openapi: 3.1.0
info:
  title: API reference
  version: 1.0.0
paths:
  /assistant:
    get:
      operationId: list
      summary: List Assistants
      tags:
        - subpackage_assistants
      parameters:
        - name: limit
          in: query
          description: This is the maximum number of items to return. Defaults to 100.
          required: false
          schema:
            type: number
            format: double
        - name: createdAtGt
          in: query
          description: This will return items where the createdAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLt
          in: query
          description: This will return items where the createdAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtGe
          in: query
          description: This will return items where the createdAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLe
          in: query
          description: This will return items where the createdAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGt
          in: query
          description: This will return items where the updatedAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLt
          in: query
          description: This will return items where the updatedAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGe
          in: query
          description: This will return items where the updatedAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLe
          in: query
          description: This will return items where the updatedAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Assistant'
    post:
      operationId: create
      summary: Create Assistant
      tags:
        - subpackage_assistants
      parameters:
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Assistant'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateAssistantDTO'
  /assistant/{id}:
    get:
      operationId: get
      summary: Get Assistant
      tags:
        - subpackage_assistants
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Assistant'
    delete:
      operationId: delete
      summary: Delete Assistant
      tags:
        - subpackage_assistants
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Assistant'
    patch:
      operationId: update
      summary: Update Assistant
      tags:
        - subpackage_assistants
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Assistant'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateAssistantDTO'
  /squad:
    get:
      operationId: list
      summary: List Squads
      tags:
        - subpackage_squads
      parameters:
        - name: limit
          in: query
          description: This is the maximum number of items to return. Defaults to 100.
          required: false
          schema:
            type: number
            format: double
        - name: createdAtGt
          in: query
          description: This will return items where the createdAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLt
          in: query
          description: This will return items where the createdAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtGe
          in: query
          description: This will return items where the createdAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLe
          in: query
          description: This will return items where the createdAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGt
          in: query
          description: This will return items where the updatedAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLt
          in: query
          description: This will return items where the updatedAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGe
          in: query
          description: This will return items where the updatedAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLe
          in: query
          description: This will return items where the updatedAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Squad'
    post:
      operationId: create
      summary: Create Squad
      tags:
        - subpackage_squads
      parameters:
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Squad'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateSquadDTO'
  /squad/{id}:
    get:
      operationId: get
      summary: Get Squad
      tags:
        - subpackage_squads
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Squad'
    delete:
      operationId: delete
      summary: Delete Squad
      tags:
        - subpackage_squads
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Squad'
    patch:
      operationId: update
      summary: Update Squad
      tags:
        - subpackage_squads
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Squad'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateSquadDTO'
  /call:
    get:
      operationId: list
      summary: List Calls
      tags:
        - subpackage_calls
      parameters:
        - name: id
          in: query
          description: This is the unique identifier for the call.
          required: false
          schema:
            type: string
        - name: assistantId
          in: query
          description: This will return calls with the specified assistantId.
          required: false
          schema:
            type: string
        - name: phoneNumberId
          in: query
          description: >-
            This is the phone number that will be used for the call. To use a transient number, use `phoneNumber`
            instead.


            Only relevant for `outboundPhoneCall` and `inboundPhoneCall` type.
          required: false
          schema:
            type: string
        - name: limit
          in: query
          description: This is the maximum number of items to return. Defaults to 100.
          required: false
          schema:
            type: number
            format: double
        - name: createdAtGt
          in: query
          description: This will return items where the createdAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLt
          in: query
          description: This will return items where the createdAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtGe
          in: query
          description: This will return items where the createdAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLe
          in: query
          description: This will return items where the createdAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGt
          in: query
          description: This will return items where the updatedAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLt
          in: query
          description: This will return items where the updatedAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGe
          in: query
          description: This will return items where the updatedAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLe
          in: query
          description: This will return items where the updatedAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Call'
    post:
      operationId: create
      summary: Create Call
      tags:
        - subpackage_calls
      parameters:
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/calls_create_Response_201'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateCallDTO'
  /call/{id}:
    get:
      operationId: get
      summary: Get Call
      tags:
        - subpackage_calls
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Call'
    delete:
      operationId: delete
      summary: Delete Call
      tags:
        - subpackage_calls
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Call'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeleteCallDTO'
    patch:
      operationId: update
      summary: Update Call
      tags:
        - subpackage_calls
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Call'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateCallDTO'
  /chat:
    get:
      operationId: list
      summary: List Chats
      tags:
        - subpackage_chats
      parameters:
        - name: id
          in: query
          description: This is the unique identifier for the chat to filter by.
          required: false
          schema:
            type: string
        - name: assistantId
          in: query
          description: This is the unique identifier for the assistant that will be used for the chat.
          required: false
          schema:
            type: string
        - name: assistantIdAny
          in: query
          description: Filter by multiple assistant IDs. Provide as comma-separated values.
          required: false
          schema:
            type: string
        - name: squadId
          in: query
          description: This is the unique identifier for the squad that will be used for the chat.
          required: false
          schema:
            type: string
        - name: sessionId
          in: query
          description: This is the unique identifier for the session that will be used for the chat.
          required: false
          schema:
            type: string
        - name: previousChatId
          in: query
          description: This is the unique identifier for the previous chat to filter by.
          required: false
          schema:
            type: string
        - name: page
          in: query
          description: This is the page number to return. Defaults to 1.
          required: false
          schema:
            type: number
            format: double
        - name: sortOrder
          in: query
          description: This is the sort order for pagination. Defaults to 'DESC'.
          required: false
          schema:
            $ref: '#/components/schemas/ChatGetParametersSortOrder'
        - name: limit
          in: query
          description: This is the maximum number of items to return. Defaults to 100.
          required: false
          schema:
            type: number
            format: double
        - name: createdAtGt
          in: query
          description: This will return items where the createdAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLt
          in: query
          description: This will return items where the createdAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtGe
          in: query
          description: This will return items where the createdAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLe
          in: query
          description: This will return items where the createdAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGt
          in: query
          description: This will return items where the updatedAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLt
          in: query
          description: This will return items where the updatedAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGe
          in: query
          description: This will return items where the updatedAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLe
          in: query
          description: This will return items where the updatedAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChatPaginatedResponse'
    post:
      operationId: create
      summary: Create Chat
      description: >-
        Creates a new chat with optional SMS delivery via transport field. Requires at least one of:
        assistantId/assistant, sessionId, or previousChatId. Note: sessionId and previousChatId are mutually exclusive.
        Transport field enables SMS delivery with two modes: (1) New conversation - provide transport.phoneNumberId and
        transport.customer to create a new session, (2) Existing conversation - provide sessionId to use existing
        session data. Cannot specify both sessionId and transport fields together. The
        transport.useLLMGeneratedMessageForOutbound flag controls whether input is processed by LLM (true, default) or
        forwarded directly as SMS (false).
      tags:
        - subpackage_chats
      parameters:
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Chat response - either non-streaming chat or streaming
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/chats_create_Response_200'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateChatDTO'
  /chat/{id}:
    get:
      operationId: get
      summary: Get Chat
      tags:
        - subpackage_chats
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Chat'
    delete:
      operationId: delete
      summary: Delete Chat
      tags:
        - subpackage_chats
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Chat'
  /chat/responses:
    post:
      operationId: create-response
      summary: Create Chat (OpenAI Compatible)
      tags:
        - subpackage_chats
      parameters:
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: OpenAI Responses API format - either non-streaming or streaming
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/chats_createResponse_Response_200'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OpenAIResponsesRequest'
  /campaign:
    get:
      operationId: campaign-controller-find-all
      summary: List Campaigns
      tags:
        - subpackage_campaigns
      parameters:
        - name: id
          in: query
          required: false
          schema:
            type: string
        - name: status
          in: query
          required: false
          schema:
            $ref: '#/components/schemas/CampaignGetParametersStatus'
        - name: page
          in: query
          description: This is the page number to return. Defaults to 1.
          required: false
          schema:
            type: number
            format: double
        - name: sortOrder
          in: query
          description: This is the sort order for pagination. Defaults to 'DESC'.
          required: false
          schema:
            $ref: '#/components/schemas/CampaignGetParametersSortOrder'
        - name: limit
          in: query
          description: This is the maximum number of items to return. Defaults to 100.
          required: false
          schema:
            type: number
            format: double
        - name: createdAtGt
          in: query
          description: This will return items where the createdAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLt
          in: query
          description: This will return items where the createdAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtGe
          in: query
          description: This will return items where the createdAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLe
          in: query
          description: This will return items where the createdAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGt
          in: query
          description: This will return items where the updatedAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLt
          in: query
          description: This will return items where the updatedAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGe
          in: query
          description: This will return items where the updatedAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLe
          in: query
          description: This will return items where the updatedAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CampaignPaginatedResponse'
    post:
      operationId: campaign-controller-create
      summary: Create Campaign
      tags:
        - subpackage_campaigns
      parameters:
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Campaign'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateCampaignDTO'
  /campaign/{id}:
    get:
      operationId: campaign-controller-find-one
      summary: Get Campaign
      tags:
        - subpackage_campaigns
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Campaign'
    delete:
      operationId: campaign-controller-remove
      summary: Delete Campaign
      tags:
        - subpackage_campaigns
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Campaign'
    patch:
      operationId: campaign-controller-update
      summary: Update Campaign
      tags:
        - subpackage_campaigns
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Campaign'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateCampaignDTO'
  /session:
    get:
      operationId: list
      summary: List Sessions
      tags:
        - subpackage_sessions
      parameters:
        - name: id
          in: query
          description: This is the unique identifier for the session to filter by.
          required: false
          schema:
            type: string
        - name: name
          in: query
          description: This is the name of the session to filter by.
          required: false
          schema:
            type: string
        - name: assistantId
          in: query
          description: This is the ID of the assistant to filter sessions by.
          required: false
          schema:
            type: string
        - name: assistantIdAny
          in: query
          description: Filter by multiple assistant IDs. Provide as comma-separated values.
          required: false
          schema:
            type: string
        - name: squadId
          in: query
          description: This is the ID of the squad to filter sessions by.
          required: false
          schema:
            type: string
        - name: workflowId
          in: query
          description: This is the ID of the workflow to filter sessions by.
          required: false
          schema:
            type: string
        - name: numberE164CheckEnabled
          in: query
          description: >-
            This is the flag to toggle the E164 check for the `number` field. This is an advanced property which should
            be used if you know your use case requires it.


            Use cases:

            - `false`: To allow non-E164 numbers like `+001234567890`, `1234`, or `abc`. This is useful for dialing out
            to non-E164 numbers on your SIP trunks.

            - `true` (default): To allow only E164 numbers like `+14155551234`. This is standard for PSTN calls.


            If `false`, the `number` is still required to only contain alphanumeric characters (regex:
            `/^\+?[a-zA-Z0-9]+$/`).


            @default true (E164 check is enabled)
          required: false
          schema:
            type: boolean
            default: true
        - name: extension
          in: query
          description: This is the extension that will be dialed after the call is answered.
          required: false
          schema:
            type: string
        - name: assistantOverrides
          in: query
          description: |-
            These are the overrides for the assistant's settings and template variables specific to this customer.
            This allows customization of the assistant's behavior for individual customers in batch calls.
          required: false
          schema:
            description: Any type
        - name: number
          in: query
          description: This is the number of the customer.
          required: false
          schema:
            type: string
        - name: sipUri
          in: query
          description: This is the SIP URI of the customer.
          required: false
          schema:
            type: string
        - name: name
          in: query
          description: >-
            This is the name of the customer. This is just for your own reference.


            For SIP inbound calls, this is extracted from the `From` SIP header with format `"Display Name"
            <sip:username@domain>`.
          required: false
          schema:
            type: string
        - name: email
          in: query
          description: This is the email of the customer.
          required: false
          schema:
            type: string
        - name: externalId
          in: query
          description: This is the external ID of the customer.
          required: false
          schema:
            type: string
        - name: customerNumberAny
          in: query
          description: Filter by any of the specified customer phone numbers (comma-separated).
          required: false
          schema:
            type: string
        - name: phoneNumberId
          in: query
          description: This will return sessions with the specified phoneNumberId.
          required: false
          schema:
            type: string
        - name: phoneNumberIdAny
          in: query
          description: This will return sessions with any of the specified phoneNumberIds.
          required: false
          schema:
            type: array
            items:
              type: string
        - name: page
          in: query
          description: This is the page number to return. Defaults to 1.
          required: false
          schema:
            type: number
            format: double
        - name: sortOrder
          in: query
          description: This is the sort order for pagination. Defaults to 'DESC'.
          required: false
          schema:
            $ref: '#/components/schemas/SessionGetParametersSortOrder'
        - name: limit
          in: query
          description: This is the maximum number of items to return. Defaults to 100.
          required: false
          schema:
            type: number
            format: double
        - name: createdAtGt
          in: query
          description: This will return items where the createdAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLt
          in: query
          description: This will return items where the createdAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtGe
          in: query
          description: This will return items where the createdAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLe
          in: query
          description: This will return items where the createdAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGt
          in: query
          description: This will return items where the updatedAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLt
          in: query
          description: This will return items where the updatedAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGe
          in: query
          description: This will return items where the updatedAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLe
          in: query
          description: This will return items where the updatedAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SessionPaginatedResponse'
    post:
      operationId: create
      summary: Create Session
      tags:
        - subpackage_sessions
      parameters:
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Session'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateSessionDTO'
  /session/{id}:
    get:
      operationId: get
      summary: Get Session
      tags:
        - subpackage_sessions
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Session'
    delete:
      operationId: delete
      summary: Delete Session
      tags:
        - subpackage_sessions
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Session'
    patch:
      operationId: update
      summary: Update Session
      tags:
        - subpackage_sessions
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Session'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateSessionDTO'
  /phone-number:
    get:
      operationId: list
      summary: List Phone Numbers
      tags:
        - subpackage_phoneNumbers
      parameters:
        - name: limit
          in: query
          description: This is the maximum number of items to return. Defaults to 100.
          required: false
          schema:
            type: number
            format: double
        - name: createdAtGt
          in: query
          description: This will return items where the createdAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLt
          in: query
          description: This will return items where the createdAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtGe
          in: query
          description: This will return items where the createdAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLe
          in: query
          description: This will return items where the createdAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGt
          in: query
          description: This will return items where the updatedAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLt
          in: query
          description: This will return items where the updatedAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGe
          in: query
          description: This will return items where the updatedAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLe
          in: query
          description: This will return items where the updatedAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/PhoneNumberGetResponsesContentApplicationJsonSchemaItems'
    post:
      operationId: create
      summary: Create Phone Number
      tags:
        - subpackage_phoneNumbers
      parameters:
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/phoneNumbers_create_Response_201'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/phoneNumbers_create_Request'
  /v2/phone-number:
    get:
      operationId: phone-number-controller-find-all-paginated
      summary: List Phone Numbers
      tags:
        - subpackage_phoneNumbers
      parameters:
        - name: search
          in: query
          description: This will search phone numbers by name, number, or SIP URI (partial match, case-insensitive).
          required: false
          schema:
            type: string
        - name: page
          in: query
          description: This is the page number to return. Defaults to 1.
          required: false
          schema:
            type: number
            format: double
        - name: sortOrder
          in: query
          description: This is the sort order for pagination. Defaults to 'DESC'.
          required: false
          schema:
            $ref: '#/components/schemas/V2PhoneNumberGetParametersSortOrder'
        - name: limit
          in: query
          description: This is the maximum number of items to return. Defaults to 100.
          required: false
          schema:
            type: number
            format: double
        - name: createdAtGt
          in: query
          description: This will return items where the createdAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLt
          in: query
          description: This will return items where the createdAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtGe
          in: query
          description: This will return items where the createdAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLe
          in: query
          description: This will return items where the createdAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGt
          in: query
          description: This will return items where the updatedAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLt
          in: query
          description: This will return items where the updatedAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGe
          in: query
          description: This will return items where the updatedAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLe
          in: query
          description: This will return items where the updatedAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PhoneNumberPaginatedResponse'
  /phone-number/{id}:
    get:
      operationId: get
      summary: Get Phone Number
      tags:
        - subpackage_phoneNumbers
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/phoneNumbers_get_Response_200'
    delete:
      operationId: delete
      summary: Delete Phone Number
      tags:
        - subpackage_phoneNumbers
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/phoneNumbers_delete_Response_200'
    patch:
      operationId: update
      summary: Update Phone Number
      tags:
        - subpackage_phoneNumbers
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/phoneNumbers_update_Response_200'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/phoneNumbers_update_Request'
  /tool:
    get:
      operationId: list
      summary: List Tools
      tags:
        - subpackage_tools
      parameters:
        - name: limit
          in: query
          description: This is the maximum number of items to return. Defaults to 100.
          required: false
          schema:
            type: number
            format: double
        - name: createdAtGt
          in: query
          description: This will return items where the createdAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLt
          in: query
          description: This will return items where the createdAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtGe
          in: query
          description: This will return items where the createdAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLe
          in: query
          description: This will return items where the createdAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGt
          in: query
          description: This will return items where the updatedAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLt
          in: query
          description: This will return items where the updatedAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGe
          in: query
          description: This will return items where the updatedAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLe
          in: query
          description: This will return items where the updatedAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ToolGetResponsesContentApplicationJsonSchemaItems'
    post:
      operationId: create
      summary: Create Tool
      tags:
        - subpackage_tools
      parameters:
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tools_create_Response_201'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/tools_create_Request'
  /tool/{id}:
    get:
      operationId: get
      summary: Get Tool
      tags:
        - subpackage_tools
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tools_get_Response_200'
    delete:
      operationId: delete
      summary: Delete Tool
      tags:
        - subpackage_tools
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tools_delete_Response_200'
    patch:
      operationId: update
      summary: Update Tool
      tags:
        - subpackage_tools
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/tools_update_Response_200'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/tools_update_Request'
  /file:
    get:
      operationId: list
      summary: List Files
      tags:
        - subpackage_files
      parameters:
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/File'
    post:
      operationId: create
      summary: Upload File
      tags:
        - subpackage_files
      parameters:
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '201':
          description: File uploaded successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/File'
        '400':
          description: Invalid file
          content:
            application/json:
              schema:
                description: Any type
      requestBody:
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                file:
                  type: string
                  format: binary
                  description: This is the File you want to upload for use with the Knowledge Base.
              required:
                - file
  /file/{id}:
    get:
      operationId: get
      summary: Get File
      tags:
        - subpackage_files
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/File'
    delete:
      operationId: delete
      summary: Delete File
      tags:
        - subpackage_files
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/File'
    patch:
      operationId: update
      summary: Update File
      tags:
        - subpackage_files
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/File'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateFileDTO'
  /structured-output:
    get:
      operationId: structured-output-controller-find-all
      summary: List Structured Outputs
      tags:
        - subpackage_structuredOutputs
      parameters:
        - name: id
          in: query
          description: This will return structured outputs where the id matches the specified value.
          required: false
          schema:
            type: string
        - name: name
          in: query
          description: This will return structured outputs where the name matches the specified value.
          required: false
          schema:
            type: string
        - name: page
          in: query
          description: This is the page number to return. Defaults to 1.
          required: false
          schema:
            type: number
            format: double
        - name: sortOrder
          in: query
          description: This is the sort order for pagination. Defaults to 'DESC'.
          required: false
          schema:
            $ref: '#/components/schemas/StructuredOutputGetParametersSortOrder'
        - name: limit
          in: query
          description: This is the maximum number of items to return. Defaults to 100.
          required: false
          schema:
            type: number
            format: double
        - name: createdAtGt
          in: query
          description: This will return items where the createdAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLt
          in: query
          description: This will return items where the createdAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtGe
          in: query
          description: This will return items where the createdAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLe
          in: query
          description: This will return items where the createdAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGt
          in: query
          description: This will return items where the updatedAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLt
          in: query
          description: This will return items where the updatedAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGe
          in: query
          description: This will return items where the updatedAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLe
          in: query
          description: This will return items where the updatedAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StructuredOutputPaginatedResponse'
    post:
      operationId: structured-output-controller-create
      summary: Create Structured Output
      tags:
        - subpackage_structuredOutputs
      parameters:
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StructuredOutput'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateStructuredOutputDTO'
  /structured-output/{id}:
    get:
      operationId: structured-output-controller-find-one
      summary: Get Structured Output
      tags:
        - subpackage_structuredOutputs
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StructuredOutput'
    delete:
      operationId: structured-output-controller-remove
      summary: Delete Structured Output
      tags:
        - subpackage_structuredOutputs
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StructuredOutput'
    patch:
      operationId: structured-output-controller-update
      summary: Update Structured Output
      tags:
        - subpackage_structuredOutputs
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: schemaOverride
          in: query
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StructuredOutput'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateStructuredOutputDTO'
  /structured-output/run:
    post:
      operationId: structured-output-controller-run
      summary: Run Structured Output
      tags:
        - subpackage_structuredOutputs
      parameters:
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StructuredOutput'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StructuredOutputRunDTO'
  /reporting/insight:
    get:
      operationId: insight-controller-find-all
      summary: Get Insights
      tags:
        - subpackage_insight
      parameters:
        - name: id
          in: query
          required: false
          schema:
            type: string
        - name: page
          in: query
          description: This is the page number to return. Defaults to 1.
          required: false
          schema:
            type: number
            format: double
        - name: sortOrder
          in: query
          description: This is the sort order for pagination. Defaults to 'DESC'.
          required: false
          schema:
            $ref: '#/components/schemas/ReportingInsightGetParametersSortOrder'
        - name: limit
          in: query
          description: This is the maximum number of items to return. Defaults to 100.
          required: false
          schema:
            type: number
            format: double
        - name: createdAtGt
          in: query
          description: This will return items where the createdAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLt
          in: query
          description: This will return items where the createdAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtGe
          in: query
          description: This will return items where the createdAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLe
          in: query
          description: This will return items where the createdAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGt
          in: query
          description: This will return items where the updatedAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLt
          in: query
          description: This will return items where the updatedAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGe
          in: query
          description: This will return items where the updatedAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLe
          in: query
          description: This will return items where the updatedAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InsightPaginatedResponse'
    post:
      operationId: insight-controller-create
      summary: Create Insight
      tags:
        - subpackage_insight
      parameters:
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Insight_InsightController_create_Response_201'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Insight_InsightController_create_Request'
  /reporting/insight/{id}:
    get:
      operationId: insight-controller-find-one
      summary: Get Insight
      tags:
        - subpackage_insight
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Insight_InsightController_findOne_Response_200'
    delete:
      operationId: insight-controller-remove
      summary: Delete Insight
      tags:
        - subpackage_insight
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Insight_InsightController_remove_Response_200'
    patch:
      operationId: insight-controller-update
      summary: Update Insight
      tags:
        - subpackage_insight
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Insight_InsightController_update_Response_200'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Insight_InsightController_update_Request'
  /reporting/insight/{id}/run:
    post:
      operationId: insight-controller-run
      summary: Run Insight
      tags:
        - subpackage_insight
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InsightRunResponse'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/InsightRunDTO'
  /reporting/insight/preview:
    post:
      operationId: insight-controller-preview
      summary: Preview Insight
      tags:
        - subpackage_insight
      parameters:
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InsightRunResponse'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Insight_InsightController_preview_Request'
  /eval:
    get:
      operationId: eval-controller-get-paginated
      summary: List Evals
      tags:
        - subpackage_eval
      parameters:
        - name: id
          in: query
          required: false
          schema:
            type: string
        - name: page
          in: query
          description: This is the page number to return. Defaults to 1.
          required: false
          schema:
            type: number
            format: double
        - name: sortOrder
          in: query
          description: This is the sort order for pagination. Defaults to 'DESC'.
          required: false
          schema:
            $ref: '#/components/schemas/EvalGetParametersSortOrder'
        - name: limit
          in: query
          description: This is the maximum number of items to return. Defaults to 100.
          required: false
          schema:
            type: number
            format: double
        - name: createdAtGt
          in: query
          description: This will return items where the createdAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLt
          in: query
          description: This will return items where the createdAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtGe
          in: query
          description: This will return items where the createdAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLe
          in: query
          description: This will return items where the createdAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGt
          in: query
          description: This will return items where the updatedAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLt
          in: query
          description: This will return items where the updatedAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGe
          in: query
          description: This will return items where the updatedAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLe
          in: query
          description: This will return items where the updatedAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EvalPaginatedResponse'
    post:
      operationId: eval-controller-create
      summary: Create Eval
      tags:
        - subpackage_eval
      parameters:
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Eval'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateEvalDTO'
  /eval/{id}:
    get:
      operationId: eval-controller-get
      summary: Get Eval
      tags:
        - subpackage_eval
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Eval'
    delete:
      operationId: eval-controller-remove
      summary: Delete Eval
      tags:
        - subpackage_eval
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Eval'
    patch:
      operationId: eval-controller-update
      summary: Update Eval
      tags:
        - subpackage_eval
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Eval'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateEvalDTO'
  /eval/run/{id}:
    get:
      operationId: eval-controller-get-run
      summary: Get Eval Run
      tags:
        - subpackage_eval
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EvalRun'
    delete:
      operationId: eval-controller-remove-run
      summary: Delete Eval Run
      tags:
        - subpackage_eval
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EvalRun'
  /eval/run:
    get:
      operationId: eval-controller-get-runs-paginated
      summary: List Eval Runs
      tags:
        - subpackage_eval
      parameters:
        - name: id
          in: query
          required: false
          schema:
            type: string
        - name: page
          in: query
          description: This is the page number to return. Defaults to 1.
          required: false
          schema:
            type: number
            format: double
        - name: sortOrder
          in: query
          description: This is the sort order for pagination. Defaults to 'DESC'.
          required: false
          schema:
            $ref: '#/components/schemas/EvalRunGetParametersSortOrder'
        - name: limit
          in: query
          description: This is the maximum number of items to return. Defaults to 100.
          required: false
          schema:
            type: number
            format: double
        - name: createdAtGt
          in: query
          description: This will return items where the createdAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLt
          in: query
          description: This will return items where the createdAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtGe
          in: query
          description: This will return items where the createdAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLe
          in: query
          description: This will return items where the createdAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGt
          in: query
          description: This will return items where the updatedAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLt
          in: query
          description: This will return items where the updatedAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGe
          in: query
          description: This will return items where the updatedAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLe
          in: query
          description: This will return items where the updatedAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EvalRunPaginatedResponse'
    post:
      operationId: eval-controller-run
      summary: Create Eval Run
      tags:
        - subpackage_eval
      parameters:
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Eval_EvalController_run_Response_200'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateEvalRunDTO'
  /observability/scorecard/{id}:
    get:
      operationId: scorecard-controller-get
      summary: Get Scorecard
      tags:
        - subpackage_observabilityScorecard
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Scorecard'
    delete:
      operationId: scorecard-controller-remove
      summary: Delete Scorecard
      tags:
        - subpackage_observabilityScorecard
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Scorecard'
    patch:
      operationId: scorecard-controller-update
      summary: Update Scorecard
      tags:
        - subpackage_observabilityScorecard
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Scorecard'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateScorecardDTO'
  /observability/scorecard:
    get:
      operationId: scorecard-controller-get-paginated
      summary: List Scorecards
      tags:
        - subpackage_observabilityScorecard
      parameters:
        - name: id
          in: query
          required: false
          schema:
            type: string
        - name: page
          in: query
          description: This is the page number to return. Defaults to 1.
          required: false
          schema:
            type: number
            format: double
        - name: sortOrder
          in: query
          description: This is the sort order for pagination. Defaults to 'DESC'.
          required: false
          schema:
            $ref: '#/components/schemas/ObservabilityScorecardGetParametersSortOrder'
        - name: limit
          in: query
          description: This is the maximum number of items to return. Defaults to 100.
          required: false
          schema:
            type: number
            format: double
        - name: createdAtGt
          in: query
          description: This will return items where the createdAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLt
          in: query
          description: This will return items where the createdAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtGe
          in: query
          description: This will return items where the createdAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLe
          in: query
          description: This will return items where the createdAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGt
          in: query
          description: This will return items where the updatedAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLt
          in: query
          description: This will return items where the updatedAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGe
          in: query
          description: This will return items where the updatedAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLe
          in: query
          description: This will return items where the updatedAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScorecardPaginatedResponse'
    post:
      operationId: scorecard-controller-create
      summary: Create Scorecard
      tags:
        - subpackage_observabilityScorecard
      parameters:
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Scorecard'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateScorecardDTO'
  /provider/{provider}/{resourceName}:
    get:
      operationId: provider-resource-controller-get-provider-resources-paginated
      summary: List Provider Resources
      tags:
        - subpackage_providerResources
      parameters:
        - name: provider
          in: path
          description: The provider (e.g., 11labs)
          required: true
          schema:
            $ref: '#/components/schemas/ProviderProviderResourceNameGetParametersProvider'
        - name: resourceName
          in: path
          description: The resource name (e.g., pronunciation-dictionary)
          required: true
          schema:
            $ref: '#/components/schemas/ProviderProviderResourceNameGetParametersResourceName'
        - name: id
          in: query
          required: false
          schema:
            type: string
        - name: resourceId
          in: query
          required: false
          schema:
            type: string
        - name: page
          in: query
          description: This is the page number to return. Defaults to 1.
          required: false
          schema:
            type: number
            format: double
        - name: sortOrder
          in: query
          description: This is the sort order for pagination. Defaults to 'DESC'.
          required: false
          schema:
            $ref: '#/components/schemas/ProviderProviderResourceNameGetParametersSortOrder'
        - name: limit
          in: query
          description: This is the maximum number of items to return. Defaults to 100.
          required: false
          schema:
            type: number
            format: double
        - name: createdAtGt
          in: query
          description: This will return items where the createdAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLt
          in: query
          description: This will return items where the createdAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtGe
          in: query
          description: This will return items where the createdAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: createdAtLe
          in: query
          description: This will return items where the createdAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGt
          in: query
          description: This will return items where the updatedAt is greater than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLt
          in: query
          description: This will return items where the updatedAt is less than the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtGe
          in: query
          description: This will return items where the updatedAt is greater than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: updatedAtLe
          in: query
          description: This will return items where the updatedAt is less than or equal to the specified value.
          required: false
          schema:
            type: string
            format: date-time
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: List of provider resources
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProviderResourcePaginatedResponse'
    post:
      operationId: provider-resource-controller-create-provider-resource
      summary: Create Provider Resource
      tags:
        - subpackage_providerResources
      parameters:
        - name: provider
          in: path
          description: The provider (e.g., 11labs)
          required: true
          schema:
            $ref: '#/components/schemas/ProviderProviderResourceNamePostParametersProvider'
        - name: resourceName
          in: path
          description: The resource name (e.g., pronunciation-dictionary)
          required: true
          schema:
            $ref: '#/components/schemas/ProviderProviderResourceNamePostParametersResourceName'
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '201':
          description: Successfully created provider resource
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProviderResource'
  /provider/{provider}/{resourceName}/{id}:
    get:
      operationId: provider-resource-controller-get-provider-resource
      summary: Get Provider Resource
      tags:
        - subpackage_providerResources
      parameters:
        - name: provider
          in: path
          description: The provider (e.g., 11labs)
          required: true
          schema:
            $ref: '#/components/schemas/ProviderProviderResourceNameIdGetParametersProvider'
        - name: resourceName
          in: path
          description: The resource name (e.g., pronunciation-dictionary)
          required: true
          schema:
            $ref: '#/components/schemas/ProviderProviderResourceNameIdGetParametersResourceName'
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Successfully retrieved provider resource
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProviderResource'
        '404':
          description: Provider resource not found
          content:
            application/json:
              schema:
                description: Any type
    delete:
      operationId: provider-resource-controller-delete-provider-resource
      summary: Delete Provider Resource
      tags:
        - subpackage_providerResources
      parameters:
        - name: provider
          in: path
          description: The provider (e.g., 11labs)
          required: true
          schema:
            $ref: '#/components/schemas/ProviderProviderResourceNameIdDeleteParametersProvider'
        - name: resourceName
          in: path
          description: The resource name (e.g., pronunciation-dictionary)
          required: true
          schema:
            $ref: '#/components/schemas/ProviderProviderResourceNameIdDeleteParametersResourceName'
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProviderResource'
        '404':
          description: Provider resource not found
          content:
            application/json:
              schema:
                description: Any type
    patch:
      operationId: provider-resource-controller-update-provider-resource
      summary: Update Provider Resource
      tags:
        - subpackage_providerResources
      parameters:
        - name: provider
          in: path
          description: The provider (e.g., 11labs)
          required: true
          schema:
            $ref: '#/components/schemas/ProviderProviderResourceNameIdPatchParametersProvider'
        - name: resourceName
          in: path
          description: The resource name (e.g., pronunciation-dictionary)
          required: true
          schema:
            $ref: '#/components/schemas/ProviderProviderResourceNameIdPatchParametersResourceName'
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProviderResource'
        '404':
          description: Provider resource not found
          content:
            application/json:
              schema:
                description: Any type
  /analytics:
    post:
      operationId: get
      summary: Create Analytics Queries
      tags:
        - subpackage_analytics
      parameters:
        - name: Authorization
          in: header
          description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/AnalyticsQueryResult'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AnalyticsQueryDTO'
servers:
  - url: https://api.vapi.ai
components:
  schemas:
    AssemblyAiTranscriberProvider:
      type: string
      enum:
        - assembly-ai
      description: This is the transcription provider that will be used.
      title: AssemblyAiTranscriberProvider
    AssemblyAiTranscriberLanguage:
      type: string
      enum:
        - multi
        - en
      description: This is the language that will be set for the transcription.
      title: AssemblyAiTranscriberLanguage
    AssemblyAiTranscriberSpeechModel:
      type: string
      enum:
        - universal-streaming-english
        - universal-streaming-multilingual
      description: |-
        This is the speech model used for the streaming session.
        Note: Keyterms prompting is not supported with multilingual streaming.
        @default 'universal-streaming-english'
      title: AssemblyAiTranscriberSpeechModel
    FallbackAssemblyAiTranscriberProvider:
      type: string
      enum:
        - assembly-ai
      description: This is the transcription provider that will be used.
      title: FallbackAssemblyAiTranscriberProvider
    FallbackAssemblyAiTranscriberLanguage:
      type: string
      enum:
        - multi
        - en
      description: This is the language that will be set for the transcription.
      title: FallbackAssemblyAiTranscriberLanguage
    FallbackAssemblyAiTranscriberSpeechModel:
      type: string
      enum:
        - universal-streaming-english
        - universal-streaming-multilingual
      description: |-
        This is the speech model used for the streaming session.
        Note: Keyterms prompting is not supported with multilingual streaming.
        @default 'universal-streaming-english'
      title: FallbackAssemblyAiTranscriberSpeechModel
    FallbackAssemblyAITranscriber:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/FallbackAssemblyAiTranscriberProvider'
          description: This is the transcription provider that will be used.
        language:
          $ref: '#/components/schemas/FallbackAssemblyAiTranscriberLanguage'
          description: This is the language that will be set for the transcription.
        confidenceThreshold:
          type: number
          format: double
          description: |-
            Transcripts below this confidence threshold will be discarded.

            @default 0.4
        formatTurns:
          type: boolean
          description: |-
            This enables formatting of transcripts.

            @default true
        endOfTurnConfidenceThreshold:
          type: number
          format: double
          description: |-
            This is the end of turn confidence threshold. The minimum confidence that the end of turn is detected.
            Note: Only used if startSpeakingPlan.smartEndpointingPlan is not set.
            @min 0
            @max 1
            @default 0.7
        minEndOfTurnSilenceWhenConfident:
          type: number
          format: double
          description: |-
            This is the minimum end of turn silence when confident in milliseconds.
            Note: Only used if startSpeakingPlan.smartEndpointingPlan is not set.
            @default 160
        wordFinalizationMaxWaitTime:
          type: number
          format: double
        maxTurnSilence:
          type: number
          format: double
          description: |-
            This is the maximum turn silence time in milliseconds.
            Note: Only used if startSpeakingPlan.smartEndpointingPlan is not set.
            @default 400
        vadAssistedEndpointingEnabled:
          type: boolean
          description: >-
            Use VAD to assist with endpointing decisions from the transcriber.

            When enabled, transcriber endpointing will be buffered if VAD detects the user is still speaking, preventing
            premature turn-taking.

            When disabled, transcriber endpointing will be used immediately regardless of VAD state, allowing for
            quicker but more aggressive turn-taking.

            Note: Only used if startSpeakingPlan.smartEndpointingPlan is not set.


            @default true
        speechModel:
          $ref: '#/components/schemas/FallbackAssemblyAiTranscriberSpeechModel'
          description: |-
            This is the speech model used for the streaming session.
            Note: Keyterms prompting is not supported with multilingual streaming.
            @default 'universal-streaming-english'
        realtimeUrl:
          type: string
          description: The WebSocket URL that the transcriber connects to.
        wordBoost:
          type: array
          items:
            type: string
          description: Add up to 2500 characters of custom vocabulary.
        keytermsPrompt:
          type: array
          items:
            type: string
          description: |-
            Keyterms prompting improves recognition accuracy for specific words and phrases.
            Can include up to 100 keyterms, each up to 50 characters.
            Costs an additional $0.04/hour when enabled.
        endUtteranceSilenceThreshold:
          type: number
          format: double
          description: The duration of the end utterance silence threshold in milliseconds.
        disablePartialTranscripts:
          type: boolean
          description: |-
            Disable partial transcripts.
            Set to `true` to not receive partial transcripts. Defaults to `false`.
      required:
        - provider
      title: FallbackAssemblyAITranscriber
    FallbackAzureSpeechTranscriberProvider:
      type: string
      enum:
        - azure
      description: This is the transcription provider that will be used.
      title: FallbackAzureSpeechTranscriberProvider
    FallbackAzureSpeechTranscriberLanguage:
      type: string
      enum:
        - af-ZA
        - am-ET
        - ar-AE
        - ar-BH
        - ar-DZ
        - ar-EG
        - ar-IL
        - ar-IQ
        - ar-JO
        - ar-KW
        - ar-LB
        - ar-LY
        - ar-MA
        - ar-OM
        - ar-PS
        - ar-QA
        - ar-SA
        - ar-SY
        - ar-TN
        - ar-YE
        - az-AZ
        - bg-BG
        - bn-IN
        - bs-BA
        - ca-ES
        - cs-CZ
        - cy-GB
        - da-DK
        - de-AT
        - de-CH
        - de-DE
        - el-GR
        - en-AU
        - en-CA
        - en-GB
        - en-GH
        - en-HK
        - en-IE
        - en-IN
        - en-KE
        - en-NG
        - en-NZ
        - en-PH
        - en-SG
        - en-TZ
        - en-US
        - en-ZA
        - es-AR
        - es-BO
        - es-CL
        - es-CO
        - es-CR
        - es-CU
        - es-DO
        - es-EC
        - es-ES
        - es-GQ
        - es-GT
        - es-HN
        - es-MX
        - es-NI
        - es-PA
        - es-PE
        - es-PR
        - es-PY
        - es-SV
        - es-US
        - es-UY
        - es-VE
        - et-EE
        - eu-ES
        - fa-IR
        - fi-FI
        - fil-PH
        - fr-BE
        - fr-CA
        - fr-CH
        - fr-FR
        - ga-IE
        - gl-ES
        - gu-IN
        - he-IL
        - hi-IN
        - hr-HR
        - hu-HU
        - hy-AM
        - id-ID
        - is-IS
        - it-CH
        - it-IT
        - ja-JP
        - jv-ID
        - ka-GE
        - kk-KZ
        - km-KH
        - kn-IN
        - ko-KR
        - lo-LA
        - lt-LT
        - lv-LV
        - mk-MK
        - ml-IN
        - mn-MN
        - mr-IN
        - ms-MY
        - mt-MT
        - my-MM
        - nb-NO
        - ne-NP
        - nl-BE
        - nl-NL
        - pa-IN
        - pl-PL
        - ps-AF
        - pt-BR
        - pt-PT
        - ro-RO
        - ru-RU
        - si-LK
        - sk-SK
        - sl-SI
        - so-SO
        - sq-AL
        - sr-RS
        - sv-SE
        - sw-KE
        - sw-TZ
        - ta-IN
        - te-IN
        - th-TH
        - tr-TR
        - uk-UA
        - ur-IN
        - uz-UZ
        - vi-VN
        - wuu-CN
        - yue-CN
        - zh-CN
        - zh-CN-shandong
        - zh-CN-sichuan
        - zh-HK
        - zh-TW
        - zu-ZA
      description: >-
        This is the language that will be set for the transcription. The list of languages Azure supports can be found
        here: https://learn.microsoft.com/en-us/azure/ai-services/speech-service/language-support?tabs=stt
      title: FallbackAzureSpeechTranscriberLanguage
    FallbackAzureSpeechTranscriberSegmentationStrategy:
      type: string
      enum:
        - Default
        - Time
        - Semantic
      description: >-
        Controls how phrase boundaries are detected, enabling either simple time/silence heuristics or more advanced
        semantic segmentation.
      title: FallbackAzureSpeechTranscriberSegmentationStrategy
    FallbackAzureSpeechTranscriber:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/FallbackAzureSpeechTranscriberProvider'
          description: This is the transcription provider that will be used.
        language:
          $ref: '#/components/schemas/FallbackAzureSpeechTranscriberLanguage'
          description: >-
            This is the language that will be set for the transcription. The list of languages Azure supports can be
            found here: https://learn.microsoft.com/en-us/azure/ai-services/speech-service/language-support?tabs=stt
        segmentationStrategy:
          $ref: '#/components/schemas/FallbackAzureSpeechTranscriberSegmentationStrategy'
          description: >-
            Controls how phrase boundaries are detected, enabling either simple time/silence heuristics or more advanced
            semantic segmentation.
        segmentationSilenceTimeoutMs:
          type: number
          format: double
          description: >-
            Duration of detected silence after which the service finalizes a phrase. Configure to adjust sensitivity to
            pauses in speech.
        segmentationMaximumTimeMs:
          type: number
          format: double
          description: Maximum duration a segment can reach before being cut off when using time-based segmentation.
      required:
        - provider
      title: FallbackAzureSpeechTranscriber
    FallbackCustomTranscriberProvider:
      type: string
      enum:
        - custom-transcriber
      description: >-
        This is the transcription provider that will be used. Use `custom-transcriber` for providers that are not
        natively supported.
      title: FallbackCustomTranscriberProvider
    ServerHeaders:
      type: object
      properties: {}
      description: >-
        These are the headers to include in the request.


        Each key-value pair represents a header name and its value.


        Note: Specifying an Authorization header here will override the authorization provided by the `credentialId` (if
        provided). This is an anti-pattern and should be avoided outside of edge case scenarios.
      title: ServerHeaders
    BackoffPlanType:
      type: string
      enum:
        - fixed
        - exponential
      description: |-
        This is the type of backoff plan to use. Defaults to fixed.

        @default fixed
      title: BackoffPlanType
    BackoffPlanExcludedStatusCodesItems:
      type: object
      properties: {}
      title: BackoffPlanExcludedStatusCodesItems
    BackoffPlan:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/BackoffPlanType'
          description: |-
            This is the type of backoff plan to use. Defaults to fixed.

            @default fixed
        maxRetries:
          type: number
          format: double
          description: |-
            This is the maximum number of retries to attempt if the request fails. Defaults to 0 (no retries).

            @default 0
        baseDelaySeconds:
          type: number
          format: double
          description: >-
            This is the base delay in seconds. For linear backoff, this is the delay between each retry. For exponential
            backoff, this is the initial delay.
        excludedStatusCodes:
          type: array
          items:
            $ref: '#/components/schemas/BackoffPlanExcludedStatusCodesItems'
          description: >-
            This is the excluded status codes. If the response status code is in this list, the request will not be
            retried.

            By default, the request will be retried for any non-2xx status code.
      required:
        - type
        - maxRetries
        - baseDelaySeconds
      title: BackoffPlan
    Server:
      type: object
      properties:
        timeoutSeconds:
          type: number
          format: double
          description: |-
            This is the timeout in seconds for the request. Defaults to 20 seconds.

            @default 20
        credentialId:
          type: string
          description: The credential ID for server authentication
        staticIpAddressesEnabled:
          type: boolean
          description: |-
            If enabled, requests will originate from a static set of IPs owned and managed by Vapi.

            @default false
        encryptedPaths:
          type: array
          items:
            type: string
          description: This is the paths to encrypt in the request body if credentialId and encryptionPlan are defined.
        url:
          type: string
          description: This is where the request will be sent.
        headers:
          $ref: '#/components/schemas/ServerHeaders'
          description: >-
            These are the headers to include in the request.


            Each key-value pair represents a header name and its value.


            Note: Specifying an Authorization header here will override the authorization provided by the `credentialId`
            (if provided). This is an anti-pattern and should be avoided outside of edge case scenarios.
        backoffPlan:
          $ref: '#/components/schemas/BackoffPlan'
          description: |-
            This is the backoff plan if the request fails. Defaults to undefined (the request will not be retried).

            @default undefined (the request will not be retried)
      title: Server
    FallbackCustomTranscriber:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/FallbackCustomTranscriberProvider'
          description: >-
            This is the transcription provider that will be used. Use `custom-transcriber` for providers that are not
            natively supported.
        server:
          $ref: '#/components/schemas/Server'
          description: |-
            This is where the transcription request will be sent.

            Usage:
            1. Vapi will initiate a websocket connection with `server.url`.

            2. Vapi will send an initial text frame with the sample rate. Format:
            ```
                {
                  "type": "start",
                  "encoding": "linear16", // 16-bit raw PCM format
                  "container": "raw",
                  "sampleRate": {{sampleRate}},
                  "channels": 2 // customer is channel 0, assistant is channel 1
                }
            ```

            3. Vapi will send the audio data in 16-bit raw PCM format as binary frames.

            4. You can read the messages something like this:
            ```
            ws.on('message', (data, isBinary) => {
              if (isBinary) {
                pcmBuffer = Buffer.concat([pcmBuffer, data]);
                console.log(`Received PCM data, buffer size: ${pcmBuffer.length}`);
              } else {
                console.log('Received message:', JSON.parse(data.toString()));
              }
            });
            ```

            5. You will respond with transcriptions as you have them. Format:
            ```
             {
                "type": "transcriber-response",
                "transcription": "Hello, world!",
                "channel": "customer" | "assistant"
             }
            ```
      required:
        - provider
        - server
      title: FallbackCustomTranscriber
    FallbackDeepgramTranscriberProvider:
      type: string
      enum:
        - deepgram
      description: This is the transcription provider that will be used.
      title: FallbackDeepgramTranscriberProvider
    DeepgramTranscriberModel:
      type: string
      enum:
        - flux-general-en
        - nova-3
        - nova-3-general
        - nova-3-medical
        - nova-2
        - nova-2-general
        - nova-2-meeting
        - nova-2-phonecall
        - nova-2-finance
        - nova-2-conversationalai
        - nova-2-voicemail
        - nova-2-video
        - nova-2-medical
        - nova-2-drivethru
        - nova-2-automotive
        - nova
        - nova-general
        - nova-phonecall
        - nova-medical
        - enhanced
        - enhanced-general
        - enhanced-meeting
        - enhanced-phonecall
        - enhanced-finance
        - base
        - base-general
        - base-meeting
        - base-phonecall
        - base-finance
        - base-conversationalai
        - base-voicemail
        - base-video
        - whisper
      title: DeepgramTranscriberModel
    DeepgramTranscriberLanguage:
      type: string
      enum:
        - bg
        - ca
        - cs
        - da
        - da-DK
        - de
        - de-CH
        - el
        - en
        - en-AU
        - en-GB
        - en-IN
        - en-NZ
        - en-US
        - es
        - es-419
        - es-LATAM
        - et
        - fi
        - fr
        - fr-CA
        - hi
        - hi-Latn
        - hu
        - id
        - it
        - ja
        - ko
        - ko-KR
        - lt
        - lv
        - ms
        - multi
        - nl
        - nl-BE
        - 'no'
        - pl
        - pt
        - pt-BR
        - ro
        - ru
        - sk
        - sv
        - sv-SE
        - ta
        - taq
        - th
        - th-TH
        - tr
        - uk
        - vi
        - zh
        - zh-CN
        - zh-Hans
        - zh-Hant
        - zh-TW
      title: DeepgramTranscriberLanguage
    FallbackDeepgramTranscriber:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/FallbackDeepgramTranscriberProvider'
          description: This is the transcription provider that will be used.
        model:
          $ref: '#/components/schemas/DeepgramTranscriberModel'
          description: >-
            This is the Deepgram model that will be used. A list of models can be found here:
            https://developers.deepgram.com/docs/models-languages-overview
        language:
          $ref: '#/components/schemas/DeepgramTranscriberLanguage'
          description: >-
            This is the language that will be set for the transcription. The list of languages Deepgram supports can be
            found here: https://developers.deepgram.com/docs/models-languages-overview
        smartFormat:
          type: boolean
          description: >-
            This will be use smart format option provided by Deepgram. It's default disabled because it can sometimes
            format numbers as times but it's getting better.
        mipOptOut:
          type: boolean
          default: false
          description: >-
            If set to true, this will add mip_opt_out=true as a query parameter of all API requests. See
            https://developers.deepgram.com/docs/the-deepgram-model-improvement-partnership-program#want-to-opt-out


            This will only be used if you are using your own Deepgram API key.


            @default false
        numerals:
          type: boolean
          description: >-
            If set to true, this will cause deepgram to convert spoken numbers to literal numerals. For example, "my
            phone number is nine-seven-two..." would become "my phone number is 972..."


            @default false
        profanityFilter:
          type: boolean
          description: |-
            If set to true, Deepgram will replace profanity in transcripts with surrounding asterisks, e.g. "f***".

            @default false
        confidenceThreshold:
          type: number
          format: double
          description: |-
            Transcripts below this confidence threshold will be discarded.

            @default 0.4
        eagerEotThreshold:
          type: number
          format: double
          description: >-
            Eager end-of-turn confidence required to fire a eager end-of-turn event. Setting a value here will enable
            EagerEndOfTurn and SpeechResumed events. It is disabled by default. Only used with Flux models.
        eotThreshold:
          type: number
          format: double
          description: |-
            End-of-turn confidence required to finish a turn. Only used with Flux models.

            @default 0.7
        eotTimeoutMs:
          type: number
          format: double
          description: >-
            A turn will be finished when this much time has passed after speech, regardless of EOT confidence. Only used
            with Flux models.


            @default 5000
        keywords:
          type: array
          items:
            type: string
          description: >-
            These keywords are passed to the transcription model to help it pick up use-case specific words. Anything
            that may not be a common word, like your company name, should be added here.
        keyterm:
          type: array
          items:
            type: string
          description: Keyterm Prompting allows you improve Keyword Recall Rate (KRR) for important keyterms or phrases up to 90%.
        endpointing:
          type: number
          format: double
          description: >-
            This is the timeout after which Deepgram will send transcription on user silence. You can read in-depth
            documentation here: https://developers.deepgram.com/docs/endpointing.


            Here are the most important bits:

            - Defaults to 10. This is recommended for most use cases to optimize for latency.

            - 10 can cause some missing transcriptions since because of the shorter context. This mostly happens for
            one-word utterances. For those uses cases, it's recommended to try 300. It will add a bit of latency but the
            quality and reliability of the experience will be better.

            - If neither 10 nor 300 work, contact support@vapi.ai and we'll find another solution.


            @default 10
      required:
        - provider
      title: FallbackDeepgramTranscriber
    FallbackElevenLabsTranscriberProvider:
      type: string
      enum:
        - 11labs
      description: This is the transcription provider that will be used.
      title: FallbackElevenLabsTranscriberProvider
    FallbackElevenLabsTranscriberModel0:
      type: string
      enum:
        - scribe_v1
        - scribe_v2
        - scribe_v2_realtime
      title: FallbackElevenLabsTranscriberModel0
    FallbackElevenLabsTranscriberModel:
      oneOf:
        - $ref: '#/components/schemas/FallbackElevenLabsTranscriberModel0'
      description: This is the model that will be used for the transcription.
      title: FallbackElevenLabsTranscriberModel
    FallbackElevenLabsTranscriberLanguage:
      type: string
      enum:
        - aa
        - ab
        - ae
        - af
        - ak
        - am
        - an
        - ar
        - as
        - av
        - ay
        - az
        - ba
        - be
        - bg
        - bh
        - bi
        - bm
        - bn
        - bo
        - br
        - bs
        - ca
        - ce
        - ch
        - co
        - cr
        - cs
        - cu
        - cv
        - cy
        - da
        - de
        - dv
        - dz
        - ee
        - el
        - en
        - eo
        - es
        - et
        - eu
        - fa
        - ff
        - fi
        - fj
        - fo
        - fr
        - fy
        - ga
        - gd
        - gl
        - gn
        - gu
        - gv
        - ha
        - he
        - hi
        - ho
        - hr
        - ht
        - hu
        - hy
        - hz
        - ia
        - id
        - ie
        - ig
        - ii
        - ik
        - io
        - is
        - it
        - iu
        - ja
        - jv
        - ka
        - kg
        - ki
        - kj
        - kk
        - kl
        - km
        - kn
        - ko
        - kr
        - ks
        - ku
        - kv
        - kw
        - ky
        - la
        - lb
        - lg
        - li
        - ln
        - lo
        - lt
        - lu
        - lv
        - mg
        - mh
        - mi
        - mk
        - ml
        - mn
        - mr
        - ms
        - mt
        - my
        - na
        - nb
        - nd
        - ne
        - ng
        - nl
        - nn
        - 'no'
        - nr
        - nv
        - ny
        - oc
        - oj
        - om
        - or
        - os
        - pa
        - pi
        - pl
        - ps
        - pt
        - qu
        - rm
        - rn
        - ro
        - ru
        - rw
        - sa
        - sc
        - sd
        - se
        - sg
        - si
        - sk
        - sl
        - sm
        - sn
        - so
        - sq
        - sr
        - ss
        - st
        - su
        - sv
        - sw
        - ta
        - te
        - tg
        - th
        - ti
        - tk
        - tl
        - tn
        - to
        - tr
        - ts
        - tt
        - tw
        - ty
        - ug
        - uk
        - ur
        - uz
        - ve
        - vi
        - vo
        - wa
        - wo
        - xh
        - yi
        - yue
        - yo
        - za
        - zh
        - zu
      description: This is the language that will be used for the transcription.
      title: FallbackElevenLabsTranscriberLanguage
    FallbackElevenLabsTranscriber:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/FallbackElevenLabsTranscriberProvider'
          description: This is the transcription provider that will be used.
        model:
          $ref: '#/components/schemas/FallbackElevenLabsTranscriberModel'
          description: This is the model that will be used for the transcription.
        language:
          $ref: '#/components/schemas/FallbackElevenLabsTranscriberLanguage'
          description: This is the language that will be used for the transcription.
        silenceThresholdSeconds:
          type: number
          format: double
          description: This is the number of seconds of silence before VAD commits (0.3-3.0).
        confidenceThreshold:
          type: number
          format: double
          description: This is the VAD sensitivity (0.1-0.9, lower indicates more sensitive).
        minSpeechDurationMs:
          type: number
          format: double
          description: This is the minimum speech duration for VAD (50-2000ms).
        minSilenceDurationMs:
          type: number
          format: double
          description: This is the minimum silence duration for VAD (50-2000ms).
      required:
        - provider
      title: FallbackElevenLabsTranscriber
    FallbackGladiaTranscriberProvider:
      type: string
      enum:
        - gladia
      description: This is the transcription provider that will be used.
      title: FallbackGladiaTranscriberProvider
    FallbackGladiaTranscriberModel0:
      type: string
      enum:
        - fast
        - accurate
        - solaria-1
      title: FallbackGladiaTranscriberModel0
    FallbackGladiaTranscriberModel:
      oneOf:
        - $ref: '#/components/schemas/FallbackGladiaTranscriberModel0'
      description: This is the Gladia model that will be used. Default is 'fast'
      title: FallbackGladiaTranscriberModel
    FallbackGladiaTranscriberLanguageBehaviour0:
      type: string
      enum:
        - manual
        - automatic single language
        - automatic multiple languages
      title: FallbackGladiaTranscriberLanguageBehaviour0
    FallbackGladiaTranscriberLanguageBehaviour:
      oneOf:
        - $ref: '#/components/schemas/FallbackGladiaTranscriberLanguageBehaviour0'
      description: Defines how the transcription model detects the audio language. Default value is 'automatic single language'.
      title: FallbackGladiaTranscriberLanguageBehaviour
    FallbackGladiaTranscriberLanguage:
      type: string
      enum:
        - af
        - sq
        - am
        - ar
        - hy
        - as
        - az
        - ba
        - eu
        - be
        - bn
        - bs
        - br
        - bg
        - ca
        - zh
        - hr
        - cs
        - da
        - nl
        - en
        - et
        - fo
        - fi
        - fr
        - gl
        - ka
        - de
        - el
        - gu
        - ht
        - ha
        - haw
        - he
        - hi
        - hu
        - is
        - id
        - it
        - ja
        - jv
        - kn
        - kk
        - km
        - ko
        - lo
        - la
        - lv
        - ln
        - lt
        - lb
        - mk
        - mg
        - ms
        - ml
        - mt
        - mi
        - mr
        - mn
        - my
        - ne
        - 'no'
        - nn
        - oc
        - ps
        - fa
        - pl
        - pt
        - pa
        - ro
        - ru
        - sa
        - sr
        - sn
        - sd
        - si
        - sk
        - sl
        - so
        - es
        - su
        - sw
        - sv
        - tl
        - tg
        - ta
        - tt
        - te
        - th
        - bo
        - tr
        - tk
        - uk
        - ur
        - uz
        - vi
        - cy
        - yi
        - yo
      description: Defines the language to use for the transcription. Required when languageBehaviour is 'manual'.
      title: FallbackGladiaTranscriberLanguage
    FallbackGladiaTranscriberLanguages:
      type: string
      enum:
        - af
        - sq
        - am
        - ar
        - hy
        - as
        - az
        - ba
        - eu
        - be
        - bn
        - bs
        - br
        - bg
        - ca
        - zh
        - hr
        - cs
        - da
        - nl
        - en
        - et
        - fo
        - fi
        - fr
        - gl
        - ka
        - de
        - el
        - gu
        - ht
        - ha
        - haw
        - he
        - hi
        - hu
        - is
        - id
        - it
        - ja
        - jv
        - kn
        - kk
        - km
        - ko
        - lo
        - la
        - lv
        - ln
        - lt
        - lb
        - mk
        - mg
        - ms
        - ml
        - mt
        - mi
        - mr
        - mn
        - my
        - ne
        - 'no'
        - nn
        - oc
        - ps
        - fa
        - pl
        - pt
        - pa
        - ro
        - ru
        - sa
        - sr
        - sn
        - sd
        - si
        - sk
        - sl
        - so
        - es
        - su
        - sw
        - sv
        - tl
        - tg
        - ta
        - tt
        - te
        - th
        - bo
        - tr
        - tk
        - uk
        - ur
        - uz
        - vi
        - cy
        - yi
        - yo
      description: Defines the languages to use for the transcription. Required when languageBehaviour is 'manual'.
      title: FallbackGladiaTranscriberLanguages
    GladiaVocabularyItemDTO:
      type: object
      properties:
        value:
          type: string
          description: The vocabulary word or phrase
        pronunciations:
          type: array
          items:
            type: string
          description: Alternative pronunciations for the vocabulary item
        intensity:
          type: number
          format: double
          description: Intensity for this specific vocabulary item (0.0 to 1.0)
        language:
          type: string
          description: Language code for this vocabulary item (ISO 639-1)
      required:
        - value
      title: GladiaVocabularyItemDTO
    GladiaCustomVocabularyConfigDtoVocabularyItems:
      oneOf:
        - type: string
        - $ref: '#/components/schemas/GladiaVocabularyItemDTO'
      title: GladiaCustomVocabularyConfigDtoVocabularyItems
    GladiaCustomVocabularyConfigDTO:
      type: object
      properties:
        vocabulary:
          type: array
          items:
            $ref: '#/components/schemas/GladiaCustomVocabularyConfigDtoVocabularyItems'
          description: Array of vocabulary items (strings or objects with value, pronunciations, intensity, language)
        defaultIntensity:
          type: number
          format: double
          default: 0.5
          description: Default intensity for vocabulary items (0.0 to 1.0)
      required:
        - vocabulary
      title: GladiaCustomVocabularyConfigDTO
    FallbackGladiaTranscriberRegion:
      type: string
      enum:
        - us-west
        - eu-west
      description: Region for processing audio (us-west or eu-west)
      title: FallbackGladiaTranscriberRegion
    FallbackGladiaTranscriber:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/FallbackGladiaTranscriberProvider'
          description: This is the transcription provider that will be used.
        model:
          $ref: '#/components/schemas/FallbackGladiaTranscriberModel'
          description: This is the Gladia model that will be used. Default is 'fast'
        languageBehaviour:
          $ref: '#/components/schemas/FallbackGladiaTranscriberLanguageBehaviour'
          description: >-
            Defines how the transcription model detects the audio language. Default value is 'automatic single
            language'.
        language:
          $ref: '#/components/schemas/FallbackGladiaTranscriberLanguage'
          description: Defines the language to use for the transcription. Required when languageBehaviour is 'manual'.
        languages:
          $ref: '#/components/schemas/FallbackGladiaTranscriberLanguages'
          description: Defines the languages to use for the transcription. Required when languageBehaviour is 'manual'.
        transcriptionHint:
          type: string
          description: >-
            Provides a custom vocabulary to the model to improve accuracy of transcribing context specific words,
            technical terms, names, etc. If empty, this argument is ignored.

            ⚠️ Warning ⚠️: Please be aware that the transcription_hint field has a character limit of 600. If you
            provide a transcription_hint longer than 600 characters, it will be automatically truncated to meet this
            limit.
        prosody:
          type: boolean
          description: >-
            If prosody is true, you will get a transcription that can contain prosodies i.e. (laugh) (giggles) (malefic
            laugh) (toss) (music)… Default value is false.
        audioEnhancer:
          type: boolean
          description: If true, audio will be pre-processed to improve accuracy but latency will increase. Default value is false.
        confidenceThreshold:
          type: number
          format: double
          description: |-
            Transcripts below this confidence threshold will be discarded.

            @default 0.4
        endpointing:
          type: number
          format: double
          description: Endpointing time in seconds - time to wait before considering speech ended
        speechThreshold:
          type: number
          format: double
          description: Speech threshold - sensitivity configuration for speech detection (0.0 to 1.0)
        customVocabularyEnabled:
          type: boolean
          description: Enable custom vocabulary for improved accuracy
        customVocabularyConfig:
          $ref: '#/components/schemas/GladiaCustomVocabularyConfigDTO'
          description: Custom vocabulary configuration
        region:
          $ref: '#/components/schemas/FallbackGladiaTranscriberRegion'
          description: Region for processing audio (us-west or eu-west)
        receivePartialTranscripts:
          type: boolean
          description: Enable partial transcripts for low-latency streaming transcription
      required:
        - provider
      title: FallbackGladiaTranscriber
    FallbackGoogleTranscriberProvider:
      type: string
      enum:
        - google
      description: This is the transcription provider that will be used.
      title: FallbackGoogleTranscriberProvider
    FallbackGoogleTranscriberModel:
      type: string
      enum:
        - gemini-3-flash-preview
        - gemini-2.5-pro
        - gemini-2.5-flash
        - gemini-2.5-flash-lite
        - gemini-2.0-flash-thinking-exp
        - gemini-2.0-pro-exp-02-05
        - gemini-2.0-flash
        - gemini-2.0-flash-lite
        - gemini-2.0-flash-exp
        - gemini-2.0-flash-realtime-exp
        - gemini-1.5-flash
        - gemini-1.5-flash-002
        - gemini-1.5-pro
        - gemini-1.5-pro-002
        - gemini-1.0-pro
      description: This is the model that will be used for the transcription.
      title: FallbackGoogleTranscriberModel
    FallbackGoogleTranscriberLanguage:
      type: string
      enum:
        - Multilingual
        - Arabic
        - Bengali
        - Bulgarian
        - Chinese
        - Croatian
        - Czech
        - Danish
        - Dutch
        - English
        - Estonian
        - Finnish
        - French
        - German
        - Greek
        - Hebrew
        - Hindi
        - Hungarian
        - Indonesian
        - Italian
        - Japanese
        - Korean
        - Latvian
        - Lithuanian
        - Norwegian
        - Polish
        - Portuguese
        - Romanian
        - Russian
        - Serbian
        - Slovak
        - Slovenian
        - Spanish
        - Swahili
        - Swedish
        - Thai
        - Turkish
        - Ukrainian
        - Vietnamese
      description: This is the language that will be set for the transcription.
      title: FallbackGoogleTranscriberLanguage
    FallbackGoogleTranscriber:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/FallbackGoogleTranscriberProvider'
          description: This is the transcription provider that will be used.
        model:
          $ref: '#/components/schemas/FallbackGoogleTranscriberModel'
          description: This is the model that will be used for the transcription.
        language:
          $ref: '#/components/schemas/FallbackGoogleTranscriberLanguage'
          description: This is the language that will be set for the transcription.
      required:
        - provider
      title: FallbackGoogleTranscriber
    FallbackTalkscriberTranscriberProvider:
      type: string
      enum:
        - talkscriber
      description: This is the transcription provider that will be used.
      title: FallbackTalkscriberTranscriberProvider
    FallbackTalkscriberTranscriberModel:
      type: string
      enum:
        - whisper
      description: This is the model that will be used for the transcription.
      title: FallbackTalkscriberTranscriberModel
    FallbackTalkscriberTranscriberLanguage:
      type: string
      enum:
        - en
        - zh
        - de
        - es
        - ru
        - ko
        - fr
        - ja
        - pt
        - tr
        - pl
        - ca
        - nl
        - ar
        - sv
        - it
        - id
        - hi
        - fi
        - vi
        - he
        - uk
        - el
        - ms
        - cs
        - ro
        - da
        - hu
        - ta
        - 'no'
        - th
        - ur
        - hr
        - bg
        - lt
        - la
        - mi
        - ml
        - cy
        - sk
        - te
        - fa
        - lv
        - bn
        - sr
        - az
        - sl
        - kn
        - et
        - mk
        - br
        - eu
        - is
        - hy
        - ne
        - mn
        - bs
        - kk
        - sq
        - sw
        - gl
        - mr
        - pa
        - si
        - km
        - sn
        - yo
        - so
        - af
        - oc
        - ka
        - be
        - tg
        - sd
        - gu
        - am
        - yi
        - lo
        - uz
        - fo
        - ht
        - ps
        - tk
        - nn
        - mt
        - sa
        - lb
        - my
        - bo
        - tl
        - mg
        - as
        - tt
        - haw
        - ln
        - ha
        - ba
        - jw
        - su
        - yue
      description: >-
        This is the language that will be set for the transcription. The list of languages Whisper supports can be found
        here: https://github.com/openai/whisper/blob/main/whisper/tokenizer.py
      title: FallbackTalkscriberTranscriberLanguage
    FallbackTalkscriberTranscriber:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/FallbackTalkscriberTranscriberProvider'
          description: This is the transcription provider that will be used.
        model:
          $ref: '#/components/schemas/FallbackTalkscriberTranscriberModel'
          description: This is the model that will be used for the transcription.
        language:
          $ref: '#/components/schemas/FallbackTalkscriberTranscriberLanguage'
          description: >-
            This is the language that will be set for the transcription. The list of languages Whisper supports can be
            found here: https://github.com/openai/whisper/blob/main/whisper/tokenizer.py
      required:
        - provider
      title: FallbackTalkscriberTranscriber
    FallbackSpeechmaticsTranscriberProvider:
      type: string
      enum:
        - speechmatics
      description: This is the transcription provider that will be used.
      title: FallbackSpeechmaticsTranscriberProvider
    FallbackSpeechmaticsTranscriberModel:
      type: string
      enum:
        - default
      description: This is the model that will be used for the transcription.
      title: FallbackSpeechmaticsTranscriberModel
    FallbackSpeechmaticsTranscriberLanguage:
      type: string
      enum:
        - auto
        - ar
        - ar_en
        - ba
        - eu
        - be
        - bn
        - bg
        - yue
        - ca
        - hr
        - cs
        - da
        - nl
        - en
        - eo
        - et
        - fi
        - fr
        - gl
        - de
        - el
        - he
        - hi
        - hu
        - id
        - ia
        - ga
        - it
        - ja
        - ko
        - lv
        - lt
        - ms
        - en_ms
        - mt
        - cmn
        - cmn_en
        - mr
        - mn
        - 'no'
        - fa
        - pl
        - pt
        - ro
        - ru
        - sk
        - sl
        - es
        - en_es
        - sw
        - sv
        - tl
        - ta
        - en_ta
        - th
        - tr
        - uk
        - ur
        - ug
        - vi
        - cy
      title: FallbackSpeechmaticsTranscriberLanguage
    FallbackSpeechmaticsTranscriberOperatingPoint:
      type: string
      enum:
        - standard
        - enhanced
      default: enhanced
      description: >-
        This is the operating point for the transcription. Choose between `standard` for faster turnaround with strong
        accuracy or `enhanced` for highest accuracy when precision is critical.


        @default 'enhanced'
      title: FallbackSpeechmaticsTranscriberOperatingPoint
    FallbackSpeechmaticsTranscriberRegion:
      type: string
      enum:
        - eu
        - us
      default: eu
      description: >-
        This is the region for the Speechmatics API. Choose between EU (Europe) and US (United States) regions for lower
        latency and data sovereignty compliance.


        @default 'eu'
      title: FallbackSpeechmaticsTranscriberRegion
    SpeechmaticsCustomVocabularyItem:
      type: object
      properties:
        content:
          type: string
          description: The word or phrase to add to the custom vocabulary.
        soundsLike:
          type: array
          items:
            type: string
          description: >-
            Alternative phonetic representations of how the word might sound. This helps recognition when the word might
            be pronounced differently.
      required:
        - content
      title: SpeechmaticsCustomVocabularyItem
    FallbackSpeechmaticsTranscriberNumeralStyle:
      type: string
      enum:
        - written
        - spoken
      default: written
      description: |-
        This controls how numbers, dates, currencies, and other entities are formatted in the transcription output.

        @default 'written'
      title: FallbackSpeechmaticsTranscriberNumeralStyle
    FallbackSpeechmaticsTranscriber:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/FallbackSpeechmaticsTranscriberProvider'
          description: This is the transcription provider that will be used.
        model:
          $ref: '#/components/schemas/FallbackSpeechmaticsTranscriberModel'
          description: This is the model that will be used for the transcription.
        language:
          $ref: '#/components/schemas/FallbackSpeechmaticsTranscriberLanguage'
        operatingPoint:
          $ref: '#/components/schemas/FallbackSpeechmaticsTranscriberOperatingPoint'
          description: >-
            This is the operating point for the transcription. Choose between `standard` for faster turnaround with
            strong accuracy or `enhanced` for highest accuracy when precision is critical.


            @default 'enhanced'
        region:
          $ref: '#/components/schemas/FallbackSpeechmaticsTranscriberRegion'
          description: >-
            This is the region for the Speechmatics API. Choose between EU (Europe) and US (United States) regions for
            lower latency and data sovereignty compliance.


            @default 'eu'
        enableDiarization:
          type: boolean
          default: false
          description: >-
            This enables speaker diarization, which identifies and separates speakers in the transcription. Essential
            for multi-speaker conversations and conference calls.


            @default false
        maxDelay:
          type: number
          format: double
          default: 3000
          description: |-
            This sets the maximum delay in milliseconds for partial transcripts. Balances latency and accuracy.

            @default 3000
        customVocabulary:
          type: array
          items:
            $ref: '#/components/schemas/SpeechmaticsCustomVocabularyItem'
        numeralStyle:
          $ref: '#/components/schemas/FallbackSpeechmaticsTranscriberNumeralStyle'
          description: |-
            This controls how numbers, dates, currencies, and other entities are formatted in the transcription output.

            @default 'written'
        endOfTurnSensitivity:
          type: number
          format: double
          default: 0.5
          description: >-
            This is the sensitivity level for end-of-turn detection, which determines when a speaker has finished
            talking. Higher values are more sensitive.


            @default 0.5
        removeDisfluencies:
          type: boolean
          default: false
          description: >-
            This enables removal of disfluencies (um, uh) from the transcript to create cleaner, more professional
            output.


            This is only supported for the English language transcriber.


            @default false
        minimumSpeechDuration:
          type: number
          format: double
          default: 0
          description: >-
            This is the minimum duration in seconds for speech segments. Shorter segments will be filtered out. Helps
            remove noise and improve accuracy.


            @default 0.0
      required:
        - provider
        - customVocabulary
      title: FallbackSpeechmaticsTranscriber
    FallbackOpenAiTranscriberProvider:
      type: string
      enum:
        - openai
      description: This is the transcription provider that will be used.
      title: FallbackOpenAiTranscriberProvider
    FallbackOpenAiTranscriberModel:
      type: string
      enum:
        - gpt-4o-transcribe
        - gpt-4o-mini-transcribe
      description: This is the model that will be used for the transcription.
      title: FallbackOpenAiTranscriberModel
    FallbackOpenAiTranscriberLanguage:
      type: string
      enum:
        - af
        - ar
        - hy
        - az
        - be
        - bs
        - bg
        - ca
        - zh
        - hr
        - cs
        - da
        - nl
        - en
        - et
        - fi
        - fr
        - gl
        - de
        - el
        - he
        - hi
        - hu
        - is
        - id
        - it
        - ja
        - kn
        - kk
        - ko
        - lv
        - lt
        - mk
        - ms
        - mr
        - mi
        - ne
        - 'no'
        - fa
        - pl
        - pt
        - ro
        - ru
        - sr
        - sk
        - sl
        - es
        - sw
        - sv
        - tl
        - ta
        - th
        - tr
        - uk
        - ur
        - vi
        - cy
      description: This is the language that will be set for the transcription.
      title: FallbackOpenAiTranscriberLanguage
    FallbackOpenAITranscriber:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/FallbackOpenAiTranscriberProvider'
          description: This is the transcription provider that will be used.
        model:
          $ref: '#/components/schemas/FallbackOpenAiTranscriberModel'
          description: This is the model that will be used for the transcription.
        language:
          $ref: '#/components/schemas/FallbackOpenAiTranscriberLanguage'
          description: This is the language that will be set for the transcription.
      required:
        - provider
        - model
      title: FallbackOpenAITranscriber
    FallbackCartesiaTranscriberProvider:
      type: string
      enum:
        - cartesia
      title: FallbackCartesiaTranscriberProvider
    FallbackCartesiaTranscriberModel:
      type: string
      enum:
        - ink-whisper
      title: FallbackCartesiaTranscriberModel
    FallbackCartesiaTranscriberLanguage:
      type: string
      enum:
        - aa
        - ab
        - ae
        - af
        - ak
        - am
        - an
        - ar
        - as
        - av
        - ay
        - az
        - ba
        - be
        - bg
        - bh
        - bi
        - bm
        - bn
        - bo
        - br
        - bs
        - ca
        - ce
        - ch
        - co
        - cr
        - cs
        - cu
        - cv
        - cy
        - da
        - de
        - dv
        - dz
        - ee
        - el
        - en
        - eo
        - es
        - et
        - eu
        - fa
        - ff
        - fi
        - fj
        - fo
        - fr
        - fy
        - ga
        - gd
        - gl
        - gn
        - gu
        - gv
        - ha
        - he
        - hi
        - ho
        - hr
        - ht
        - hu
        - hy
        - hz
        - ia
        - id
        - ie
        - ig
        - ii
        - ik
        - io
        - is
        - it
        - iu
        - ja
        - jv
        - ka
        - kg
        - ki
        - kj
        - kk
        - kl
        - km
        - kn
        - ko
        - kr
        - ks
        - ku
        - kv
        - kw
        - ky
        - la
        - lb
        - lg
        - li
        - ln
        - lo
        - lt
        - lu
        - lv
        - mg
        - mh
        - mi
        - mk
        - ml
        - mn
        - mr
        - ms
        - mt
        - my
        - na
        - nb
        - nd
        - ne
        - ng
        - nl
        - nn
        - 'no'
        - nr
        - nv
        - ny
        - oc
        - oj
        - om
        - or
        - os
        - pa
        - pi
        - pl
        - ps
        - pt
        - qu
        - rm
        - rn
        - ro
        - ru
        - rw
        - sa
        - sc
        - sd
        - se
        - sg
        - si
        - sk
        - sl
        - sm
        - sn
        - so
        - sq
        - sr
        - ss
        - st
        - su
        - sv
        - sw
        - ta
        - te
        - tg
        - th
        - ti
        - tk
        - tl
        - tn
        - to
        - tr
        - ts
        - tt
        - tw
        - ty
        - ug
        - uk
        - ur
        - uz
        - ve
        - vi
        - vo
        - wa
        - wo
        - xh
        - yi
        - yue
        - yo
        - za
        - zh
        - zu
      title: FallbackCartesiaTranscriberLanguage
    FallbackCartesiaTranscriber:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/FallbackCartesiaTranscriberProvider'
        model:
          $ref: '#/components/schemas/FallbackCartesiaTranscriberModel'
        language:
          $ref: '#/components/schemas/FallbackCartesiaTranscriberLanguage'
      required:
        - provider
      title: FallbackCartesiaTranscriber
    FallbackSonioxTranscriberProvider:
      type: string
      enum:
        - soniox
      title: FallbackSonioxTranscriberProvider
    FallbackSonioxTranscriberModel:
      type: string
      enum:
        - stt-rt-v4
      description: The Soniox model to use for transcription.
      title: FallbackSonioxTranscriberModel
    FallbackSonioxTranscriberLanguage:
      type: string
      enum:
        - aa
        - ab
        - ae
        - af
        - ak
        - am
        - an
        - ar
        - as
        - av
        - ay
        - az
        - ba
        - be
        - bg
        - bh
        - bi
        - bm
        - bn
        - bo
        - br
        - bs
        - ca
        - ce
        - ch
        - co
        - cr
        - cs
        - cu
        - cv
        - cy
        - da
        - de
        - dv
        - dz
        - ee
        - el
        - en
        - eo
        - es
        - et
        - eu
        - fa
        - ff
        - fi
        - fj
        - fo
        - fr
        - fy
        - ga
        - gd
        - gl
        - gn
        - gu
        - gv
        - ha
        - he
        - hi
        - ho
        - hr
        - ht
        - hu
        - hy
        - hz
        - ia
        - id
        - ie
        - ig
        - ii
        - ik
        - io
        - is
        - it
        - iu
        - ja
        - jv
        - ka
        - kg
        - ki
        - kj
        - kk
        - kl
        - km
        - kn
        - ko
        - kr
        - ks
        - ku
        - kv
        - kw
        - ky
        - la
        - lb
        - lg
        - li
        - ln
        - lo
        - lt
        - lu
        - lv
        - mg
        - mh
        - mi
        - mk
        - ml
        - mn
        - mr
        - ms
        - mt
        - my
        - na
        - nb
        - nd
        - ne
        - ng
        - nl
        - nn
        - 'no'
        - nr
        - nv
        - ny
        - oc
        - oj
        - om
        - or
        - os
        - pa
        - pi
        - pl
        - ps
        - pt
        - qu
        - rm
        - rn
        - ro
        - ru
        - rw
        - sa
        - sc
        - sd
        - se
        - sg
        - si
        - sk
        - sl
        - sm
        - sn
        - so
        - sq
        - sr
        - ss
        - st
        - su
        - sv
        - sw
        - ta
        - te
        - tg
        - th
        - ti
        - tk
        - tl
        - tn
        - to
        - tr
        - ts
        - tt
        - tw
        - ty
        - ug
        - uk
        - ur
        - uz
        - ve
        - vi
        - vo
        - wa
        - wo
        - xh
        - yi
        - yue
        - yo
        - za
        - zh
        - zu
      description: >-
        The language for transcription. Uses ISO 639-1 codes. Soniox supports 60+ languages with a single universal
        model.
      title: FallbackSonioxTranscriberLanguage
    FallbackSonioxTranscriber:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/FallbackSonioxTranscriberProvider'
        model:
          $ref: '#/components/schemas/FallbackSonioxTranscriberModel'
          description: The Soniox model to use for transcription.
        language:
          $ref: '#/components/schemas/FallbackSonioxTranscriberLanguage'
          description: >-
            The language for transcription. Uses ISO 639-1 codes. Soniox supports 60+ languages with a single universal
            model.
        languageHintsStrict:
          type: boolean
          description: >-
            When enabled, restricts transcription to the language specified in the language field. When disabled, the
            model can detect and transcribe any of 60+ supported languages. Defaults to true.
        maxEndpointDelayMs:
          type: number
          format: double
          description: >-
            Maximum delay in milliseconds between when the speaker stops and when the endpoint is detected. Lower values
            mean faster turn-taking but more false endpoints. Range: 500-3000. Default: 500.
        customVocabulary:
          type: array
          items:
            type: string
          description: >-
            Custom vocabulary terms to boost recognition accuracy. Useful for brand names, product names, and
            domain-specific terminology. Maps to Soniox context.terms.
      required:
        - provider
      title: FallbackSonioxTranscriber
    FallbackTranscriberPlanTranscribersItems:
      oneOf:
        - $ref: '#/components/schemas/FallbackAssemblyAITranscriber'
        - $ref: '#/components/schemas/FallbackAzureSpeechTranscriber'
        - $ref: '#/components/schemas/FallbackCustomTranscriber'
        - $ref: '#/components/schemas/FallbackDeepgramTranscriber'
        - $ref: '#/components/schemas/FallbackElevenLabsTranscriber'
        - $ref: '#/components/schemas/FallbackGladiaTranscriber'
        - $ref: '#/components/schemas/FallbackGoogleTranscriber'
        - $ref: '#/components/schemas/FallbackTalkscriberTranscriber'
        - $ref: '#/components/schemas/FallbackSpeechmaticsTranscriber'
        - $ref: '#/components/schemas/FallbackOpenAITranscriber'
        - $ref: '#/components/schemas/FallbackCartesiaTranscriber'
        - $ref: '#/components/schemas/FallbackSonioxTranscriber'
      title: FallbackTranscriberPlanTranscribersItems
    FallbackTranscriberPlan:
      type: object
      properties:
        transcribers:
          type: array
          items:
            $ref: '#/components/schemas/FallbackTranscriberPlanTranscribersItems'
      required:
        - transcribers
      title: FallbackTranscriberPlan
    AssemblyAITranscriber:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/AssemblyAiTranscriberProvider'
          description: This is the transcription provider that will be used.
        language:
          $ref: '#/components/schemas/AssemblyAiTranscriberLanguage'
          description: This is the language that will be set for the transcription.
        confidenceThreshold:
          type: number
          format: double
          description: |-
            Transcripts below this confidence threshold will be discarded.

            @default 0.4
        formatTurns:
          type: boolean
          description: |-
            This enables formatting of transcripts.

            @default true
        endOfTurnConfidenceThreshold:
          type: number
          format: double
          description: |-
            This is the end of turn confidence threshold. The minimum confidence that the end of turn is detected.
            Note: Only used if startSpeakingPlan.smartEndpointingPlan is not set.
            @min 0
            @max 1
            @default 0.7
        minEndOfTurnSilenceWhenConfident:
          type: number
          format: double
          description: |-
            This is the minimum end of turn silence when confident in milliseconds.
            Note: Only used if startSpeakingPlan.smartEndpointingPlan is not set.
            @default 160
        wordFinalizationMaxWaitTime:
          type: number
          format: double
        maxTurnSilence:
          type: number
          format: double
          description: |-
            This is the maximum turn silence time in milliseconds.
            Note: Only used if startSpeakingPlan.smartEndpointingPlan is not set.
            @default 400
        vadAssistedEndpointingEnabled:
          type: boolean
          description: >-
            Use VAD to assist with endpointing decisions from the transcriber.

            When enabled, transcriber endpointing will be buffered if VAD detects the user is still speaking, preventing
            premature turn-taking.

            When disabled, transcriber endpointing will be used immediately regardless of VAD state, allowing for
            quicker but more aggressive turn-taking.

            Note: Only used if startSpeakingPlan.smartEndpointingPlan is not set.


            @default true
        speechModel:
          $ref: '#/components/schemas/AssemblyAiTranscriberSpeechModel'
          description: |-
            This is the speech model used for the streaming session.
            Note: Keyterms prompting is not supported with multilingual streaming.
            @default 'universal-streaming-english'
        realtimeUrl:
          type: string
          description: The WebSocket URL that the transcriber connects to.
        wordBoost:
          type: array
          items:
            type: string
          description: Add up to 2500 characters of custom vocabulary.
        keytermsPrompt:
          type: array
          items:
            type: string
          description: |-
            Keyterms prompting improves recognition accuracy for specific words and phrases.
            Can include up to 100 keyterms, each up to 50 characters.
            Costs an additional $0.04/hour when enabled.
        endUtteranceSilenceThreshold:
          type: number
          format: double
          description: The duration of the end utterance silence threshold in milliseconds.
        disablePartialTranscripts:
          type: boolean
          description: |-
            Disable partial transcripts.
            Set to `true` to not receive partial transcripts. Defaults to `false`.
        fallbackPlan:
          $ref: '#/components/schemas/FallbackTranscriberPlan'
          description: >-
            This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider
            fails.
      required:
        - provider
      title: AssemblyAITranscriber
    AzureSpeechTranscriberProvider:
      type: string
      enum:
        - azure
      description: This is the transcription provider that will be used.
      title: AzureSpeechTranscriberProvider
    AzureSpeechTranscriberLanguage:
      type: string
      enum:
        - af-ZA
        - am-ET
        - ar-AE
        - ar-BH
        - ar-DZ
        - ar-EG
        - ar-IL
        - ar-IQ
        - ar-JO
        - ar-KW
        - ar-LB
        - ar-LY
        - ar-MA
        - ar-OM
        - ar-PS
        - ar-QA
        - ar-SA
        - ar-SY
        - ar-TN
        - ar-YE
        - az-AZ
        - bg-BG
        - bn-IN
        - bs-BA
        - ca-ES
        - cs-CZ
        - cy-GB
        - da-DK
        - de-AT
        - de-CH
        - de-DE
        - el-GR
        - en-AU
        - en-CA
        - en-GB
        - en-GH
        - en-HK
        - en-IE
        - en-IN
        - en-KE
        - en-NG
        - en-NZ
        - en-PH
        - en-SG
        - en-TZ
        - en-US
        - en-ZA
        - es-AR
        - es-BO
        - es-CL
        - es-CO
        - es-CR
        - es-CU
        - es-DO
        - es-EC
        - es-ES
        - es-GQ
        - es-GT
        - es-HN
        - es-MX
        - es-NI
        - es-PA
        - es-PE
        - es-PR
        - es-PY
        - es-SV
        - es-US
        - es-UY
        - es-VE
        - et-EE
        - eu-ES
        - fa-IR
        - fi-FI
        - fil-PH
        - fr-BE
        - fr-CA
        - fr-CH
        - fr-FR
        - ga-IE
        - gl-ES
        - gu-IN
        - he-IL
        - hi-IN
        - hr-HR
        - hu-HU
        - hy-AM
        - id-ID
        - is-IS
        - it-CH
        - it-IT
        - ja-JP
        - jv-ID
        - ka-GE
        - kk-KZ
        - km-KH
        - kn-IN
        - ko-KR
        - lo-LA
        - lt-LT
        - lv-LV
        - mk-MK
        - ml-IN
        - mn-MN
        - mr-IN
        - ms-MY
        - mt-MT
        - my-MM
        - nb-NO
        - ne-NP
        - nl-BE
        - nl-NL
        - pa-IN
        - pl-PL
        - ps-AF
        - pt-BR
        - pt-PT
        - ro-RO
        - ru-RU
        - si-LK
        - sk-SK
        - sl-SI
        - so-SO
        - sq-AL
        - sr-RS
        - sv-SE
        - sw-KE
        - sw-TZ
        - ta-IN
        - te-IN
        - th-TH
        - tr-TR
        - uk-UA
        - ur-IN
        - uz-UZ
        - vi-VN
        - wuu-CN
        - yue-CN
        - zh-CN
        - zh-CN-shandong
        - zh-CN-sichuan
        - zh-HK
        - zh-TW
        - zu-ZA
      description: >-
        This is the language that will be set for the transcription. The list of languages Azure supports can be found
        here: https://learn.microsoft.com/en-us/azure/ai-services/speech-service/language-support?tabs=stt
      title: AzureSpeechTranscriberLanguage
    AzureSpeechTranscriberSegmentationStrategy:
      type: string
      enum:
        - Default
        - Time
        - Semantic
      description: >-
        Controls how phrase boundaries are detected, enabling either simple time/silence heuristics or more advanced
        semantic segmentation.
      title: AzureSpeechTranscriberSegmentationStrategy
    AzureSpeechTranscriber:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/AzureSpeechTranscriberProvider'
          description: This is the transcription provider that will be used.
        language:
          $ref: '#/components/schemas/AzureSpeechTranscriberLanguage'
          description: >-
            This is the language that will be set for the transcription. The list of languages Azure supports can be
            found here: https://learn.microsoft.com/en-us/azure/ai-services/speech-service/language-support?tabs=stt
        segmentationStrategy:
          $ref: '#/components/schemas/AzureSpeechTranscriberSegmentationStrategy'
          description: >-
            Controls how phrase boundaries are detected, enabling either simple time/silence heuristics or more advanced
            semantic segmentation.
        segmentationSilenceTimeoutMs:
          type: number
          format: double
          description: >-
            Duration of detected silence after which the service finalizes a phrase. Configure to adjust sensitivity to
            pauses in speech.
        segmentationMaximumTimeMs:
          type: number
          format: double
          description: Maximum duration a segment can reach before being cut off when using time-based segmentation.
        fallbackPlan:
          $ref: '#/components/schemas/FallbackTranscriberPlan'
          description: >-
            This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider
            fails.
      required:
        - provider
      title: AzureSpeechTranscriber
    CustomTranscriberProvider:
      type: string
      enum:
        - custom-transcriber
      description: >-
        This is the transcription provider that will be used. Use `custom-transcriber` for providers that are not
        natively supported.
      title: CustomTranscriberProvider
    CustomTranscriber:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/CustomTranscriberProvider'
          description: >-
            This is the transcription provider that will be used. Use `custom-transcriber` for providers that are not
            natively supported.
        server:
          $ref: '#/components/schemas/Server'
          description: |-
            This is where the transcription request will be sent.

            Usage:
            1. Vapi will initiate a websocket connection with `server.url`.

            2. Vapi will send an initial text frame with the sample rate. Format:
            ```
                {
                  "type": "start",
                  "encoding": "linear16", // 16-bit raw PCM format
                  "container": "raw",
                  "sampleRate": {{sampleRate}},
                  "channels": 2 // customer is channel 0, assistant is channel 1
                }
            ```

            3. Vapi will send the audio data in 16-bit raw PCM format as binary frames.

            4. You can read the messages something like this:
            ```
            ws.on('message', (data, isBinary) => {
              if (isBinary) {
                pcmBuffer = Buffer.concat([pcmBuffer, data]);
                console.log(`Received PCM data, buffer size: ${pcmBuffer.length}`);
              } else {
                console.log('Received message:', JSON.parse(data.toString()));
              }
            });
            ```

            5. You will respond with transcriptions as you have them. Format:
            ```
             {
                "type": "transcriber-response",
                "transcription": "Hello, world!",
                "channel": "customer" | "assistant"
             }
            ```
        fallbackPlan:
          $ref: '#/components/schemas/FallbackTranscriberPlan'
          description: >-
            This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider
            fails.
      required:
        - provider
        - server
      title: CustomTranscriber
    DeepgramTranscriberProvider:
      type: string
      enum:
        - deepgram
      description: This is the transcription provider that will be used.
      title: DeepgramTranscriberProvider
    DeepgramTranscriber:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/DeepgramTranscriberProvider'
          description: This is the transcription provider that will be used.
        model:
          $ref: '#/components/schemas/DeepgramTranscriberModel'
          description: >-
            This is the Deepgram model that will be used. A list of models can be found here:
            https://developers.deepgram.com/docs/models-languages-overview
        language:
          $ref: '#/components/schemas/DeepgramTranscriberLanguage'
          description: >-
            This is the language that will be set for the transcription. The list of languages Deepgram supports can be
            found here: https://developers.deepgram.com/docs/models-languages-overview
        smartFormat:
          type: boolean
          description: >-
            This will be use smart format option provided by Deepgram. It's default disabled because it can sometimes
            format numbers as times but it's getting better.
        mipOptOut:
          type: boolean
          default: false
          description: >-
            If set to true, this will add mip_opt_out=true as a query parameter of all API requests. See
            https://developers.deepgram.com/docs/the-deepgram-model-improvement-partnership-program#want-to-opt-out


            This will only be used if you are using your own Deepgram API key.


            @default false
        numerals:
          type: boolean
          description: >-
            If set to true, this will cause deepgram to convert spoken numbers to literal numerals. For example, "my
            phone number is nine-seven-two..." would become "my phone number is 972..."


            @default false
        profanityFilter:
          type: boolean
          description: |-
            If set to true, Deepgram will replace profanity in transcripts with surrounding asterisks, e.g. "f***".

            @default false
        confidenceThreshold:
          type: number
          format: double
          description: |-
            Transcripts below this confidence threshold will be discarded.

            @default 0.4
        eagerEotThreshold:
          type: number
          format: double
          description: >-
            Eager end-of-turn confidence required to fire a eager end-of-turn event. Setting a value here will enable
            EagerEndOfTurn and SpeechResumed events. It is disabled by default. Only used with Flux models.
        eotThreshold:
          type: number
          format: double
          description: |-
            End-of-turn confidence required to finish a turn. Only used with Flux models.

            @default 0.7
        eotTimeoutMs:
          type: number
          format: double
          description: >-
            A turn will be finished when this much time has passed after speech, regardless of EOT confidence. Only used
            with Flux models.


            @default 5000
        keywords:
          type: array
          items:
            type: string
          description: >-
            These keywords are passed to the transcription model to help it pick up use-case specific words. Anything
            that may not be a common word, like your company name, should be added here.
        keyterm:
          type: array
          items:
            type: string
          description: Keyterm Prompting allows you improve Keyword Recall Rate (KRR) for important keyterms or phrases up to 90%.
        endpointing:
          type: number
          format: double
          description: >-
            This is the timeout after which Deepgram will send transcription on user silence. You can read in-depth
            documentation here: https://developers.deepgram.com/docs/endpointing.


            Here are the most important bits:

            - Defaults to 10. This is recommended for most use cases to optimize for latency.

            - 10 can cause some missing transcriptions since because of the shorter context. This mostly happens for
            one-word utterances. For those uses cases, it's recommended to try 300. It will add a bit of latency but the
            quality and reliability of the experience will be better.

            - If neither 10 nor 300 work, contact support@vapi.ai and we'll find another solution.


            @default 10
        fallbackPlan:
          $ref: '#/components/schemas/FallbackTranscriberPlan'
          description: >-
            This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider
            fails.
      required:
        - provider
      title: DeepgramTranscriber
    ElevenLabsTranscriberProvider:
      type: string
      enum:
        - 11labs
      description: This is the transcription provider that will be used.
      title: ElevenLabsTranscriberProvider
    ElevenLabsTranscriberModel0:
      type: string
      enum:
        - scribe_v1
        - scribe_v2
        - scribe_v2_realtime
      title: ElevenLabsTranscriberModel0
    ElevenLabsTranscriberModel:
      oneOf:
        - $ref: '#/components/schemas/ElevenLabsTranscriberModel0'
      description: This is the model that will be used for the transcription.
      title: ElevenLabsTranscriberModel
    ElevenLabsTranscriberLanguage:
      type: string
      enum:
        - aa
        - ab
        - ae
        - af
        - ak
        - am
        - an
        - ar
        - as
        - av
        - ay
        - az
        - ba
        - be
        - bg
        - bh
        - bi
        - bm
        - bn
        - bo
        - br
        - bs
        - ca
        - ce
        - ch
        - co
        - cr
        - cs
        - cu
        - cv
        - cy
        - da
        - de
        - dv
        - dz
        - ee
        - el
        - en
        - eo
        - es
        - et
        - eu
        - fa
        - ff
        - fi
        - fj
        - fo
        - fr
        - fy
        - ga
        - gd
        - gl
        - gn
        - gu
        - gv
        - ha
        - he
        - hi
        - ho
        - hr
        - ht
        - hu
        - hy
        - hz
        - ia
        - id
        - ie
        - ig
        - ii
        - ik
        - io
        - is
        - it
        - iu
        - ja
        - jv
        - ka
        - kg
        - ki
        - kj
        - kk
        - kl
        - km
        - kn
        - ko
        - kr
        - ks
        - ku
        - kv
        - kw
        - ky
        - la
        - lb
        - lg
        - li
        - ln
        - lo
        - lt
        - lu
        - lv
        - mg
        - mh
        - mi
        - mk
        - ml
        - mn
        - mr
        - ms
        - mt
        - my
        - na
        - nb
        - nd
        - ne
        - ng
        - nl
        - nn
        - 'no'
        - nr
        - nv
        - ny
        - oc
        - oj
        - om
        - or
        - os
        - pa
        - pi
        - pl
        - ps
        - pt
        - qu
        - rm
        - rn
        - ro
        - ru
        - rw
        - sa
        - sc
        - sd
        - se
        - sg
        - si
        - sk
        - sl
        - sm
        - sn
        - so
        - sq
        - sr
        - ss
        - st
        - su
        - sv
        - sw
        - ta
        - te
        - tg
        - th
        - ti
        - tk
        - tl
        - tn
        - to
        - tr
        - ts
        - tt
        - tw
        - ty
        - ug
        - uk
        - ur
        - uz
        - ve
        - vi
        - vo
        - wa
        - wo
        - xh
        - yi
        - yue
        - yo
        - za
        - zh
        - zu
      description: This is the language that will be used for the transcription.
      title: ElevenLabsTranscriberLanguage
    ElevenLabsTranscriber:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/ElevenLabsTranscriberProvider'
          description: This is the transcription provider that will be used.
        model:
          $ref: '#/components/schemas/ElevenLabsTranscriberModel'
          description: This is the model that will be used for the transcription.
        language:
          $ref: '#/components/schemas/ElevenLabsTranscriberLanguage'
          description: This is the language that will be used for the transcription.
        silenceThresholdSeconds:
          type: number
          format: double
          description: This is the number of seconds of silence before VAD commits (0.3-3.0).
        confidenceThreshold:
          type: number
          format: double
          description: This is the VAD sensitivity (0.1-0.9, lower indicates more sensitive).
        minSpeechDurationMs:
          type: number
          format: double
          description: This is the minimum speech duration for VAD (50-2000ms).
        minSilenceDurationMs:
          type: number
          format: double
          description: This is the minimum silence duration for VAD (50-2000ms).
        fallbackPlan:
          $ref: '#/components/schemas/FallbackTranscriberPlan'
          description: >-
            This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider
            fails.
      required:
        - provider
      title: ElevenLabsTranscriber
    GladiaTranscriberProvider:
      type: string
      enum:
        - gladia
      description: This is the transcription provider that will be used.
      title: GladiaTranscriberProvider
    GladiaTranscriberModel0:
      type: string
      enum:
        - fast
        - accurate
        - solaria-1
      title: GladiaTranscriberModel0
    GladiaTranscriberModel:
      oneOf:
        - $ref: '#/components/schemas/GladiaTranscriberModel0'
      description: This is the Gladia model that will be used. Default is 'fast'
      title: GladiaTranscriberModel
    GladiaTranscriberLanguageBehaviour0:
      type: string
      enum:
        - manual
        - automatic single language
        - automatic multiple languages
      title: GladiaTranscriberLanguageBehaviour0
    GladiaTranscriberLanguageBehaviour:
      oneOf:
        - $ref: '#/components/schemas/GladiaTranscriberLanguageBehaviour0'
      description: Defines how the transcription model detects the audio language. Default value is 'automatic single language'.
      title: GladiaTranscriberLanguageBehaviour
    GladiaTranscriberLanguage:
      type: string
      enum:
        - af
        - sq
        - am
        - ar
        - hy
        - as
        - az
        - ba
        - eu
        - be
        - bn
        - bs
        - br
        - bg
        - ca
        - zh
        - hr
        - cs
        - da
        - nl
        - en
        - et
        - fo
        - fi
        - fr
        - gl
        - ka
        - de
        - el
        - gu
        - ht
        - ha
        - haw
        - he
        - hi
        - hu
        - is
        - id
        - it
        - ja
        - jv
        - kn
        - kk
        - km
        - ko
        - lo
        - la
        - lv
        - ln
        - lt
        - lb
        - mk
        - mg
        - ms
        - ml
        - mt
        - mi
        - mr
        - mn
        - my
        - ne
        - 'no'
        - nn
        - oc
        - ps
        - fa
        - pl
        - pt
        - pa
        - ro
        - ru
        - sa
        - sr
        - sn
        - sd
        - si
        - sk
        - sl
        - so
        - es
        - su
        - sw
        - sv
        - tl
        - tg
        - ta
        - tt
        - te
        - th
        - bo
        - tr
        - tk
        - uk
        - ur
        - uz
        - vi
        - cy
        - yi
        - yo
      description: Defines the language to use for the transcription. Required when languageBehaviour is 'manual'.
      title: GladiaTranscriberLanguage
    GladiaTranscriberLanguages:
      type: string
      enum:
        - af
        - sq
        - am
        - ar
        - hy
        - as
        - az
        - ba
        - eu
        - be
        - bn
        - bs
        - br
        - bg
        - ca
        - zh
        - hr
        - cs
        - da
        - nl
        - en
        - et
        - fo
        - fi
        - fr
        - gl
        - ka
        - de
        - el
        - gu
        - ht
        - ha
        - haw
        - he
        - hi
        - hu
        - is
        - id
        - it
        - ja
        - jv
        - kn
        - kk
        - km
        - ko
        - lo
        - la
        - lv
        - ln
        - lt
        - lb
        - mk
        - mg
        - ms
        - ml
        - mt
        - mi
        - mr
        - mn
        - my
        - ne
        - 'no'
        - nn
        - oc
        - ps
        - fa
        - pl
        - pt
        - pa
        - ro
        - ru
        - sa
        - sr
        - sn
        - sd
        - si
        - sk
        - sl
        - so
        - es
        - su
        - sw
        - sv
        - tl
        - tg
        - ta
        - tt
        - te
        - th
        - bo
        - tr
        - tk
        - uk
        - ur
        - uz
        - vi
        - cy
        - yi
        - yo
      description: Defines the languages to use for the transcription. Required when languageBehaviour is 'manual'.
      title: GladiaTranscriberLanguages
    GladiaTranscriberRegion:
      type: string
      enum:
        - us-west
        - eu-west
      description: Region for processing audio (us-west or eu-west)
      title: GladiaTranscriberRegion
    GladiaTranscriber:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/GladiaTranscriberProvider'
          description: This is the transcription provider that will be used.
        model:
          $ref: '#/components/schemas/GladiaTranscriberModel'
          description: This is the Gladia model that will be used. Default is 'fast'
        languageBehaviour:
          $ref: '#/components/schemas/GladiaTranscriberLanguageBehaviour'
          description: >-
            Defines how the transcription model detects the audio language. Default value is 'automatic single
            language'.
        language:
          $ref: '#/components/schemas/GladiaTranscriberLanguage'
          description: Defines the language to use for the transcription. Required when languageBehaviour is 'manual'.
        languages:
          $ref: '#/components/schemas/GladiaTranscriberLanguages'
          description: Defines the languages to use for the transcription. Required when languageBehaviour is 'manual'.
        transcriptionHint:
          type: string
          description: >-
            Provides a custom vocabulary to the model to improve accuracy of transcribing context specific words,
            technical terms, names, etc. If empty, this argument is ignored.

            ⚠️ Warning ⚠️: Please be aware that the transcription_hint field has a character limit of 600. If you
            provide a transcription_hint longer than 600 characters, it will be automatically truncated to meet this
            limit.
        prosody:
          type: boolean
          description: >-
            If prosody is true, you will get a transcription that can contain prosodies i.e. (laugh) (giggles) (malefic
            laugh) (toss) (music)… Default value is false.
        audioEnhancer:
          type: boolean
          description: If true, audio will be pre-processed to improve accuracy but latency will increase. Default value is false.
        confidenceThreshold:
          type: number
          format: double
          description: |-
            Transcripts below this confidence threshold will be discarded.

            @default 0.4
        endpointing:
          type: number
          format: double
          description: Endpointing time in seconds - time to wait before considering speech ended
        speechThreshold:
          type: number
          format: double
          description: Speech threshold - sensitivity configuration for speech detection (0.0 to 1.0)
        customVocabularyEnabled:
          type: boolean
          description: Enable custom vocabulary for improved accuracy
        customVocabularyConfig:
          $ref: '#/components/schemas/GladiaCustomVocabularyConfigDTO'
          description: Custom vocabulary configuration
        region:
          $ref: '#/components/schemas/GladiaTranscriberRegion'
          description: Region for processing audio (us-west or eu-west)
        receivePartialTranscripts:
          type: boolean
          description: Enable partial transcripts for low-latency streaming transcription
        fallbackPlan:
          $ref: '#/components/schemas/FallbackTranscriberPlan'
          description: >-
            This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider
            fails.
      required:
        - provider
      title: GladiaTranscriber
    GoogleTranscriberProvider:
      type: string
      enum:
        - google
      description: This is the transcription provider that will be used.
      title: GoogleTranscriberProvider
    GoogleTranscriberModel:
      type: string
      enum:
        - gemini-3-flash-preview
        - gemini-2.5-pro
        - gemini-2.5-flash
        - gemini-2.5-flash-lite
        - gemini-2.0-flash-thinking-exp
        - gemini-2.0-pro-exp-02-05
        - gemini-2.0-flash
        - gemini-2.0-flash-lite
        - gemini-2.0-flash-exp
        - gemini-2.0-flash-realtime-exp
        - gemini-1.5-flash
        - gemini-1.5-flash-002
        - gemini-1.5-pro
        - gemini-1.5-pro-002
        - gemini-1.0-pro
      description: This is the model that will be used for the transcription.
      title: GoogleTranscriberModel
    GoogleTranscriberLanguage:
      type: string
      enum:
        - Multilingual
        - Arabic
        - Bengali
        - Bulgarian
        - Chinese
        - Croatian
        - Czech
        - Danish
        - Dutch
        - English
        - Estonian
        - Finnish
        - French
        - German
        - Greek
        - Hebrew
        - Hindi
        - Hungarian
        - Indonesian
        - Italian
        - Japanese
        - Korean
        - Latvian
        - Lithuanian
        - Norwegian
        - Polish
        - Portuguese
        - Romanian
        - Russian
        - Serbian
        - Slovak
        - Slovenian
        - Spanish
        - Swahili
        - Swedish
        - Thai
        - Turkish
        - Ukrainian
        - Vietnamese
      description: This is the language that will be set for the transcription.
      title: GoogleTranscriberLanguage
    GoogleTranscriber:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/GoogleTranscriberProvider'
          description: This is the transcription provider that will be used.
        model:
          $ref: '#/components/schemas/GoogleTranscriberModel'
          description: This is the model that will be used for the transcription.
        language:
          $ref: '#/components/schemas/GoogleTranscriberLanguage'
          description: This is the language that will be set for the transcription.
        fallbackPlan:
          $ref: '#/components/schemas/FallbackTranscriberPlan'
          description: >-
            This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider
            fails.
      required:
        - provider
      title: GoogleTranscriber
    SpeechmaticsTranscriberProvider:
      type: string
      enum:
        - speechmatics
      description: This is the transcription provider that will be used.
      title: SpeechmaticsTranscriberProvider
    SpeechmaticsTranscriberModel:
      type: string
      enum:
        - default
      description: This is the model that will be used for the transcription.
      title: SpeechmaticsTranscriberModel
    SpeechmaticsTranscriberLanguage:
      type: string
      enum:
        - auto
        - ar
        - ar_en
        - ba
        - eu
        - be
        - bn
        - bg
        - yue
        - ca
        - hr
        - cs
        - da
        - nl
        - en
        - eo
        - et
        - fi
        - fr
        - gl
        - de
        - el
        - he
        - hi
        - hu
        - id
        - ia
        - ga
        - it
        - ja
        - ko
        - lv
        - lt
        - ms
        - en_ms
        - mt
        - cmn
        - cmn_en
        - mr
        - mn
        - 'no'
        - fa
        - pl
        - pt
        - ro
        - ru
        - sk
        - sl
        - es
        - en_es
        - sw
        - sv
        - tl
        - ta
        - en_ta
        - th
        - tr
        - uk
        - ur
        - ug
        - vi
        - cy
      title: SpeechmaticsTranscriberLanguage
    SpeechmaticsTranscriberOperatingPoint:
      type: string
      enum:
        - standard
        - enhanced
      default: enhanced
      description: >-
        This is the operating point for the transcription. Choose between `standard` for faster turnaround with strong
        accuracy or `enhanced` for highest accuracy when precision is critical.


        @default 'enhanced'
      title: SpeechmaticsTranscriberOperatingPoint
    SpeechmaticsTranscriberRegion:
      type: string
      enum:
        - eu
        - us
      default: eu
      description: >-
        This is the region for the Speechmatics API. Choose between EU (Europe) and US (United States) regions for lower
        latency and data sovereignty compliance.


        @default 'eu'
      title: SpeechmaticsTranscriberRegion
    SpeechmaticsTranscriberNumeralStyle:
      type: string
      enum:
        - written
        - spoken
      default: written
      description: |-
        This controls how numbers, dates, currencies, and other entities are formatted in the transcription output.

        @default 'written'
      title: SpeechmaticsTranscriberNumeralStyle
    SpeechmaticsTranscriber:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/SpeechmaticsTranscriberProvider'
          description: This is the transcription provider that will be used.
        model:
          $ref: '#/components/schemas/SpeechmaticsTranscriberModel'
          description: This is the model that will be used for the transcription.
        language:
          $ref: '#/components/schemas/SpeechmaticsTranscriberLanguage'
        operatingPoint:
          $ref: '#/components/schemas/SpeechmaticsTranscriberOperatingPoint'
          description: >-
            This is the operating point for the transcription. Choose between `standard` for faster turnaround with
            strong accuracy or `enhanced` for highest accuracy when precision is critical.


            @default 'enhanced'
        region:
          $ref: '#/components/schemas/SpeechmaticsTranscriberRegion'
          description: >-
            This is the region for the Speechmatics API. Choose between EU (Europe) and US (United States) regions for
            lower latency and data sovereignty compliance.


            @default 'eu'
        enableDiarization:
          type: boolean
          default: false
          description: >-
            This enables speaker diarization, which identifies and separates speakers in the transcription. Essential
            for multi-speaker conversations and conference calls.


            @default false
        maxDelay:
          type: number
          format: double
          default: 3000
          description: |-
            This sets the maximum delay in milliseconds for partial transcripts. Balances latency and accuracy.

            @default 3000
        customVocabulary:
          type: array
          items:
            $ref: '#/components/schemas/SpeechmaticsCustomVocabularyItem'
        numeralStyle:
          $ref: '#/components/schemas/SpeechmaticsTranscriberNumeralStyle'
          description: |-
            This controls how numbers, dates, currencies, and other entities are formatted in the transcription output.

            @default 'written'
        endOfTurnSensitivity:
          type: number
          format: double
          default: 0.5
          description: >-
            This is the sensitivity level for end-of-turn detection, which determines when a speaker has finished
            talking. Higher values are more sensitive.


            @default 0.5
        removeDisfluencies:
          type: boolean
          default: false
          description: >-
            This enables removal of disfluencies (um, uh) from the transcript to create cleaner, more professional
            output.


            This is only supported for the English language transcriber.


            @default false
        minimumSpeechDuration:
          type: number
          format: double
          default: 0
          description: >-
            This is the minimum duration in seconds for speech segments. Shorter segments will be filtered out. Helps
            remove noise and improve accuracy.


            @default 0.0
        fallbackPlan:
          $ref: '#/components/schemas/FallbackTranscriberPlan'
          description: >-
            This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider
            fails.
      required:
        - provider
        - customVocabulary
      title: SpeechmaticsTranscriber
    TalkscriberTranscriberProvider:
      type: string
      enum:
        - talkscriber
      description: This is the transcription provider that will be used.
      title: TalkscriberTranscriberProvider
    TalkscriberTranscriberModel:
      type: string
      enum:
        - whisper
      description: This is the model that will be used for the transcription.
      title: TalkscriberTranscriberModel
    TalkscriberTranscriberLanguage:
      type: string
      enum:
        - en
        - zh
        - de
        - es
        - ru
        - ko
        - fr
        - ja
        - pt
        - tr
        - pl
        - ca
        - nl
        - ar
        - sv
        - it
        - id
        - hi
        - fi
        - vi
        - he
        - uk
        - el
        - ms
        - cs
        - ro
        - da
        - hu
        - ta
        - 'no'
        - th
        - ur
        - hr
        - bg
        - lt
        - la
        - mi
        - ml
        - cy
        - sk
        - te
        - fa
        - lv
        - bn
        - sr
        - az
        - sl
        - kn
        - et
        - mk
        - br
        - eu
        - is
        - hy
        - ne
        - mn
        - bs
        - kk
        - sq
        - sw
        - gl
        - mr
        - pa
        - si
        - km
        - sn
        - yo
        - so
        - af
        - oc
        - ka
        - be
        - tg
        - sd
        - gu
        - am
        - yi
        - lo
        - uz
        - fo
        - ht
        - ps
        - tk
        - nn
        - mt
        - sa
        - lb
        - my
        - bo
        - tl
        - mg
        - as
        - tt
        - haw
        - ln
        - ha
        - ba
        - jw
        - su
        - yue
      description: >-
        This is the language that will be set for the transcription. The list of languages Whisper supports can be found
        here: https://github.com/openai/whisper/blob/main/whisper/tokenizer.py
      title: TalkscriberTranscriberLanguage
    TalkscriberTranscriber:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/TalkscriberTranscriberProvider'
          description: This is the transcription provider that will be used.
        model:
          $ref: '#/components/schemas/TalkscriberTranscriberModel'
          description: This is the model that will be used for the transcription.
        language:
          $ref: '#/components/schemas/TalkscriberTranscriberLanguage'
          description: >-
            This is the language that will be set for the transcription. The list of languages Whisper supports can be
            found here: https://github.com/openai/whisper/blob/main/whisper/tokenizer.py
        fallbackPlan:
          $ref: '#/components/schemas/FallbackTranscriberPlan'
          description: >-
            This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider
            fails.
      required:
        - provider
      title: TalkscriberTranscriber
    OpenAiTranscriberProvider:
      type: string
      enum:
        - openai
      description: This is the transcription provider that will be used.
      title: OpenAiTranscriberProvider
    OpenAiTranscriberModel:
      type: string
      enum:
        - gpt-4o-transcribe
        - gpt-4o-mini-transcribe
      description: This is the model that will be used for the transcription.
      title: OpenAiTranscriberModel
    OpenAiTranscriberLanguage:
      type: string
      enum:
        - af
        - ar
        - hy
        - az
        - be
        - bs
        - bg
        - ca
        - zh
        - hr
        - cs
        - da
        - nl
        - en
        - et
        - fi
        - fr
        - gl
        - de
        - el
        - he
        - hi
        - hu
        - is
        - id
        - it
        - ja
        - kn
        - kk
        - ko
        - lv
        - lt
        - mk
        - ms
        - mr
        - mi
        - ne
        - 'no'
        - fa
        - pl
        - pt
        - ro
        - ru
        - sr
        - sk
        - sl
        - es
        - sw
        - sv
        - tl
        - ta
        - th
        - tr
        - uk
        - ur
        - vi
        - cy
      description: This is the language that will be set for the transcription.
      title: OpenAiTranscriberLanguage
    OpenAITranscriber:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/OpenAiTranscriberProvider'
          description: This is the transcription provider that will be used.
        model:
          $ref: '#/components/schemas/OpenAiTranscriberModel'
          description: This is the model that will be used for the transcription.
        language:
          $ref: '#/components/schemas/OpenAiTranscriberLanguage'
          description: This is the language that will be set for the transcription.
        fallbackPlan:
          $ref: '#/components/schemas/FallbackTranscriberPlan'
          description: >-
            This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider
            fails.
      required:
        - provider
        - model
      title: OpenAITranscriber
    CartesiaTranscriberProvider:
      type: string
      enum:
        - cartesia
      title: CartesiaTranscriberProvider
    CartesiaTranscriberModel:
      type: string
      enum:
        - ink-whisper
      title: CartesiaTranscriberModel
    CartesiaTranscriberLanguage:
      type: string
      enum:
        - aa
        - ab
        - ae
        - af
        - ak
        - am
        - an
        - ar
        - as
        - av
        - ay
        - az
        - ba
        - be
        - bg
        - bh
        - bi
        - bm
        - bn
        - bo
        - br
        - bs
        - ca
        - ce
        - ch
        - co
        - cr
        - cs
        - cu
        - cv
        - cy
        - da
        - de
        - dv
        - dz
        - ee
        - el
        - en
        - eo
        - es
        - et
        - eu
        - fa
        - ff
        - fi
        - fj
        - fo
        - fr
        - fy
        - ga
        - gd
        - gl
        - gn
        - gu
        - gv
        - ha
        - he
        - hi
        - ho
        - hr
        - ht
        - hu
        - hy
        - hz
        - ia
        - id
        - ie
        - ig
        - ii
        - ik
        - io
        - is
        - it
        - iu
        - ja
        - jv
        - ka
        - kg
        - ki
        - kj
        - kk
        - kl
        - km
        - kn
        - ko
        - kr
        - ks
        - ku
        - kv
        - kw
        - ky
        - la
        - lb
        - lg
        - li
        - ln
        - lo
        - lt
        - lu
        - lv
        - mg
        - mh
        - mi
        - mk
        - ml
        - mn
        - mr
        - ms
        - mt
        - my
        - na
        - nb
        - nd
        - ne
        - ng
        - nl
        - nn
        - 'no'
        - nr
        - nv
        - ny
        - oc
        - oj
        - om
        - or
        - os
        - pa
        - pi
        - pl
        - ps
        - pt
        - qu
        - rm
        - rn
        - ro
        - ru
        - rw
        - sa
        - sc
        - sd
        - se
        - sg
        - si
        - sk
        - sl
        - sm
        - sn
        - so
        - sq
        - sr
        - ss
        - st
        - su
        - sv
        - sw
        - ta
        - te
        - tg
        - th
        - ti
        - tk
        - tl
        - tn
        - to
        - tr
        - ts
        - tt
        - tw
        - ty
        - ug
        - uk
        - ur
        - uz
        - ve
        - vi
        - vo
        - wa
        - wo
        - xh
        - yi
        - yue
        - yo
        - za
        - zh
        - zu
      title: CartesiaTranscriberLanguage
    CartesiaTranscriber:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/CartesiaTranscriberProvider'
        model:
          $ref: '#/components/schemas/CartesiaTranscriberModel'
        language:
          $ref: '#/components/schemas/CartesiaTranscriberLanguage'
        fallbackPlan:
          $ref: '#/components/schemas/FallbackTranscriberPlan'
          description: >-
            This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider
            fails.
      required:
        - provider
      title: CartesiaTranscriber
    SonioxTranscriberProvider:
      type: string
      enum:
        - soniox
      title: SonioxTranscriberProvider
    SonioxTranscriberModel:
      type: string
      enum:
        - stt-rt-v4
      description: The Soniox model to use for transcription.
      title: SonioxTranscriberModel
    SonioxTranscriberLanguage:
      type: string
      enum:
        - aa
        - ab
        - ae
        - af
        - ak
        - am
        - an
        - ar
        - as
        - av
        - ay
        - az
        - ba
        - be
        - bg
        - bh
        - bi
        - bm
        - bn
        - bo
        - br
        - bs
        - ca
        - ce
        - ch
        - co
        - cr
        - cs
        - cu
        - cv
        - cy
        - da
        - de
        - dv
        - dz
        - ee
        - el
        - en
        - eo
        - es
        - et
        - eu
        - fa
        - ff
        - fi
        - fj
        - fo
        - fr
        - fy
        - ga
        - gd
        - gl
        - gn
        - gu
        - gv
        - ha
        - he
        - hi
        - ho
        - hr
        - ht
        - hu
        - hy
        - hz
        - ia
        - id
        - ie
        - ig
        - ii
        - ik
        - io
        - is
        - it
        - iu
        - ja
        - jv
        - ka
        - kg
        - ki
        - kj
        - kk
        - kl
        - km
        - kn
        - ko
        - kr
        - ks
        - ku
        - kv
        - kw
        - ky
        - la
        - lb
        - lg
        - li
        - ln
        - lo
        - lt
        - lu
        - lv
        - mg
        - mh
        - mi
        - mk
        - ml
        - mn
        - mr
        - ms
        - mt
        - my
        - na
        - nb
        - nd
        - ne
        - ng
        - nl
        - nn
        - 'no'
        - nr
        - nv
        - ny
        - oc
        - oj
        - om
        - or
        - os
        - pa
        - pi
        - pl
        - ps
        - pt
        - qu
        - rm
        - rn
        - ro
        - ru
        - rw
        - sa
        - sc
        - sd
        - se
        - sg
        - si
        - sk
        - sl
        - sm
        - sn
        - so
        - sq
        - sr
        - ss
        - st
        - su
        - sv
        - sw
        - ta
        - te
        - tg
        - th
        - ti
        - tk
        - tl
        - tn
        - to
        - tr
        - ts
        - tt
        - tw
        - ty
        - ug
        - uk
        - ur
        - uz
        - ve
        - vi
        - vo
        - wa
        - wo
        - xh
        - yi
        - yue
        - yo
        - za
        - zh
        - zu
      description: >-
        The language for transcription. Uses ISO 639-1 codes. Soniox supports 60+ languages with a single universal
        model.
      title: SonioxTranscriberLanguage
    SonioxTranscriber:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/SonioxTranscriberProvider'
        model:
          $ref: '#/components/schemas/SonioxTranscriberModel'
          description: The Soniox model to use for transcription.
        language:
          $ref: '#/components/schemas/SonioxTranscriberLanguage'
          description: >-
            The language for transcription. Uses ISO 639-1 codes. Soniox supports 60+ languages with a single universal
            model.
        languageHintsStrict:
          type: boolean
          description: >-
            When enabled, restricts transcription to the language specified in the language field. When disabled, the
            model can detect and transcribe any of 60+ supported languages. Defaults to true.
        maxEndpointDelayMs:
          type: number
          format: double
          description: >-
            Maximum delay in milliseconds between when the speaker stops and when the endpoint is detected. Lower values
            mean faster turn-taking but more false endpoints. Range: 500-3000. Default: 500.
        customVocabulary:
          type: array
          items:
            type: string
          description: >-
            Custom vocabulary terms to boost recognition accuracy. Useful for brand names, product names, and
            domain-specific terminology. Maps to Soniox context.terms.
        fallbackPlan:
          $ref: '#/components/schemas/FallbackTranscriberPlan'
          description: >-
            This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider
            fails.
      required:
        - provider
      title: SonioxTranscriber
    AssistantTranscriber:
      oneOf:
        - $ref: '#/components/schemas/AssemblyAITranscriber'
        - $ref: '#/components/schemas/AzureSpeechTranscriber'
        - $ref: '#/components/schemas/CustomTranscriber'
        - $ref: '#/components/schemas/DeepgramTranscriber'
        - $ref: '#/components/schemas/ElevenLabsTranscriber'
        - $ref: '#/components/schemas/GladiaTranscriber'
        - $ref: '#/components/schemas/GoogleTranscriber'
        - $ref: '#/components/schemas/SpeechmaticsTranscriber'
        - $ref: '#/components/schemas/TalkscriberTranscriber'
        - $ref: '#/components/schemas/OpenAITranscriber'
        - $ref: '#/components/schemas/CartesiaTranscriber'
        - $ref: '#/components/schemas/SonioxTranscriber'
      description: These are the options for the assistant's transcriber.
      title: AssistantTranscriber
    OpenAiMessageRole:
      type: string
      enum:
        - assistant
        - function
        - user
        - system
        - tool
      title: OpenAiMessageRole
    OpenAIMessage:
      type: object
      properties:
        content:
          type:
            - string
            - 'null'
        role:
          $ref: '#/components/schemas/OpenAiMessageRole'
      required:
        - content
        - role
      title: OpenAIMessage
    TextContentType:
      type: string
      enum:
        - text
      title: TextContentType
    TextContentLanguage:
      type: string
      enum:
        - aa
        - ab
        - ae
        - af
        - ak
        - am
        - an
        - ar
        - as
        - av
        - ay
        - az
        - ba
        - be
        - bg
        - bh
        - bi
        - bm
        - bn
        - bo
        - br
        - bs
        - ca
        - ce
        - ch
        - co
        - cr
        - cs
        - cu
        - cv
        - cy
        - da
        - de
        - dv
        - dz
        - ee
        - el
        - en
        - eo
        - es
        - et
        - eu
        - fa
        - ff
        - fi
        - fj
        - fo
        - fr
        - fy
        - ga
        - gd
        - gl
        - gn
        - gu
        - gv
        - ha
        - he
        - hi
        - ho
        - hr
        - ht
        - hu
        - hy
        - hz
        - ia
        - id
        - ie
        - ig
        - ii
        - ik
        - io
        - is
        - it
        - iu
        - ja
        - jv
        - ka
        - kg
        - ki
        - kj
        - kk
        - kl
        - km
        - kn
        - ko
        - kr
        - ks
        - ku
        - kv
        - kw
        - ky
        - la
        - lb
        - lg
        - li
        - ln
        - lo
        - lt
        - lu
        - lv
        - mg
        - mh
        - mi
        - mk
        - ml
        - mn
        - mr
        - ms
        - mt
        - my
        - na
        - nb
        - nd
        - ne
        - ng
        - nl
        - nn
        - 'no'
        - nr
        - nv
        - ny
        - oc
        - oj
        - om
        - or
        - os
        - pa
        - pi
        - pl
        - ps
        - pt
        - qu
        - rm
        - rn
        - ro
        - ru
        - rw
        - sa
        - sc
        - sd
        - se
        - sg
        - si
        - sk
        - sl
        - sm
        - sn
        - so
        - sq
        - sr
        - ss
        - st
        - su
        - sv
        - sw
        - ta
        - te
        - tg
        - th
        - ti
        - tk
        - tl
        - tn
        - to
        - tr
        - ts
        - tt
        - tw
        - ty
        - ug
        - uk
        - ur
        - uz
        - ve
        - vi
        - vo
        - wa
        - wo
        - xh
        - yi
        - yue
        - yo
        - za
        - zh
        - zu
      title: TextContentLanguage
    TextContent:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/TextContentType'
        text:
          type: string
        language:
          $ref: '#/components/schemas/TextContentLanguage'
      required:
        - type
        - text
        - language
      title: TextContent
    ToolMessageStartContentsItems:
      oneOf:
        - $ref: '#/components/schemas/TextContent'
      title: ToolMessageStartContentsItems
    ToolMessageStartType:
      type: string
      enum:
        - request-start
      description: >-
        This message is triggered when the tool call starts.


        This message is never triggered for async tools.


        If this message is not provided, one of the default filler messages "Hold on a sec", "One moment", "Just a sec",
        "Give me a moment" or "This'll just take a sec" will be used.
      title: ToolMessageStartType
    ConditionOperator:
      type: string
      enum:
        - eq
        - neq
        - gt
        - gte
        - lt
        - lte
      description: This is the operator you want to use to compare the parameter and value.
      title: ConditionOperator
    Condition:
      type: object
      properties:
        operator:
          $ref: '#/components/schemas/ConditionOperator'
          description: This is the operator you want to use to compare the parameter and value.
        param:
          type: string
          description: This is the name of the parameter that you want to check.
        value:
          type: string
          description: This is the value you want to compare against the parameter.
      required:
        - operator
        - param
        - value
      title: Condition
    ToolMessageStart:
      type: object
      properties:
        contents:
          type: array
          items:
            $ref: '#/components/schemas/ToolMessageStartContentsItems'
          description: >-
            This is an alternative to the `content` property. It allows to specify variants of the same content, one per
            language.


            Usage:

            - If your assistants are multilingual, you can provide content for each language.

            - If you don't provide content for a language, the first item in the array will be automatically translated
            to the active language at that moment.


            This will override the `content` property.
        type:
          $ref: '#/components/schemas/ToolMessageStartType'
          description: >-
            This message is triggered when the tool call starts.


            This message is never triggered for async tools.


            If this message is not provided, one of the default filler messages "Hold on a sec", "One moment", "Just a
            sec", "Give me a moment" or "This'll just take a sec" will be used.
        blocking:
          type: boolean
          default: false
          description: >-
            This is an optional boolean that if true, the tool call will only trigger after the message is spoken.
            Default is false.


            @default false
        content:
          type: string
          description: This is the content that the assistant says when this message is triggered.
        conditions:
          type: array
          items:
            $ref: '#/components/schemas/Condition'
          description: >-
            This is an optional array of conditions that the tool call arguments must meet in order for this message to
            be triggered.
      required:
        - type
      title: ToolMessageStart
    ToolMessageCompleteContentsItems:
      oneOf:
        - $ref: '#/components/schemas/TextContent'
      title: ToolMessageCompleteContentsItems
    ToolMessageCompleteType:
      type: string
      enum:
        - request-complete
      description: >-
        This message is triggered when the tool call is complete.


        This message is triggered immediately without waiting for your server to respond for async tool calls.


        If this message is not provided, the model will be requested to respond.


        If this message is provided, only this message will be spoken and the model will not be requested to come up
        with a response. It's an exclusive OR.
      title: ToolMessageCompleteType
    ToolMessageCompleteRole:
      type: string
      enum:
        - assistant
        - system
      description: |-
        This is optional and defaults to "assistant".

        When role=assistant, `content` is said out loud.

        When role=system, `content` is passed to the model in a system message. Example:
            system: default one
            assistant:
            user:
            assistant:
            user:
            assistant:
            user:
            assistant: tool called
            tool: your server response
            <--- system prompt as hint
            ---> model generates response which is spoken
        This is useful when you want to provide a hint to the model about what to say next.
      title: ToolMessageCompleteRole
    ToolMessageComplete:
      type: object
      properties:
        contents:
          type: array
          items:
            $ref: '#/components/schemas/ToolMessageCompleteContentsItems'
          description: >-
            This is an alternative to the `content` property. It allows to specify variants of the same content, one per
            language.


            Usage:

            - If your assistants are multilingual, you can provide content for each language.

            - If you don't provide content for a language, the first item in the array will be automatically translated
            to the active language at that moment.


            This will override the `content` property.
        type:
          $ref: '#/components/schemas/ToolMessageCompleteType'
          description: >-
            This message is triggered when the tool call is complete.


            This message is triggered immediately without waiting for your server to respond for async tool calls.


            If this message is not provided, the model will be requested to respond.


            If this message is provided, only this message will be spoken and the model will not be requested to come up
            with a response. It's an exclusive OR.
        role:
          $ref: '#/components/schemas/ToolMessageCompleteRole'
          description: |-
            This is optional and defaults to "assistant".

            When role=assistant, `content` is said out loud.

            When role=system, `content` is passed to the model in a system message. Example:
                system: default one
                assistant:
                user:
                assistant:
                user:
                assistant:
                user:
                assistant: tool called
                tool: your server response
                <--- system prompt as hint
                ---> model generates response which is spoken
            This is useful when you want to provide a hint to the model about what to say next.
        endCallAfterSpokenEnabled:
          type: boolean
          description: |-
            This is an optional boolean that if true, the call will end after the message is spoken. Default is false.

            This is ignored if `role` is set to `system`.

            @default false
        content:
          type: string
          description: This is the content that the assistant says when this message is triggered.
        conditions:
          type: array
          items:
            $ref: '#/components/schemas/Condition'
          description: >-
            This is an optional array of conditions that the tool call arguments must meet in order for this message to
            be triggered.
      required:
        - type
      title: ToolMessageComplete
    ToolMessageFailedContentsItems:
      oneOf:
        - $ref: '#/components/schemas/TextContent'
      title: ToolMessageFailedContentsItems
    ToolMessageFailedType:
      type: string
      enum:
        - request-failed
      description: >-
        This message is triggered when the tool call fails.


        This message is never triggered for async tool calls.


        If this message is not provided, the model will be requested to respond.


        If this message is provided, only this message will be spoken and the model will not be requested to come up
        with a response. It's an exclusive OR.
      title: ToolMessageFailedType
    ToolMessageFailed:
      type: object
      properties:
        contents:
          type: array
          items:
            $ref: '#/components/schemas/ToolMessageFailedContentsItems'
          description: >-
            This is an alternative to the `content` property. It allows to specify variants of the same content, one per
            language.


            Usage:

            - If your assistants are multilingual, you can provide content for each language.

            - If you don't provide content for a language, the first item in the array will be automatically translated
            to the active language at that moment.


            This will override the `content` property.
        type:
          $ref: '#/components/schemas/ToolMessageFailedType'
          description: >-
            This message is triggered when the tool call fails.


            This message is never triggered for async tool calls.


            If this message is not provided, the model will be requested to respond.


            If this message is provided, only this message will be spoken and the model will not be requested to come up
            with a response. It's an exclusive OR.
        endCallAfterSpokenEnabled:
          type: boolean
          description: |-
            This is an optional boolean that if true, the call will end after the message is spoken. Default is false.

            @default false
        content:
          type: string
          description: This is the content that the assistant says when this message is triggered.
        conditions:
          type: array
          items:
            $ref: '#/components/schemas/Condition'
          description: >-
            This is an optional array of conditions that the tool call arguments must meet in order for this message to
            be triggered.
      required:
        - type
      title: ToolMessageFailed
    ToolMessageDelayedContentsItems:
      oneOf:
        - $ref: '#/components/schemas/TextContent'
      title: ToolMessageDelayedContentsItems
    ToolMessageDelayedType:
      type: string
      enum:
        - request-response-delayed
      description: >-
        This message is triggered when the tool call is delayed.


        There are the two things that can trigger this message:

        1. The user talks with the assistant while your server is processing the request. Default is "Sorry, a few more
        seconds."

        2. The server doesn't respond within `timingMilliseconds`.


        This message is never triggered for async tool calls.
      title: ToolMessageDelayedType
    ToolMessageDelayed:
      type: object
      properties:
        contents:
          type: array
          items:
            $ref: '#/components/schemas/ToolMessageDelayedContentsItems'
          description: >-
            This is an alternative to the `content` property. It allows to specify variants of the same content, one per
            language.


            Usage:

            - If your assistants are multilingual, you can provide content for each language.

            - If you don't provide content for a language, the first item in the array will be automatically translated
            to the active language at that moment.


            This will override the `content` property.
        type:
          $ref: '#/components/schemas/ToolMessageDelayedType'
          description: >-
            This message is triggered when the tool call is delayed.


            There are the two things that can trigger this message:

            1. The user talks with the assistant while your server is processing the request. Default is "Sorry, a few
            more seconds."

            2. The server doesn't respond within `timingMilliseconds`.


            This message is never triggered for async tool calls.
        timingMilliseconds:
          type: number
          format: double
          description: The number of milliseconds to wait for the server response before saying this message.
        content:
          type: string
          description: This is the content that the assistant says when this message is triggered.
        conditions:
          type: array
          items:
            $ref: '#/components/schemas/Condition'
          description: >-
            This is an optional array of conditions that the tool call arguments must meet in order for this message to
            be triggered.
      required:
        - type
      title: ToolMessageDelayed
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod:
      type: string
      enum:
        - POST
        - GET
        - PUT
        - PATCH
        - DELETE
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod
    ToolParameterValue:
      oneOf:
        - type: string
        - type: number
          format: double
        - type: boolean
        - type: object
          additionalProperties:
            description: Any type
        - type: array
          items:
            description: Any type
      description: The value of the parameter. Any JSON type. String values support Liquid templates.
      title: ToolParameterValue
    ToolParameter:
      type: object
      properties:
        key:
          type: string
          description: This is the key of the parameter.
        value:
          $ref: '#/components/schemas/ToolParameterValue'
          description: The value of the parameter. Any JSON type. String values support Liquid templates.
      required:
        - key
        - value
      title: ToolParameter
    JsonSchemaType:
      type: string
      enum:
        - string
        - number
        - integer
        - boolean
        - array
        - object
      description: |-
        This is the type of output you'd like.

        `string`, `number`, `integer`, `boolean` are the primitive types and should be obvious.

        `array` and `object` are more interesting and quite powerful. They allow you to define nested structures.

        For `array`, you can define the schema of the items in the array using the `items` property.

        For `object`, you can define the properties of the object using the `properties` property.
      title: JsonSchemaType
    JsonSchemaFormat:
      type: string
      enum:
        - date-time
        - time
        - date
        - duration
        - email
        - hostname
        - ipv4
        - ipv6
        - uuid
      description: >-
        This is the format of the string. To pass a regex, use the `pattern` property instead.


        OpenAI documentation:
        https://platform.openai.com/docs/guides/structured-outputs?api-mode=chat&type-restrictions=string-restrictions
      title: JsonSchemaFormat
    JsonSchema:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/JsonSchemaType'
          description: |-
            This is the type of output you'd like.

            `string`, `number`, `integer`, `boolean` are the primitive types and should be obvious.

            `array` and `object` are more interesting and quite powerful. They allow you to define nested structures.

            For `array`, you can define the schema of the items in the array using the `items` property.

            For `object`, you can define the properties of the object using the `properties` property.
        items:
          $ref: '#/components/schemas/JsonSchema'
          description: >-
            This is required if the type is "array". This is the schema of the items in the array. This is a recursive
            reference to JsonSchema.
        properties:
          type: object
          additionalProperties:
            $ref: '#/components/schemas/JsonSchema'
          description: >-
            This is required if the type is "object". This specifies the properties of the object. This is a map of
            property names to JsonSchema objects.
        description:
          type: string
          description: This is the description to help the model understand what it needs to output.
        pattern:
          type: string
          description: >-
            This is the pattern of the string. This is a regex that will be used to validate the data in question. To
            use a common format, use the `format` property instead.


            OpenAI documentation: https://platform.openai.com/docs/guides/structured-outputs#supported-properties
        format:
          $ref: '#/components/schemas/JsonSchemaFormat'
          description: >-
            This is the format of the string. To pass a regex, use the `pattern` property instead.


            OpenAI documentation:
            https://platform.openai.com/docs/guides/structured-outputs?api-mode=chat&type-restrictions=string-restrictions
        required:
          type: array
          items:
            type: string
          description: |-
            This is a list of properties that are required.

            This only makes sense if the type is "object".
        enum:
          type: array
          items:
            type: string
          description: This array specifies the allowed values that can be used to restrict the output of the model.
        title:
          type: string
          description: This is the title of the schema.
      required:
        - type
      title: JsonSchema
    VariableExtractionAlias:
      type: object
      properties:
        key:
          type: string
          description: >-
            This is the key of the variable.


            This variable will be accessible during the call as `{{key}}` and stored in `call.artifact.variableValues`
            after the call.


            Rules:

            - Must start with a letter (a-z, A-Z).

            - Subsequent characters can be letters, numbers, or underscores.

            - Minimum length of 1 and maximum length of 40.
        value:
          type: string
          description: |-
            This is the value of the variable.

            This can reference existing variables, use filters, and perform transformations.

            Examples: "{{name}}", "{{customer.email}}", "Hello {{name | upcase}}"
      required:
        - key
        - value
      title: VariableExtractionAlias
    VariableExtractionPlan:
      type: object
      properties:
        schema:
          $ref: '#/components/schemas/JsonSchema'
          description: >-
            This is the schema to extract.


            Examples:

            1. To extract object properties, you can use the following schema:

            ```json

            {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "age": {
                  "type": "number"
                }
              }
            }

            ```


            These will be extracted as `{{ name }}` and `{{ age }}` respectively. To emphasize, object properties are
            extracted as direct global variables.


            2. To extract nested properties, you can use the following schema:

            ```json

            {
              "type": "object",
              "properties": {
                "name": {
                  "type": "object",
                  "properties": {
                    "first": {
                      "type": "string"
                    },
                    "last": {
                      "type": "string"
                    }
                  }
                }
              }
            }

            ```


            These will be extracted as `{{ name }}`. And, `{{ name.first }}` and `{{ name.last }}` will be accessible.


            3. To extract array items, you can use the following schema:

            ```json

            {
              "type": "array",
              "title": "zipCodes",
              "items": {
                "type": "string"
              }
            }

            ```


            This will be extracted as `{{ zipCodes }}`. To access the array items, you can use `{{ zipCodes[0] }}` and
            `{{ zipCodes[1] }}`.


            4. To extract array of objects, you can use the following schema:


            ```json

            {
              "type": "array",
              "name": "people",
              "items": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "age": {
                    "type": "number"
                  },
                  "zipCodes": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                }
              }
            }

            ```


            This will be extracted as `{{ people }}`. To access the array items, you can use `{{ people[n].name }}`, `{{
            people[n].age }}`, `{{ people[n].zipCodes }}`, `{{ people[n].zipCodes[0] }}` and `{{ people[n].zipCodes[1]
            }}`.
        aliases:
          type: array
          items:
            $ref: '#/components/schemas/VariableExtractionAlias'
          description: >-
            These are additional variables to create.


            These will be accessible during the call as `{{key}}` and stored in `call.artifact.variableValues` after the
            call.


            Example:

            ```json

            {
              "aliases": [
                {
                  "key": "customerName",
                  "value": "{{name}}"
                },
                {
                  "key": "fullName",
                  "value": "{{firstName}} {{lastName}}"
                },
                {
                  "key": "greeting",
                  "value": "Hello {{name}}, welcome to {{company}}!"
                },
                {
                  "key": "customerCity",
                  "value": "{{addresses[0].city}}"
                },
                {
                  "key": "something",
                  "value": "{{any liquid}}"
                }
              ]
            }

            ```


            This will create variables `customerName`, `fullName`, `greeting`, `customerCity`, and `something`. To
            access these variables, you can reference them as `{{customerName}}`, `{{fullName}}`, `{{greeting}}`,
            `{{customerCity}}`, and `{{something}}`.
      title: VariableExtractionPlan
    RegexConditionType:
      type: string
      enum:
        - regex
      description: This is the type discriminator for regex condition
      title: RegexConditionType
    MessageTargetRole:
      type: string
      enum:
        - user
        - assistant
      description: |-
        This is the role of the message to target.

        If not specified, will find the position in the message history ignoring role (effectively `any`).
      title: MessageTargetRole
    MessageTarget:
      type: object
      properties:
        role:
          $ref: '#/components/schemas/MessageTargetRole'
          description: |-
            This is the role of the message to target.

            If not specified, will find the position in the message history ignoring role (effectively `any`).
        position:
          type: number
          format: double
          description: |-
            This is the position of the message to target.
            - Negative numbers: Count from end (-1 = most recent, -2 = second most recent)
            - 0: First/oldest message in history
            - Positive numbers: Specific position (0-indexed from start)

            @default -1 (most recent message)
      title: MessageTarget
    RegexCondition:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/RegexConditionType'
          description: This is the type discriminator for regex condition
        regex:
          type: string
          description: >-
            This is the regular expression pattern to match against message content.


            Note:

            - This works by using the RegExp.test method in Node.JS. Eg. /hello/.test("hello there") will return true.


            Hot tips:

            - In JavaScript, escape \ when sending the regex pattern. Eg. "hello\sthere" will be sent over the wire as
            "hellosthere". Send "hello\\sthere" instead.

            - RegExp.test does substring matching, so /cat/.test("I love cats") will return true. To do full string
            matching, use anchors: /^cat$/ will only match exactly "cat".

            - Word boundaries \b are useful for matching whole words: /\bcat\b/ matches "cat" but not "cats" or
            "category".

            - Use inline flags for portability: (?i) for case insensitive, (?m) for multiline
        target:
          $ref: '#/components/schemas/MessageTarget'
          description: |-
            This is the target for messages to check against.
            If not specified, the condition will run on the last message (position: -1).
            If role is not specified, it will look at the last message regardless of role.
            @default { position: -1 }
        negate:
          type: boolean
          description: |-
            This is the flag that when true, the condition matches if the pattern does NOT match.
            Useful for ensuring certain words/phrases are absent.

            @default false
      required:
        - type
        - regex
      title: RegexCondition
    LiquidConditionType:
      type: string
      enum:
        - liquid
      description: This is the type discriminator for liquid condition
      title: LiquidConditionType
    LiquidCondition:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/LiquidConditionType'
          description: This is the type discriminator for liquid condition
        liquid:
          type: string
          description: |-
            This is the Liquid template that must return exactly "true" or "false" as a string.
            The template is evaluated and the entire output must be either "true" or "false" - nothing else.

            Available variables:
            - `messages`: Array of recent messages in OpenAI chat completions format (ChatCompletionMessageParam[])
              Each message has properties like: role ('user', 'assistant', 'system'), content (string), etc.
            - `now`: Current timestamp in milliseconds (built-in Liquid variable)
            - Any assistant variable values (e.g., `userName`, `accountStatus`)

            Useful Liquid filters for messages:
            - `messages | last: 5` - Get the 5 most recent messages
            - `messages | where: 'role', 'user'` - Filter to only user messages
            - `messages | reverse` - Reverse the order of messages
      required:
        - type
        - liquid
      title: LiquidCondition
    GroupConditionType:
      type: string
      enum:
        - group
      description: This is the type discriminator for group condition
      title: GroupConditionType
    GroupConditionOperator:
      type: string
      enum:
        - AND
        - OR
      description: This is the logical operator for combining conditions in this group
      title: GroupConditionOperator
    GroupConditionConditionsItems:
      oneOf:
        - $ref: '#/components/schemas/RegexCondition'
        - $ref: '#/components/schemas/LiquidCondition'
        - $ref: '#/components/schemas/GroupCondition'
      title: GroupConditionConditionsItems
    GroupCondition:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/GroupConditionType'
          description: This is the type discriminator for group condition
        operator:
          $ref: '#/components/schemas/GroupConditionOperator'
          description: This is the logical operator for combining conditions in this group
        conditions:
          type: array
          items:
            $ref: '#/components/schemas/GroupConditionConditionsItems'
          description: |-
            This is the list of nested conditions to evaluate.
            Supports recursive nesting of groups for complex logic.
      required:
        - type
        - operator
        - conditions
      title: GroupCondition
    ToolRejectionPlanConditionsItems:
      oneOf:
        - $ref: '#/components/schemas/RegexCondition'
        - $ref: '#/components/schemas/LiquidCondition'
        - $ref: '#/components/schemas/GroupCondition'
      title: ToolRejectionPlanConditionsItems
    ToolRejectionPlan:
      type: object
      properties:
        conditions:
          type: array
          items:
            $ref: '#/components/schemas/ToolRejectionPlanConditionsItems'
          description: |-
            This is the list of conditions that must be evaluated.

            Usage:
            - If all conditions match (AND logic), the tool call is rejected.
            - For OR logic at the top level, use a single 'group' condition with operator: 'OR'.

            @default [] - Empty array means tool always executes
      title: ToolRejectionPlan
    CreateApiRequestToolDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: >-
              #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems
          description: >-
            These are the messages that will be spoken to the user as the tool is running.


            For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the
            function tool, these can be custom configured.
        method:
          $ref: '#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod'
        timeoutSeconds:
          type: number
          format: double
          description: |-
            This is the timeout in seconds for the request. Defaults to 20 seconds.

            @default 20
        credentialId:
          type: string
          description: The credential ID for API request authentication
        encryptedPaths:
          type: array
          items:
            type: string
          description: This is the paths to encrypt in the request body if credentialId and encryptionPlan are defined.
        parameters:
          type: array
          items:
            $ref: '#/components/schemas/ToolParameter'
          description: Static key-value pairs merged into the request body. Values support Liquid templates.
        name:
          type: string
          description: |-
            This is the name of the tool. This will be passed to the model.

            Must be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 40.
        description:
          type: string
          description: This is the description of the tool. This will be passed to the model.
        url:
          type: string
          description: This is where the request will be sent.
        body:
          $ref: '#/components/schemas/JsonSchema'
          description: This is the body of the request.
        headers:
          $ref: '#/components/schemas/JsonSchema'
          description: These are the headers to send with the request.
        backoffPlan:
          $ref: '#/components/schemas/BackoffPlan'
          description: |-
            This is the backoff plan if the request fails. Defaults to undefined (the request will not be retried).

            @default undefined (the request will not be retried)
        variableExtractionPlan:
          $ref: '#/components/schemas/VariableExtractionPlan'
          description: >-
            This is the plan to extract variables from the tool's response. These will be accessible during the call and
            stored in `call.artifact.variableValues` after the call.


            Usage:

            1. Use `aliases` to extract variables from the tool's response body. (Most common case)


            ```json

            {
              "aliases": [
                {
                  "key": "customerName",
                  "value": "{{customer.name}}"
                },
                {
                  "key": "customerAge",
                  "value": "{{customer.age}}"
                }
              ]
            }

            ```


            The tool response body is made available to the liquid template.


            2. Use `aliases` to extract variables from the tool's response body if the response is an array.


            ```json

            {
              "aliases": [
                {
                  "key": "customerName",
                  "value": "{{$[0].name}}"
                },
                {
                  "key": "customerAge",
                  "value": "{{$[0].age}}"
                }
              ]
            }

            ```


            $ is a shorthand for the tool's response body. `$[0]` is the first item in the array. `$[n]` is the nth item
            in the array. Note, $ is available regardless of the response body type (both object and array).


            3. Use `aliases` to extract variables from the tool's response headers.


            ```json

            {
              "aliases": [
                {
                  "key": "customerName",
                  "value": "{{tool.response.headers.customer-name}}"
                },
                {
                  "key": "customerAge",
                  "value": "{{tool.response.headers.customer-age}}"
                }
              ]
            }

            ```


            `tool.response` is made available to the liquid template. Particularly, both `tool.response.headers` and
            `tool.response.body` are available. Note, `tool.response` is available regardless of the response body type
            (both object and array).


            4. Use `schema` to extract a large portion of the tool's response body.


            4.1. If you hit example.com and it returns `{"name": "John", "age": 30}`, then you can specify the schema
            as:


            ```json

            {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "age": {
                    "type": "number"
                  }
                }
              }
            }

            ```

            These will be extracted as `{{ name }}` and `{{ age }}` respectively. To emphasize, object properties are
            extracted as direct global variables.


            4.2. If you hit example.com and it returns `{"name": {"first": "John", "last": "Doe"}}`, then you can
            specify the schema as:


            ```json

            {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "object",
                    "properties": {
                      "first": {
                        "type": "string"
                      },
                      "last": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }

            ```


            These will be extracted as `{{ name }}`. And, `{{ name.first }}` and `{{ name.last }}` will be accessible.


            4.3. If you hit example.com and it returns `["94123", "94124"]`, then you can specify the schema as:


            ```json

            {
              "schema": {
                "type": "array",
                "title": "zipCodes",
                "items": {
                  "type": "string"
                }
              }
            }

            ```


            This will be extracted as `{{ zipCodes }}`. To access the array items, you can use `{{ zipCodes[0] }}` and
            `{{ zipCodes[1] }}`.


            4.4. If you hit example.com and it returns `[{"name": "John", "age": 30, "zipCodes": ["94123", "94124"]},
            {"name": "Jane", "age": 25, "zipCodes": ["94125", "94126"]}]`, then you can specify the schema as:


            ```json

            {
              "schema": {
                "type": "array",
                "title": "people",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "age": {
                      "type": "number"
                    },
                    "zipCodes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }

            ```


            This will be extracted as `{{ people }}`. To access the array items, you can use `{{ people[n].name }}`, `{{
            people[n].age }}`, `{{ people[n].zipCodes }}`, `{{ people[n].zipCodes[0] }}` and `{{ people[n].zipCodes[1]
            }}`.


            Note: Both `aliases` and `schema` can be used together.
        rejectionPlan:
          $ref: '#/components/schemas/ToolRejectionPlan'
          description: |-
            This is the plan to reject a tool call based on the conversation state.

            // Example 1: Reject endCall if user didn't say goodbye
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                target: { position: -1, role: 'user' },
                negate: true  // Reject if pattern does NOT match
              }]
            }
            ```

            // Example 2: Reject transfer if user is actually asking a question
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '\\?',
                target: { position: -1, role: 'user' }
              }]
            }
            ```

            // Example 3: Reject transfer if user didn't mention transfer recently
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 5 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' %}
            {% assign mentioned = false %}
            {% for msg in userMessages %}
              {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                {% assign mentioned = true %}
                {% break %}
              {% endif %}
            {% endfor %}
            {% if mentioned %}
              false
            {% else %}
              true
            {% endif %}`
              }]
            }
            ```

            // Example 4: Reject endCall if the bot is looping and trying to exit
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 6 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
            {% if userMessages.size < 3 %}
              false
            {% else %}
              {% assign msg1 = userMessages[0].content | downcase %}
              {% assign msg2 = userMessages[1].content | downcase %}
              {% assign msg3 = userMessages[2].content | downcase %}
              {% comment %} Check for repetitive messages {% endcomment %}
              {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                true
              {% comment %} Check for common loop phrases {% endcomment %}
              {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                true
              {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                true
              {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                true
              {% else %}
                false
              {% endif %}
            {% endif %}`
              }]
            }
            ```
      required:
        - method
        - url
      title: CreateApiRequestToolDTO
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashSubType:
      type: string
      enum:
        - bash_20241022
      description: The sub type of tool.
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashSubType
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashName:
      type: string
      enum:
        - bash
      default: bash
      description: The name of the tool, fixed to 'bash'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashName
    CreateBashToolDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems'
          description: >-
            These are the messages that will be spoken to the user as the tool is running.


            For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the
            function tool, these can be custom configured.
        subType:
          $ref: '#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashSubType'
          description: The sub type of tool.
        server:
          $ref: '#/components/schemas/Server'
          description: |2-

              This is the server where a `tool-calls` webhook will be sent.

              Notes:
              - Webhook is sent to this server when a tool call is made.
              - Webhook contains the call, assistant, and phone number objects.
              - Webhook contains the variables set on the assistant.
              - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
              - Webhook expects a response with tool call result.
        name:
          $ref: '#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashName'
          description: The name of the tool, fixed to 'bash'
        rejectionPlan:
          $ref: '#/components/schemas/ToolRejectionPlan'
          description: |-
            This is the plan to reject a tool call based on the conversation state.

            // Example 1: Reject endCall if user didn't say goodbye
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                target: { position: -1, role: 'user' },
                negate: true  // Reject if pattern does NOT match
              }]
            }
            ```

            // Example 2: Reject transfer if user is actually asking a question
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '\\?',
                target: { position: -1, role: 'user' }
              }]
            }
            ```

            // Example 3: Reject transfer if user didn't mention transfer recently
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 5 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' %}
            {% assign mentioned = false %}
            {% for msg in userMessages %}
              {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                {% assign mentioned = true %}
                {% break %}
              {% endif %}
            {% endfor %}
            {% if mentioned %}
              false
            {% else %}
              true
            {% endif %}`
              }]
            }
            ```

            // Example 4: Reject endCall if the bot is looping and trying to exit
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 6 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
            {% if userMessages.size < 3 %}
              false
            {% else %}
              {% assign msg1 = userMessages[0].content | downcase %}
              {% assign msg2 = userMessages[1].content | downcase %}
              {% assign msg3 = userMessages[2].content | downcase %}
              {% comment %} Check for repetitive messages {% endcomment %}
              {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                true
              {% comment %} Check for common loop phrases {% endcomment %}
              {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                true
              {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                true
              {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                true
              {% else %}
                false
              {% endif %}
            {% endif %}`
              }]
            }
            ```
      required:
        - subType
        - name
      title: CreateBashToolDTO
    CreateCodeToolDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: CreateCodeToolDtoMessagesItems
    CreateCodeToolDtoType:
      type: string
      enum:
        - code
      description: The type of tool. "code" for Code tool.
      title: CreateCodeToolDtoType
    CodeToolEnvironmentVariable:
      type: object
      properties:
        name:
          type: string
          description: Name of the environment variable
        value:
          type: string
          description: Value of the environment variable. Supports Liquid templates.
      required:
        - name
        - value
      title: CodeToolEnvironmentVariable
    OpenAiFunctionParametersType:
      type: string
      enum:
        - object
      description: >-
        This must be set to 'object'. It instructs the model to return a JSON object containing the function call
        properties.
      title: OpenAiFunctionParametersType
    OpenAIFunctionParameters:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/OpenAiFunctionParametersType'
          description: >-
            This must be set to 'object'. It instructs the model to return a JSON object containing the function call
            properties.
        properties:
          type: object
          additionalProperties:
            $ref: '#/components/schemas/JsonSchema'
          description: >-
            This provides a description of the properties required by the function.

            JSON Schema can be used to specify expectations for each property.

            Refer to [this doc](https://ajv.js.org/json-schema.html#json-data-type) for a comprehensive guide on JSON
            Schema.
        required:
          type: array
          items:
            type: string
          description: This specifies the properties that are required by the function.
      required:
        - type
        - properties
      title: OpenAIFunctionParameters
    OpenAIFunction:
      type: object
      properties:
        strict:
          type: boolean
          default: false
          description: >-
            This is a boolean that controls whether to enable strict schema adherence when generating the function call.
            If set to true, the model will follow the exact schema defined in the parameters field. Only a subset of
            JSON Schema is supported when strict is true. Learn more about Structured Outputs in the [OpenAI
            guide](https://openai.com/index/introducing-structured-outputs-in-the-api/).


            @default false
        name:
          type: string
          description: |-
            This is the the name of the function to be called.

            Must be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 64.
        description:
          type: string
          description: >-
            This is the description of what the function does, used by the AI to choose when and how to call the
            function.
        parameters:
          $ref: '#/components/schemas/OpenAIFunctionParameters'
          description: >-
            These are the parameters the functions accepts, described as a JSON Schema object.


            See the [OpenAI guide](https://platform.openai.com/docs/guides/function-calling) for examples, and the [JSON
            Schema reference](https://json-schema.org/understanding-json-schema) for documentation about the format.


            Omitting parameters defines a function with an empty parameter list.
      required:
        - name
      title: OpenAIFunction
    CreateCodeToolDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/CreateCodeToolDtoMessagesItems'
          description: >-
            These are the messages that will be spoken to the user as the tool is running.


            For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the
            function tool, these can be custom configured.
        type:
          $ref: '#/components/schemas/CreateCodeToolDtoType'
          description: The type of tool. "code" for Code tool.
        async:
          type: boolean
          description: |-
            This determines if the tool is async.

              If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.

              If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.

              Defaults to synchronous (`false`).
        server:
          $ref: '#/components/schemas/Server'
          description: |2-

              This is the server where a `tool-calls` webhook will be sent.

              Notes:
              - Webhook is sent to this server when a tool call is made.
              - Webhook contains the call, assistant, and phone number objects.
              - Webhook contains the variables set on the assistant.
              - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
              - Webhook expects a response with tool call result.
        code:
          type: string
          description: TypeScript code to execute when the tool is called
        environmentVariables:
          type: array
          items:
            $ref: '#/components/schemas/CodeToolEnvironmentVariable'
          description: Environment variables available in code via `env` object
        timeoutSeconds:
          type: number
          format: double
          description: |-
            This is the timeout in seconds for the code execution. Defaults to 10 seconds.
            Maximum is 30 seconds to prevent abuse.

            @default 10
        credentialId:
          type: string
          description: Credential ID containing the Val Town API key
        variableExtractionPlan:
          $ref: '#/components/schemas/VariableExtractionPlan'
          description: Plan to extract variables from the tool response
        function:
          $ref: '#/components/schemas/OpenAIFunction'
          description: |-
            This is the function definition of the tool.

            For the Code tool, this defines the name, description, and parameters that the model
            will use to understand when and how to call this tool.
        rejectionPlan:
          $ref: '#/components/schemas/ToolRejectionPlan'
          description: |-
            This is the plan to reject a tool call based on the conversation state.

            // Example 1: Reject endCall if user didn't say goodbye
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                target: { position: -1, role: 'user' },
                negate: true  // Reject if pattern does NOT match
              }]
            }
            ```

            // Example 2: Reject transfer if user is actually asking a question
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '\\?',
                target: { position: -1, role: 'user' }
              }]
            }
            ```

            // Example 3: Reject transfer if user didn't mention transfer recently
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 5 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' %}
            {% assign mentioned = false %}
            {% for msg in userMessages %}
              {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                {% assign mentioned = true %}
                {% break %}
              {% endif %}
            {% endfor %}
            {% if mentioned %}
              false
            {% else %}
              true
            {% endif %}`
              }]
            }
            ```

            // Example 4: Reject endCall if the bot is looping and trying to exit
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 6 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
            {% if userMessages.size < 3 %}
              false
            {% else %}
              {% assign msg1 = userMessages[0].content | downcase %}
              {% assign msg2 = userMessages[1].content | downcase %}
              {% assign msg3 = userMessages[2].content | downcase %}
              {% comment %} Check for repetitive messages {% endcomment %}
              {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                true
              {% comment %} Check for common loop phrases {% endcomment %}
              {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                true
              {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                true
              {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                true
              {% else %}
                false
              {% endif %}
            {% endif %}`
              }]
            }
            ```
      required:
        - type
        - code
      title: CreateCodeToolDTO
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerSubType:
      type: string
      enum:
        - computer_20241022
      description: The sub type of tool.
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerSubType
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerName:
      type: string
      enum:
        - computer
      default: computer
      description: The name of the tool, fixed to 'computer'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerName
    CreateComputerToolDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: >-
              #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems
          description: >-
            These are the messages that will be spoken to the user as the tool is running.


            For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the
            function tool, these can be custom configured.
        subType:
          $ref: '#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerSubType'
          description: The sub type of tool.
        server:
          $ref: '#/components/schemas/Server'
          description: |2-

              This is the server where a `tool-calls` webhook will be sent.

              Notes:
              - Webhook is sent to this server when a tool call is made.
              - Webhook contains the call, assistant, and phone number objects.
              - Webhook contains the variables set on the assistant.
              - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
              - Webhook expects a response with tool call result.
        name:
          $ref: '#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerName'
          description: The name of the tool, fixed to 'computer'
        displayWidthPx:
          type: number
          format: double
          description: The display width in pixels
        displayHeightPx:
          type: number
          format: double
          description: The display height in pixels
        displayNumber:
          type: number
          format: double
          description: Optional display number
        rejectionPlan:
          $ref: '#/components/schemas/ToolRejectionPlan'
          description: |-
            This is the plan to reject a tool call based on the conversation state.

            // Example 1: Reject endCall if user didn't say goodbye
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                target: { position: -1, role: 'user' },
                negate: true  // Reject if pattern does NOT match
              }]
            }
            ```

            // Example 2: Reject transfer if user is actually asking a question
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '\\?',
                target: { position: -1, role: 'user' }
              }]
            }
            ```

            // Example 3: Reject transfer if user didn't mention transfer recently
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 5 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' %}
            {% assign mentioned = false %}
            {% for msg in userMessages %}
              {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                {% assign mentioned = true %}
                {% break %}
              {% endif %}
            {% endfor %}
            {% if mentioned %}
              false
            {% else %}
              true
            {% endif %}`
              }]
            }
            ```

            // Example 4: Reject endCall if the bot is looping and trying to exit
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 6 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
            {% if userMessages.size < 3 %}
              false
            {% else %}
              {% assign msg1 = userMessages[0].content | downcase %}
              {% assign msg2 = userMessages[1].content | downcase %}
              {% assign msg3 = userMessages[2].content | downcase %}
              {% comment %} Check for repetitive messages {% endcomment %}
              {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                true
              {% comment %} Check for common loop phrases {% endcomment %}
              {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                true
              {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                true
              {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                true
              {% else %}
                false
              {% endif %}
            {% endif %}`
              }]
            }
            ```
      required:
        - subType
        - name
        - displayWidthPx
        - displayHeightPx
      title: CreateComputerToolDTO
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems
    CreateDtmfToolDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems'
          description: >-
            These are the messages that will be spoken to the user as the tool is running.


            For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the
            function tool, these can be custom configured.
        sipInfoDtmfEnabled:
          type: boolean
          default: false
          description: >-
            This enables sending DTMF tones via SIP INFO messages instead of RFC 2833 (RTP events). When enabled, DTMF
            digits will be sent using the SIP INFO method, which can be more reliable in some network configurations.
            Only relevant when using the `vapi.sip` transport.
        rejectionPlan:
          $ref: '#/components/schemas/ToolRejectionPlan'
          description: |-
            This is the plan to reject a tool call based on the conversation state.

            // Example 1: Reject endCall if user didn't say goodbye
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                target: { position: -1, role: 'user' },
                negate: true  // Reject if pattern does NOT match
              }]
            }
            ```

            // Example 2: Reject transfer if user is actually asking a question
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '\\?',
                target: { position: -1, role: 'user' }
              }]
            }
            ```

            // Example 3: Reject transfer if user didn't mention transfer recently
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 5 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' %}
            {% assign mentioned = false %}
            {% for msg in userMessages %}
              {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                {% assign mentioned = true %}
                {% break %}
              {% endif %}
            {% endfor %}
            {% if mentioned %}
              false
            {% else %}
              true
            {% endif %}`
              }]
            }
            ```

            // Example 4: Reject endCall if the bot is looping and trying to exit
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 6 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
            {% if userMessages.size < 3 %}
              false
            {% else %}
              {% assign msg1 = userMessages[0].content | downcase %}
              {% assign msg2 = userMessages[1].content | downcase %}
              {% assign msg3 = userMessages[2].content | downcase %}
              {% comment %} Check for repetitive messages {% endcomment %}
              {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                true
              {% comment %} Check for common loop phrases {% endcomment %}
              {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                true
              {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                true
              {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                true
              {% else %}
                false
              {% endif %}
            {% endif %}`
              }]
            }
            ```
      title: CreateDtmfToolDTO
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems
    CreateEndCallToolDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: >-
              #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems
          description: >-
            These are the messages that will be spoken to the user as the tool is running.


            For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the
            function tool, these can be custom configured.
        rejectionPlan:
          $ref: '#/components/schemas/ToolRejectionPlan'
          description: |-
            This is the plan to reject a tool call based on the conversation state.

            // Example 1: Reject endCall if user didn't say goodbye
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                target: { position: -1, role: 'user' },
                negate: true  // Reject if pattern does NOT match
              }]
            }
            ```

            // Example 2: Reject transfer if user is actually asking a question
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '\\?',
                target: { position: -1, role: 'user' }
              }]
            }
            ```

            // Example 3: Reject transfer if user didn't mention transfer recently
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 5 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' %}
            {% assign mentioned = false %}
            {% for msg in userMessages %}
              {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                {% assign mentioned = true %}
                {% break %}
              {% endif %}
            {% endfor %}
            {% if mentioned %}
              false
            {% else %}
              true
            {% endif %}`
              }]
            }
            ```

            // Example 4: Reject endCall if the bot is looping and trying to exit
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 6 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
            {% if userMessages.size < 3 %}
              false
            {% else %}
              {% assign msg1 = userMessages[0].content | downcase %}
              {% assign msg2 = userMessages[1].content | downcase %}
              {% assign msg3 = userMessages[2].content | downcase %}
              {% comment %} Check for repetitive messages {% endcomment %}
              {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                true
              {% comment %} Check for common loop phrases {% endcomment %}
              {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                true
              {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                true
              {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                true
              {% else %}
                false
              {% endif %}
            {% endif %}`
              }]
            }
            ```
      title: CreateEndCallToolDTO
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems
    CreateFunctionToolDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: >-
              #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems
          description: >-
            These are the messages that will be spoken to the user as the tool is running.


            For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the
            function tool, these can be custom configured.
        async:
          type: boolean
          description: |-
            This determines if the tool is async.

              If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.

              If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.

              Defaults to synchronous (`false`).
        server:
          $ref: '#/components/schemas/Server'
          description: |2-

              This is the server where a `tool-calls` webhook will be sent.

              Notes:
              - Webhook is sent to this server when a tool call is made.
              - Webhook contains the call, assistant, and phone number objects.
              - Webhook contains the variables set on the assistant.
              - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
              - Webhook expects a response with tool call result.
        variableExtractionPlan:
          $ref: '#/components/schemas/VariableExtractionPlan'
          description: Plan to extract variables from the tool response
        parameters:
          type: array
          items:
            $ref: '#/components/schemas/ToolParameter'
          description: Static key-value pairs merged into the request body. Values support Liquid templates.
        function:
          $ref: '#/components/schemas/OpenAIFunction'
          description: This is the function definition of the tool.
        rejectionPlan:
          $ref: '#/components/schemas/ToolRejectionPlan'
          description: |-
            This is the plan to reject a tool call based on the conversation state.

            // Example 1: Reject endCall if user didn't say goodbye
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                target: { position: -1, role: 'user' },
                negate: true  // Reject if pattern does NOT match
              }]
            }
            ```

            // Example 2: Reject transfer if user is actually asking a question
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '\\?',
                target: { position: -1, role: 'user' }
              }]
            }
            ```

            // Example 3: Reject transfer if user didn't mention transfer recently
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 5 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' %}
            {% assign mentioned = false %}
            {% for msg in userMessages %}
              {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                {% assign mentioned = true %}
                {% break %}
              {% endif %}
            {% endfor %}
            {% if mentioned %}
              false
            {% else %}
              true
            {% endif %}`
              }]
            }
            ```

            // Example 4: Reject endCall if the bot is looping and trying to exit
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 6 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
            {% if userMessages.size < 3 %}
              false
            {% else %}
              {% assign msg1 = userMessages[0].content | downcase %}
              {% assign msg2 = userMessages[1].content | downcase %}
              {% assign msg3 = userMessages[2].content | downcase %}
              {% comment %} Check for repetitive messages {% endcomment %}
              {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                true
              {% comment %} Check for common loop phrases {% endcomment %}
              {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                true
              {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                true
              {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                true
              {% else %}
                false
              {% endif %}
            {% endif %}`
              }]
            }
            ```
      title: CreateFunctionToolDTO
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: >-
        ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems
    CreateGoHighLevelCalendarAvailabilityToolDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: >-
              #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems
          description: >-
            These are the messages that will be spoken to the user as the tool is running.


            For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the
            function tool, these can be custom configured.
        rejectionPlan:
          $ref: '#/components/schemas/ToolRejectionPlan'
          description: |-
            This is the plan to reject a tool call based on the conversation state.

            // Example 1: Reject endCall if user didn't say goodbye
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                target: { position: -1, role: 'user' },
                negate: true  // Reject if pattern does NOT match
              }]
            }
            ```

            // Example 2: Reject transfer if user is actually asking a question
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '\\?',
                target: { position: -1, role: 'user' }
              }]
            }
            ```

            // Example 3: Reject transfer if user didn't mention transfer recently
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 5 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' %}
            {% assign mentioned = false %}
            {% for msg in userMessages %}
              {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                {% assign mentioned = true %}
                {% break %}
              {% endif %}
            {% endfor %}
            {% if mentioned %}
              false
            {% else %}
              true
            {% endif %}`
              }]
            }
            ```

            // Example 4: Reject endCall if the bot is looping and trying to exit
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 6 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
            {% if userMessages.size < 3 %}
              false
            {% else %}
              {% assign msg1 = userMessages[0].content | downcase %}
              {% assign msg2 = userMessages[1].content | downcase %}
              {% assign msg3 = userMessages[2].content | downcase %}
              {% comment %} Check for repetitive messages {% endcomment %}
              {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                true
              {% comment %} Check for common loop phrases {% endcomment %}
              {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                true
              {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                true
              {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                true
              {% else %}
                false
              {% endif %}
            {% endif %}`
              }]
            }
            ```
      title: CreateGoHighLevelCalendarAvailabilityToolDTO
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems
    CreateGoHighLevelCalendarEventCreateToolDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: >-
              #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems
          description: >-
            These are the messages that will be spoken to the user as the tool is running.


            For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the
            function tool, these can be custom configured.
        rejectionPlan:
          $ref: '#/components/schemas/ToolRejectionPlan'
          description: |-
            This is the plan to reject a tool call based on the conversation state.

            // Example 1: Reject endCall if user didn't say goodbye
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                target: { position: -1, role: 'user' },
                negate: true  // Reject if pattern does NOT match
              }]
            }
            ```

            // Example 2: Reject transfer if user is actually asking a question
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '\\?',
                target: { position: -1, role: 'user' }
              }]
            }
            ```

            // Example 3: Reject transfer if user didn't mention transfer recently
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 5 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' %}
            {% assign mentioned = false %}
            {% for msg in userMessages %}
              {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                {% assign mentioned = true %}
                {% break %}
              {% endif %}
            {% endfor %}
            {% if mentioned %}
              false
            {% else %}
              true
            {% endif %}`
              }]
            }
            ```

            // Example 4: Reject endCall if the bot is looping and trying to exit
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 6 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
            {% if userMessages.size < 3 %}
              false
            {% else %}
              {% assign msg1 = userMessages[0].content | downcase %}
              {% assign msg2 = userMessages[1].content | downcase %}
              {% assign msg3 = userMessages[2].content | downcase %}
              {% comment %} Check for repetitive messages {% endcomment %}
              {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                true
              {% comment %} Check for common loop phrases {% endcomment %}
              {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                true
              {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                true
              {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                true
              {% else %}
                false
              {% endif %}
            {% endif %}`
              }]
            }
            ```
      title: CreateGoHighLevelCalendarEventCreateToolDTO
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems
    CreateGoHighLevelContactCreateToolDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: >-
              #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems
          description: >-
            These are the messages that will be spoken to the user as the tool is running.


            For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the
            function tool, these can be custom configured.
        rejectionPlan:
          $ref: '#/components/schemas/ToolRejectionPlan'
          description: |-
            This is the plan to reject a tool call based on the conversation state.

            // Example 1: Reject endCall if user didn't say goodbye
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                target: { position: -1, role: 'user' },
                negate: true  // Reject if pattern does NOT match
              }]
            }
            ```

            // Example 2: Reject transfer if user is actually asking a question
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '\\?',
                target: { position: -1, role: 'user' }
              }]
            }
            ```

            // Example 3: Reject transfer if user didn't mention transfer recently
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 5 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' %}
            {% assign mentioned = false %}
            {% for msg in userMessages %}
              {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                {% assign mentioned = true %}
                {% break %}
              {% endif %}
            {% endfor %}
            {% if mentioned %}
              false
            {% else %}
              true
            {% endif %}`
              }]
            }
            ```

            // Example 4: Reject endCall if the bot is looping and trying to exit
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 6 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
            {% if userMessages.size < 3 %}
              false
            {% else %}
              {% assign msg1 = userMessages[0].content | downcase %}
              {% assign msg2 = userMessages[1].content | downcase %}
              {% assign msg3 = userMessages[2].content | downcase %}
              {% comment %} Check for repetitive messages {% endcomment %}
              {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                true
              {% comment %} Check for common loop phrases {% endcomment %}
              {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                true
              {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                true
              {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                true
              {% else %}
                false
              {% endif %}
            {% endif %}`
              }]
            }
            ```
      title: CreateGoHighLevelContactCreateToolDTO
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems
    CreateGoHighLevelContactGetToolDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: >-
              #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems
          description: >-
            These are the messages that will be spoken to the user as the tool is running.


            For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the
            function tool, these can be custom configured.
        rejectionPlan:
          $ref: '#/components/schemas/ToolRejectionPlan'
          description: |-
            This is the plan to reject a tool call based on the conversation state.

            // Example 1: Reject endCall if user didn't say goodbye
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                target: { position: -1, role: 'user' },
                negate: true  // Reject if pattern does NOT match
              }]
            }
            ```

            // Example 2: Reject transfer if user is actually asking a question
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '\\?',
                target: { position: -1, role: 'user' }
              }]
            }
            ```

            // Example 3: Reject transfer if user didn't mention transfer recently
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 5 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' %}
            {% assign mentioned = false %}
            {% for msg in userMessages %}
              {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                {% assign mentioned = true %}
                {% break %}
              {% endif %}
            {% endfor %}
            {% if mentioned %}
              false
            {% else %}
              true
            {% endif %}`
              }]
            }
            ```

            // Example 4: Reject endCall if the bot is looping and trying to exit
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 6 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
            {% if userMessages.size < 3 %}
              false
            {% else %}
              {% assign msg1 = userMessages[0].content | downcase %}
              {% assign msg2 = userMessages[1].content | downcase %}
              {% assign msg3 = userMessages[2].content | downcase %}
              {% comment %} Check for repetitive messages {% endcomment %}
              {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                true
              {% comment %} Check for common loop phrases {% endcomment %}
              {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                true
              {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                true
              {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                true
              {% else %}
                false
              {% endif %}
            {% endif %}`
              }]
            }
            ```
      title: CreateGoHighLevelContactGetToolDTO
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems
    CreateGoogleCalendarCheckAvailabilityToolDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: >-
              #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems
          description: >-
            These are the messages that will be spoken to the user as the tool is running.


            For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the
            function tool, these can be custom configured.
        rejectionPlan:
          $ref: '#/components/schemas/ToolRejectionPlan'
          description: |-
            This is the plan to reject a tool call based on the conversation state.

            // Example 1: Reject endCall if user didn't say goodbye
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                target: { position: -1, role: 'user' },
                negate: true  // Reject if pattern does NOT match
              }]
            }
            ```

            // Example 2: Reject transfer if user is actually asking a question
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '\\?',
                target: { position: -1, role: 'user' }
              }]
            }
            ```

            // Example 3: Reject transfer if user didn't mention transfer recently
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 5 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' %}
            {% assign mentioned = false %}
            {% for msg in userMessages %}
              {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                {% assign mentioned = true %}
                {% break %}
              {% endif %}
            {% endfor %}
            {% if mentioned %}
              false
            {% else %}
              true
            {% endif %}`
              }]
            }
            ```

            // Example 4: Reject endCall if the bot is looping and trying to exit
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 6 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
            {% if userMessages.size < 3 %}
              false
            {% else %}
              {% assign msg1 = userMessages[0].content | downcase %}
              {% assign msg2 = userMessages[1].content | downcase %}
              {% assign msg3 = userMessages[2].content | downcase %}
              {% comment %} Check for repetitive messages {% endcomment %}
              {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                true
              {% comment %} Check for common loop phrases {% endcomment %}
              {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                true
              {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                true
              {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                true
              {% else %}
                false
              {% endif %}
            {% endif %}`
              }]
            }
            ```
      title: CreateGoogleCalendarCheckAvailabilityToolDTO
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems
    CreateGoogleCalendarCreateEventToolDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: >-
              #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems
          description: >-
            These are the messages that will be spoken to the user as the tool is running.


            For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the
            function tool, these can be custom configured.
        rejectionPlan:
          $ref: '#/components/schemas/ToolRejectionPlan'
          description: |-
            This is the plan to reject a tool call based on the conversation state.

            // Example 1: Reject endCall if user didn't say goodbye
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                target: { position: -1, role: 'user' },
                negate: true  // Reject if pattern does NOT match
              }]
            }
            ```

            // Example 2: Reject transfer if user is actually asking a question
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '\\?',
                target: { position: -1, role: 'user' }
              }]
            }
            ```

            // Example 3: Reject transfer if user didn't mention transfer recently
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 5 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' %}
            {% assign mentioned = false %}
            {% for msg in userMessages %}
              {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                {% assign mentioned = true %}
                {% break %}
              {% endif %}
            {% endfor %}
            {% if mentioned %}
              false
            {% else %}
              true
            {% endif %}`
              }]
            }
            ```

            // Example 4: Reject endCall if the bot is looping and trying to exit
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 6 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
            {% if userMessages.size < 3 %}
              false
            {% else %}
              {% assign msg1 = userMessages[0].content | downcase %}
              {% assign msg2 = userMessages[1].content | downcase %}
              {% assign msg3 = userMessages[2].content | downcase %}
              {% comment %} Check for repetitive messages {% endcomment %}
              {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                true
              {% comment %} Check for common loop phrases {% endcomment %}
              {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                true
              {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                true
              {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                true
              {% else %}
                false
              {% endif %}
            {% endif %}`
              }]
            }
            ```
      title: CreateGoogleCalendarCreateEventToolDTO
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems
    CreateGoogleSheetsRowAppendToolDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: >-
              #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems
          description: >-
            These are the messages that will be spoken to the user as the tool is running.


            For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the
            function tool, these can be custom configured.
        rejectionPlan:
          $ref: '#/components/schemas/ToolRejectionPlan'
          description: |-
            This is the plan to reject a tool call based on the conversation state.

            // Example 1: Reject endCall if user didn't say goodbye
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                target: { position: -1, role: 'user' },
                negate: true  // Reject if pattern does NOT match
              }]
            }
            ```

            // Example 2: Reject transfer if user is actually asking a question
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '\\?',
                target: { position: -1, role: 'user' }
              }]
            }
            ```

            // Example 3: Reject transfer if user didn't mention transfer recently
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 5 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' %}
            {% assign mentioned = false %}
            {% for msg in userMessages %}
              {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                {% assign mentioned = true %}
                {% break %}
              {% endif %}
            {% endfor %}
            {% if mentioned %}
              false
            {% else %}
              true
            {% endif %}`
              }]
            }
            ```

            // Example 4: Reject endCall if the bot is looping and trying to exit
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 6 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
            {% if userMessages.size < 3 %}
              false
            {% else %}
              {% assign msg1 = userMessages[0].content | downcase %}
              {% assign msg2 = userMessages[1].content | downcase %}
              {% assign msg3 = userMessages[2].content | downcase %}
              {% comment %} Check for repetitive messages {% endcomment %}
              {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                true
              {% comment %} Check for common loop phrases {% endcomment %}
              {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                true
              {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                true
              {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                true
              {% else %}
                false
              {% endif %}
            {% endif %}`
              }]
            }
            ```
      title: CreateGoogleSheetsRowAppendToolDTO
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems
    HandoffDestinationAssistantType:
      type: string
      enum:
        - assistant
      title: HandoffDestinationAssistantType
    ContextEngineeringPlanLastNMessagesType:
      type: string
      enum:
        - lastNMessages
      title: ContextEngineeringPlanLastNMessagesType
    ContextEngineeringPlanLastNMessages:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/ContextEngineeringPlanLastNMessagesType'
        maxMessages:
          type: number
          format: double
          description: This is the maximum number of messages to include in the context engineering plan.
      required:
        - type
        - maxMessages
      title: ContextEngineeringPlanLastNMessages
    ContextEngineeringPlanNoneType:
      type: string
      enum:
        - none
      title: ContextEngineeringPlanNoneType
    ContextEngineeringPlanNone:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/ContextEngineeringPlanNoneType'
      required:
        - type
      title: ContextEngineeringPlanNone
    ContextEngineeringPlanAllType:
      type: string
      enum:
        - all
      title: ContextEngineeringPlanAllType
    ContextEngineeringPlanAll:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/ContextEngineeringPlanAllType'
      required:
        - type
      title: ContextEngineeringPlanAll
    ContextEngineeringPlanUserAndAssistantMessagesType:
      type: string
      enum:
        - userAndAssistantMessages
      title: ContextEngineeringPlanUserAndAssistantMessagesType
    ContextEngineeringPlanUserAndAssistantMessages:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/ContextEngineeringPlanUserAndAssistantMessagesType'
      required:
        - type
      title: ContextEngineeringPlanUserAndAssistantMessages
    HandoffDestinationAssistantContextEngineeringPlan:
      oneOf:
        - $ref: '#/components/schemas/ContextEngineeringPlanLastNMessages'
        - $ref: '#/components/schemas/ContextEngineeringPlanNone'
        - $ref: '#/components/schemas/ContextEngineeringPlanAll'
        - $ref: '#/components/schemas/ContextEngineeringPlanUserAndAssistantMessages'
      description: This is the plan for manipulating the message context before handing off the call to the next assistant.
      title: HandoffDestinationAssistantContextEngineeringPlan
    CreateAssistantDtoTranscriber:
      oneOf:
        - $ref: '#/components/schemas/AssemblyAITranscriber'
        - $ref: '#/components/schemas/AzureSpeechTranscriber'
        - $ref: '#/components/schemas/CustomTranscriber'
        - $ref: '#/components/schemas/DeepgramTranscriber'
        - $ref: '#/components/schemas/ElevenLabsTranscriber'
        - $ref: '#/components/schemas/GladiaTranscriber'
        - $ref: '#/components/schemas/GoogleTranscriber'
        - $ref: '#/components/schemas/SpeechmaticsTranscriber'
        - $ref: '#/components/schemas/TalkscriberTranscriber'
        - $ref: '#/components/schemas/OpenAITranscriber'
        - $ref: '#/components/schemas/CartesiaTranscriber'
        - $ref: '#/components/schemas/SonioxTranscriber'
      description: These are the options for the assistant's transcriber.
      title: CreateAssistantDtoTranscriber
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems
    McpToolMessagesMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: McpToolMessagesMessagesItems
    McpToolMessages:
      type: object
      properties:
        name:
          type: string
          description: The name of the tool from the MCP server.
        messages:
          type: array
          items:
            $ref: '#/components/schemas/McpToolMessagesMessagesItems'
          description: >-
            Custom messages for this specific tool. Set to an empty array to suppress all messages for this tool. If not
            provided, the tool will use the default messages from the parent MCP tool configuration.
      required:
        - name
      title: McpToolMessages
    McpToolMetadataProtocol:
      type: string
      enum:
        - sse
        - shttp
      description: This is the protocol used for MCP communication. Defaults to Streamable HTTP.
      title: McpToolMetadataProtocol
    McpToolMetadata:
      type: object
      properties:
        protocol:
          $ref: '#/components/schemas/McpToolMetadataProtocol'
          description: This is the protocol used for MCP communication. Defaults to Streamable HTTP.
      title: McpToolMetadata
    CreateMcpToolDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems'
          description: >-
            These are the messages that will be spoken to the user as the tool is running.


            For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the
            function tool, these can be custom configured.
        server:
          $ref: '#/components/schemas/Server'
          description: |2-

              This is the server where a `tool-calls` webhook will be sent.

              Notes:
              - Webhook is sent to this server when a tool call is made.
              - Webhook contains the call, assistant, and phone number objects.
              - Webhook contains the variables set on the assistant.
              - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
              - Webhook expects a response with tool call result.
        toolMessages:
          type: array
          items:
            $ref: '#/components/schemas/McpToolMessages'
          description: >-
            Per-tool message overrides for individual tools loaded from the MCP server. Set messages to an empty array
            to suppress messages for a specific tool. Tools not listed here will use the default messages from the
            parent tool.
        metadata:
          $ref: '#/components/schemas/McpToolMetadata'
        rejectionPlan:
          $ref: '#/components/schemas/ToolRejectionPlan'
          description: |-
            This is the plan to reject a tool call based on the conversation state.

            // Example 1: Reject endCall if user didn't say goodbye
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                target: { position: -1, role: 'user' },
                negate: true  // Reject if pattern does NOT match
              }]
            }
            ```

            // Example 2: Reject transfer if user is actually asking a question
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '\\?',
                target: { position: -1, role: 'user' }
              }]
            }
            ```

            // Example 3: Reject transfer if user didn't mention transfer recently
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 5 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' %}
            {% assign mentioned = false %}
            {% for msg in userMessages %}
              {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                {% assign mentioned = true %}
                {% break %}
              {% endif %}
            {% endfor %}
            {% if mentioned %}
              false
            {% else %}
              true
            {% endif %}`
              }]
            }
            ```

            // Example 4: Reject endCall if the bot is looping and trying to exit
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 6 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
            {% if userMessages.size < 3 %}
              false
            {% else %}
              {% assign msg1 = userMessages[0].content | downcase %}
              {% assign msg2 = userMessages[1].content | downcase %}
              {% assign msg3 = userMessages[2].content | downcase %}
              {% comment %} Check for repetitive messages {% endcomment %}
              {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                true
              {% comment %} Check for common loop phrases {% endcomment %}
              {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                true
              {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                true
              {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                true
              {% else %}
                false
              {% endif %}
            {% endif %}`
              }]
            }
            ```
      title: CreateMcpToolDTO
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems
    KnowledgeBaseProvider:
      type: string
      enum:
        - google
      description: The provider of the knowledge base
      title: KnowledgeBaseProvider
    KnowledgeBaseModel:
      type: string
      enum:
        - gemini-3-flash-preview
        - gemini-2.5-pro
        - gemini-2.5-flash
        - gemini-2.5-flash-lite
        - gemini-2.0-flash-thinking-exp
        - gemini-2.0-pro-exp-02-05
        - gemini-2.0-flash
        - gemini-2.0-flash-lite
        - gemini-2.0-flash-exp
        - gemini-2.0-flash-realtime-exp
        - gemini-1.5-flash
        - gemini-1.5-flash-002
        - gemini-1.5-pro
        - gemini-1.5-pro-002
        - gemini-1.0-pro
      description: The model to use for the knowledge base
      title: KnowledgeBaseModel
    KnowledgeBase:
      type: object
      properties:
        name:
          type: string
          description: The name of the knowledge base
        provider:
          $ref: '#/components/schemas/KnowledgeBaseProvider'
          description: The provider of the knowledge base
        model:
          $ref: '#/components/schemas/KnowledgeBaseModel'
          description: The model to use for the knowledge base
        description:
          type: string
          description: A description of the knowledge base
        fileIds:
          type: array
          items:
            type: string
          description: The file IDs associated with this knowledge base
      required:
        - name
        - provider
        - description
        - fileIds
      title: KnowledgeBase
    CreateQueryToolDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems'
          description: >-
            These are the messages that will be spoken to the user as the tool is running.


            For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the
            function tool, these can be custom configured.
        knowledgeBases:
          type: array
          items:
            $ref: '#/components/schemas/KnowledgeBase'
          description: The knowledge bases to query
        rejectionPlan:
          $ref: '#/components/schemas/ToolRejectionPlan'
          description: |-
            This is the plan to reject a tool call based on the conversation state.

            // Example 1: Reject endCall if user didn't say goodbye
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                target: { position: -1, role: 'user' },
                negate: true  // Reject if pattern does NOT match
              }]
            }
            ```

            // Example 2: Reject transfer if user is actually asking a question
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '\\?',
                target: { position: -1, role: 'user' }
              }]
            }
            ```

            // Example 3: Reject transfer if user didn't mention transfer recently
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 5 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' %}
            {% assign mentioned = false %}
            {% for msg in userMessages %}
              {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                {% assign mentioned = true %}
                {% break %}
              {% endif %}
            {% endfor %}
            {% if mentioned %}
              false
            {% else %}
              true
            {% endif %}`
              }]
            }
            ```

            // Example 4: Reject endCall if the bot is looping and trying to exit
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 6 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
            {% if userMessages.size < 3 %}
              false
            {% else %}
              {% assign msg1 = userMessages[0].content | downcase %}
              {% assign msg2 = userMessages[1].content | downcase %}
              {% assign msg3 = userMessages[2].content | downcase %}
              {% comment %} Check for repetitive messages {% endcomment %}
              {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                true
              {% comment %} Check for common loop phrases {% endcomment %}
              {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                true
              {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                true
              {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                true
              {% else %}
                false
              {% endif %}
            {% endif %}`
              }]
            }
            ```
      title: CreateQueryToolDTO
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems
    CreateSlackSendMessageToolDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: >-
              #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems
          description: >-
            These are the messages that will be spoken to the user as the tool is running.


            For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the
            function tool, these can be custom configured.
        rejectionPlan:
          $ref: '#/components/schemas/ToolRejectionPlan'
          description: |-
            This is the plan to reject a tool call based on the conversation state.

            // Example 1: Reject endCall if user didn't say goodbye
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                target: { position: -1, role: 'user' },
                negate: true  // Reject if pattern does NOT match
              }]
            }
            ```

            // Example 2: Reject transfer if user is actually asking a question
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '\\?',
                target: { position: -1, role: 'user' }
              }]
            }
            ```

            // Example 3: Reject transfer if user didn't mention transfer recently
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 5 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' %}
            {% assign mentioned = false %}
            {% for msg in userMessages %}
              {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                {% assign mentioned = true %}
                {% break %}
              {% endif %}
            {% endfor %}
            {% if mentioned %}
              false
            {% else %}
              true
            {% endif %}`
              }]
            }
            ```

            // Example 4: Reject endCall if the bot is looping and trying to exit
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 6 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
            {% if userMessages.size < 3 %}
              false
            {% else %}
              {% assign msg1 = userMessages[0].content | downcase %}
              {% assign msg2 = userMessages[1].content | downcase %}
              {% assign msg3 = userMessages[2].content | downcase %}
              {% comment %} Check for repetitive messages {% endcomment %}
              {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                true
              {% comment %} Check for common loop phrases {% endcomment %}
              {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                true
              {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                true
              {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                true
              {% else %}
                false
              {% endif %}
            {% endif %}`
              }]
            }
            ```
      title: CreateSlackSendMessageToolDTO
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems
    CreateSmsToolDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems'
          description: >-
            These are the messages that will be spoken to the user as the tool is running.


            For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the
            function tool, these can be custom configured.
        rejectionPlan:
          $ref: '#/components/schemas/ToolRejectionPlan'
          description: |-
            This is the plan to reject a tool call based on the conversation state.

            // Example 1: Reject endCall if user didn't say goodbye
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                target: { position: -1, role: 'user' },
                negate: true  // Reject if pattern does NOT match
              }]
            }
            ```

            // Example 2: Reject transfer if user is actually asking a question
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '\\?',
                target: { position: -1, role: 'user' }
              }]
            }
            ```

            // Example 3: Reject transfer if user didn't mention transfer recently
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 5 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' %}
            {% assign mentioned = false %}
            {% for msg in userMessages %}
              {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                {% assign mentioned = true %}
                {% break %}
              {% endif %}
            {% endfor %}
            {% if mentioned %}
              false
            {% else %}
              true
            {% endif %}`
              }]
            }
            ```

            // Example 4: Reject endCall if the bot is looping and trying to exit
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 6 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
            {% if userMessages.size < 3 %}
              false
            {% else %}
              {% assign msg1 = userMessages[0].content | downcase %}
              {% assign msg2 = userMessages[1].content | downcase %}
              {% assign msg3 = userMessages[2].content | downcase %}
              {% comment %} Check for repetitive messages {% endcomment %}
              {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                true
              {% comment %} Check for common loop phrases {% endcomment %}
              {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                true
              {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                true
              {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                true
              {% else %}
                false
              {% endif %}
            {% endif %}`
              }]
            }
            ```
      title: CreateSmsToolDTO
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType:
      type: string
      enum:
        - text_editor_20241022
      description: The sub type of tool.
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorName:
      type: string
      enum:
        - str_replace_editor
      default: str_replace_editor
      description: The name of the tool, fixed to 'str_replace_editor'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorName
    CreateTextEditorToolDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: >-
              #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems
          description: >-
            These are the messages that will be spoken to the user as the tool is running.


            For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the
            function tool, these can be custom configured.
        subType:
          $ref: '#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType'
          description: The sub type of tool.
        server:
          $ref: '#/components/schemas/Server'
          description: |2-

              This is the server where a `tool-calls` webhook will be sent.

              Notes:
              - Webhook is sent to this server when a tool call is made.
              - Webhook contains the call, assistant, and phone number objects.
              - Webhook contains the variables set on the assistant.
              - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
              - Webhook expects a response with tool call result.
        name:
          $ref: '#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorName'
          description: The name of the tool, fixed to 'str_replace_editor'
        rejectionPlan:
          $ref: '#/components/schemas/ToolRejectionPlan'
          description: |-
            This is the plan to reject a tool call based on the conversation state.

            // Example 1: Reject endCall if user didn't say goodbye
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                target: { position: -1, role: 'user' },
                negate: true  // Reject if pattern does NOT match
              }]
            }
            ```

            // Example 2: Reject transfer if user is actually asking a question
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '\\?',
                target: { position: -1, role: 'user' }
              }]
            }
            ```

            // Example 3: Reject transfer if user didn't mention transfer recently
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 5 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' %}
            {% assign mentioned = false %}
            {% for msg in userMessages %}
              {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                {% assign mentioned = true %}
                {% break %}
              {% endif %}
            {% endfor %}
            {% if mentioned %}
              false
            {% else %}
              true
            {% endif %}`
              }]
            }
            ```

            // Example 4: Reject endCall if the bot is looping and trying to exit
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 6 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
            {% if userMessages.size < 3 %}
              false
            {% else %}
              {% assign msg1 = userMessages[0].content | downcase %}
              {% assign msg2 = userMessages[1].content | downcase %}
              {% assign msg3 = userMessages[2].content | downcase %}
              {% comment %} Check for repetitive messages {% endcomment %}
              {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                true
              {% comment %} Check for common loop phrases {% endcomment %}
              {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                true
              {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                true
              {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                true
              {% else %}
                false
              {% endif %}
            {% endif %}`
              }]
            }
            ```
      required:
        - subType
        - name
      title: CreateTextEditorToolDTO
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems
    CustomMessageContentsItems:
      oneOf:
        - $ref: '#/components/schemas/TextContent'
      title: CustomMessageContentsItems
    CustomMessageType:
      type: string
      enum:
        - custom-message
      description: This is a custom message.
      title: CustomMessageType
    CustomMessage:
      type: object
      properties:
        contents:
          type: array
          items:
            $ref: '#/components/schemas/CustomMessageContentsItems'
          description: >-
            This is an alternative to the `content` property. It allows to specify variants of the same content, one per
            language.


            Usage:

            - If your assistants are multilingual, you can provide content for each language.

            - If you don't provide content for a language, the first item in the array will be automatically translated
            to the active language at that moment.


            This will override the `content` property.
        type:
          $ref: '#/components/schemas/CustomMessageType'
          description: This is a custom message.
        content:
          type: string
          description: This is the content that the assistant will say when this message is triggered.
      required:
        - type
      title: CustomMessage
    TransferDestinationAssistantMessage:
      oneOf:
        - type: string
        - $ref: '#/components/schemas/CustomMessage'
      description: >-
        This is spoken to the customer before connecting them to the destination.


        Usage:

        - If this is not provided and transfer tool messages is not provided, default is "Transferring the call now".

        - If set to "", nothing is spoken. This is useful when you want to silently transfer. This is especially useful
        when transferring between assistants in a squad. In this scenario, you likely also want to set
        `assistant.firstMessageMode=assistant-speaks-first-with-model-generated-message` for the destination assistant.


        This accepts a string or a ToolMessageStart class. Latter is useful if you want to specify multiple messages for
        different languages through the `contents` field.
      title: TransferDestinationAssistantMessage
    TransferDestinationAssistantType:
      type: string
      enum:
        - assistant
      title: TransferDestinationAssistantType
    TransferMode:
      type: string
      enum:
        - rolling-history
        - swap-system-message-in-history
      title: TransferMode
    TransferDestinationAssistant:
      type: object
      properties:
        message:
          $ref: '#/components/schemas/TransferDestinationAssistantMessage'
          description: >-
            This is spoken to the customer before connecting them to the destination.


            Usage:

            - If this is not provided and transfer tool messages is not provided, default is "Transferring the call
            now".

            - If set to "", nothing is spoken. This is useful when you want to silently transfer. This is especially
            useful when transferring between assistants in a squad. In this scenario, you likely also want to set
            `assistant.firstMessageMode=assistant-speaks-first-with-model-generated-message` for the destination
            assistant.


            This accepts a string or a ToolMessageStart class. Latter is useful if you want to specify multiple messages
            for different languages through the `contents` field.
        type:
          $ref: '#/components/schemas/TransferDestinationAssistantType'
        transferMode:
          $ref: '#/components/schemas/TransferMode'
          description: >-
            This is the mode to use for the transfer. Defaults to `rolling-history`.


            - `rolling-history`: This is the default mode. It keeps the entire conversation history and appends the new
            assistant's system message on transfer.

              Example:

              Pre-transfer:
                system: assistant1 system message
                assistant: assistant1 first message
                user: hey, good morning
                assistant: how can i help?
                user: i need help with my account
                assistant: (destination.message)

              Post-transfer:
                system: assistant1 system message
                assistant: assistant1 first message
                user: hey, good morning
                assistant: how can i help?
                user: i need help with my account
                assistant: (destination.message)
                system: assistant2 system message
                assistant: assistant2 first message (or model generated if firstMessageMode is set to `assistant-speaks-first-with-model-generated-message`)

            - `swap-system-message-in-history`: This replaces the original system message with the new assistant's
            system message on transfer.

              Example:

              Pre-transfer:
                system: assistant1 system message
                assistant: assistant1 first message
                user: hey, good morning
                assistant: how can i help?
                user: i need help with my account
                assistant: (destination.message)

              Post-transfer:
                system: assistant2 system message
                assistant: assistant1 first message
                user: hey, good morning
                assistant: how can i help?
                user: i need help with my account
                assistant: (destination.message)
                assistant: assistant2 first message (or model generated if firstMessageMode is set to `assistant-speaks-first-with-model-generated-message`)

            - `delete-history`: This deletes the entire conversation history on transfer.

              Example:

              Pre-transfer:
                system: assistant1 system message
                assistant: assistant1 first message
                user: hey, good morning
                assistant: how can i help?
                user: i need help with my account
                assistant: (destination.message)

              Post-transfer:
                system: assistant2 system message
                assistant: assistant2 first message
                user: Yes, please
                assistant: how can i help?
                user: i need help with my account

            - `swap-system-message-in-history-and-remove-transfer-tool-messages`: This replaces the original system
            message with the new assistant's system message on transfer and removes transfer tool messages from
            conversation history sent to the LLM.

              Example:

              Pre-transfer:
                system: assistant1 system message
                assistant: assistant1 first message
                user: hey, good morning
                assistant: how can i help?
                user: i need help with my account
                transfer-tool
                transfer-tool-result
                assistant: (destination.message)

              Post-transfer:
                system: assistant2 system message
                assistant: assistant1 first message
                user: hey, good morning
                assistant: how can i help?
                user: i need help with my account
                assistant: (destination.message)
                assistant: assistant2 first message (or model generated if firstMessageMode is set to `assistant-speaks-first-with-model-generated-message`)

            @default 'rolling-history'
        assistantName:
          type: string
          description: This is the assistant to transfer the call to.
        description:
          type: string
          description: This is the description of the destination, used by the AI to choose when and how to transfer the call.
      required:
        - type
        - assistantName
      title: TransferDestinationAssistant
    TransferDestinationNumberMessage:
      oneOf:
        - type: string
        - $ref: '#/components/schemas/CustomMessage'
      description: >-
        This is spoken to the customer before connecting them to the destination.


        Usage:

        - If this is not provided and transfer tool messages is not provided, default is "Transferring the call now".

        - If set to "", nothing is spoken. This is useful when you want to silently transfer. This is especially useful
        when transferring between assistants in a squad. In this scenario, you likely also want to set
        `assistant.firstMessageMode=assistant-speaks-first-with-model-generated-message` for the destination assistant.


        This accepts a string or a ToolMessageStart class. Latter is useful if you want to specify multiple messages for
        different languages through the `contents` field.
      title: TransferDestinationNumberMessage
    TransferDestinationNumberType:
      type: string
      enum:
        - number
      title: TransferDestinationNumberType
    TransferPlanMode:
      type: string
      enum:
        - blind-transfer
        - blind-transfer-add-summary-to-sip-header
        - warm-transfer-say-message
        - warm-transfer-say-summary
        - warm-transfer-twiml
        - warm-transfer-wait-for-operator-to-speak-first-and-then-say-message
        - warm-transfer-wait-for-operator-to-speak-first-and-then-say-summary
        - warm-transfer-experimental
      description: >-
        This configures how transfer is executed and the experience of the destination party receiving the call.


        Usage:

        - `blind-transfer`: The assistant forwards the call to the destination without any message or summary.

        - `blind-transfer-add-summary-to-sip-header`: The assistant forwards the call to the destination and adds a SIP
        header X-Transfer-Summary to the call to include the summary.

        - `warm-transfer-say-message`: The assistant dials the destination, delivers the `message` to the destination
        party, connects the customer, and leaves the call.

        - `warm-transfer-say-summary`: The assistant dials the destination, provides a summary of the call to the
        destination party, connects the customer, and leaves the call.

        - `warm-transfer-wait-for-operator-to-speak-first-and-then-say-message`: The assistant dials the destination,
        waits for the operator to speak, delivers the `message` to the destination party, and then connects the
        customer.

        - `warm-transfer-wait-for-operator-to-speak-first-and-then-say-summary`: The assistant dials the destination,
        waits for the operator to speak, provides a summary of the call to the destination party, and then connects the
        customer.

        - `warm-transfer-twiml`: The assistant dials the destination, executes the twiml instructions on the destination
        call leg, connects the customer, and leaves the call.

        - `warm-transfer-experimental`: The assistant puts the customer on hold, dials the destination, and if the
        destination answers (and is human), delivers a message or summary before connecting the customer. If the
        destination is unreachable or not human (e.g., with voicemail detection), the assistant delivers the
        `fallbackMessage` to the customer and optionally ends the call.


        @default 'blind-transfer'
      title: TransferPlanMode
    TransferPlanMessage:
      oneOf:
        - type: string
        - $ref: '#/components/schemas/CustomMessage'
      description: >-
        This is the message the assistant will deliver to the destination party before connecting the customer.


        Usage:

        - Used only when `mode` is `blind-transfer-add-summary-to-sip-header`, `warm-transfer-say-message`,
        `warm-transfer-wait-for-operator-to-speak-first-and-then-say-message`, or `warm-transfer-experimental`.
      title: TransferPlanMessage
    TransferPlanSipVerb:
      type: string
      enum:
        - refer
        - bye
        - dial
      default: refer
      description: |-
        This specifies the SIP verb to use while transferring the call.
        - 'refer': Uses SIP REFER to transfer the call (default)
        - 'bye': Ends current call with SIP BYE
        - 'dial': Uses SIP DIAL to transfer the call
      title: TransferPlanSipVerb
    TransferPlanContextEngineeringPlan:
      oneOf:
        - $ref: '#/components/schemas/ContextEngineeringPlanLastNMessages'
        - $ref: '#/components/schemas/ContextEngineeringPlanNone'
        - $ref: '#/components/schemas/ContextEngineeringPlanAll'
      description: |-
        This is the plan for manipulating the message context before initiating the warm transfer.
        Usage:
        - Used only when `mode` is `warm-transfer-experimental`.
        - These messages will automatically be added to the transferAssistant's system message.
        - If 'none', we will not add any transcript to the transferAssistant's system message.
        - If you want to provide your own messages, use transferAssistant.model.messages instead.

        @default { type: 'all' }
      title: TransferPlanContextEngineeringPlan
    SummaryPlanMessagesItems:
      type: object
      properties: {}
      title: SummaryPlanMessagesItems
    SummaryPlan:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/SummaryPlanMessagesItems'
          description: |-
            These are the messages used to generate the summary.

            @default: ```
            [
              {
                "role": "system",
                "content": "You are an expert note-taker. You will be given a transcript of a call. Summarize the call in 2-3 sentences. DO NOT return anything except the summary."
              },
              {
                "role": "user",
                "content": "Here is the transcript:\n\n{{transcript}}\n\n. Here is the ended reason of the call:\n\n{{endedReason}}\n\n"
              }
            ]```

            You can customize by providing any messages you want.

            Here are the template variables available:
            - {{transcript}}: The transcript of the call from `call.artifact.transcript` 
            - {{systemPrompt}}: The system prompt of the call from `assistant.model.messages[type=system].content` 
            - {{messages}}: The messages of the call from `assistant.model.messages` 
            - {{endedReason}}: The ended reason of the call from `call.endedReason`
        enabled:
          type: boolean
          description: |-
            This determines whether a summary is generated and stored in `call.analysis.summary`. Defaults to true.

            Usage:
            - If you want to disable the summary, set this to false.

            @default true
        timeoutSeconds:
          type: number
          format: double
          description: >-
            This is how long the request is tried before giving up. When request times out, `call.analysis.summary` will
            be empty.


            Usage:

            - To guarantee the summary is generated, set this value high. Note, this will delay the end of call report
            in cases where model is slow to respond.


            @default 5 seconds
      title: SummaryPlan
    TransferFallbackPlanMessage:
      oneOf:
        - type: string
        - $ref: '#/components/schemas/CustomMessage'
      description: This is the message the assistant will deliver to the customer if the transfer fails.
      title: TransferFallbackPlanMessage
    TransferFallbackPlan:
      type: object
      properties:
        message:
          $ref: '#/components/schemas/TransferFallbackPlanMessage'
          description: This is the message the assistant will deliver to the customer if the transfer fails.
        endCallEnabled:
          type: boolean
          default: true
          description: |-
            This controls what happens after delivering the failure message to the customer.
            - true: End the call after delivering the failure message (default)
            - false: Keep the assistant on the call to continue handling the customer's request

            @default true
      required:
        - message
      title: TransferFallbackPlan
    TransferPlan:
      type: object
      properties:
        mode:
          $ref: '#/components/schemas/TransferPlanMode'
          description: >-
            This configures how transfer is executed and the experience of the destination party receiving the call.


            Usage:

            - `blind-transfer`: The assistant forwards the call to the destination without any message or summary.

            - `blind-transfer-add-summary-to-sip-header`: The assistant forwards the call to the destination and adds a
            SIP header X-Transfer-Summary to the call to include the summary.

            - `warm-transfer-say-message`: The assistant dials the destination, delivers the `message` to the
            destination party, connects the customer, and leaves the call.

            - `warm-transfer-say-summary`: The assistant dials the destination, provides a summary of the call to the
            destination party, connects the customer, and leaves the call.

            - `warm-transfer-wait-for-operator-to-speak-first-and-then-say-message`: The assistant dials the
            destination, waits for the operator to speak, delivers the `message` to the destination party, and then
            connects the customer.

            - `warm-transfer-wait-for-operator-to-speak-first-and-then-say-summary`: The assistant dials the
            destination, waits for the operator to speak, provides a summary of the call to the destination party, and
            then connects the customer.

            - `warm-transfer-twiml`: The assistant dials the destination, executes the twiml instructions on the
            destination call leg, connects the customer, and leaves the call.

            - `warm-transfer-experimental`: The assistant puts the customer on hold, dials the destination, and if the
            destination answers (and is human), delivers a message or summary before connecting the customer. If the
            destination is unreachable or not human (e.g., with voicemail detection), the assistant delivers the
            `fallbackMessage` to the customer and optionally ends the call.


            @default 'blind-transfer'
        message:
          $ref: '#/components/schemas/TransferPlanMessage'
          description: >-
            This is the message the assistant will deliver to the destination party before connecting the customer.


            Usage:

            - Used only when `mode` is `blind-transfer-add-summary-to-sip-header`, `warm-transfer-say-message`,
            `warm-transfer-wait-for-operator-to-speak-first-and-then-say-message`, or `warm-transfer-experimental`.
        timeout:
          type: number
          format: double
          default: 60
          description: >-
            This is the timeout in seconds for the
            warm-transfer-wait-for-operator-to-speak-first-and-then-say-message/summary


            @default 60
        sipVerb:
          $ref: '#/components/schemas/TransferPlanSipVerb'
          description: |-
            This specifies the SIP verb to use while transferring the call.
            - 'refer': Uses SIP REFER to transfer the call (default)
            - 'bye': Ends current call with SIP BYE
            - 'dial': Uses SIP DIAL to transfer the call
        dialTimeout:
          type: number
          format: double
          default: 60
          description: >-
            This sets the timeout for the dial operation in seconds. This is the duration the call will ring before
            timing out.


            Only applicable when `sipVerb='dial'`. Not applicable for SIP REFER or BYE.


            @default 60
        holdAudioUrl:
          type: string
          description: |-
            This is the URL to an audio file played while the customer is on hold during transfer.

            Usage:
            - Used only when `mode` is `warm-transfer-experimental`.
            - Used when transferring calls to play hold audio for the customer.
            - Must be a publicly accessible URL to an audio file.
            - Supported formats: MP3 and WAV.
            - If not provided, the default hold audio will be used.
        transferCompleteAudioUrl:
          type: string
          description: >-
            This is the URL to an audio file played after the warm transfer message or summary is delivered to the
            destination party.

            It can be used to play a custom sound like 'beep' to notify that the transfer is complete.


            Usage:

            - Used only when `mode` is `warm-transfer-experimental`.

            - Used when transferring calls to play hold audio for the destination party.

            - Must be a publicly accessible URL to an audio file.

            - Supported formats: MP3 and WAV.
        contextEngineeringPlan:
          $ref: '#/components/schemas/TransferPlanContextEngineeringPlan'
          description: |-
            This is the plan for manipulating the message context before initiating the warm transfer.
            Usage:
            - Used only when `mode` is `warm-transfer-experimental`.
            - These messages will automatically be added to the transferAssistant's system message.
            - If 'none', we will not add any transcript to the transferAssistant's system message.
            - If you want to provide your own messages, use transferAssistant.model.messages instead.

            @default { type: 'all' }
        twiml:
          type: string
          description: |-
            This is the TwiML instructions to execute on the destination call leg before connecting the customer.

            Usage:
            - Used only when `mode` is `warm-transfer-twiml`.
            - Supports only `Play`, `Say`, `Gather`, `Hangup` and `Pause` verbs.
            - Maximum length is 4096 characters.

            Example:
            ```
            <Say voice="alice" language="en-US">Hello, transferring a customer to you.</Say>
            <Pause length="2"/>
            <Say>They called about billing questions.</Say>
            ```
        summaryPlan:
          $ref: '#/components/schemas/SummaryPlan'
          description: >-
            This is the plan for generating a summary of the call to present to the destination party.


            Usage:

            - Used only when `mode` is `blind-transfer-add-summary-to-sip-header` or `warm-transfer-say-summary` or
            `warm-transfer-wait-for-operator-to-speak-first-and-then-say-summary` or `warm-transfer-experimental`.
        sipHeadersInReferToEnabled:
          type: boolean
          description: |-
            This flag includes the sipHeaders from above in the refer to sip uri as url encoded query params.

            @default false
        fallbackPlan:
          $ref: '#/components/schemas/TransferFallbackPlan'
          description: |-
            This configures the fallback plan when the transfer fails (destination unreachable, busy, or not human).

            Usage:
            - Used only when `mode` is `warm-transfer-experimental`.
            - If not provided when using `warm-transfer-experimental`, a default message will be used.
      required:
        - mode
      title: TransferPlan
    TransferDestinationNumber:
      type: object
      properties:
        message:
          $ref: '#/components/schemas/TransferDestinationNumberMessage'
          description: >-
            This is spoken to the customer before connecting them to the destination.


            Usage:

            - If this is not provided and transfer tool messages is not provided, default is "Transferring the call
            now".

            - If set to "", nothing is spoken. This is useful when you want to silently transfer. This is especially
            useful when transferring between assistants in a squad. In this scenario, you likely also want to set
            `assistant.firstMessageMode=assistant-speaks-first-with-model-generated-message` for the destination
            assistant.


            This accepts a string or a ToolMessageStart class. Latter is useful if you want to specify multiple messages
            for different languages through the `contents` field.
        type:
          $ref: '#/components/schemas/TransferDestinationNumberType'
        numberE164CheckEnabled:
          type: boolean
          default: true
          description: >-
            This is the flag to toggle the E164 check for the `number` field. This is an advanced property which should
            be used if you know your use case requires it.


            Use cases:

            - `false`: To allow non-E164 numbers like `+001234567890`, `1234`, or `abc`. This is useful for dialing out
            to non-E164 numbers on your SIP trunks.

            - `true` (default): To allow only E164 numbers like `+14155551234`. This is standard for PSTN calls.


            If `false`, the `number` is still required to only contain alphanumeric characters (regex:
            `/^\+?[a-zA-Z0-9]+$/`).


            @default true (E164 check is enabled)
        number:
          type: string
          description: This is the phone number to transfer the call to.
        extension:
          type: string
          description: This is the extension to dial after transferring the call to the `number`.
        callerId:
          type: string
          description: >-
            This is the caller ID to use when transferring the call to the `number`.


            Usage:

            - If not provided, the caller ID will be the number the call is coming **from**.
              Example: a customer with number +14151111111 calls in to and the assistant transfers out to +16470000000. +16470000000 will see +14151111111 as the caller.
              For inbound calls, the caller ID is the customer's number. For outbound calls, the caller ID is the phone number of the assistant.
            - To change this behavior, provide a `callerId`.

            - Set to '{{customer.number}}' to always use the customer's number as the caller ID.

            - Set to '{{phoneNumber.number}}' to always use the phone number of the assistant as the caller ID.

            - Set to any E164 number to always use that number as the caller ID. This needs to be a number that is owned
            or verified by your Transport provider like Twilio.


            For Twilio, you can read up more here: https://www.twilio.com/docs/voice/twiml/dial#callerid
        transferPlan:
          $ref: '#/components/schemas/TransferPlan'
          description: >-
            This configures how transfer is executed and the experience of the destination party receiving the call.
            Defaults to `blind-transfer`.


            @default `transferPlan.mode='blind-transfer'`
        description:
          type: string
          description: This is the description of the destination, used by the AI to choose when and how to transfer the call.
      required:
        - type
        - number
      title: TransferDestinationNumber
    TransferDestinationSipMessage:
      oneOf:
        - type: string
        - $ref: '#/components/schemas/CustomMessage'
      description: >-
        This is spoken to the customer before connecting them to the destination.


        Usage:

        - If this is not provided and transfer tool messages is not provided, default is "Transferring the call now".

        - If set to "", nothing is spoken. This is useful when you want to silently transfer. This is especially useful
        when transferring between assistants in a squad. In this scenario, you likely also want to set
        `assistant.firstMessageMode=assistant-speaks-first-with-model-generated-message` for the destination assistant.


        This accepts a string or a ToolMessageStart class. Latter is useful if you want to specify multiple messages for
        different languages through the `contents` field.
      title: TransferDestinationSipMessage
    TransferDestinationSipType:
      type: string
      enum:
        - sip
      title: TransferDestinationSipType
    TransferDestinationSipSipHeaders:
      type: object
      properties: {}
      description: These are custom headers to be added to SIP refer during transfer call.
      title: TransferDestinationSipSipHeaders
    TransferDestinationSip:
      type: object
      properties:
        message:
          $ref: '#/components/schemas/TransferDestinationSipMessage'
          description: >-
            This is spoken to the customer before connecting them to the destination.


            Usage:

            - If this is not provided and transfer tool messages is not provided, default is "Transferring the call
            now".

            - If set to "", nothing is spoken. This is useful when you want to silently transfer. This is especially
            useful when transferring between assistants in a squad. In this scenario, you likely also want to set
            `assistant.firstMessageMode=assistant-speaks-first-with-model-generated-message` for the destination
            assistant.


            This accepts a string or a ToolMessageStart class. Latter is useful if you want to specify multiple messages
            for different languages through the `contents` field.
        type:
          $ref: '#/components/schemas/TransferDestinationSipType'
        sipUri:
          type: string
          description: This is the SIP URI to transfer the call to.
        callerId:
          type: string
          description: |-
            This is the caller ID to use when transferring the call to the `sipUri`.

            Usage:
            - If not provided, the caller ID will be determined by the SIP infrastructure.
            - Set to '{{customer.number}}' to always use the customer's number as the caller ID.
            - Set to '{{phoneNumber.number}}' to always use the phone number of the assistant as the caller ID.
            - Set to any E164 number to always use that number as the caller ID.

            Only applicable when `transferPlan.sipVerb='dial'`. Not applicable for SIP REFER.
        transferPlan:
          $ref: '#/components/schemas/TransferPlan'
          description: >-
            This configures how transfer is executed and the experience of the destination party receiving the call.
            Defaults to `blind-transfer`.


            @default `transferPlan.mode='blind-transfer'`
        sipHeaders:
          $ref: '#/components/schemas/TransferDestinationSipSipHeaders'
          description: These are custom headers to be added to SIP refer during transfer call.
        description:
          type: string
          description: This is the description of the destination, used by the AI to choose when and how to transfer the call.
      required:
        - type
        - sipUri
      title: TransferDestinationSip
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems:
      oneOf:
        - $ref: '#/components/schemas/TransferDestinationAssistant'
        - $ref: '#/components/schemas/TransferDestinationNumber'
        - $ref: '#/components/schemas/TransferDestinationSip'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems
    CreateTransferCallToolDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: >-
              #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems
          description: >-
            These are the messages that will be spoken to the user as the tool is running.


            For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the
            function tool, these can be custom configured.
        destinations:
          type: array
          items:
            $ref: >-
              #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems
          description: >-
            These are the destinations that the call can be transferred to. If no destinations are provided, server.url
            will be used to get the transfer destination once the tool is called.
        rejectionPlan:
          $ref: '#/components/schemas/ToolRejectionPlan'
          description: |-
            This is the plan to reject a tool call based on the conversation state.

            // Example 1: Reject endCall if user didn't say goodbye
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                target: { position: -1, role: 'user' },
                negate: true  // Reject if pattern does NOT match
              }]
            }
            ```

            // Example 2: Reject transfer if user is actually asking a question
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '\\?',
                target: { position: -1, role: 'user' }
              }]
            }
            ```

            // Example 3: Reject transfer if user didn't mention transfer recently
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 5 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' %}
            {% assign mentioned = false %}
            {% for msg in userMessages %}
              {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                {% assign mentioned = true %}
                {% break %}
              {% endif %}
            {% endfor %}
            {% if mentioned %}
              false
            {% else %}
              true
            {% endif %}`
              }]
            }
            ```

            // Example 4: Reject endCall if the bot is looping and trying to exit
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 6 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
            {% if userMessages.size < 3 %}
              false
            {% else %}
              {% assign msg1 = userMessages[0].content | downcase %}
              {% assign msg2 = userMessages[1].content | downcase %}
              {% assign msg3 = userMessages[2].content | downcase %}
              {% comment %} Check for repetitive messages {% endcomment %}
              {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                true
              {% comment %} Check for common loop phrases {% endcomment %}
              {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                true
              {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                true
              {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                true
              {% else %}
                false
              {% endif %}
            {% endif %}`
              }]
            }
            ```
      title: CreateTransferCallToolDTO
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb:
      type: string
      enum:
        - INFO
        - MESSAGE
        - NOTIFY
      description: The SIP method to send.
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody:
      oneOf:
        - type: string
        - $ref: '#/components/schemas/JsonSchema'
      description: >-
        Body to include in the SIP request. Either a literal string body, or a JSON schema describing a structured body
        that the model should populate.
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody
    CreateSipRequestToolDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: >-
              #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems
          description: >-
            These are the messages that will be spoken to the user as the tool is running.


            For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the
            function tool, these can be custom configured.
        verb:
          $ref: '#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb'
          description: The SIP method to send.
        headers:
          $ref: '#/components/schemas/JsonSchema'
          description: JSON schema for headers the model should populate when sending the SIP request.
        body:
          $ref: '#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody'
          description: >-
            Body to include in the SIP request. Either a literal string body, or a JSON schema describing a structured
            body that the model should populate.
        rejectionPlan:
          $ref: '#/components/schemas/ToolRejectionPlan'
          description: |-
            This is the plan to reject a tool call based on the conversation state.

            // Example 1: Reject endCall if user didn't say goodbye
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                target: { position: -1, role: 'user' },
                negate: true  // Reject if pattern does NOT match
              }]
            }
            ```

            // Example 2: Reject transfer if user is actually asking a question
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '\\?',
                target: { position: -1, role: 'user' }
              }]
            }
            ```

            // Example 3: Reject transfer if user didn't mention transfer recently
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 5 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' %}
            {% assign mentioned = false %}
            {% for msg in userMessages %}
              {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                {% assign mentioned = true %}
                {% break %}
              {% endif %}
            {% endfor %}
            {% if mentioned %}
              false
            {% else %}
              true
            {% endif %}`
              }]
            }
            ```

            // Example 4: Reject endCall if the bot is looping and trying to exit
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 6 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
            {% if userMessages.size < 3 %}
              false
            {% else %}
              {% assign msg1 = userMessages[0].content | downcase %}
              {% assign msg2 = userMessages[1].content | downcase %}
              {% assign msg3 = userMessages[2].content | downcase %}
              {% comment %} Check for repetitive messages {% endcomment %}
              {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                true
              {% comment %} Check for common loop phrases {% endcomment %}
              {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                true
              {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                true
              {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                true
              {% else %}
                false
              {% endif %}
            {% endif %}`
              }]
            }
            ```
      required:
        - verb
      title: CreateSipRequestToolDTO
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems
    CreateVoicemailToolDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: >-
              #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems
          description: >-
            These are the messages that will be spoken to the user as the tool is running.


            For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the
            function tool, these can be custom configured.
        beepDetectionEnabled:
          type: boolean
          default: false
          description: >-
            This is the flag that enables beep detection for voicemail detection and applies only for twilio based
            calls.


            @default false
        rejectionPlan:
          $ref: '#/components/schemas/ToolRejectionPlan'
          description: |-
            This is the plan to reject a tool call based on the conversation state.

            // Example 1: Reject endCall if user didn't say goodbye
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                target: { position: -1, role: 'user' },
                negate: true  // Reject if pattern does NOT match
              }]
            }
            ```

            // Example 2: Reject transfer if user is actually asking a question
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '\\?',
                target: { position: -1, role: 'user' }
              }]
            }
            ```

            // Example 3: Reject transfer if user didn't mention transfer recently
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 5 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' %}
            {% assign mentioned = false %}
            {% for msg in userMessages %}
              {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                {% assign mentioned = true %}
                {% break %}
              {% endif %}
            {% endfor %}
            {% if mentioned %}
              false
            {% else %}
              true
            {% endif %}`
              }]
            }
            ```

            // Example 4: Reject endCall if the bot is looping and trying to exit
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 6 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
            {% if userMessages.size < 3 %}
              false
            {% else %}
              {% assign msg1 = userMessages[0].content | downcase %}
              {% assign msg2 = userMessages[1].content | downcase %}
              {% assign msg3 = userMessages[2].content | downcase %}
              {% comment %} Check for repetitive messages {% endcomment %}
              {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                true
              {% comment %} Check for common loop phrases {% endcomment %}
              {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                true
              {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                true
              {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                true
              {% else %}
                false
              {% endif %}
            {% endif %}`
              }]
            }
            ```
      title: CreateVoicemailToolDTO
    AnthropicBedrockModelToolsItems:
      oneOf:
        - $ref: '#/components/schemas/CreateApiRequestToolDTO'
        - $ref: '#/components/schemas/CreateBashToolDTO'
        - $ref: '#/components/schemas/CreateCodeToolDTO'
        - $ref: '#/components/schemas/CreateComputerToolDTO'
        - $ref: '#/components/schemas/CreateDtmfToolDTO'
        - $ref: '#/components/schemas/CreateEndCallToolDTO'
        - $ref: '#/components/schemas/CreateFunctionToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactGetToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCreateEventToolDTO'
        - $ref: '#/components/schemas/CreateGoogleSheetsRowAppendToolDTO'
        - $ref: '#/components/schemas/CreateHandoffToolDTO'
        - $ref: '#/components/schemas/CreateMcpToolDTO'
        - $ref: '#/components/schemas/CreateQueryToolDTO'
        - $ref: '#/components/schemas/CreateSlackSendMessageToolDTO'
        - $ref: '#/components/schemas/CreateSmsToolDTO'
        - $ref: '#/components/schemas/CreateTextEditorToolDTO'
        - $ref: '#/components/schemas/CreateTransferCallToolDTO'
        - $ref: '#/components/schemas/CreateSipRequestToolDTO'
        - $ref: '#/components/schemas/CreateVoicemailToolDTO'
      title: AnthropicBedrockModelToolsItems
    CreateCustomKnowledgeBaseDtoProvider:
      type: string
      enum:
        - custom-knowledge-base
      description: This knowledge base is bring your own knowledge base implementation.
      title: CreateCustomKnowledgeBaseDtoProvider
    CreateCustomKnowledgeBaseDTO:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/CreateCustomKnowledgeBaseDtoProvider'
          description: This knowledge base is bring your own knowledge base implementation.
        server:
          $ref: '#/components/schemas/Server'
          description: |-
            This is where the knowledge base request will be sent.

            Request Example:

            POST https://{server.url}
            Content-Type: application/json

            {
              "messsage": {
                "type": "knowledge-base-request",
                "messages": [
                  {
                    "role": "user",
                    "content": "Why is ocean blue?"
                  }
                ],
                ...other metadata about the call...
              }
            }

            Response Expected:
            ```
            {
              "message": {
                 "role": "assistant",
                 "content": "The ocean is blue because water absorbs everything but blue.",
              }, // YOU CAN RETURN THE EXACT RESPONSE TO SPEAK
              "documents": [
                {
                  "content": "The ocean is blue primarily because water absorbs colors in the red part of the light spectrum and scatters the blue light, making it more visible to our eyes.",
                  "similarity": 1
                },
                {
                  "content": "Blue light is scattered more by the water molecules than other colors, enhancing the blue appearance of the ocean.",
                  "similarity": .5
                }
              ] // OR, YOU CAN RETURN AN ARRAY OF DOCUMENTS THAT WILL BE SENT TO THE MODEL
            }
            ```
      required:
        - provider
        - server
      title: CreateCustomKnowledgeBaseDTO
    AnthropicBedrockModelKnowledgeBase:
      oneOf:
        - $ref: '#/components/schemas/CreateCustomKnowledgeBaseDTO'
      description: These are the options for the knowledge base.
      title: AnthropicBedrockModelKnowledgeBase
    AnthropicBedrockModelProvider:
      type: string
      enum:
        - anthropic-bedrock
      description: The provider identifier for Anthropic via AWS Bedrock.
      title: AnthropicBedrockModelProvider
    AnthropicBedrockModelModel:
      type: string
      enum:
        - claude-3-opus-20240229
        - claude-3-sonnet-20240229
        - claude-3-haiku-20240307
        - claude-3-5-sonnet-20240620
        - claude-3-5-sonnet-20241022
        - claude-3-5-haiku-20241022
        - claude-3-7-sonnet-20250219
        - claude-opus-4-20250514
        - claude-opus-4-5-20251101
        - claude-opus-4-6
        - claude-sonnet-4-20250514
        - claude-sonnet-4-5-20250929
        - claude-sonnet-4-6
        - claude-haiku-4-5-20251001
      description: The specific Anthropic/Claude model that will be used via Bedrock.
      title: AnthropicBedrockModelModel
    AnthropicThinkingConfigType:
      type: string
      enum:
        - enabled
      title: AnthropicThinkingConfigType
    AnthropicThinkingConfig:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/AnthropicThinkingConfigType'
        budgetTokens:
          type: number
          format: double
          description: |-
            The maximum number of tokens to allocate for thinking.
            Must be between 1024 and 100000 tokens.
      required:
        - type
        - budgetTokens
      title: AnthropicThinkingConfig
    AnthropicBedrockModel:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/OpenAIMessage'
          description: This is the starting state for the conversation.
        tools:
          type: array
          items:
            $ref: '#/components/schemas/AnthropicBedrockModelToolsItems'
          description: |-
            These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.

            Both `tools` and `toolIds` can be used together.
        toolIds:
          type: array
          items:
            type: string
          description: |-
            These are the tools that the assistant can use during the call. To use transient tools, use `tools`.

            Both `tools` and `toolIds` can be used together.
        knowledgeBase:
          $ref: '#/components/schemas/AnthropicBedrockModelKnowledgeBase'
          description: These are the options for the knowledge base.
        provider:
          $ref: '#/components/schemas/AnthropicBedrockModelProvider'
          description: The provider identifier for Anthropic via AWS Bedrock.
        model:
          $ref: '#/components/schemas/AnthropicBedrockModelModel'
          description: The specific Anthropic/Claude model that will be used via Bedrock.
        thinking:
          $ref: '#/components/schemas/AnthropicThinkingConfig'
          description: |-
            Optional configuration for Anthropic's thinking feature.
            Only applicable for claude-3-7-sonnet-20250219 model.
            If provided, maxTokens must be greater than thinking.budgetTokens.
        temperature:
          type: number
          format: double
          description: This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.
        maxTokens:
          type: number
          format: double
          description: >-
            This is the max number of tokens that the assistant will be allowed to generate in each turn of the
            conversation. Default is 250.
        emotionRecognitionEnabled:
          type: boolean
          description: >-
            This determines whether we detect user's emotion while they speak and send it as an additional info to
            model.


            Default `false` because the model is usually are good at understanding the user's emotion from text.


            @default false
        numFastTurns:
          type: number
          format: double
          description: >-
            This sets how many turns at the start of the conversation to use a smaller, faster model from the same
            provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.


            Default is 0.


            @default 0
      required:
        - provider
        - model
      title: AnthropicBedrockModel
    AnyscaleModelToolsItems:
      oneOf:
        - $ref: '#/components/schemas/CreateApiRequestToolDTO'
        - $ref: '#/components/schemas/CreateBashToolDTO'
        - $ref: '#/components/schemas/CreateCodeToolDTO'
        - $ref: '#/components/schemas/CreateComputerToolDTO'
        - $ref: '#/components/schemas/CreateDtmfToolDTO'
        - $ref: '#/components/schemas/CreateEndCallToolDTO'
        - $ref: '#/components/schemas/CreateFunctionToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactGetToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCreateEventToolDTO'
        - $ref: '#/components/schemas/CreateGoogleSheetsRowAppendToolDTO'
        - $ref: '#/components/schemas/CreateHandoffToolDTO'
        - $ref: '#/components/schemas/CreateMcpToolDTO'
        - $ref: '#/components/schemas/CreateQueryToolDTO'
        - $ref: '#/components/schemas/CreateSlackSendMessageToolDTO'
        - $ref: '#/components/schemas/CreateSmsToolDTO'
        - $ref: '#/components/schemas/CreateTextEditorToolDTO'
        - $ref: '#/components/schemas/CreateTransferCallToolDTO'
        - $ref: '#/components/schemas/CreateSipRequestToolDTO'
        - $ref: '#/components/schemas/CreateVoicemailToolDTO'
      title: AnyscaleModelToolsItems
    AnyscaleModelKnowledgeBase:
      oneOf:
        - $ref: '#/components/schemas/CreateCustomKnowledgeBaseDTO'
      description: These are the options for the knowledge base.
      title: AnyscaleModelKnowledgeBase
    AnyscaleModelProvider:
      type: string
      enum:
        - anyscale
      title: AnyscaleModelProvider
    AnyscaleModel:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/OpenAIMessage'
          description: This is the starting state for the conversation.
        tools:
          type: array
          items:
            $ref: '#/components/schemas/AnyscaleModelToolsItems'
          description: |-
            These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.

            Both `tools` and `toolIds` can be used together.
        toolIds:
          type: array
          items:
            type: string
          description: |-
            These are the tools that the assistant can use during the call. To use transient tools, use `tools`.

            Both `tools` and `toolIds` can be used together.
        knowledgeBase:
          $ref: '#/components/schemas/AnyscaleModelKnowledgeBase'
          description: These are the options for the knowledge base.
        provider:
          $ref: '#/components/schemas/AnyscaleModelProvider'
        model:
          type: string
          description: This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b
        temperature:
          type: number
          format: double
          description: This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.
        maxTokens:
          type: number
          format: double
          description: >-
            This is the max number of tokens that the assistant will be allowed to generate in each turn of the
            conversation. Default is 250.
        emotionRecognitionEnabled:
          type: boolean
          description: >-
            This determines whether we detect user's emotion while they speak and send it as an additional info to
            model.


            Default `false` because the model is usually are good at understanding the user's emotion from text.


            @default false
        numFastTurns:
          type: number
          format: double
          description: >-
            This sets how many turns at the start of the conversation to use a smaller, faster model from the same
            provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.


            Default is 0.


            @default 0
      required:
        - provider
        - model
      title: AnyscaleModel
    CerebrasModelToolsItems:
      oneOf:
        - $ref: '#/components/schemas/CreateApiRequestToolDTO'
        - $ref: '#/components/schemas/CreateBashToolDTO'
        - $ref: '#/components/schemas/CreateCodeToolDTO'
        - $ref: '#/components/schemas/CreateComputerToolDTO'
        - $ref: '#/components/schemas/CreateDtmfToolDTO'
        - $ref: '#/components/schemas/CreateEndCallToolDTO'
        - $ref: '#/components/schemas/CreateFunctionToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactGetToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCreateEventToolDTO'
        - $ref: '#/components/schemas/CreateGoogleSheetsRowAppendToolDTO'
        - $ref: '#/components/schemas/CreateHandoffToolDTO'
        - $ref: '#/components/schemas/CreateMcpToolDTO'
        - $ref: '#/components/schemas/CreateQueryToolDTO'
        - $ref: '#/components/schemas/CreateSlackSendMessageToolDTO'
        - $ref: '#/components/schemas/CreateSmsToolDTO'
        - $ref: '#/components/schemas/CreateTextEditorToolDTO'
        - $ref: '#/components/schemas/CreateTransferCallToolDTO'
        - $ref: '#/components/schemas/CreateSipRequestToolDTO'
        - $ref: '#/components/schemas/CreateVoicemailToolDTO'
      title: CerebrasModelToolsItems
    CerebrasModelKnowledgeBase:
      oneOf:
        - $ref: '#/components/schemas/CreateCustomKnowledgeBaseDTO'
      description: These are the options for the knowledge base.
      title: CerebrasModelKnowledgeBase
    CerebrasModelModel:
      type: string
      enum:
        - llama3.1-8b
        - llama-3.3-70b
      description: This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b
      title: CerebrasModelModel
    CerebrasModelProvider:
      type: string
      enum:
        - cerebras
      title: CerebrasModelProvider
    CerebrasModel:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/OpenAIMessage'
          description: This is the starting state for the conversation.
        tools:
          type: array
          items:
            $ref: '#/components/schemas/CerebrasModelToolsItems'
          description: |-
            These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.

            Both `tools` and `toolIds` can be used together.
        toolIds:
          type: array
          items:
            type: string
          description: |-
            These are the tools that the assistant can use during the call. To use transient tools, use `tools`.

            Both `tools` and `toolIds` can be used together.
        knowledgeBase:
          $ref: '#/components/schemas/CerebrasModelKnowledgeBase'
          description: These are the options for the knowledge base.
        model:
          $ref: '#/components/schemas/CerebrasModelModel'
          description: This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b
        provider:
          $ref: '#/components/schemas/CerebrasModelProvider'
        temperature:
          type: number
          format: double
          description: This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.
        maxTokens:
          type: number
          format: double
          description: >-
            This is the max number of tokens that the assistant will be allowed to generate in each turn of the
            conversation. Default is 250.
        emotionRecognitionEnabled:
          type: boolean
          description: >-
            This determines whether we detect user's emotion while they speak and send it as an additional info to
            model.


            Default `false` because the model is usually are good at understanding the user's emotion from text.


            @default false
        numFastTurns:
          type: number
          format: double
          description: >-
            This sets how many turns at the start of the conversation to use a smaller, faster model from the same
            provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.


            Default is 0.


            @default 0
      required:
        - model
        - provider
      title: CerebrasModel
    CustomLlmModelToolsItems:
      oneOf:
        - $ref: '#/components/schemas/CreateApiRequestToolDTO'
        - $ref: '#/components/schemas/CreateBashToolDTO'
        - $ref: '#/components/schemas/CreateCodeToolDTO'
        - $ref: '#/components/schemas/CreateComputerToolDTO'
        - $ref: '#/components/schemas/CreateDtmfToolDTO'
        - $ref: '#/components/schemas/CreateEndCallToolDTO'
        - $ref: '#/components/schemas/CreateFunctionToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactGetToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCreateEventToolDTO'
        - $ref: '#/components/schemas/CreateGoogleSheetsRowAppendToolDTO'
        - $ref: '#/components/schemas/CreateHandoffToolDTO'
        - $ref: '#/components/schemas/CreateMcpToolDTO'
        - $ref: '#/components/schemas/CreateQueryToolDTO'
        - $ref: '#/components/schemas/CreateSlackSendMessageToolDTO'
        - $ref: '#/components/schemas/CreateSmsToolDTO'
        - $ref: '#/components/schemas/CreateTextEditorToolDTO'
        - $ref: '#/components/schemas/CreateTransferCallToolDTO'
        - $ref: '#/components/schemas/CreateSipRequestToolDTO'
        - $ref: '#/components/schemas/CreateVoicemailToolDTO'
      title: CustomLlmModelToolsItems
    CustomLlmModelKnowledgeBase:
      oneOf:
        - $ref: '#/components/schemas/CreateCustomKnowledgeBaseDTO'
      description: These are the options for the knowledge base.
      title: CustomLlmModelKnowledgeBase
    CustomLlmModelProvider:
      type: string
      enum:
        - custom-llm
      description: >-
        This is the provider that will be used for the model. Any service, including your own server, that is compatible
        with the OpenAI API can be used.
      title: CustomLlmModelProvider
    CustomLlmModelMetadataSendMode:
      type: string
      enum:
        - 'off'
        - variable
        - destructured
      description: >-
        This determines whether metadata is sent in requests to the custom provider.


        - `off` will not send any metadata. payload will look like `{ messages }`

        - `variable` will send `assistant.metadata` as a variable on the payload. payload will look like `{ messages,
        metadata }`

        - `destructured` will send `assistant.metadata` fields directly on the payload. payload will look like `{
        messages, ...metadata }`


        Further, `variable` and `destructured` will send `call`, `phoneNumber`, and `customer` objects in the payload.


        Default is `variable`.
      title: CustomLlmModelMetadataSendMode
    CustomLLMModel:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/OpenAIMessage'
          description: This is the starting state for the conversation.
        tools:
          type: array
          items:
            $ref: '#/components/schemas/CustomLlmModelToolsItems'
          description: |-
            These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.

            Both `tools` and `toolIds` can be used together.
        toolIds:
          type: array
          items:
            type: string
          description: |-
            These are the tools that the assistant can use during the call. To use transient tools, use `tools`.

            Both `tools` and `toolIds` can be used together.
        knowledgeBase:
          $ref: '#/components/schemas/CustomLlmModelKnowledgeBase'
          description: These are the options for the knowledge base.
        provider:
          $ref: '#/components/schemas/CustomLlmModelProvider'
          description: >-
            This is the provider that will be used for the model. Any service, including your own server, that is
            compatible with the OpenAI API can be used.
        metadataSendMode:
          $ref: '#/components/schemas/CustomLlmModelMetadataSendMode'
          description: >-
            This determines whether metadata is sent in requests to the custom provider.


            - `off` will not send any metadata. payload will look like `{ messages }`

            - `variable` will send `assistant.metadata` as a variable on the payload. payload will look like `{
            messages, metadata }`

            - `destructured` will send `assistant.metadata` fields directly on the payload. payload will look like `{
            messages, ...metadata }`


            Further, `variable` and `destructured` will send `call`, `phoneNumber`, and `customer` objects in the
            payload.


            Default is `variable`.
        headers:
          type: object
          additionalProperties:
            type: string
          description: >-
            Custom headers to send with requests. These headers can override default OpenAI headers except for
            Authorization (which should be specified using a custom-llm credential).
        url:
          type: string
          description: These is the URL we'll use for the OpenAI client's `baseURL`. Ex. https://openrouter.ai/api/v1
        wordLevelConfidenceEnabled:
          type: boolean
          description: >-
            This determines whether the transcriber's word level confidence is sent in requests to the custom provider.
            Default is false.

            This only works for Deepgram transcribers.
        timeoutSeconds:
          type: number
          format: double
          description: >-
            This sets the timeout for the connection to the custom provider without needing to stream any tokens back.
            Default is 20 seconds.
        model:
          type: string
          description: This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b
        temperature:
          type: number
          format: double
          description: This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.
        maxTokens:
          type: number
          format: double
          description: >-
            This is the max number of tokens that the assistant will be allowed to generate in each turn of the
            conversation. Default is 250.
        emotionRecognitionEnabled:
          type: boolean
          description: >-
            This determines whether we detect user's emotion while they speak and send it as an additional info to
            model.


            Default `false` because the model is usually are good at understanding the user's emotion from text.


            @default false
        numFastTurns:
          type: number
          format: double
          description: >-
            This sets how many turns at the start of the conversation to use a smaller, faster model from the same
            provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.


            Default is 0.


            @default 0
      required:
        - provider
        - url
        - model
      title: CustomLLMModel
    DeepInfraModelToolsItems:
      oneOf:
        - $ref: '#/components/schemas/CreateApiRequestToolDTO'
        - $ref: '#/components/schemas/CreateBashToolDTO'
        - $ref: '#/components/schemas/CreateCodeToolDTO'
        - $ref: '#/components/schemas/CreateComputerToolDTO'
        - $ref: '#/components/schemas/CreateDtmfToolDTO'
        - $ref: '#/components/schemas/CreateEndCallToolDTO'
        - $ref: '#/components/schemas/CreateFunctionToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactGetToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCreateEventToolDTO'
        - $ref: '#/components/schemas/CreateGoogleSheetsRowAppendToolDTO'
        - $ref: '#/components/schemas/CreateHandoffToolDTO'
        - $ref: '#/components/schemas/CreateMcpToolDTO'
        - $ref: '#/components/schemas/CreateQueryToolDTO'
        - $ref: '#/components/schemas/CreateSlackSendMessageToolDTO'
        - $ref: '#/components/schemas/CreateSmsToolDTO'
        - $ref: '#/components/schemas/CreateTextEditorToolDTO'
        - $ref: '#/components/schemas/CreateTransferCallToolDTO'
        - $ref: '#/components/schemas/CreateSipRequestToolDTO'
        - $ref: '#/components/schemas/CreateVoicemailToolDTO'
      title: DeepInfraModelToolsItems
    DeepInfraModelKnowledgeBase:
      oneOf:
        - $ref: '#/components/schemas/CreateCustomKnowledgeBaseDTO'
      description: These are the options for the knowledge base.
      title: DeepInfraModelKnowledgeBase
    DeepInfraModelProvider:
      type: string
      enum:
        - deepinfra
      title: DeepInfraModelProvider
    DeepInfraModel:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/OpenAIMessage'
          description: This is the starting state for the conversation.
        tools:
          type: array
          items:
            $ref: '#/components/schemas/DeepInfraModelToolsItems'
          description: |-
            These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.

            Both `tools` and `toolIds` can be used together.
        toolIds:
          type: array
          items:
            type: string
          description: |-
            These are the tools that the assistant can use during the call. To use transient tools, use `tools`.

            Both `tools` and `toolIds` can be used together.
        knowledgeBase:
          $ref: '#/components/schemas/DeepInfraModelKnowledgeBase'
          description: These are the options for the knowledge base.
        provider:
          $ref: '#/components/schemas/DeepInfraModelProvider'
        model:
          type: string
          description: This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b
        temperature:
          type: number
          format: double
          description: This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.
        maxTokens:
          type: number
          format: double
          description: >-
            This is the max number of tokens that the assistant will be allowed to generate in each turn of the
            conversation. Default is 250.
        emotionRecognitionEnabled:
          type: boolean
          description: >-
            This determines whether we detect user's emotion while they speak and send it as an additional info to
            model.


            Default `false` because the model is usually are good at understanding the user's emotion from text.


            @default false
        numFastTurns:
          type: number
          format: double
          description: >-
            This sets how many turns at the start of the conversation to use a smaller, faster model from the same
            provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.


            Default is 0.


            @default 0
      required:
        - provider
        - model
      title: DeepInfraModel
    DeepSeekModelToolsItems:
      oneOf:
        - $ref: '#/components/schemas/CreateApiRequestToolDTO'
        - $ref: '#/components/schemas/CreateBashToolDTO'
        - $ref: '#/components/schemas/CreateCodeToolDTO'
        - $ref: '#/components/schemas/CreateComputerToolDTO'
        - $ref: '#/components/schemas/CreateDtmfToolDTO'
        - $ref: '#/components/schemas/CreateEndCallToolDTO'
        - $ref: '#/components/schemas/CreateFunctionToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactGetToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCreateEventToolDTO'
        - $ref: '#/components/schemas/CreateGoogleSheetsRowAppendToolDTO'
        - $ref: '#/components/schemas/CreateHandoffToolDTO'
        - $ref: '#/components/schemas/CreateMcpToolDTO'
        - $ref: '#/components/schemas/CreateQueryToolDTO'
        - $ref: '#/components/schemas/CreateSlackSendMessageToolDTO'
        - $ref: '#/components/schemas/CreateSmsToolDTO'
        - $ref: '#/components/schemas/CreateTextEditorToolDTO'
        - $ref: '#/components/schemas/CreateTransferCallToolDTO'
        - $ref: '#/components/schemas/CreateSipRequestToolDTO'
        - $ref: '#/components/schemas/CreateVoicemailToolDTO'
      title: DeepSeekModelToolsItems
    DeepSeekModelKnowledgeBase:
      oneOf:
        - $ref: '#/components/schemas/CreateCustomKnowledgeBaseDTO'
      description: These are the options for the knowledge base.
      title: DeepSeekModelKnowledgeBase
    DeepSeekModelModel:
      type: string
      enum:
        - deepseek-chat
        - deepseek-reasoner
      description: This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b
      title: DeepSeekModelModel
    DeepSeekModelProvider:
      type: string
      enum:
        - deep-seek
      title: DeepSeekModelProvider
    DeepSeekModel:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/OpenAIMessage'
          description: This is the starting state for the conversation.
        tools:
          type: array
          items:
            $ref: '#/components/schemas/DeepSeekModelToolsItems'
          description: |-
            These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.

            Both `tools` and `toolIds` can be used together.
        toolIds:
          type: array
          items:
            type: string
          description: |-
            These are the tools that the assistant can use during the call. To use transient tools, use `tools`.

            Both `tools` and `toolIds` can be used together.
        knowledgeBase:
          $ref: '#/components/schemas/DeepSeekModelKnowledgeBase'
          description: These are the options for the knowledge base.
        model:
          $ref: '#/components/schemas/DeepSeekModelModel'
          description: This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b
        provider:
          $ref: '#/components/schemas/DeepSeekModelProvider'
        temperature:
          type: number
          format: double
          description: This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.
        maxTokens:
          type: number
          format: double
          description: >-
            This is the max number of tokens that the assistant will be allowed to generate in each turn of the
            conversation. Default is 250.
        emotionRecognitionEnabled:
          type: boolean
          description: >-
            This determines whether we detect user's emotion while they speak and send it as an additional info to
            model.


            Default `false` because the model is usually are good at understanding the user's emotion from text.


            @default false
        numFastTurns:
          type: number
          format: double
          description: >-
            This sets how many turns at the start of the conversation to use a smaller, faster model from the same
            provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.


            Default is 0.


            @default 0
      required:
        - model
        - provider
      title: DeepSeekModel
    GoogleModelToolsItems:
      oneOf:
        - $ref: '#/components/schemas/CreateApiRequestToolDTO'
        - $ref: '#/components/schemas/CreateBashToolDTO'
        - $ref: '#/components/schemas/CreateCodeToolDTO'
        - $ref: '#/components/schemas/CreateComputerToolDTO'
        - $ref: '#/components/schemas/CreateDtmfToolDTO'
        - $ref: '#/components/schemas/CreateEndCallToolDTO'
        - $ref: '#/components/schemas/CreateFunctionToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactGetToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCreateEventToolDTO'
        - $ref: '#/components/schemas/CreateGoogleSheetsRowAppendToolDTO'
        - $ref: '#/components/schemas/CreateHandoffToolDTO'
        - $ref: '#/components/schemas/CreateMcpToolDTO'
        - $ref: '#/components/schemas/CreateQueryToolDTO'
        - $ref: '#/components/schemas/CreateSlackSendMessageToolDTO'
        - $ref: '#/components/schemas/CreateSmsToolDTO'
        - $ref: '#/components/schemas/CreateTextEditorToolDTO'
        - $ref: '#/components/schemas/CreateTransferCallToolDTO'
        - $ref: '#/components/schemas/CreateSipRequestToolDTO'
        - $ref: '#/components/schemas/CreateVoicemailToolDTO'
      title: GoogleModelToolsItems
    GoogleModelKnowledgeBase:
      oneOf:
        - $ref: '#/components/schemas/CreateCustomKnowledgeBaseDTO'
      description: These are the options for the knowledge base.
      title: GoogleModelKnowledgeBase
    GoogleModelModel:
      type: string
      enum:
        - gemini-3-flash-preview
        - gemini-2.5-pro
        - gemini-2.5-flash
        - gemini-2.5-flash-lite
        - gemini-2.0-flash-thinking-exp
        - gemini-2.0-pro-exp-02-05
        - gemini-2.0-flash
        - gemini-2.0-flash-lite
        - gemini-2.0-flash-exp
        - gemini-2.0-flash-realtime-exp
        - gemini-1.5-flash
        - gemini-1.5-flash-002
        - gemini-1.5-pro
        - gemini-1.5-pro-002
        - gemini-1.0-pro
      description: This is the Google model that will be used.
      title: GoogleModelModel
    GoogleModelProvider:
      type: string
      enum:
        - google
      title: GoogleModelProvider
    GeminiMultimodalLivePrebuiltVoiceConfigVoiceName:
      type: string
      enum:
        - Puck
        - Charon
        - Kore
        - Fenrir
        - Aoede
      title: GeminiMultimodalLivePrebuiltVoiceConfigVoiceName
    GeminiMultimodalLivePrebuiltVoiceConfig:
      type: object
      properties:
        voiceName:
          $ref: '#/components/schemas/GeminiMultimodalLivePrebuiltVoiceConfigVoiceName'
      required:
        - voiceName
      title: GeminiMultimodalLivePrebuiltVoiceConfig
    GeminiMultimodalLiveVoiceConfig:
      type: object
      properties:
        prebuiltVoiceConfig:
          $ref: '#/components/schemas/GeminiMultimodalLivePrebuiltVoiceConfig'
      required:
        - prebuiltVoiceConfig
      title: GeminiMultimodalLiveVoiceConfig
    GeminiMultimodalLiveSpeechConfig:
      type: object
      properties:
        voiceConfig:
          $ref: '#/components/schemas/GeminiMultimodalLiveVoiceConfig'
      required:
        - voiceConfig
      title: GeminiMultimodalLiveSpeechConfig
    GoogleRealtimeConfig:
      type: object
      properties:
        topP:
          type: number
          format: double
          description: >-
            This is the nucleus sampling parameter that controls the cumulative probability of tokens considered during
            text generation.

            Only applicable with the Gemini Flash 2.0 Multimodal Live API.
        topK:
          type: number
          format: double
          description: >-
            This is the top-k sampling parameter that limits the number of highest probability tokens considered during
            text generation.

            Only applicable with the Gemini Flash 2.0 Multimodal Live API.
        presencePenalty:
          type: number
          format: double
          description: >-
            This is the presence penalty parameter that influences the model's likelihood to repeat information by
            penalizing tokens based on their presence in the text.

            Only applicable with the Gemini Flash 2.0 Multimodal Live API.
        frequencyPenalty:
          type: number
          format: double
          description: >-
            This is the frequency penalty parameter that influences the model's likelihood to repeat tokens by
            penalizing them based on their frequency in the text.

            Only applicable with the Gemini Flash 2.0 Multimodal Live API.
        speechConfig:
          $ref: '#/components/schemas/GeminiMultimodalLiveSpeechConfig'
          description: >-
            This is the speech configuration object that defines the voice settings to be used for the model's speech
            output.

            Only applicable with the Gemini Flash 2.0 Multimodal Live API.
      title: GoogleRealtimeConfig
    GoogleModel:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/OpenAIMessage'
          description: This is the starting state for the conversation.
        tools:
          type: array
          items:
            $ref: '#/components/schemas/GoogleModelToolsItems'
          description: |-
            These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.

            Both `tools` and `toolIds` can be used together.
        toolIds:
          type: array
          items:
            type: string
          description: |-
            These are the tools that the assistant can use during the call. To use transient tools, use `tools`.

            Both `tools` and `toolIds` can be used together.
        knowledgeBase:
          $ref: '#/components/schemas/GoogleModelKnowledgeBase'
          description: These are the options for the knowledge base.
        model:
          $ref: '#/components/schemas/GoogleModelModel'
          description: This is the Google model that will be used.
        provider:
          $ref: '#/components/schemas/GoogleModelProvider'
        realtimeConfig:
          $ref: '#/components/schemas/GoogleRealtimeConfig'
          description: |-
            This is the session configuration for the Gemini Flash 2.0 Multimodal Live API.
            Only applicable if the model `gemini-2.0-flash-realtime-exp` is selected.
        temperature:
          type: number
          format: double
          description: This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.
        maxTokens:
          type: number
          format: double
          description: >-
            This is the max number of tokens that the assistant will be allowed to generate in each turn of the
            conversation. Default is 250.
        emotionRecognitionEnabled:
          type: boolean
          description: >-
            This determines whether we detect user's emotion while they speak and send it as an additional info to
            model.


            Default `false` because the model is usually are good at understanding the user's emotion from text.


            @default false
        numFastTurns:
          type: number
          format: double
          description: >-
            This sets how many turns at the start of the conversation to use a smaller, faster model from the same
            provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.


            Default is 0.


            @default 0
      required:
        - model
        - provider
      title: GoogleModel
    GroqModelToolsItems:
      oneOf:
        - $ref: '#/components/schemas/CreateApiRequestToolDTO'
        - $ref: '#/components/schemas/CreateBashToolDTO'
        - $ref: '#/components/schemas/CreateCodeToolDTO'
        - $ref: '#/components/schemas/CreateComputerToolDTO'
        - $ref: '#/components/schemas/CreateDtmfToolDTO'
        - $ref: '#/components/schemas/CreateEndCallToolDTO'
        - $ref: '#/components/schemas/CreateFunctionToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactGetToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCreateEventToolDTO'
        - $ref: '#/components/schemas/CreateGoogleSheetsRowAppendToolDTO'
        - $ref: '#/components/schemas/CreateHandoffToolDTO'
        - $ref: '#/components/schemas/CreateMcpToolDTO'
        - $ref: '#/components/schemas/CreateQueryToolDTO'
        - $ref: '#/components/schemas/CreateSlackSendMessageToolDTO'
        - $ref: '#/components/schemas/CreateSmsToolDTO'
        - $ref: '#/components/schemas/CreateTextEditorToolDTO'
        - $ref: '#/components/schemas/CreateTransferCallToolDTO'
        - $ref: '#/components/schemas/CreateSipRequestToolDTO'
        - $ref: '#/components/schemas/CreateVoicemailToolDTO'
      title: GroqModelToolsItems
    GroqModelKnowledgeBase:
      oneOf:
        - $ref: '#/components/schemas/CreateCustomKnowledgeBaseDTO'
      description: These are the options for the knowledge base.
      title: GroqModelKnowledgeBase
    GroqModelModel:
      type: string
      enum:
        - openai/gpt-oss-20b
        - openai/gpt-oss-120b
        - deepseek-r1-distill-llama-70b
        - llama-3.3-70b-versatile
        - llama-3.1-405b-reasoning
        - llama-3.1-8b-instant
        - llama3-8b-8192
        - llama3-70b-8192
        - gemma2-9b-it
        - moonshotai/kimi-k2-instruct-0905
        - meta-llama/llama-4-maverick-17b-128e-instruct
        - meta-llama/llama-4-scout-17b-16e-instruct
        - mistral-saba-24b
        - compound-beta
        - compound-beta-mini
      description: This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b
      title: GroqModelModel
    GroqModelProvider:
      type: string
      enum:
        - groq
      title: GroqModelProvider
    GroqModel:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/OpenAIMessage'
          description: This is the starting state for the conversation.
        tools:
          type: array
          items:
            $ref: '#/components/schemas/GroqModelToolsItems'
          description: |-
            These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.

            Both `tools` and `toolIds` can be used together.
        toolIds:
          type: array
          items:
            type: string
          description: |-
            These are the tools that the assistant can use during the call. To use transient tools, use `tools`.

            Both `tools` and `toolIds` can be used together.
        knowledgeBase:
          $ref: '#/components/schemas/GroqModelKnowledgeBase'
          description: These are the options for the knowledge base.
        model:
          $ref: '#/components/schemas/GroqModelModel'
          description: This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b
        provider:
          $ref: '#/components/schemas/GroqModelProvider'
        temperature:
          type: number
          format: double
          description: This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.
        maxTokens:
          type: number
          format: double
          description: >-
            This is the max number of tokens that the assistant will be allowed to generate in each turn of the
            conversation. Default is 250.
        emotionRecognitionEnabled:
          type: boolean
          description: >-
            This determines whether we detect user's emotion while they speak and send it as an additional info to
            model.


            Default `false` because the model is usually are good at understanding the user's emotion from text.


            @default false
        numFastTurns:
          type: number
          format: double
          description: >-
            This sets how many turns at the start of the conversation to use a smaller, faster model from the same
            provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.


            Default is 0.


            @default 0
      required:
        - model
        - provider
      title: GroqModel
    InflectionAiModelToolsItems:
      oneOf:
        - $ref: '#/components/schemas/CreateApiRequestToolDTO'
        - $ref: '#/components/schemas/CreateBashToolDTO'
        - $ref: '#/components/schemas/CreateCodeToolDTO'
        - $ref: '#/components/schemas/CreateComputerToolDTO'
        - $ref: '#/components/schemas/CreateDtmfToolDTO'
        - $ref: '#/components/schemas/CreateEndCallToolDTO'
        - $ref: '#/components/schemas/CreateFunctionToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactGetToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCreateEventToolDTO'
        - $ref: '#/components/schemas/CreateGoogleSheetsRowAppendToolDTO'
        - $ref: '#/components/schemas/CreateHandoffToolDTO'
        - $ref: '#/components/schemas/CreateMcpToolDTO'
        - $ref: '#/components/schemas/CreateQueryToolDTO'
        - $ref: '#/components/schemas/CreateSlackSendMessageToolDTO'
        - $ref: '#/components/schemas/CreateSmsToolDTO'
        - $ref: '#/components/schemas/CreateTextEditorToolDTO'
        - $ref: '#/components/schemas/CreateTransferCallToolDTO'
        - $ref: '#/components/schemas/CreateSipRequestToolDTO'
        - $ref: '#/components/schemas/CreateVoicemailToolDTO'
      title: InflectionAiModelToolsItems
    InflectionAiModelKnowledgeBase:
      oneOf:
        - $ref: '#/components/schemas/CreateCustomKnowledgeBaseDTO'
      description: These are the options for the knowledge base.
      title: InflectionAiModelKnowledgeBase
    InflectionAiModelModel:
      type: string
      enum:
        - inflection_3_pi
      description: This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b
      title: InflectionAiModelModel
    InflectionAiModelProvider:
      type: string
      enum:
        - inflection-ai
      title: InflectionAiModelProvider
    InflectionAIModel:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/OpenAIMessage'
          description: This is the starting state for the conversation.
        tools:
          type: array
          items:
            $ref: '#/components/schemas/InflectionAiModelToolsItems'
          description: |-
            These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.

            Both `tools` and `toolIds` can be used together.
        toolIds:
          type: array
          items:
            type: string
          description: |-
            These are the tools that the assistant can use during the call. To use transient tools, use `tools`.

            Both `tools` and `toolIds` can be used together.
        knowledgeBase:
          $ref: '#/components/schemas/InflectionAiModelKnowledgeBase'
          description: These are the options for the knowledge base.
        model:
          $ref: '#/components/schemas/InflectionAiModelModel'
          description: This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b
        provider:
          $ref: '#/components/schemas/InflectionAiModelProvider'
        temperature:
          type: number
          format: double
          description: This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.
        maxTokens:
          type: number
          format: double
          description: >-
            This is the max number of tokens that the assistant will be allowed to generate in each turn of the
            conversation. Default is 250.
        emotionRecognitionEnabled:
          type: boolean
          description: >-
            This determines whether we detect user's emotion while they speak and send it as an additional info to
            model.


            Default `false` because the model is usually are good at understanding the user's emotion from text.


            @default false
        numFastTurns:
          type: number
          format: double
          description: >-
            This sets how many turns at the start of the conversation to use a smaller, faster model from the same
            provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.


            Default is 0.


            @default 0
      required:
        - model
        - provider
      title: InflectionAIModel
    MinimaxLlmModelToolsItems:
      oneOf:
        - $ref: '#/components/schemas/CreateApiRequestToolDTO'
        - $ref: '#/components/schemas/CreateBashToolDTO'
        - $ref: '#/components/schemas/CreateCodeToolDTO'
        - $ref: '#/components/schemas/CreateComputerToolDTO'
        - $ref: '#/components/schemas/CreateDtmfToolDTO'
        - $ref: '#/components/schemas/CreateEndCallToolDTO'
        - $ref: '#/components/schemas/CreateFunctionToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactGetToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCreateEventToolDTO'
        - $ref: '#/components/schemas/CreateGoogleSheetsRowAppendToolDTO'
        - $ref: '#/components/schemas/CreateHandoffToolDTO'
        - $ref: '#/components/schemas/CreateMcpToolDTO'
        - $ref: '#/components/schemas/CreateQueryToolDTO'
        - $ref: '#/components/schemas/CreateSlackSendMessageToolDTO'
        - $ref: '#/components/schemas/CreateSmsToolDTO'
        - $ref: '#/components/schemas/CreateTextEditorToolDTO'
        - $ref: '#/components/schemas/CreateTransferCallToolDTO'
        - $ref: '#/components/schemas/CreateSipRequestToolDTO'
        - $ref: '#/components/schemas/CreateVoicemailToolDTO'
      title: MinimaxLlmModelToolsItems
    MinimaxLlmModelKnowledgeBase:
      oneOf:
        - $ref: '#/components/schemas/CreateCustomKnowledgeBaseDTO'
      description: These are the options for the knowledge base.
      title: MinimaxLlmModelKnowledgeBase
    MinimaxLlmModelProvider:
      type: string
      enum:
        - minimax
      title: MinimaxLlmModelProvider
    MinimaxLlmModelModel:
      type: string
      enum:
        - MiniMax-M2.7
      description: This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b
      title: MinimaxLlmModelModel
    MinimaxLLMModel:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/OpenAIMessage'
          description: This is the starting state for the conversation.
        tools:
          type: array
          items:
            $ref: '#/components/schemas/MinimaxLlmModelToolsItems'
          description: |-
            These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.

            Both `tools` and `toolIds` can be used together.
        toolIds:
          type: array
          items:
            type: string
          description: |-
            These are the tools that the assistant can use during the call. To use transient tools, use `tools`.

            Both `tools` and `toolIds` can be used together.
        knowledgeBase:
          $ref: '#/components/schemas/MinimaxLlmModelKnowledgeBase'
          description: These are the options for the knowledge base.
        provider:
          $ref: '#/components/schemas/MinimaxLlmModelProvider'
        model:
          $ref: '#/components/schemas/MinimaxLlmModelModel'
          description: This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b
        temperature:
          type: number
          format: double
          description: This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.
        maxTokens:
          type: number
          format: double
          description: >-
            This is the max number of tokens that the assistant will be allowed to generate in each turn of the
            conversation. Default is 250.
        emotionRecognitionEnabled:
          type: boolean
          description: >-
            This determines whether we detect user's emotion while they speak and send it as an additional info to
            model.


            Default `false` because the model is usually are good at understanding the user's emotion from text.


            @default false
        numFastTurns:
          type: number
          format: double
          description: >-
            This sets how many turns at the start of the conversation to use a smaller, faster model from the same
            provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.


            Default is 0.


            @default 0
      required:
        - provider
        - model
      title: MinimaxLLMModel
    OpenAiModelToolsItems:
      oneOf:
        - $ref: '#/components/schemas/CreateApiRequestToolDTO'
        - $ref: '#/components/schemas/CreateBashToolDTO'
        - $ref: '#/components/schemas/CreateCodeToolDTO'
        - $ref: '#/components/schemas/CreateComputerToolDTO'
        - $ref: '#/components/schemas/CreateDtmfToolDTO'
        - $ref: '#/components/schemas/CreateEndCallToolDTO'
        - $ref: '#/components/schemas/CreateFunctionToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactGetToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCreateEventToolDTO'
        - $ref: '#/components/schemas/CreateGoogleSheetsRowAppendToolDTO'
        - $ref: '#/components/schemas/CreateHandoffToolDTO'
        - $ref: '#/components/schemas/CreateMcpToolDTO'
        - $ref: '#/components/schemas/CreateQueryToolDTO'
        - $ref: '#/components/schemas/CreateSlackSendMessageToolDTO'
        - $ref: '#/components/schemas/CreateSmsToolDTO'
        - $ref: '#/components/schemas/CreateTextEditorToolDTO'
        - $ref: '#/components/schemas/CreateTransferCallToolDTO'
        - $ref: '#/components/schemas/CreateSipRequestToolDTO'
        - $ref: '#/components/schemas/CreateVoicemailToolDTO'
      title: OpenAiModelToolsItems
    OpenAiModelKnowledgeBase:
      oneOf:
        - $ref: '#/components/schemas/CreateCustomKnowledgeBaseDTO'
      description: These are the options for the knowledge base.
      title: OpenAiModelKnowledgeBase
    OpenAiModelProvider:
      type: string
      enum:
        - openai
      description: This is the provider that will be used for the model.
      title: OpenAiModelProvider
    OpenAiModelModel:
      type: string
      enum:
        - gpt-5.4
        - gpt-5.4-mini
        - gpt-5.4-nano
        - gpt-5.2
        - gpt-5.2-chat-latest
        - gpt-5.1
        - gpt-5.1-chat-latest
        - gpt-5
        - gpt-5-chat-latest
        - gpt-5-mini
        - gpt-5-nano
        - gpt-4.1-2025-04-14
        - gpt-4.1-mini-2025-04-14
        - gpt-4.1-nano-2025-04-14
        - gpt-4.1
        - gpt-4.1-mini
        - gpt-4.1-nano
        - chatgpt-4o-latest
        - o3
        - o3-mini
        - o4-mini
        - o1-mini
        - o1-mini-2024-09-12
        - gpt-4o-realtime-preview-2024-10-01
        - gpt-4o-realtime-preview-2024-12-17
        - gpt-4o-mini-realtime-preview-2024-12-17
        - gpt-realtime-2025-08-28
        - gpt-realtime-mini-2025-12-15
        - gpt-4o-mini-2024-07-18
        - gpt-4o-mini
        - gpt-4o
        - gpt-4o-2024-05-13
        - gpt-4o-2024-08-06
        - gpt-4o-2024-11-20
        - gpt-4-turbo
        - gpt-4-turbo-2024-04-09
        - gpt-4-turbo-preview
        - gpt-4-0125-preview
        - gpt-4-1106-preview
        - gpt-4
        - gpt-4-0613
        - gpt-3.5-turbo
        - gpt-3.5-turbo-0125
        - gpt-3.5-turbo-1106
        - gpt-3.5-turbo-16k
        - gpt-3.5-turbo-0613
        - gpt-4.1-2025-04-14:westus
        - gpt-4.1-2025-04-14:eastus2
        - gpt-4.1-2025-04-14:eastus
        - gpt-4.1-2025-04-14:westus3
        - gpt-4.1-2025-04-14:northcentralus
        - gpt-4.1-2025-04-14:southcentralus
        - gpt-4.1-2025-04-14:westeurope
        - gpt-4.1-2025-04-14:germanywestcentral
        - gpt-4.1-2025-04-14:polandcentral
        - gpt-4.1-2025-04-14:spaincentral
        - gpt-4.1-mini-2025-04-14:westus
        - gpt-4.1-mini-2025-04-14:eastus2
        - gpt-4.1-mini-2025-04-14:eastus
        - gpt-4.1-mini-2025-04-14:westus3
        - gpt-4.1-mini-2025-04-14:northcentralus
        - gpt-4.1-mini-2025-04-14:southcentralus
        - gpt-4.1-mini-2025-04-14:westeurope
        - gpt-4.1-mini-2025-04-14:germanywestcentral
        - gpt-4.1-mini-2025-04-14:polandcentral
        - gpt-4.1-mini-2025-04-14:spaincentral
        - gpt-4.1-nano-2025-04-14:westus
        - gpt-4.1-nano-2025-04-14:eastus2
        - gpt-4.1-nano-2025-04-14:westus3
        - gpt-4.1-nano-2025-04-14:northcentralus
        - gpt-4.1-nano-2025-04-14:southcentralus
        - gpt-4o-2024-11-20:swedencentral
        - gpt-4o-2024-11-20:westus
        - gpt-4o-2024-11-20:eastus2
        - gpt-4o-2024-11-20:eastus
        - gpt-4o-2024-11-20:westus3
        - gpt-4o-2024-11-20:southcentralus
        - gpt-4o-2024-11-20:westeurope
        - gpt-4o-2024-11-20:germanywestcentral
        - gpt-4o-2024-11-20:polandcentral
        - gpt-4o-2024-11-20:spaincentral
        - gpt-4o-2024-08-06:westus
        - gpt-4o-2024-08-06:westus3
        - gpt-4o-2024-08-06:eastus
        - gpt-4o-2024-08-06:eastus2
        - gpt-4o-2024-08-06:northcentralus
        - gpt-4o-2024-08-06:southcentralus
        - gpt-4o-mini-2024-07-18:westus
        - gpt-4o-mini-2024-07-18:westus3
        - gpt-4o-mini-2024-07-18:eastus
        - gpt-4o-mini-2024-07-18:eastus2
        - gpt-4o-mini-2024-07-18:northcentralus
        - gpt-4o-mini-2024-07-18:southcentralus
        - gpt-4o-2024-05-13:eastus2
        - gpt-4o-2024-05-13:eastus
        - gpt-4o-2024-05-13:northcentralus
        - gpt-4o-2024-05-13:southcentralus
        - gpt-4o-2024-05-13:westus3
        - gpt-4o-2024-05-13:westus
        - gpt-4-turbo-2024-04-09:eastus2
        - gpt-4-0125-preview:eastus
        - gpt-4-0125-preview:northcentralus
        - gpt-4-0125-preview:southcentralus
        - gpt-4-1106-preview:australiaeast
        - gpt-4-1106-preview:canadaeast
        - gpt-4-1106-preview:france
        - gpt-4-1106-preview:india
        - gpt-4-1106-preview:norway
        - gpt-4-1106-preview:swedencentral
        - gpt-4-1106-preview:uk
        - gpt-4-1106-preview:westus
        - gpt-4-1106-preview:westus3
        - gpt-4-0613:canadaeast
        - gpt-3.5-turbo-0125:canadaeast
        - gpt-3.5-turbo-0125:northcentralus
        - gpt-3.5-turbo-0125:southcentralus
        - gpt-3.5-turbo-1106:canadaeast
        - gpt-3.5-turbo-1106:westus
      description: >-
        This is the OpenAI model that will be used.


        When using Vapi OpenAI or your own Azure Credentials, you have the option to specify the region for the selected
        model. This shouldn't be specified unless you have a specific reason to do so. Vapi will automatically find the
        fastest region that make sense.

        This is helpful when you are required to comply with Data Residency rules. Learn more about Azure regions here
        https://azure.microsoft.com/en-us/explore/global-infrastructure/data-residency/.


        @default undefined
      title: OpenAiModelModel
    OpenAiModelFallbackModelsItems:
      type: string
      enum:
        - gpt-5.4
        - gpt-5.4-mini
        - gpt-5.4-nano
        - gpt-5.2
        - gpt-5.2-chat-latest
        - gpt-5.1
        - gpt-5.1-chat-latest
        - gpt-5
        - gpt-5-chat-latest
        - gpt-5-mini
        - gpt-5-nano
        - gpt-4.1-2025-04-14
        - gpt-4.1-mini-2025-04-14
        - gpt-4.1-nano-2025-04-14
        - gpt-4.1
        - gpt-4.1-mini
        - gpt-4.1-nano
        - chatgpt-4o-latest
        - o3
        - o3-mini
        - o4-mini
        - o1-mini
        - o1-mini-2024-09-12
        - gpt-4o-realtime-preview-2024-10-01
        - gpt-4o-realtime-preview-2024-12-17
        - gpt-4o-mini-realtime-preview-2024-12-17
        - gpt-realtime-2025-08-28
        - gpt-realtime-mini-2025-12-15
        - gpt-4o-mini-2024-07-18
        - gpt-4o-mini
        - gpt-4o
        - gpt-4o-2024-05-13
        - gpt-4o-2024-08-06
        - gpt-4o-2024-11-20
        - gpt-4-turbo
        - gpt-4-turbo-2024-04-09
        - gpt-4-turbo-preview
        - gpt-4-0125-preview
        - gpt-4-1106-preview
        - gpt-4
        - gpt-4-0613
        - gpt-3.5-turbo
        - gpt-3.5-turbo-0125
        - gpt-3.5-turbo-1106
        - gpt-3.5-turbo-16k
        - gpt-3.5-turbo-0613
        - gpt-4.1-2025-04-14:westus
        - gpt-4.1-2025-04-14:eastus2
        - gpt-4.1-2025-04-14:eastus
        - gpt-4.1-2025-04-14:westus3
        - gpt-4.1-2025-04-14:northcentralus
        - gpt-4.1-2025-04-14:southcentralus
        - gpt-4.1-2025-04-14:westeurope
        - gpt-4.1-2025-04-14:germanywestcentral
        - gpt-4.1-2025-04-14:polandcentral
        - gpt-4.1-2025-04-14:spaincentral
        - gpt-4.1-mini-2025-04-14:westus
        - gpt-4.1-mini-2025-04-14:eastus2
        - gpt-4.1-mini-2025-04-14:eastus
        - gpt-4.1-mini-2025-04-14:westus3
        - gpt-4.1-mini-2025-04-14:northcentralus
        - gpt-4.1-mini-2025-04-14:southcentralus
        - gpt-4.1-mini-2025-04-14:westeurope
        - gpt-4.1-mini-2025-04-14:germanywestcentral
        - gpt-4.1-mini-2025-04-14:polandcentral
        - gpt-4.1-mini-2025-04-14:spaincentral
        - gpt-4.1-nano-2025-04-14:westus
        - gpt-4.1-nano-2025-04-14:eastus2
        - gpt-4.1-nano-2025-04-14:westus3
        - gpt-4.1-nano-2025-04-14:northcentralus
        - gpt-4.1-nano-2025-04-14:southcentralus
        - gpt-4o-2024-11-20:swedencentral
        - gpt-4o-2024-11-20:westus
        - gpt-4o-2024-11-20:eastus2
        - gpt-4o-2024-11-20:eastus
        - gpt-4o-2024-11-20:westus3
        - gpt-4o-2024-11-20:southcentralus
        - gpt-4o-2024-11-20:westeurope
        - gpt-4o-2024-11-20:germanywestcentral
        - gpt-4o-2024-11-20:polandcentral
        - gpt-4o-2024-11-20:spaincentral
        - gpt-4o-2024-08-06:westus
        - gpt-4o-2024-08-06:westus3
        - gpt-4o-2024-08-06:eastus
        - gpt-4o-2024-08-06:eastus2
        - gpt-4o-2024-08-06:northcentralus
        - gpt-4o-2024-08-06:southcentralus
        - gpt-4o-mini-2024-07-18:westus
        - gpt-4o-mini-2024-07-18:westus3
        - gpt-4o-mini-2024-07-18:eastus
        - gpt-4o-mini-2024-07-18:eastus2
        - gpt-4o-mini-2024-07-18:northcentralus
        - gpt-4o-mini-2024-07-18:southcentralus
        - gpt-4o-2024-05-13:eastus2
        - gpt-4o-2024-05-13:eastus
        - gpt-4o-2024-05-13:northcentralus
        - gpt-4o-2024-05-13:southcentralus
        - gpt-4o-2024-05-13:westus3
        - gpt-4o-2024-05-13:westus
        - gpt-4-turbo-2024-04-09:eastus2
        - gpt-4-0125-preview:eastus
        - gpt-4-0125-preview:northcentralus
        - gpt-4-0125-preview:southcentralus
        - gpt-4-1106-preview:australiaeast
        - gpt-4-1106-preview:canadaeast
        - gpt-4-1106-preview:france
        - gpt-4-1106-preview:india
        - gpt-4-1106-preview:norway
        - gpt-4-1106-preview:swedencentral
        - gpt-4-1106-preview:uk
        - gpt-4-1106-preview:westus
        - gpt-4-1106-preview:westus3
        - gpt-4-0613:canadaeast
        - gpt-3.5-turbo-0125:canadaeast
        - gpt-3.5-turbo-0125:northcentralus
        - gpt-3.5-turbo-0125:southcentralus
        - gpt-3.5-turbo-1106:canadaeast
        - gpt-3.5-turbo-1106:westus
      title: OpenAiModelFallbackModelsItems
    OpenAiModelToolStrictCompatibilityMode:
      type: string
      enum:
        - strip-parameters-with-unsupported-validation
        - strip-unsupported-validation
      description: >-
        Azure OpenAI doesn't support `maxLength` right now
        https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/structured-outputs?tabs=python-secure%2Cdotnet-entra-id&pivots=programming-language-csharp#unsupported-type-specific-keywords.
        Need to strip.


        - `strip-parameters-with-unsupported-validation` will strip parameters with unsupported validation.

        - `strip-unsupported-validation` will keep the parameters but strip unsupported validation.


        @default `strip-unsupported-validation`
      title: OpenAiModelToolStrictCompatibilityMode
    OpenAiModelPromptCacheRetention:
      type: string
      enum:
        - in_memory
        - 24h
      description: >-
        This controls the prompt cache retention policy for models that support extended caching (GPT-4.1, GPT-5
        series).


        - `in_memory`: Default behavior, cache retained in GPU memory only

        - `24h`: Extended caching, keeps cached prefixes active for up to 24 hours by offloading to GPU-local storage


        Only applies to models: gpt-5.4, gpt-5.4-mini, gpt-5.4-nano, gpt-5.2, gpt-5.1, gpt-5.1-codex,
        gpt-5.1-codex-mini, gpt-5.1-chat-latest, gpt-5, gpt-5-codex, gpt-4.1


        @default undefined (uses API default which is 'in_memory')
      title: OpenAiModelPromptCacheRetention
    OpenAIModel:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/OpenAIMessage'
          description: This is the starting state for the conversation.
        tools:
          type: array
          items:
            $ref: '#/components/schemas/OpenAiModelToolsItems'
          description: |-
            These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.

            Both `tools` and `toolIds` can be used together.
        toolIds:
          type: array
          items:
            type: string
          description: |-
            These are the tools that the assistant can use during the call. To use transient tools, use `tools`.

            Both `tools` and `toolIds` can be used together.
        knowledgeBase:
          $ref: '#/components/schemas/OpenAiModelKnowledgeBase'
          description: These are the options for the knowledge base.
        provider:
          $ref: '#/components/schemas/OpenAiModelProvider'
          description: This is the provider that will be used for the model.
        model:
          $ref: '#/components/schemas/OpenAiModelModel'
          description: >-
            This is the OpenAI model that will be used.


            When using Vapi OpenAI or your own Azure Credentials, you have the option to specify the region for the
            selected model. This shouldn't be specified unless you have a specific reason to do so. Vapi will
            automatically find the fastest region that make sense.

            This is helpful when you are required to comply with Data Residency rules. Learn more about Azure regions
            here https://azure.microsoft.com/en-us/explore/global-infrastructure/data-residency/.


            @default undefined
        fallbackModels:
          type: array
          items:
            $ref: '#/components/schemas/OpenAiModelFallbackModelsItems'
          description: >-
            These are the fallback models that will be used if the primary model fails. This shouldn't be specified
            unless you have a specific reason to do so. Vapi will automatically find the fastest fallbacks that make
            sense.
        toolStrictCompatibilityMode:
          $ref: '#/components/schemas/OpenAiModelToolStrictCompatibilityMode'
          description: >-
            Azure OpenAI doesn't support `maxLength` right now
            https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/structured-outputs?tabs=python-secure%2Cdotnet-entra-id&pivots=programming-language-csharp#unsupported-type-specific-keywords.
            Need to strip.


            - `strip-parameters-with-unsupported-validation` will strip parameters with unsupported validation.

            - `strip-unsupported-validation` will keep the parameters but strip unsupported validation.


            @default `strip-unsupported-validation`
        promptCacheRetention:
          $ref: '#/components/schemas/OpenAiModelPromptCacheRetention'
          description: >-
            This controls the prompt cache retention policy for models that support extended caching (GPT-4.1, GPT-5
            series).


            - `in_memory`: Default behavior, cache retained in GPU memory only

            - `24h`: Extended caching, keeps cached prefixes active for up to 24 hours by offloading to GPU-local
            storage


            Only applies to models: gpt-5.4, gpt-5.4-mini, gpt-5.4-nano, gpt-5.2, gpt-5.1, gpt-5.1-codex,
            gpt-5.1-codex-mini, gpt-5.1-chat-latest, gpt-5, gpt-5-codex, gpt-4.1


            @default undefined (uses API default which is 'in_memory')
        promptCacheKey:
          type: string
          description: |-
            This is the prompt cache key for models that support extended caching (GPT-4.1, GPT-5 series).

            Providing a cache key allows you to share cached prefixes across requests.

            @default undefined
        temperature:
          type: number
          format: double
          description: This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.
        maxTokens:
          type: number
          format: double
          description: >-
            This is the max number of tokens that the assistant will be allowed to generate in each turn of the
            conversation. Default is 250.
        emotionRecognitionEnabled:
          type: boolean
          description: >-
            This determines whether we detect user's emotion while they speak and send it as an additional info to
            model.


            Default `false` because the model is usually are good at understanding the user's emotion from text.


            @default false
        numFastTurns:
          type: number
          format: double
          description: >-
            This sets how many turns at the start of the conversation to use a smaller, faster model from the same
            provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.


            Default is 0.


            @default 0
      required:
        - provider
        - model
      title: OpenAIModel
    OpenRouterModelToolsItems:
      oneOf:
        - $ref: '#/components/schemas/CreateApiRequestToolDTO'
        - $ref: '#/components/schemas/CreateBashToolDTO'
        - $ref: '#/components/schemas/CreateCodeToolDTO'
        - $ref: '#/components/schemas/CreateComputerToolDTO'
        - $ref: '#/components/schemas/CreateDtmfToolDTO'
        - $ref: '#/components/schemas/CreateEndCallToolDTO'
        - $ref: '#/components/schemas/CreateFunctionToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactGetToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCreateEventToolDTO'
        - $ref: '#/components/schemas/CreateGoogleSheetsRowAppendToolDTO'
        - $ref: '#/components/schemas/CreateHandoffToolDTO'
        - $ref: '#/components/schemas/CreateMcpToolDTO'
        - $ref: '#/components/schemas/CreateQueryToolDTO'
        - $ref: '#/components/schemas/CreateSlackSendMessageToolDTO'
        - $ref: '#/components/schemas/CreateSmsToolDTO'
        - $ref: '#/components/schemas/CreateTextEditorToolDTO'
        - $ref: '#/components/schemas/CreateTransferCallToolDTO'
        - $ref: '#/components/schemas/CreateSipRequestToolDTO'
        - $ref: '#/components/schemas/CreateVoicemailToolDTO'
      title: OpenRouterModelToolsItems
    OpenRouterModelKnowledgeBase:
      oneOf:
        - $ref: '#/components/schemas/CreateCustomKnowledgeBaseDTO'
      description: These are the options for the knowledge base.
      title: OpenRouterModelKnowledgeBase
    OpenRouterModelProvider:
      type: string
      enum:
        - openrouter
      title: OpenRouterModelProvider
    OpenRouterModel:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/OpenAIMessage'
          description: This is the starting state for the conversation.
        tools:
          type: array
          items:
            $ref: '#/components/schemas/OpenRouterModelToolsItems'
          description: |-
            These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.

            Both `tools` and `toolIds` can be used together.
        toolIds:
          type: array
          items:
            type: string
          description: |-
            These are the tools that the assistant can use during the call. To use transient tools, use `tools`.

            Both `tools` and `toolIds` can be used together.
        knowledgeBase:
          $ref: '#/components/schemas/OpenRouterModelKnowledgeBase'
          description: These are the options for the knowledge base.
        provider:
          $ref: '#/components/schemas/OpenRouterModelProvider'
        model:
          type: string
          description: This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b
        temperature:
          type: number
          format: double
          description: This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.
        maxTokens:
          type: number
          format: double
          description: >-
            This is the max number of tokens that the assistant will be allowed to generate in each turn of the
            conversation. Default is 250.
        emotionRecognitionEnabled:
          type: boolean
          description: >-
            This determines whether we detect user's emotion while they speak and send it as an additional info to
            model.


            Default `false` because the model is usually are good at understanding the user's emotion from text.


            @default false
        numFastTurns:
          type: number
          format: double
          description: >-
            This sets how many turns at the start of the conversation to use a smaller, faster model from the same
            provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.


            Default is 0.


            @default 0
      required:
        - provider
        - model
      title: OpenRouterModel
    PerplexityAiModelToolsItems:
      oneOf:
        - $ref: '#/components/schemas/CreateApiRequestToolDTO'
        - $ref: '#/components/schemas/CreateBashToolDTO'
        - $ref: '#/components/schemas/CreateCodeToolDTO'
        - $ref: '#/components/schemas/CreateComputerToolDTO'
        - $ref: '#/components/schemas/CreateDtmfToolDTO'
        - $ref: '#/components/schemas/CreateEndCallToolDTO'
        - $ref: '#/components/schemas/CreateFunctionToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactGetToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCreateEventToolDTO'
        - $ref: '#/components/schemas/CreateGoogleSheetsRowAppendToolDTO'
        - $ref: '#/components/schemas/CreateHandoffToolDTO'
        - $ref: '#/components/schemas/CreateMcpToolDTO'
        - $ref: '#/components/schemas/CreateQueryToolDTO'
        - $ref: '#/components/schemas/CreateSlackSendMessageToolDTO'
        - $ref: '#/components/schemas/CreateSmsToolDTO'
        - $ref: '#/components/schemas/CreateTextEditorToolDTO'
        - $ref: '#/components/schemas/CreateTransferCallToolDTO'
        - $ref: '#/components/schemas/CreateSipRequestToolDTO'
        - $ref: '#/components/schemas/CreateVoicemailToolDTO'
      title: PerplexityAiModelToolsItems
    PerplexityAiModelKnowledgeBase:
      oneOf:
        - $ref: '#/components/schemas/CreateCustomKnowledgeBaseDTO'
      description: These are the options for the knowledge base.
      title: PerplexityAiModelKnowledgeBase
    PerplexityAiModelProvider:
      type: string
      enum:
        - perplexity-ai
      title: PerplexityAiModelProvider
    PerplexityAIModel:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/OpenAIMessage'
          description: This is the starting state for the conversation.
        tools:
          type: array
          items:
            $ref: '#/components/schemas/PerplexityAiModelToolsItems'
          description: |-
            These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.

            Both `tools` and `toolIds` can be used together.
        toolIds:
          type: array
          items:
            type: string
          description: |-
            These are the tools that the assistant can use during the call. To use transient tools, use `tools`.

            Both `tools` and `toolIds` can be used together.
        knowledgeBase:
          $ref: '#/components/schemas/PerplexityAiModelKnowledgeBase'
          description: These are the options for the knowledge base.
        provider:
          $ref: '#/components/schemas/PerplexityAiModelProvider'
        model:
          type: string
          description: This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b
        temperature:
          type: number
          format: double
          description: This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.
        maxTokens:
          type: number
          format: double
          description: >-
            This is the max number of tokens that the assistant will be allowed to generate in each turn of the
            conversation. Default is 250.
        emotionRecognitionEnabled:
          type: boolean
          description: >-
            This determines whether we detect user's emotion while they speak and send it as an additional info to
            model.


            Default `false` because the model is usually are good at understanding the user's emotion from text.


            @default false
        numFastTurns:
          type: number
          format: double
          description: >-
            This sets how many turns at the start of the conversation to use a smaller, faster model from the same
            provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.


            Default is 0.


            @default 0
      required:
        - provider
        - model
      title: PerplexityAIModel
    TogetherAiModelToolsItems:
      oneOf:
        - $ref: '#/components/schemas/CreateApiRequestToolDTO'
        - $ref: '#/components/schemas/CreateBashToolDTO'
        - $ref: '#/components/schemas/CreateCodeToolDTO'
        - $ref: '#/components/schemas/CreateComputerToolDTO'
        - $ref: '#/components/schemas/CreateDtmfToolDTO'
        - $ref: '#/components/schemas/CreateEndCallToolDTO'
        - $ref: '#/components/schemas/CreateFunctionToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactGetToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCreateEventToolDTO'
        - $ref: '#/components/schemas/CreateGoogleSheetsRowAppendToolDTO'
        - $ref: '#/components/schemas/CreateHandoffToolDTO'
        - $ref: '#/components/schemas/CreateMcpToolDTO'
        - $ref: '#/components/schemas/CreateQueryToolDTO'
        - $ref: '#/components/schemas/CreateSlackSendMessageToolDTO'
        - $ref: '#/components/schemas/CreateSmsToolDTO'
        - $ref: '#/components/schemas/CreateTextEditorToolDTO'
        - $ref: '#/components/schemas/CreateTransferCallToolDTO'
        - $ref: '#/components/schemas/CreateSipRequestToolDTO'
        - $ref: '#/components/schemas/CreateVoicemailToolDTO'
      title: TogetherAiModelToolsItems
    TogetherAiModelKnowledgeBase:
      oneOf:
        - $ref: '#/components/schemas/CreateCustomKnowledgeBaseDTO'
      description: These are the options for the knowledge base.
      title: TogetherAiModelKnowledgeBase
    TogetherAiModelProvider:
      type: string
      enum:
        - together-ai
      title: TogetherAiModelProvider
    TogetherAIModel:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/OpenAIMessage'
          description: This is the starting state for the conversation.
        tools:
          type: array
          items:
            $ref: '#/components/schemas/TogetherAiModelToolsItems'
          description: |-
            These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.

            Both `tools` and `toolIds` can be used together.
        toolIds:
          type: array
          items:
            type: string
          description: |-
            These are the tools that the assistant can use during the call. To use transient tools, use `tools`.

            Both `tools` and `toolIds` can be used together.
        knowledgeBase:
          $ref: '#/components/schemas/TogetherAiModelKnowledgeBase'
          description: These are the options for the knowledge base.
        provider:
          $ref: '#/components/schemas/TogetherAiModelProvider'
        model:
          type: string
          description: This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b
        temperature:
          type: number
          format: double
          description: This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.
        maxTokens:
          type: number
          format: double
          description: >-
            This is the max number of tokens that the assistant will be allowed to generate in each turn of the
            conversation. Default is 250.
        emotionRecognitionEnabled:
          type: boolean
          description: >-
            This determines whether we detect user's emotion while they speak and send it as an additional info to
            model.


            Default `false` because the model is usually are good at understanding the user's emotion from text.


            @default false
        numFastTurns:
          type: number
          format: double
          description: >-
            This sets how many turns at the start of the conversation to use a smaller, faster model from the same
            provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.


            Default is 0.


            @default 0
      required:
        - provider
        - model
      title: TogetherAIModel
    XaiModelToolsItems:
      oneOf:
        - $ref: '#/components/schemas/CreateApiRequestToolDTO'
        - $ref: '#/components/schemas/CreateBashToolDTO'
        - $ref: '#/components/schemas/CreateCodeToolDTO'
        - $ref: '#/components/schemas/CreateComputerToolDTO'
        - $ref: '#/components/schemas/CreateDtmfToolDTO'
        - $ref: '#/components/schemas/CreateEndCallToolDTO'
        - $ref: '#/components/schemas/CreateFunctionToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactGetToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCreateEventToolDTO'
        - $ref: '#/components/schemas/CreateGoogleSheetsRowAppendToolDTO'
        - $ref: '#/components/schemas/CreateHandoffToolDTO'
        - $ref: '#/components/schemas/CreateMcpToolDTO'
        - $ref: '#/components/schemas/CreateQueryToolDTO'
        - $ref: '#/components/schemas/CreateSlackSendMessageToolDTO'
        - $ref: '#/components/schemas/CreateSmsToolDTO'
        - $ref: '#/components/schemas/CreateTextEditorToolDTO'
        - $ref: '#/components/schemas/CreateTransferCallToolDTO'
        - $ref: '#/components/schemas/CreateSipRequestToolDTO'
        - $ref: '#/components/schemas/CreateVoicemailToolDTO'
      title: XaiModelToolsItems
    XaiModelKnowledgeBase:
      oneOf:
        - $ref: '#/components/schemas/CreateCustomKnowledgeBaseDTO'
      description: These are the options for the knowledge base.
      title: XaiModelKnowledgeBase
    XaiModelModel:
      type: string
      enum:
        - grok-beta
        - grok-2
        - grok-3
        - grok-4-fast-reasoning
        - grok-4-fast-non-reasoning
      description: This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b
      title: XaiModelModel
    XaiModelProvider:
      type: string
      enum:
        - xai
      title: XaiModelProvider
    XaiModel:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/OpenAIMessage'
          description: This is the starting state for the conversation.
        tools:
          type: array
          items:
            $ref: '#/components/schemas/XaiModelToolsItems'
          description: |-
            These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.

            Both `tools` and `toolIds` can be used together.
        toolIds:
          type: array
          items:
            type: string
          description: |-
            These are the tools that the assistant can use during the call. To use transient tools, use `tools`.

            Both `tools` and `toolIds` can be used together.
        knowledgeBase:
          $ref: '#/components/schemas/XaiModelKnowledgeBase'
          description: These are the options for the knowledge base.
        model:
          $ref: '#/components/schemas/XaiModelModel'
          description: This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b
        provider:
          $ref: '#/components/schemas/XaiModelProvider'
        temperature:
          type: number
          format: double
          description: This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.
        maxTokens:
          type: number
          format: double
          description: >-
            This is the max number of tokens that the assistant will be allowed to generate in each turn of the
            conversation. Default is 250.
        emotionRecognitionEnabled:
          type: boolean
          description: >-
            This determines whether we detect user's emotion while they speak and send it as an additional info to
            model.


            Default `false` because the model is usually are good at understanding the user's emotion from text.


            @default false
        numFastTurns:
          type: number
          format: double
          description: >-
            This sets how many turns at the start of the conversation to use a smaller, faster model from the same
            provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.


            Default is 0.


            @default 0
      required:
        - model
        - provider
      title: XaiModel
    CreateAssistantDtoModel:
      oneOf:
        - $ref: '#/components/schemas/AnthropicModel'
        - $ref: '#/components/schemas/AnthropicBedrockModel'
        - $ref: '#/components/schemas/AnyscaleModel'
        - $ref: '#/components/schemas/CerebrasModel'
        - $ref: '#/components/schemas/CustomLLMModel'
        - $ref: '#/components/schemas/DeepInfraModel'
        - $ref: '#/components/schemas/DeepSeekModel'
        - $ref: '#/components/schemas/GoogleModel'
        - $ref: '#/components/schemas/GroqModel'
        - $ref: '#/components/schemas/InflectionAIModel'
        - $ref: '#/components/schemas/MinimaxLLMModel'
        - $ref: '#/components/schemas/OpenAIModel'
        - $ref: '#/components/schemas/OpenRouterModel'
        - $ref: '#/components/schemas/PerplexityAIModel'
        - $ref: '#/components/schemas/TogetherAIModel'
        - $ref: '#/components/schemas/XaiModel'
      description: These are the options for the assistant's LLM.
      title: CreateAssistantDtoModel
    AzureVoiceProvider:
      type: string
      enum:
        - azure
      description: This is the voice provider that will be used.
      title: AzureVoiceProvider
    AzureVoiceId0:
      type: string
      enum:
        - andrew
        - brian
        - emma
      title: AzureVoiceId0
    AzureVoiceId:
      oneOf:
        - $ref: '#/components/schemas/AzureVoiceId0'
        - type: string
      description: This is the provider-specific ID that will be used.
      title: AzureVoiceId
    ChunkPlanPunctuationBoundaries:
      type: string
      enum:
        - 。
        - ，
        - .
        - '!'
        - '?'
        - ;
        - )
        - ،
        - ۔
        - ।
        - ॥
        - '|'
        - '||'
        - ','
        - ':'
      description: |-
        These are the punctuations that are considered valid boundaries for a chunk to be created.

        Usage:
        - To increase quality, constrain to fewer boundaries.
        - To decrease latency, enable all.

        Default is automatically set to balance the trade-off between quality and latency based on the provider.
      title: ChunkPlanPunctuationBoundaries
    ExactReplacementType:
      type: string
      enum:
        - exact
      description: >-
        This is the exact replacement type. You can use this to replace a specific word or phrase with a different word
        or phrase.


        Usage:

        - Replace "hello" with "hi": { type: 'exact', key: 'hello', value: 'hi' }

        - Replace "good morning" with "good day": { type: 'exact', key: 'good morning', value: 'good day' }

        - Replace a specific name: { type: 'exact', key: 'John Doe', value: 'Jane Smith' }

        - Replace an acronym: { type: 'exact', key: 'AI', value: 'Artificial Intelligence' }

        - Replace a company name with its phonetic pronunciation: { type: 'exact', key: 'Vapi', value: 'Vappy' }
      title: ExactReplacementType
    ExactReplacement:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/ExactReplacementType'
          description: >-
            This is the exact replacement type. You can use this to replace a specific word or phrase with a different
            word or phrase.


            Usage:

            - Replace "hello" with "hi": { type: 'exact', key: 'hello', value: 'hi' }

            - Replace "good morning" with "good day": { type: 'exact', key: 'good morning', value: 'good day' }

            - Replace a specific name: { type: 'exact', key: 'John Doe', value: 'Jane Smith' }

            - Replace an acronym: { type: 'exact', key: 'AI', value: 'Artificial Intelligence' }

            - Replace a company name with its phonetic pronunciation: { type: 'exact', key: 'Vapi', value: 'Vappy' }
        replaceAllEnabled:
          type: boolean
          default: false
          description: >-
            This option let's you control whether to replace all instances of the key or only the first one. By default,
            it only replaces the first instance.

            Examples:

            - For { type: 'exact', key: 'hello', value: 'hi', replaceAllEnabled: false }. Before: "hello world, hello
            universe" | After: "hi world, hello universe"

            - For { type: 'exact', key: 'hello', value: 'hi', replaceAllEnabled: true }. Before: "hello world, hello
            universe" | After: "hi world, hi universe"

            @default false
        key:
          type: string
          description: This is the key to replace.
        value:
          type: string
          description: This is the value that will replace the match.
      required:
        - type
        - key
        - value
      title: ExactReplacement
    RegexReplacementType:
      type: string
      enum:
        - regex
      description: >-
        This is the regex replacement type. You can use this to replace a word or phrase that matches a pattern.


        Usage:

        - Replace all numbers with "some number": { type: 'regex', regex: '\\d+', value: 'some number' }

        - Replace email addresses with "[EMAIL]": { type: 'regex', regex:
        '\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b', value: '[EMAIL]' }

        - Replace phone numbers with a formatted version: { type: 'regex', regex: '(\\d{3})(\\d{3})(\\d{4})', value:
        '($1) $2-$3' }

        - Replace all instances of "color" or "colour" with "hue": { type: 'regex', regex: 'colou?r', value: 'hue' }

        - Capitalize the first letter of every sentence: { type: 'regex', regex: '(?<=\\. |^)[a-z]', value: (match) =>
        match.toUpperCase() }
      title: RegexReplacementType
    RegexOptionType:
      type: string
      enum:
        - ignore-case
        - whole-word
        - multi-line
      description: |-
        This is the type of the regex option. Options are:
        - `ignore-case`: Ignores the case of the text being matched. Add
        - `whole-word`: Matches whole words only.
        - `multi-line`: Matches across multiple lines.
      title: RegexOptionType
    RegexOption:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/RegexOptionType'
          description: |-
            This is the type of the regex option. Options are:
            - `ignore-case`: Ignores the case of the text being matched. Add
            - `whole-word`: Matches whole words only.
            - `multi-line`: Matches across multiple lines.
        enabled:
          type: boolean
          description: |-
            This is whether to enable the option.

            @default false
      required:
        - type
        - enabled
      title: RegexOption
    RegexReplacement:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/RegexReplacementType'
          description: >-
            This is the regex replacement type. You can use this to replace a word or phrase that matches a pattern.


            Usage:

            - Replace all numbers with "some number": { type: 'regex', regex: '\\d+', value: 'some number' }

            - Replace email addresses with "[EMAIL]": { type: 'regex', regex:
            '\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b', value: '[EMAIL]' }

            - Replace phone numbers with a formatted version: { type: 'regex', regex: '(\\d{3})(\\d{3})(\\d{4})', value:
            '($1) $2-$3' }

            - Replace all instances of "color" or "colour" with "hue": { type: 'regex', regex: 'colou?r', value: 'hue' }

            - Capitalize the first letter of every sentence: { type: 'regex', regex: '(?<=\\. |^)[a-z]', value: (match)
            => match.toUpperCase() }
        regex:
          type: string
          description: >-
            This is the regex pattern to replace.


            Note:

            - This works by using the `string.replace` method in Node.JS. Eg. `"hello there".replace(/hello/g, "hi")`
            will return `"hi there"`.


            Hot tip:

            - In JavaScript, escape `\` when sending the regex pattern. Eg. `"hello\sthere"` will be sent over the wire
            as `"hellosthere"`. Send `"hello\\sthere"` instead.
        options:
          type: array
          items:
            $ref: '#/components/schemas/RegexOption'
          description: |-
            These are the options for the regex replacement. Defaults to all disabled.

            @default []
        value:
          type: string
          description: This is the value that will replace the match.
      required:
        - type
        - regex
        - value
      title: RegexReplacement
    FormatPlanReplacementsItems:
      oneOf:
        - $ref: '#/components/schemas/ExactReplacement'
        - $ref: '#/components/schemas/RegexReplacement'
      title: FormatPlanReplacementsItems
    FormatPlanFormattersEnabled:
      type: string
      enum:
        - markdown
        - asterisk
        - quote
        - dash
        - newline
        - colon
        - acronym
        - dollarAmount
        - email
        - date
        - time
        - distance
        - unit
        - percentage
        - phoneNumber
        - number
        - stripAsterisk
      description: |-
        List of formatters to apply. If not provided, all default formatters will be applied.
        If provided, only the specified formatters will be applied.
        Note: Some essential formatters like angle bracket removal will always be applied.
        @default undefined
      title: FormatPlanFormattersEnabled
    FormatPlan:
      type: object
      properties:
        enabled:
          type: boolean
          description: >-
            This determines whether the chunk is formatted before being sent to the voice provider. This helps with
            enunciation. This includes phone numbers, emails and addresses. Default `true`.


            Usage:

            - To rely on the voice provider's formatting logic, set this to `false`.


            If `voice.chunkPlan.enabled` is `false`, this is automatically `false` since there's no chunk to format.


            @default true
        numberToDigitsCutoff:
          type: number
          format: double
          description: |-
            This is the cutoff after which a number is converted to individual digits instead of being spoken as words.

            Example:
            - If cutoff 2025, "12345" is converted to "1 2 3 4 5" while "1200" is converted to "twelve hundred".

            Usage:
            - If your use case doesn't involve IDs like zip codes, set this to a high value.
            - If your use case involves IDs that are shorter than 5 digits, set this to a lower value.

            @default 2025
        replacements:
          type: array
          items:
            $ref: '#/components/schemas/FormatPlanReplacementsItems'
          description: >-
            These are the custom replacements you can make to the chunk before it is sent to the voice provider.


            Usage:

            - To replace a specific word or phrase with a different word or phrase, use the `ExactReplacement` type. Eg.
            `{ type: 'exact', key: 'hello', value: 'hi' }`

            - To replace a word or phrase that matches a pattern, use the `RegexReplacement` type. Eg. `{ type: 'regex',
            regex: '\\b[a-zA-Z]{5}\\b', value: 'hi' }`


            @default []
        formattersEnabled:
          $ref: '#/components/schemas/FormatPlanFormattersEnabled'
          description: |-
            List of formatters to apply. If not provided, all default formatters will be applied.
            If provided, only the specified formatters will be applied.
            Note: Some essential formatters like angle bracket removal will always be applied.
            @default undefined
      title: FormatPlan
    ChunkPlan:
      type: object
      properties:
        enabled:
          type: boolean
          description: |-
            This determines whether the model output is chunked before being sent to the voice provider. Default `true`.

            Usage:
            - To rely on the voice provider's audio generation logic, set this to `false`.
            - If seeing issues with quality, set this to `true`.

            If disabled, Vapi-provided audio control tokens like <flush /> will not work.

            @default true
        minCharacters:
          type: number
          format: double
          description: |-
            This is the minimum number of characters in a chunk.

            Usage:
            - To increase quality, set this to a higher value.
            - To decrease latency, set this to a lower value.

            @default 30
        punctuationBoundaries:
          $ref: '#/components/schemas/ChunkPlanPunctuationBoundaries'
          description: |-
            These are the punctuations that are considered valid boundaries for a chunk to be created.

            Usage:
            - To increase quality, constrain to fewer boundaries.
            - To decrease latency, enable all.

            Default is automatically set to balance the trade-off between quality and latency based on the provider.
        formatPlan:
          $ref: '#/components/schemas/FormatPlan'
          description: This is the plan for formatting the chunk before it is sent to the voice provider.
      title: ChunkPlan
    FallbackAzureVoiceProvider:
      type: string
      enum:
        - azure
      description: This is the voice provider that will be used.
      title: FallbackAzureVoiceProvider
    FallbackAzureVoiceId0:
      type: string
      enum:
        - andrew
        - brian
        - emma
      title: FallbackAzureVoiceId0
    FallbackAzureVoiceId:
      oneOf:
        - $ref: '#/components/schemas/FallbackAzureVoiceId0'
        - type: string
      description: This is the provider-specific ID that will be used.
      title: FallbackAzureVoiceId
    FallbackAzureVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/FallbackAzureVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          $ref: '#/components/schemas/FallbackAzureVoiceId'
          description: This is the provider-specific ID that will be used.
        speed:
          type: number
          format: double
          description: This is the speed multiplier that will be used.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
        oneOf:
          description: Any type
      required:
        - provider
        - voiceId
      title: FallbackAzureVoice
    FallbackCartesiaVoiceProvider:
      type: string
      enum:
        - cartesia
      description: This is the voice provider that will be used.
      title: FallbackCartesiaVoiceProvider
    FallbackCartesiaVoiceModel:
      type: string
      enum:
        - sonic-3
        - sonic-3-2026-01-12
        - sonic-3-2025-10-27
        - sonic-2
        - sonic-2-2025-06-11
        - sonic-english
        - sonic-multilingual
        - sonic-preview
        - sonic
      description: This is the model that will be used. This is optional and will default to the correct model for the voiceId.
      title: FallbackCartesiaVoiceModel
    FallbackCartesiaVoiceLanguage:
      type: string
      enum:
        - ar
        - bg
        - bn
        - cs
        - da
        - de
        - el
        - en
        - es
        - fi
        - fr
        - gu
        - he
        - hi
        - hr
        - hu
        - id
        - it
        - ja
        - ka
        - kn
        - ko
        - ml
        - mr
        - ms
        - nl
        - 'no'
        - pa
        - pl
        - pt
        - ro
        - ru
        - sk
        - sv
        - ta
        - te
        - th
        - tl
        - tr
        - uk
        - vi
        - zh
      description: >-
        This is the language that will be used. This is optional and will default to the correct language for the
        voiceId.
      title: FallbackCartesiaVoiceLanguage
    CartesiaSpeedControl0:
      type: string
      enum:
        - slowest
        - slow
        - normal
        - fast
        - fastest
      title: CartesiaSpeedControl0
    CartesiaSpeedControl:
      oneOf:
        - $ref: '#/components/schemas/CartesiaSpeedControl0'
        - type: number
          format: double
      title: CartesiaSpeedControl
    CartesiaExperimentalControlsEmotion:
      type: string
      enum:
        - anger:lowest
        - anger:low
        - anger:high
        - anger:highest
        - positivity:lowest
        - positivity:low
        - positivity:high
        - positivity:highest
        - surprise:lowest
        - surprise:low
        - surprise:high
        - surprise:highest
        - sadness:lowest
        - sadness:low
        - sadness:high
        - sadness:highest
        - curiosity:lowest
        - curiosity:low
        - curiosity:high
        - curiosity:highest
      title: CartesiaExperimentalControlsEmotion
    CartesiaExperimentalControls:
      type: object
      properties:
        speed:
          $ref: '#/components/schemas/CartesiaSpeedControl'
        emotion:
          $ref: '#/components/schemas/CartesiaExperimentalControlsEmotion'
      title: CartesiaExperimentalControls
    CartesiaGenerationConfigExperimental:
      type: object
      properties:
        accentLocalization:
          type: integer
          default: 0
          description: >-
            Toggle accent localization for sonic-3: 0 (disabled, default) or 1 (enabled). When enabled, the voice adapts
            to match the transcript language accent while preserving vocal characteristics.
      title: CartesiaGenerationConfigExperimental
    CartesiaGenerationConfig:
      type: object
      properties:
        speed:
          type: number
          format: double
          default: 1
          description: Fine-grained speed control for sonic-3. Only available for sonic-3 model.
        volume:
          type: number
          format: double
          default: 1
          description: Fine-grained volume control for sonic-3. Only available for sonic-3 model.
        experimental:
          $ref: '#/components/schemas/CartesiaGenerationConfigExperimental'
          description: Experimental model controls for sonic-3. These are subject to breaking changes.
      title: CartesiaGenerationConfig
    FallbackCartesiaVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/FallbackCartesiaVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          type: string
          description: The ID of the particular voice you want to use.
        model:
          $ref: '#/components/schemas/FallbackCartesiaVoiceModel'
          description: This is the model that will be used. This is optional and will default to the correct model for the voiceId.
        language:
          $ref: '#/components/schemas/FallbackCartesiaVoiceLanguage'
          description: >-
            This is the language that will be used. This is optional and will default to the correct language for the
            voiceId.
        experimentalControls:
          $ref: '#/components/schemas/CartesiaExperimentalControls'
          description: Experimental controls for Cartesia voice generation
        generationConfig:
          $ref: '#/components/schemas/CartesiaGenerationConfig'
          description: >-
            Generation config for fine-grained control of sonic-3 voice output (speed, volume, and experimental
            controls). Only available for sonic-3 model.
        pronunciationDictId:
          type: string
          description: >-
            Pronunciation dictionary ID for sonic-3. Allows custom pronunciations for specific words. Only available for
            sonic-3 model.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
      required:
        - provider
        - voiceId
      title: FallbackCartesiaVoice
    FallbackHumeVoiceProvider:
      type: string
      enum:
        - hume
      description: This is the voice provider that will be used.
      title: FallbackHumeVoiceProvider
    FallbackHumeVoiceModel:
      type: string
      enum:
        - octave
        - octave2
      description: This is the model that will be used.
      title: FallbackHumeVoiceModel
    FallbackHumeVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/FallbackHumeVoiceProvider'
          description: This is the voice provider that will be used.
        model:
          $ref: '#/components/schemas/FallbackHumeVoiceModel'
          description: This is the model that will be used.
        voiceId:
          type: string
          description: The ID of the particular voice you want to use.
        isCustomHumeVoice:
          type: boolean
          description: Indicates whether the chosen voice is a preset Hume AI voice or a custom voice.
        description:
          type: string
          description: >-
            Natural language instructions describing how the synthesized speech should sound, including but not limited
            to tone, intonation, pacing, and accent (e.g., 'a soft, gentle voice with a strong British accent').


            If a Voice is specified in the request, this description serves as acting instructions.

            If no Voice is specified, a new voice is generated based on this description.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
      required:
        - provider
        - voiceId
      title: FallbackHumeVoice
    FallbackCustomVoiceProvider:
      type: string
      enum:
        - custom-voice
      description: This is the voice provider that will be used. Use `custom-voice` for providers that are not natively supported.
      title: FallbackCustomVoiceProvider
    FallbackCustomVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/FallbackCustomVoiceProvider'
          description: >-
            This is the voice provider that will be used. Use `custom-voice` for providers that are not natively
            supported.
        voiceId:
          type: string
          description: >-
            This is the provider-specific ID that will be used. This is passed in the voice request payload to identify
            the voice to use.
        server:
          $ref: '#/components/schemas/Server'
          description: >-
            This is where the voice request will be sent.


            Request Example:


            POST https://{server.url}

            Content-Type: application/json


            {
              "message": {
                "type": "voice-request",
                "text": "Hello, world!",
                "sampleRate": 24000,
                ...other metadata about the call...
              }
            }


            Response Expected: 1-channel 16-bit raw PCM audio at the sample rate specified in the request. Here is how
            the response will be piped to the transport:

            ```

            response.on('data', (chunk: Buffer) => {
              outputStream.write(chunk);
            });

            ```
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
      required:
        - provider
        - server
      title: FallbackCustomVoice
    FallbackDeepgramVoiceProvider:
      type: string
      enum:
        - deepgram
      description: This is the voice provider that will be used.
      title: FallbackDeepgramVoiceProvider
    FallbackDeepgramVoiceId:
      type: string
      enum:
        - asteria
        - luna
        - stella
        - athena
        - hera
        - orion
        - arcas
        - perseus
        - angus
        - orpheus
        - helios
        - zeus
        - thalia
        - andromeda
        - helena
        - apollo
        - arcas
        - aries
        - amalthea
        - asteria
        - athena
        - atlas
        - aurora
        - callista
        - cora
        - cordelia
        - delia
        - draco
        - electra
        - harmonia
        - hera
        - hermes
        - hyperion
        - iris
        - janus
        - juno
        - jupiter
        - luna
        - mars
        - minerva
        - neptune
        - odysseus
        - ophelia
        - orion
        - orpheus
        - pandora
        - phoebe
        - pluto
        - saturn
        - selene
        - theia
        - vesta
        - zeus
        - celeste
        - estrella
        - nestor
        - sirio
        - carina
        - alvaro
        - diana
        - aquila
        - selena
        - javier
      description: This is the provider-specific ID that will be used.
      title: FallbackDeepgramVoiceId
    FallbackDeepgramVoiceModel:
      type: string
      enum:
        - aura
        - aura-2
      description: This is the model that will be used. Defaults to 'aura-2' when not specified.
      title: FallbackDeepgramVoiceModel
    FallbackDeepgramVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/FallbackDeepgramVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          $ref: '#/components/schemas/FallbackDeepgramVoiceId'
          description: This is the provider-specific ID that will be used.
        model:
          $ref: '#/components/schemas/FallbackDeepgramVoiceModel'
          description: This is the model that will be used. Defaults to 'aura-2' when not specified.
        mipOptOut:
          type: boolean
          default: false
          description: >-
            If set to true, this will add mip_opt_out=true as a query parameter of all API requests. See
            https://developers.deepgram.com/docs/the-deepgram-model-improvement-partnership-program#want-to-opt-out


            This will only be used if you are using your own Deepgram API key.


            @default false
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
      required:
        - provider
        - voiceId
      title: FallbackDeepgramVoice
    FallbackElevenLabsVoiceId0:
      type: string
      enum:
        - burt
        - marissa
        - andrea
        - sarah
        - phillip
        - steve
        - joseph
        - myra
        - paula
        - ryan
        - drew
        - paul
        - mrb
        - matilda
        - mark
      title: FallbackElevenLabsVoiceId0
    FallbackElevenLabsVoiceId:
      oneOf:
        - $ref: '#/components/schemas/FallbackElevenLabsVoiceId0'
        - type: string
      description: This is the provider-specific ID that will be used. Ensure the Voice is present in your 11Labs Voice Library.
      title: FallbackElevenLabsVoiceId
    FallbackElevenLabsVoiceModel:
      type: string
      enum:
        - eleven_multilingual_v2
        - eleven_turbo_v2
        - eleven_turbo_v2_5
        - eleven_flash_v2
        - eleven_flash_v2_5
        - eleven_monolingual_v1
        - eleven_v3
      description: This is the model that will be used. Defaults to 'eleven_turbo_v2' if not specified.
      title: FallbackElevenLabsVoiceModel
    ElevenLabsPronunciationDictionaryLocator:
      type: object
      properties:
        pronunciationDictionaryId:
          type: string
          description: This is the ID of the pronunciation dictionary to use.
        versionId:
          type: string
          description: This is the version ID of the pronunciation dictionary to use.
      required:
        - pronunciationDictionaryId
        - versionId
      title: ElevenLabsPronunciationDictionaryLocator
    FallbackElevenLabsVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          type: string
          enum:
            - 11labs
          description: This is the voice provider that will be used.
        voiceId:
          $ref: '#/components/schemas/FallbackElevenLabsVoiceId'
          description: >-
            This is the provider-specific ID that will be used. Ensure the Voice is present in your 11Labs Voice
            Library.
        stability:
          type: number
          format: double
          description: Defines the stability for voice settings.
        similarityBoost:
          type: number
          format: double
          description: Defines the similarity boost for voice settings.
        style:
          type: number
          format: double
          description: Defines the style for voice settings.
        useSpeakerBoost:
          type: boolean
          description: Defines the use speaker boost for voice settings.
        speed:
          type: number
          format: double
          description: Defines the speed for voice settings.
        optimizeStreamingLatency:
          type: number
          format: double
          description: Defines the optimize streaming latency for voice settings. Defaults to 3.
        enableSsmlParsing:
          type: boolean
          description: >-
            This enables the use of https://elevenlabs.io/docs/speech-synthesis/prompting#pronunciation. Defaults to
            false to save latency.


            @default false
        autoMode:
          type: boolean
          description: Defines the auto mode for voice settings. Defaults to false.
        model:
          $ref: '#/components/schemas/FallbackElevenLabsVoiceModel'
          description: This is the model that will be used. Defaults to 'eleven_turbo_v2' if not specified.
        language:
          type: string
          description: >-
            This is the language (ISO 639-1) that is enforced for the model. Currently only Turbo v2.5 supports language
            enforcement. For other models, an error will be returned if language code is provided.
        pronunciationDictionaryLocators:
          type: array
          items:
            $ref: '#/components/schemas/ElevenLabsPronunciationDictionaryLocator'
          description: This is the pronunciation dictionary locators to use.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
      required:
        - provider
        - voiceId
      title: FallbackElevenLabsVoice
    FallbackVapiVoiceProvider:
      type: string
      enum:
        - vapi
      description: This is the voice provider that will be used.
      title: FallbackVapiVoiceProvider
    FallbackVapiVoiceVoiceId:
      type: string
      enum:
        - Clara
        - Godfrey
        - Layla
        - Sid
        - Gustavo
        - Elliot
        - Kylie
        - Rohan
        - Lily
        - Savannah
        - Hana
        - Neha
        - Cole
        - Harry
        - Paige
        - Spencer
        - Nico
        - Kai
        - Emma
        - Sagar
        - Neil
        - Naina
        - Leah
        - Tara
        - Jess
        - Leo
        - Dan
        - Mia
        - Zac
        - Zoe
      description: The voices provided by Vapi
      title: FallbackVapiVoiceVoiceId
    VapiPronunciationDictionaryLocator:
      type: object
      properties:
        pronunciationDictId:
          type: string
          description: The pronunciation dictionary ID
        versionId:
          type: string
          description: Version ID (only required for ElevenLabs, ignored for Cartesia)
      required:
        - pronunciationDictId
      title: VapiPronunciationDictionaryLocator
    FallbackVapiVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/FallbackVapiVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          $ref: '#/components/schemas/FallbackVapiVoiceVoiceId'
          description: The voices provided by Vapi
        speed:
          type: number
          format: double
          default: 1
          description: |-
            This is the speed multiplier that will be used.

            @default 1
        pronunciationDictionary:
          type: array
          items:
            $ref: '#/components/schemas/VapiPronunciationDictionaryLocator'
          description: List of pronunciation dictionary locators for custom word pronunciations.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
      required:
        - provider
        - voiceId
      title: FallbackVapiVoice
    FallbackLmntVoiceProvider:
      type: string
      enum:
        - lmnt
      description: This is the voice provider that will be used.
      title: FallbackLmntVoiceProvider
    FallbackLmntVoiceId0:
      type: string
      enum:
        - amy
        - ansel
        - autumn
        - ava
        - brandon
        - caleb
        - cassian
        - chloe
        - dalton
        - daniel
        - dustin
        - elowen
        - evander
        - huxley
        - james
        - juniper
        - kennedy
        - lauren
        - leah
        - lily
        - lucas
        - magnus
        - miles
        - morgan
        - natalie
        - nathan
        - noah
        - nyssa
        - oliver
        - paige
        - ryan
        - sadie
        - sophie
        - stella
        - terrence
        - tyler
        - vesper
        - violet
        - warrick
        - zain
        - zeke
        - zoe
      title: FallbackLmntVoiceId0
    FallbackLMNTVoiceId:
      oneOf:
        - $ref: '#/components/schemas/FallbackLmntVoiceId0'
        - type: string
      description: This is the provider-specific ID that will be used.
      title: FallbackLMNTVoiceId
    FallbackLmntVoiceLanguage:
      type: string
      enum:
        - aa
        - ab
        - ae
        - af
        - ak
        - am
        - an
        - ar
        - as
        - av
        - ay
        - az
        - ba
        - be
        - bg
        - bh
        - bi
        - bm
        - bn
        - bo
        - br
        - bs
        - ca
        - ce
        - ch
        - co
        - cr
        - cs
        - cu
        - cv
        - cy
        - da
        - de
        - dv
        - dz
        - ee
        - el
        - en
        - eo
        - es
        - et
        - eu
        - fa
        - ff
        - fi
        - fj
        - fo
        - fr
        - fy
        - ga
        - gd
        - gl
        - gn
        - gu
        - gv
        - ha
        - he
        - hi
        - ho
        - hr
        - ht
        - hu
        - hy
        - hz
        - ia
        - id
        - ie
        - ig
        - ii
        - ik
        - io
        - is
        - it
        - iu
        - ja
        - jv
        - ka
        - kg
        - ki
        - kj
        - kk
        - kl
        - km
        - kn
        - ko
        - kr
        - ks
        - ku
        - kv
        - kw
        - ky
        - la
        - lb
        - lg
        - li
        - ln
        - lo
        - lt
        - lu
        - lv
        - mg
        - mh
        - mi
        - mk
        - ml
        - mn
        - mr
        - ms
        - mt
        - my
        - na
        - nb
        - nd
        - ne
        - ng
        - nl
        - nn
        - 'no'
        - nr
        - nv
        - ny
        - oc
        - oj
        - om
        - or
        - os
        - pa
        - pi
        - pl
        - ps
        - pt
        - qu
        - rm
        - rn
        - ro
        - ru
        - rw
        - sa
        - sc
        - sd
        - se
        - sg
        - si
        - sk
        - sl
        - sm
        - sn
        - so
        - sq
        - sr
        - ss
        - st
        - su
        - sv
        - sw
        - ta
        - te
        - tg
        - th
        - ti
        - tk
        - tl
        - tn
        - to
        - tr
        - ts
        - tt
        - tw
        - ty
        - ug
        - uk
        - ur
        - uz
        - ve
        - vi
        - vo
        - wa
        - wo
        - xh
        - yi
        - yue
        - yo
        - za
        - zh
        - zu
        - auto
      description: Two letter ISO 639-1 language code. Use "auto" for auto-detection.
      title: FallbackLmntVoiceLanguage
    FallbackLMNTVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/FallbackLmntVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          $ref: '#/components/schemas/FallbackLMNTVoiceId'
          description: This is the provider-specific ID that will be used.
        speed:
          type: number
          format: double
          description: This is the speed multiplier that will be used.
        language:
          $ref: '#/components/schemas/FallbackLmntVoiceLanguage'
          description: Two letter ISO 639-1 language code. Use "auto" for auto-detection.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
      required:
        - provider
        - voiceId
      title: FallbackLMNTVoice
    FallbackOpenAiVoiceProvider:
      type: string
      enum:
        - openai
      description: This is the voice provider that will be used.
      title: FallbackOpenAiVoiceProvider
    FallbackOpenAiVoiceId0:
      type: string
      enum:
        - alloy
        - echo
        - fable
        - onyx
        - nova
        - shimmer
        - marin
        - cedar
      title: FallbackOpenAiVoiceId0
    FallbackOpenAIVoiceId:
      oneOf:
        - $ref: '#/components/schemas/FallbackOpenAiVoiceId0'
        - type: string
      description: |-
        This is the provider-specific ID that will be used.
        Please note that ash, ballad, coral, sage, and verse may only be used with realtime models.
      title: FallbackOpenAIVoiceId
    FallbackOpenAiVoiceModel:
      type: string
      enum:
        - tts-1
        - tts-1-hd
        - gpt-4o-mini-tts
      description: This is the model that will be used for text-to-speech.
      title: FallbackOpenAiVoiceModel
    FallbackOpenAIVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/FallbackOpenAiVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          $ref: '#/components/schemas/FallbackOpenAIVoiceId'
          description: |-
            This is the provider-specific ID that will be used.
            Please note that ash, ballad, coral, sage, and verse may only be used with realtime models.
        model:
          $ref: '#/components/schemas/FallbackOpenAiVoiceModel'
          description: This is the model that will be used for text-to-speech.
        instructions:
          type: string
          description: |-
            This is a prompt that allows you to control the voice of your generated audio.
            Does not work with 'tts-1' or 'tts-1-hd' models.
        speed:
          type: number
          format: double
          description: This is the speed multiplier that will be used.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
      required:
        - provider
        - voiceId
      title: FallbackOpenAIVoice
    FallbackPlayHtVoiceProvider:
      type: string
      enum:
        - playht
      description: This is the voice provider that will be used.
      title: FallbackPlayHtVoiceProvider
    FallbackPlayHtVoiceId0:
      type: string
      enum:
        - jennifer
        - melissa
        - will
        - chris
        - matt
        - jack
        - ruby
        - davis
        - donna
        - michael
      title: FallbackPlayHtVoiceId0
    FallbackPlayHTVoiceId:
      oneOf:
        - $ref: '#/components/schemas/FallbackPlayHtVoiceId0'
        - type: string
      description: This is the provider-specific ID that will be used.
      title: FallbackPlayHTVoiceId
    FallbackPlayHtVoiceEmotion:
      type: string
      enum:
        - female_happy
        - female_sad
        - female_angry
        - female_fearful
        - female_disgust
        - female_surprised
        - male_happy
        - male_sad
        - male_angry
        - male_fearful
        - male_disgust
        - male_surprised
      description: An emotion to be applied to the speech.
      title: FallbackPlayHtVoiceEmotion
    FallbackPlayHtVoiceModel:
      type: string
      enum:
        - PlayHT2.0
        - PlayHT2.0-turbo
        - Play3.0-mini
        - PlayDialog
      description: Playht voice model/engine to use.
      title: FallbackPlayHtVoiceModel
    FallbackPlayHtVoiceLanguage:
      type: string
      enum:
        - afrikaans
        - albanian
        - amharic
        - arabic
        - bengali
        - bulgarian
        - catalan
        - croatian
        - czech
        - danish
        - dutch
        - english
        - french
        - galician
        - german
        - greek
        - hebrew
        - hindi
        - hungarian
        - indonesian
        - italian
        - japanese
        - korean
        - malay
        - mandarin
        - polish
        - portuguese
        - russian
        - serbian
        - spanish
        - swedish
        - tagalog
        - thai
        - turkish
        - ukrainian
        - urdu
        - xhosa
      description: The language to use for the speech.
      title: FallbackPlayHtVoiceLanguage
    FallbackPlayHTVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/FallbackPlayHtVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          $ref: '#/components/schemas/FallbackPlayHTVoiceId'
          description: This is the provider-specific ID that will be used.
        speed:
          type: number
          format: double
          description: This is the speed multiplier that will be used.
        temperature:
          type: number
          format: double
          description: >-
            A floating point number between 0, exclusive, and 2, inclusive. If equal to null or not provided, the
            model's default temperature will be used. The temperature parameter controls variance. Lower temperatures
            result in more predictable results, higher temperatures allow each run to vary more, so the voice may sound
            less like the baseline voice.
        emotion:
          $ref: '#/components/schemas/FallbackPlayHtVoiceEmotion'
          description: An emotion to be applied to the speech.
        voiceGuidance:
          type: number
          format: double
          description: >-
            A number between 1 and 6. Use lower numbers to reduce how unique your chosen voice will be compared to other
            voices.
        styleGuidance:
          type: number
          format: double
          description: >-
            A number between 1 and 30. Use lower numbers to to reduce how strong your chosen emotion will be. Higher
            numbers will create a very emotional performance.
        textGuidance:
          type: number
          format: double
          description: >-
            A number between 1 and 2. This number influences how closely the generated speech adheres to the input text.
            Use lower values to create more fluid speech, but with a higher chance of deviating from the input text.
            Higher numbers will make the generated speech more accurate to the input text, ensuring that the words
            spoken align closely with the provided text.
        model:
          $ref: '#/components/schemas/FallbackPlayHtVoiceModel'
          description: Playht voice model/engine to use.
        language:
          $ref: '#/components/schemas/FallbackPlayHtVoiceLanguage'
          description: The language to use for the speech.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
      required:
        - provider
        - voiceId
      title: FallbackPlayHTVoice
    FallbackWellSaidVoiceProvider:
      type: string
      enum:
        - wellsaid
      description: This is the voice provider that will be used.
      title: FallbackWellSaidVoiceProvider
    FallbackWellSaidVoiceModel:
      type: string
      enum:
        - caruso
        - legacy
      description: This is the model that will be used.
      title: FallbackWellSaidVoiceModel
    FallbackWellSaidVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/FallbackWellSaidVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          type: string
          description: The WellSaid speaker ID to synthesize.
        model:
          $ref: '#/components/schemas/FallbackWellSaidVoiceModel'
          description: This is the model that will be used.
        enableSsml:
          type: boolean
          description: Enables limited SSML translation for input text.
        libraryIds:
          type: array
          items:
            type: string
          description: Array of library IDs to use for voice synthesis.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
      required:
        - provider
        - voiceId
      title: FallbackWellSaidVoice
    FallbackRimeAiVoiceProvider:
      type: string
      enum:
        - rime-ai
      description: This is the voice provider that will be used.
      title: FallbackRimeAiVoiceProvider
    FallbackRimeAiVoiceId0:
      type: string
      enum:
        - cove
        - moon
        - wildflower
        - eva
        - amber
        - maya
        - lagoon
        - breeze
        - helen
        - joy
        - marsh
        - creek
        - cedar
        - alpine
        - summit
        - nicholas
        - tyler
        - colin
        - hank
        - thunder
        - astra
        - eucalyptus
        - moraine
        - peak
        - tundra
        - mesa_extra
        - talon
        - marlu
        - glacier
        - falcon
        - luna
        - celeste
        - estelle
        - andromeda
        - esther
        - lyra
        - lintel
        - oculus
        - vespera
        - transom
        - bond
        - arcade
        - atrium
        - cupola
        - fern
        - sirius
        - orion
        - masonry
        - albion
        - parapet
      description: >-
        Popular Rime AI voices across mist, mistv2, and arcana models. Any valid Rime AI voice ID is accepted, not just
        these suggestions.
      title: FallbackRimeAiVoiceId0
    FallbackRimeAIVoiceId:
      oneOf:
        - $ref: '#/components/schemas/FallbackRimeAiVoiceId0'
        - type: string
      description: This is the provider-specific ID that will be used.
      title: FallbackRimeAIVoiceId
    FallbackRimeAiVoiceModel:
      type: string
      enum:
        - arcana
        - mistv2
        - mist
      description: This is the model that will be used. Defaults to 'arcana' when not specified.
      title: FallbackRimeAiVoiceModel
    FallbackRimeAiVoiceLanguage:
      type: string
      enum:
        - en
        - es
        - de
        - fr
        - ar
        - hi
        - ja
        - he
        - pt
        - ta
        - si
      description: 'Language for speech synthesis. Uses ISO 639 codes. Supported: en, es, de, fr, ar, hi, ja, he, pt, ta, si.'
      title: FallbackRimeAiVoiceLanguage
    FallbackRimeAIVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/FallbackRimeAiVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          $ref: '#/components/schemas/FallbackRimeAIVoiceId'
          description: This is the provider-specific ID that will be used.
        model:
          $ref: '#/components/schemas/FallbackRimeAiVoiceModel'
          description: This is the model that will be used. Defaults to 'arcana' when not specified.
        speed:
          type: number
          format: double
          description: This is the speed multiplier that will be used.
        pauseBetweenBrackets:
          type: boolean
          description: >-
            This is a flag that controls whether to add slight pauses using angle brackets. Example: "Hi. <200> I'd love
            to have a conversation with you." adds a 200ms pause between the first and second sentences.
        phonemizeBetweenBrackets:
          type: boolean
          description: >-
            This is a flag that controls whether text inside brackets should be phonemized (converted to phonetic
            pronunciation) - Example: "{h'El.o} World" will pronounce "Hello" as expected.
        reduceLatency:
          type: boolean
          description: >-
            This is a flag that controls whether to optimize for reduced latency in streaming.
            https://docs.rime.ai/api-reference/endpoint/websockets#param-reduce-latency
        inlineSpeedAlpha:
          type: string
          description: >-
            This is a string that allows inline speed control using alpha notation.
            https://docs.rime.ai/api-reference/endpoint/websockets#param-inline-speed-alpha
        language:
          $ref: '#/components/schemas/FallbackRimeAiVoiceLanguage'
          description: 'Language for speech synthesis. Uses ISO 639 codes. Supported: en, es, de, fr, ar, hi, ja, he, pt, ta, si.'
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
      required:
        - provider
        - voiceId
      title: FallbackRimeAIVoice
    FallbackSmallestAiVoiceProvider:
      type: string
      enum:
        - smallest-ai
      description: This is the voice provider that will be used.
      title: FallbackSmallestAiVoiceProvider
    FallbackSmallestAiVoiceId0:
      type: string
      enum:
        - emily
        - jasmine
        - arman
        - james
        - mithali
        - aravind
        - raj
        - diya
        - raman
        - ananya
        - isha
        - william
        - aarav
        - monika
        - niharika
        - deepika
        - raghav
        - kajal
        - radhika
        - mansi
        - nisha
        - saurabh
        - pooja
        - saina
        - sanya
      title: FallbackSmallestAiVoiceId0
    FallbackSmallestAIVoiceId:
      oneOf:
        - $ref: '#/components/schemas/FallbackSmallestAiVoiceId0'
        - type: string
      description: This is the provider-specific ID that will be used.
      title: FallbackSmallestAIVoiceId
    FallbackSmallestAiVoiceModel:
      type: string
      enum:
        - lightning
      description: Smallest AI voice model to use. Defaults to 'lightning' when not specified.
      title: FallbackSmallestAiVoiceModel
    FallbackSmallestAIVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/FallbackSmallestAiVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          $ref: '#/components/schemas/FallbackSmallestAIVoiceId'
          description: This is the provider-specific ID that will be used.
        model:
          $ref: '#/components/schemas/FallbackSmallestAiVoiceModel'
          description: Smallest AI voice model to use. Defaults to 'lightning' when not specified.
        speed:
          type: number
          format: double
          description: This is the speed multiplier that will be used.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
      required:
        - provider
        - voiceId
      title: FallbackSmallestAIVoice
    FallbackTavusVoiceProvider:
      type: string
      enum:
        - tavus
      description: This is the voice provider that will be used.
      title: FallbackTavusVoiceProvider
    FallbackTavusVoiceVoiceId0:
      type: string
      enum:
        - r52da2535a
      title: FallbackTavusVoiceVoiceId0
    FallbackTavusVoiceVoiceId:
      oneOf:
        - $ref: '#/components/schemas/FallbackTavusVoiceVoiceId0'
        - type: string
      description: This is the provider-specific ID that will be used.
      title: FallbackTavusVoiceVoiceId
    TavusConversationProperties:
      type: object
      properties:
        maxCallDuration:
          type: number
          format: double
          description: >-
            The maximum duration of the call in seconds. The default `maxCallDuration` is 3600 seconds (1 hour).

            Once the time limit specified by this parameter has been reached, the conversation will automatically shut
            down.
        participantLeftTimeout:
          type: number
          format: double
          description: >-
            The duration in seconds after which the call will be automatically shut down once the last participant
            leaves.
        participantAbsentTimeout:
          type: number
          format: double
          description: >-
            Starting from conversation creation, the duration in seconds after which the call will be automatically shut
            down if no participant joins the call.

            Default is 300 seconds (5 minutes).
        enableRecording:
          type: boolean
          description: If true, the user will be able to record the conversation.
        enableTranscription:
          type: boolean
          description: >-
            If true, the user will be able to transcribe the conversation.

            You can find more instructions on displaying transcriptions if you are using your custom DailyJS components
            here.

            You need to have an event listener on Daily that listens for `app-messages`.
        applyGreenscreen:
          type: boolean
          description: |-
            If true, the background will be replaced with a greenscreen (RGB values: `[0, 255, 155]`).
            You can use WebGL on the frontend to make the greenscreen transparent or change its color.
        language:
          type: string
          description: >-
            The language of the conversation. Please provide the **full language name**, not the two-letter code.

            If you are using your own TTS voice, please ensure it supports the language you provide.

            If you are using a stock replica or default persona, please note that only ElevenLabs and Cartesia supported
            languages are available.

            You can find a full list of supported languages for Cartesia here, for ElevenLabs here, and for PlayHT here.
        recordingS3BucketName:
          type: string
          description: The name of the S3 bucket where the recording will be stored.
        recordingS3BucketRegion:
          type: string
          description: The region of the S3 bucket where the recording will be stored.
        awsAssumeRoleArn:
          type: string
          description: The ARN of the role that will be assumed to access the S3 bucket.
      title: TavusConversationProperties
    FallbackTavusVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/FallbackTavusVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          $ref: '#/components/schemas/FallbackTavusVoiceVoiceId'
          description: This is the provider-specific ID that will be used.
        personaId:
          type: string
          description: This is the unique identifier for the persona that the replica will use in the conversation.
        callbackUrl:
          type: string
          description: This is the url that will receive webhooks with updates regarding the conversation state.
        conversationName:
          type: string
          description: This is the name for the conversation.
        conversationalContext:
          type: string
          description: This is the context that will be appended to any context provided in the persona, if one is provided.
        customGreeting:
          type: string
          description: This is the custom greeting that the replica will give once a participant joines the conversation.
        properties:
          $ref: '#/components/schemas/TavusConversationProperties'
          description: These are optional properties used to customize the conversation.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
      required:
        - provider
        - voiceId
      title: FallbackTavusVoice
    FallbackNeuphonicVoiceProvider:
      type: string
      enum:
        - neuphonic
      description: This is the voice provider that will be used.
      title: FallbackNeuphonicVoiceProvider
    FallbackNeuphonicVoiceModel:
      type: string
      enum:
        - neu_hq
        - neu_fast
      description: This is the model that will be used. Defaults to 'neu_fast' if not specified.
      title: FallbackNeuphonicVoiceModel
    FallbackNeuphonicVoiceLanguage:
      type: object
      properties: {}
      description: This is the language (ISO 639-1) that is enforced for the model.
      title: FallbackNeuphonicVoiceLanguage
    FallbackNeuphonicVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/FallbackNeuphonicVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          type: string
          description: This is the provider-specific ID that will be used.
        model:
          $ref: '#/components/schemas/FallbackNeuphonicVoiceModel'
          description: This is the model that will be used. Defaults to 'neu_fast' if not specified.
        language:
          $ref: '#/components/schemas/FallbackNeuphonicVoiceLanguage'
          description: This is the language (ISO 639-1) that is enforced for the model.
        speed:
          type: number
          format: double
          description: This is the speed multiplier that will be used.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
      required:
        - provider
        - voiceId
        - language
      title: FallbackNeuphonicVoice
    FallbackSesameVoiceProvider:
      type: string
      enum:
        - sesame
      description: This is the voice provider that will be used.
      title: FallbackSesameVoiceProvider
    FallbackSesameVoiceModel:
      type: string
      enum:
        - csm-1b
      description: This is the model that will be used.
      title: FallbackSesameVoiceModel
    FallbackSesameVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/FallbackSesameVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          type: string
          description: This is the provider-specific ID that will be used.
        model:
          $ref: '#/components/schemas/FallbackSesameVoiceModel'
          description: This is the model that will be used.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
      required:
        - provider
        - voiceId
        - model
      title: FallbackSesameVoice
    FallbackInworldVoiceProvider:
      type: string
      enum:
        - inworld
      description: This is the voice provider that will be used.
      title: FallbackInworldVoiceProvider
    FallbackInworldVoiceVoiceId:
      type: string
      enum:
        - Alex
        - Ashley
        - Craig
        - Deborah
        - Dennis
        - Edward
        - Elizabeth
        - Hades
        - Julia
        - Pixie
        - Mark
        - Olivia
        - Priya
        - Ronald
        - Sarah
        - Shaun
        - Theodore
        - Timothy
        - Wendy
        - Dominus
        - Hana
        - Clive
        - Carter
        - Blake
        - Luna
        - Yichen
        - Xiaoyin
        - Xinyi
        - Jing
        - Erik
        - Katrien
        - Lennart
        - Lore
        - Alain
        - Hélène
        - Mathieu
        - Étienne
        - Johanna
        - Josef
        - Gianni
        - Orietta
        - Asuka
        - Satoshi
        - Hyunwoo
        - Minji
        - Seojun
        - Yoona
        - Szymon
        - Wojciech
        - Heitor
        - Maitê
        - Diego
        - Lupita
        - Miguel
        - Rafael
        - Svetlana
        - Elena
        - Dmitry
        - Nikolai
        - Riya
        - Manoj
        - Yael
        - Oren
        - Nour
        - Omar
      description: >-
        Available voices by language:

        • en: Alex, Ashley, Craig, Deborah, Dennis, Edward, Elizabeth, Hades, Julia, Pixie, Mark, Olivia, Priya, Ronald,
        Sarah, Shaun, Theodore, Timothy, Wendy, Dominus, Hana, Clive, Carter, Blake, Luna

        • zh: Yichen, Xiaoyin, Xinyi, Jing

        • nl: Erik, Katrien, Lennart, Lore

        • fr: Alain, Hélène, Mathieu, Étienne

        • de: Johanna, Josef

        • it: Gianni, Orietta

        • ja: Asuka, Satoshi

        • ko: Hyunwoo, Minji, Seojun, Yoona

        • pl: Szymon, Wojciech

        • pt: Heitor, Maitê

        • es: Diego, Lupita, Miguel, Rafael

        • ru: Svetlana, Elena, Dmitry, Nikolai

        • hi: Riya, Manoj

        • he: Yael, Oren

        • ar: Nour, Omar
      title: FallbackInworldVoiceVoiceId
    FallbackInworldVoiceModel:
      type: string
      enum:
        - inworld-tts-1
      default: inworld-tts-1
      description: This is the model that will be used.
      title: FallbackInworldVoiceModel
    FallbackInworldVoiceLanguageCode:
      type: string
      enum:
        - en
        - zh
        - ko
        - nl
        - fr
        - es
        - ja
        - de
        - it
        - pl
        - pt
        - ru
        - hi
        - he
        - ar
      default: en
      description: Language code for Inworld TTS synthesis
      title: FallbackInworldVoiceLanguageCode
    FallbackInworldVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/FallbackInworldVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          $ref: '#/components/schemas/FallbackInworldVoiceVoiceId'
          description: >-
            Available voices by language:

            • en: Alex, Ashley, Craig, Deborah, Dennis, Edward, Elizabeth, Hades, Julia, Pixie, Mark, Olivia, Priya,
            Ronald, Sarah, Shaun, Theodore, Timothy, Wendy, Dominus, Hana, Clive, Carter, Blake, Luna

            • zh: Yichen, Xiaoyin, Xinyi, Jing

            • nl: Erik, Katrien, Lennart, Lore

            • fr: Alain, Hélène, Mathieu, Étienne

            • de: Johanna, Josef

            • it: Gianni, Orietta

            • ja: Asuka, Satoshi

            • ko: Hyunwoo, Minji, Seojun, Yoona

            • pl: Szymon, Wojciech

            • pt: Heitor, Maitê

            • es: Diego, Lupita, Miguel, Rafael

            • ru: Svetlana, Elena, Dmitry, Nikolai

            • hi: Riya, Manoj

            • he: Yael, Oren

            • ar: Nour, Omar
        model:
          $ref: '#/components/schemas/FallbackInworldVoiceModel'
          description: This is the model that will be used.
        languageCode:
          $ref: '#/components/schemas/FallbackInworldVoiceLanguageCode'
          description: Language code for Inworld TTS synthesis
        temperature:
          type: number
          format: double
          default: 1.1
          description: >-
            A floating point number between 0, exclusive, and 2, inclusive. If equal to null or not provided, the
            model's default temperature of 1.1 will be used. The temperature parameter controls variance.

            Higher values will make the output more random and can lead to more expressive results. Lower values will
            make it more deterministic.

            See https://docs.inworld.ai/docs/tts/capabilities/generating-audio#additional-configurations for more
            details.
        speakingRate:
          type: number
          format: double
          default: 1
          description: >-
            A floating point number between 0.5, inclusive, and 1.5, inclusive. If equal to null or not provided, the
            model's default speaking speed of 1.0 will be used.

            Values above 0.8 are recommended for higher quality.

            See https://docs.inworld.ai/docs/tts/capabilities/generating-audio#additional-configurations for more
            details.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
      required:
        - provider
        - voiceId
      title: FallbackInworldVoice
    FallbackPlanVoicesItems:
      oneOf:
        - $ref: '#/components/schemas/FallbackAzureVoice'
        - $ref: '#/components/schemas/FallbackCartesiaVoice'
        - $ref: '#/components/schemas/FallbackHumeVoice'
        - $ref: '#/components/schemas/FallbackCustomVoice'
        - $ref: '#/components/schemas/FallbackDeepgramVoice'
        - $ref: '#/components/schemas/FallbackElevenLabsVoice'
        - $ref: '#/components/schemas/FallbackVapiVoice'
        - $ref: '#/components/schemas/FallbackLMNTVoice'
        - $ref: '#/components/schemas/FallbackOpenAIVoice'
        - $ref: '#/components/schemas/FallbackPlayHTVoice'
        - $ref: '#/components/schemas/FallbackWellSaidVoice'
        - $ref: '#/components/schemas/FallbackRimeAIVoice'
        - $ref: '#/components/schemas/FallbackSmallestAIVoice'
        - $ref: '#/components/schemas/FallbackTavusVoice'
        - $ref: '#/components/schemas/FallbackNeuphonicVoice'
        - $ref: '#/components/schemas/FallbackSesameVoice'
        - $ref: '#/components/schemas/FallbackInworldVoice'
      title: FallbackPlanVoicesItems
    FallbackPlan:
      type: object
      properties:
        voices:
          type: array
          items:
            $ref: '#/components/schemas/FallbackPlanVoicesItems'
          description: This is the list of voices to fallback to in the event that the primary voice provider fails.
      required:
        - voices
      title: FallbackPlan
    AzureVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/AzureVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          $ref: '#/components/schemas/AzureVoiceId'
          description: This is the provider-specific ID that will be used.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
        speed:
          type: number
          format: double
          description: This is the speed multiplier that will be used.
        fallbackPlan:
          $ref: '#/components/schemas/FallbackPlan'
          description: This is the plan for voice provider fallbacks in the event that the primary voice provider fails.
      required:
        - provider
        - voiceId
      title: AzureVoice
    CartesiaVoiceProvider:
      type: string
      enum:
        - cartesia
      description: This is the voice provider that will be used.
      title: CartesiaVoiceProvider
    CartesiaVoiceModel:
      type: string
      enum:
        - sonic-3
        - sonic-3-2026-01-12
        - sonic-3-2025-10-27
        - sonic-2
        - sonic-2-2025-06-11
        - sonic-english
        - sonic-multilingual
        - sonic-preview
        - sonic
      description: This is the model that will be used. This is optional and will default to the correct model for the voiceId.
      title: CartesiaVoiceModel
    CartesiaVoiceLanguage:
      type: string
      enum:
        - ar
        - bg
        - bn
        - cs
        - da
        - de
        - el
        - en
        - es
        - fi
        - fr
        - gu
        - he
        - hi
        - hr
        - hu
        - id
        - it
        - ja
        - ka
        - kn
        - ko
        - ml
        - mr
        - ms
        - nl
        - 'no'
        - pa
        - pl
        - pt
        - ro
        - ru
        - sk
        - sv
        - ta
        - te
        - th
        - tl
        - tr
        - uk
        - vi
        - zh
      description: >-
        This is the language that will be used. This is optional and will default to the correct language for the
        voiceId.
      title: CartesiaVoiceLanguage
    CartesiaVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/CartesiaVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          type: string
          description: The ID of the particular voice you want to use.
        model:
          $ref: '#/components/schemas/CartesiaVoiceModel'
          description: This is the model that will be used. This is optional and will default to the correct model for the voiceId.
        language:
          $ref: '#/components/schemas/CartesiaVoiceLanguage'
          description: >-
            This is the language that will be used. This is optional and will default to the correct language for the
            voiceId.
        experimentalControls:
          $ref: '#/components/schemas/CartesiaExperimentalControls'
          description: Experimental controls for Cartesia voice generation
        generationConfig:
          $ref: '#/components/schemas/CartesiaGenerationConfig'
          description: >-
            Generation config for fine-grained control of sonic-3 voice output (speed, volume, and experimental
            controls). Only available for sonic-3 model.
        pronunciationDictId:
          type: string
          description: >-
            Pronunciation dictionary ID for sonic-3. Allows custom pronunciations for specific words. Only available for
            sonic-3 model.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
        fallbackPlan:
          $ref: '#/components/schemas/FallbackPlan'
          description: This is the plan for voice provider fallbacks in the event that the primary voice provider fails.
      required:
        - provider
        - voiceId
      title: CartesiaVoice
    CustomVoiceProvider:
      type: string
      enum:
        - custom-voice
      description: This is the voice provider that will be used. Use `custom-voice` for providers that are not natively supported.
      title: CustomVoiceProvider
    CustomVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/CustomVoiceProvider'
          description: >-
            This is the voice provider that will be used. Use `custom-voice` for providers that are not natively
            supported.
        voiceId:
          type: string
          description: >-
            This is the provider-specific ID that will be used. This is passed in the voice request payload to identify
            the voice to use.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
        server:
          $ref: '#/components/schemas/Server'
          description: >-
            This is where the voice request will be sent.


            Request Example:


            POST https://{server.url}

            Content-Type: application/json


            {
              "message": {
                "type": "voice-request",
                "text": "Hello, world!",
                "sampleRate": 24000,
                ...other metadata about the call...
              }
            }


            Response Expected: 1-channel 16-bit raw PCM audio at the sample rate specified in the request. Here is how
            the response will be piped to the transport:

            ```

            response.on('data', (chunk: Buffer) => {
              outputStream.write(chunk);
            });

            ```
        fallbackPlan:
          $ref: '#/components/schemas/FallbackPlan'
          description: This is the plan for voice provider fallbacks in the event that the primary voice provider fails.
      required:
        - provider
        - server
      title: CustomVoice
    DeepgramVoiceProvider:
      type: string
      enum:
        - deepgram
      description: This is the voice provider that will be used.
      title: DeepgramVoiceProvider
    DeepgramVoiceId:
      type: string
      enum:
        - asteria
        - luna
        - stella
        - athena
        - hera
        - orion
        - arcas
        - perseus
        - angus
        - orpheus
        - helios
        - zeus
        - thalia
        - andromeda
        - helena
        - apollo
        - arcas
        - aries
        - amalthea
        - asteria
        - athena
        - atlas
        - aurora
        - callista
        - cora
        - cordelia
        - delia
        - draco
        - electra
        - harmonia
        - hera
        - hermes
        - hyperion
        - iris
        - janus
        - juno
        - jupiter
        - luna
        - mars
        - minerva
        - neptune
        - odysseus
        - ophelia
        - orion
        - orpheus
        - pandora
        - phoebe
        - pluto
        - saturn
        - selene
        - theia
        - vesta
        - zeus
        - celeste
        - estrella
        - nestor
        - sirio
        - carina
        - alvaro
        - diana
        - aquila
        - selena
        - javier
      description: This is the provider-specific ID that will be used.
      title: DeepgramVoiceId
    DeepgramVoiceModel:
      type: string
      enum:
        - aura
        - aura-2
      description: This is the model that will be used. Defaults to 'aura-2' when not specified.
      title: DeepgramVoiceModel
    DeepgramVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/DeepgramVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          $ref: '#/components/schemas/DeepgramVoiceId'
          description: This is the provider-specific ID that will be used.
        model:
          $ref: '#/components/schemas/DeepgramVoiceModel'
          description: This is the model that will be used. Defaults to 'aura-2' when not specified.
        mipOptOut:
          type: boolean
          default: false
          description: >-
            If set to true, this will add mip_opt_out=true as a query parameter of all API requests. See
            https://developers.deepgram.com/docs/the-deepgram-model-improvement-partnership-program#want-to-opt-out


            This will only be used if you are using your own Deepgram API key.


            @default false
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
        fallbackPlan:
          $ref: '#/components/schemas/FallbackPlan'
          description: This is the plan for voice provider fallbacks in the event that the primary voice provider fails.
      required:
        - provider
        - voiceId
      title: DeepgramVoice
    ElevenLabsVoiceId0:
      type: string
      enum:
        - burt
        - marissa
        - andrea
        - sarah
        - phillip
        - steve
        - joseph
        - myra
        - paula
        - ryan
        - drew
        - paul
        - mrb
        - matilda
        - mark
      title: ElevenLabsVoiceId0
    ElevenLabsVoiceId:
      oneOf:
        - $ref: '#/components/schemas/ElevenLabsVoiceId0'
        - type: string
      description: This is the provider-specific ID that will be used. Ensure the Voice is present in your 11Labs Voice Library.
      title: ElevenLabsVoiceId
    ElevenLabsVoiceModel:
      type: string
      enum:
        - eleven_multilingual_v2
        - eleven_turbo_v2
        - eleven_turbo_v2_5
        - eleven_flash_v2
        - eleven_flash_v2_5
        - eleven_monolingual_v1
        - eleven_v3
      description: This is the model that will be used. Defaults to 'eleven_turbo_v2' if not specified.
      title: ElevenLabsVoiceModel
    ElevenLabsVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          type: string
          enum:
            - 11labs
          description: This is the voice provider that will be used.
        voiceId:
          $ref: '#/components/schemas/ElevenLabsVoiceId'
          description: >-
            This is the provider-specific ID that will be used. Ensure the Voice is present in your 11Labs Voice
            Library.
        stability:
          type: number
          format: double
          description: Defines the stability for voice settings.
        similarityBoost:
          type: number
          format: double
          description: Defines the similarity boost for voice settings.
        style:
          type: number
          format: double
          description: Defines the style for voice settings.
        useSpeakerBoost:
          type: boolean
          description: Defines the use speaker boost for voice settings.
        speed:
          type: number
          format: double
          description: Defines the speed for voice settings.
        optimizeStreamingLatency:
          type: number
          format: double
          description: Defines the optimize streaming latency for voice settings. Defaults to 3.
        enableSsmlParsing:
          type: boolean
          description: >-
            This enables the use of https://elevenlabs.io/docs/speech-synthesis/prompting#pronunciation. Defaults to
            false to save latency.


            @default false
        autoMode:
          type: boolean
          description: Defines the auto mode for voice settings. Defaults to false.
        model:
          $ref: '#/components/schemas/ElevenLabsVoiceModel'
          description: This is the model that will be used. Defaults to 'eleven_turbo_v2' if not specified.
        language:
          type: string
          description: >-
            This is the language (ISO 639-1) that is enforced for the model. Currently only Turbo v2.5 supports language
            enforcement. For other models, an error will be returned if language code is provided.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
        pronunciationDictionaryLocators:
          type: array
          items:
            $ref: '#/components/schemas/ElevenLabsPronunciationDictionaryLocator'
          description: This is the pronunciation dictionary locators to use.
        fallbackPlan:
          $ref: '#/components/schemas/FallbackPlan'
          description: This is the plan for voice provider fallbacks in the event that the primary voice provider fails.
      required:
        - provider
        - voiceId
      title: ElevenLabsVoice
    HumeVoiceProvider:
      type: string
      enum:
        - hume
      description: This is the voice provider that will be used.
      title: HumeVoiceProvider
    HumeVoiceModel:
      type: string
      enum:
        - octave
        - octave2
      description: This is the model that will be used.
      title: HumeVoiceModel
    HumeVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/HumeVoiceProvider'
          description: This is the voice provider that will be used.
        model:
          $ref: '#/components/schemas/HumeVoiceModel'
          description: This is the model that will be used.
        voiceId:
          type: string
          description: The ID of the particular voice you want to use.
        isCustomHumeVoice:
          type: boolean
          description: Indicates whether the chosen voice is a preset Hume AI voice or a custom voice.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
        description:
          type: string
          description: >-
            Natural language instructions describing how the synthesized speech should sound, including but not limited
            to tone, intonation, pacing, and accent (e.g., 'a soft, gentle voice with a strong British accent').


            If a Voice is specified in the request, this description serves as acting instructions.

            If no Voice is specified, a new voice is generated based on this description.
        fallbackPlan:
          $ref: '#/components/schemas/FallbackPlan'
          description: This is the plan for voice provider fallbacks in the event that the primary voice provider fails.
      required:
        - provider
        - voiceId
      title: HumeVoice
    LmntVoiceProvider:
      type: string
      enum:
        - lmnt
      description: This is the voice provider that will be used.
      title: LmntVoiceProvider
    LmntVoiceId0:
      type: string
      enum:
        - amy
        - ansel
        - autumn
        - ava
        - brandon
        - caleb
        - cassian
        - chloe
        - dalton
        - daniel
        - dustin
        - elowen
        - evander
        - huxley
        - james
        - juniper
        - kennedy
        - lauren
        - leah
        - lily
        - lucas
        - magnus
        - miles
        - morgan
        - natalie
        - nathan
        - noah
        - nyssa
        - oliver
        - paige
        - ryan
        - sadie
        - sophie
        - stella
        - terrence
        - tyler
        - vesper
        - violet
        - warrick
        - zain
        - zeke
        - zoe
      title: LmntVoiceId0
    LMNTVoiceId:
      oneOf:
        - $ref: '#/components/schemas/LmntVoiceId0'
        - type: string
      description: This is the provider-specific ID that will be used.
      title: LMNTVoiceId
    LmntVoiceLanguage:
      type: string
      enum:
        - aa
        - ab
        - ae
        - af
        - ak
        - am
        - an
        - ar
        - as
        - av
        - ay
        - az
        - ba
        - be
        - bg
        - bh
        - bi
        - bm
        - bn
        - bo
        - br
        - bs
        - ca
        - ce
        - ch
        - co
        - cr
        - cs
        - cu
        - cv
        - cy
        - da
        - de
        - dv
        - dz
        - ee
        - el
        - en
        - eo
        - es
        - et
        - eu
        - fa
        - ff
        - fi
        - fj
        - fo
        - fr
        - fy
        - ga
        - gd
        - gl
        - gn
        - gu
        - gv
        - ha
        - he
        - hi
        - ho
        - hr
        - ht
        - hu
        - hy
        - hz
        - ia
        - id
        - ie
        - ig
        - ii
        - ik
        - io
        - is
        - it
        - iu
        - ja
        - jv
        - ka
        - kg
        - ki
        - kj
        - kk
        - kl
        - km
        - kn
        - ko
        - kr
        - ks
        - ku
        - kv
        - kw
        - ky
        - la
        - lb
        - lg
        - li
        - ln
        - lo
        - lt
        - lu
        - lv
        - mg
        - mh
        - mi
        - mk
        - ml
        - mn
        - mr
        - ms
        - mt
        - my
        - na
        - nb
        - nd
        - ne
        - ng
        - nl
        - nn
        - 'no'
        - nr
        - nv
        - ny
        - oc
        - oj
        - om
        - or
        - os
        - pa
        - pi
        - pl
        - ps
        - pt
        - qu
        - rm
        - rn
        - ro
        - ru
        - rw
        - sa
        - sc
        - sd
        - se
        - sg
        - si
        - sk
        - sl
        - sm
        - sn
        - so
        - sq
        - sr
        - ss
        - st
        - su
        - sv
        - sw
        - ta
        - te
        - tg
        - th
        - ti
        - tk
        - tl
        - tn
        - to
        - tr
        - ts
        - tt
        - tw
        - ty
        - ug
        - uk
        - ur
        - uz
        - ve
        - vi
        - vo
        - wa
        - wo
        - xh
        - yi
        - yue
        - yo
        - za
        - zh
        - zu
        - auto
      description: Two letter ISO 639-1 language code. Use "auto" for auto-detection.
      title: LmntVoiceLanguage
    LMNTVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/LmntVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          $ref: '#/components/schemas/LMNTVoiceId'
          description: This is the provider-specific ID that will be used.
        speed:
          type: number
          format: double
          description: This is the speed multiplier that will be used.
        language:
          $ref: '#/components/schemas/LmntVoiceLanguage'
          description: Two letter ISO 639-1 language code. Use "auto" for auto-detection.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
        fallbackPlan:
          $ref: '#/components/schemas/FallbackPlan'
          description: This is the plan for voice provider fallbacks in the event that the primary voice provider fails.
      required:
        - provider
        - voiceId
      title: LMNTVoice
    NeuphonicVoiceProvider:
      type: string
      enum:
        - neuphonic
      description: This is the voice provider that will be used.
      title: NeuphonicVoiceProvider
    NeuphonicVoiceModel:
      type: string
      enum:
        - neu_hq
        - neu_fast
      description: This is the model that will be used. Defaults to 'neu_fast' if not specified.
      title: NeuphonicVoiceModel
    NeuphonicVoiceLanguage:
      type: object
      properties: {}
      description: This is the language (ISO 639-1) that is enforced for the model.
      title: NeuphonicVoiceLanguage
    NeuphonicVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/NeuphonicVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          type: string
          description: This is the provider-specific ID that will be used.
        model:
          $ref: '#/components/schemas/NeuphonicVoiceModel'
          description: This is the model that will be used. Defaults to 'neu_fast' if not specified.
        language:
          $ref: '#/components/schemas/NeuphonicVoiceLanguage'
          description: This is the language (ISO 639-1) that is enforced for the model.
        speed:
          type: number
          format: double
          description: This is the speed multiplier that will be used.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
        fallbackPlan:
          $ref: '#/components/schemas/FallbackPlan'
          description: This is the plan for voice provider fallbacks in the event that the primary voice provider fails.
      required:
        - provider
        - voiceId
        - language
      title: NeuphonicVoice
    OpenAiVoiceProvider:
      type: string
      enum:
        - openai
      description: This is the voice provider that will be used.
      title: OpenAiVoiceProvider
    OpenAiVoiceId0:
      type: string
      enum:
        - alloy
        - echo
        - fable
        - onyx
        - nova
        - shimmer
        - marin
        - cedar
      title: OpenAiVoiceId0
    OpenAIVoiceId:
      oneOf:
        - $ref: '#/components/schemas/OpenAiVoiceId0'
        - type: string
      description: |-
        This is the provider-specific ID that will be used.
        Please note that ash, ballad, coral, sage, and verse may only be used with realtime models.
      title: OpenAIVoiceId
    OpenAiVoiceModel:
      type: string
      enum:
        - tts-1
        - tts-1-hd
        - gpt-4o-mini-tts
      description: This is the model that will be used for text-to-speech.
      title: OpenAiVoiceModel
    OpenAIVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/OpenAiVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          $ref: '#/components/schemas/OpenAIVoiceId'
          description: |-
            This is the provider-specific ID that will be used.
            Please note that ash, ballad, coral, sage, and verse may only be used with realtime models.
        model:
          $ref: '#/components/schemas/OpenAiVoiceModel'
          description: This is the model that will be used for text-to-speech.
        instructions:
          type: string
          description: |-
            This is a prompt that allows you to control the voice of your generated audio.
            Does not work with 'tts-1' or 'tts-1-hd' models.
        speed:
          type: number
          format: double
          description: This is the speed multiplier that will be used.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
        fallbackPlan:
          $ref: '#/components/schemas/FallbackPlan'
          description: This is the plan for voice provider fallbacks in the event that the primary voice provider fails.
      required:
        - provider
        - voiceId
      title: OpenAIVoice
    PlayHtVoiceProvider:
      type: string
      enum:
        - playht
      description: This is the voice provider that will be used.
      title: PlayHtVoiceProvider
    PlayHtVoiceId0:
      type: string
      enum:
        - jennifer
        - melissa
        - will
        - chris
        - matt
        - jack
        - ruby
        - davis
        - donna
        - michael
      title: PlayHtVoiceId0
    PlayHTVoiceId:
      oneOf:
        - $ref: '#/components/schemas/PlayHtVoiceId0'
        - type: string
      description: This is the provider-specific ID that will be used.
      title: PlayHTVoiceId
    PlayHtVoiceEmotion:
      type: string
      enum:
        - female_happy
        - female_sad
        - female_angry
        - female_fearful
        - female_disgust
        - female_surprised
        - male_happy
        - male_sad
        - male_angry
        - male_fearful
        - male_disgust
        - male_surprised
      description: An emotion to be applied to the speech.
      title: PlayHtVoiceEmotion
    PlayHtVoiceModel:
      type: string
      enum:
        - PlayHT2.0
        - PlayHT2.0-turbo
        - Play3.0-mini
        - PlayDialog
      description: Playht voice model/engine to use.
      title: PlayHtVoiceModel
    PlayHtVoiceLanguage:
      type: string
      enum:
        - afrikaans
        - albanian
        - amharic
        - arabic
        - bengali
        - bulgarian
        - catalan
        - croatian
        - czech
        - danish
        - dutch
        - english
        - french
        - galician
        - german
        - greek
        - hebrew
        - hindi
        - hungarian
        - indonesian
        - italian
        - japanese
        - korean
        - malay
        - mandarin
        - polish
        - portuguese
        - russian
        - serbian
        - spanish
        - swedish
        - tagalog
        - thai
        - turkish
        - ukrainian
        - urdu
        - xhosa
      description: The language to use for the speech.
      title: PlayHtVoiceLanguage
    PlayHTVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/PlayHtVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          $ref: '#/components/schemas/PlayHTVoiceId'
          description: This is the provider-specific ID that will be used.
        speed:
          type: number
          format: double
          description: This is the speed multiplier that will be used.
        temperature:
          type: number
          format: double
          description: >-
            A floating point number between 0, exclusive, and 2, inclusive. If equal to null or not provided, the
            model's default temperature will be used. The temperature parameter controls variance. Lower temperatures
            result in more predictable results, higher temperatures allow each run to vary more, so the voice may sound
            less like the baseline voice.
        emotion:
          $ref: '#/components/schemas/PlayHtVoiceEmotion'
          description: An emotion to be applied to the speech.
        voiceGuidance:
          type: number
          format: double
          description: >-
            A number between 1 and 6. Use lower numbers to reduce how unique your chosen voice will be compared to other
            voices.
        styleGuidance:
          type: number
          format: double
          description: >-
            A number between 1 and 30. Use lower numbers to to reduce how strong your chosen emotion will be. Higher
            numbers will create a very emotional performance.
        textGuidance:
          type: number
          format: double
          description: >-
            A number between 1 and 2. This number influences how closely the generated speech adheres to the input text.
            Use lower values to create more fluid speech, but with a higher chance of deviating from the input text.
            Higher numbers will make the generated speech more accurate to the input text, ensuring that the words
            spoken align closely with the provided text.
        model:
          $ref: '#/components/schemas/PlayHtVoiceModel'
          description: Playht voice model/engine to use.
        language:
          $ref: '#/components/schemas/PlayHtVoiceLanguage'
          description: The language to use for the speech.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
        fallbackPlan:
          $ref: '#/components/schemas/FallbackPlan'
          description: This is the plan for voice provider fallbacks in the event that the primary voice provider fails.
      required:
        - provider
        - voiceId
      title: PlayHTVoice
    WellSaidVoiceProvider:
      type: string
      enum:
        - wellsaid
      description: This is the voice provider that will be used.
      title: WellSaidVoiceProvider
    WellSaidVoiceModel:
      type: string
      enum:
        - caruso
        - legacy
      description: This is the model that will be used.
      title: WellSaidVoiceModel
    WellSaidVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/WellSaidVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          type: string
          description: The WellSaid speaker ID to synthesize.
        model:
          $ref: '#/components/schemas/WellSaidVoiceModel'
          description: This is the model that will be used.
        enableSsml:
          type: boolean
          description: Enables limited SSML translation for input text.
        libraryIds:
          type: array
          items:
            type: string
          description: Array of library IDs to use for voice synthesis.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
        fallbackPlan:
          $ref: '#/components/schemas/FallbackPlan'
          description: This is the plan for voice provider fallbacks in the event that the primary voice provider fails.
      required:
        - provider
        - voiceId
      title: WellSaidVoice
    RimeAiVoiceProvider:
      type: string
      enum:
        - rime-ai
      description: This is the voice provider that will be used.
      title: RimeAiVoiceProvider
    RimeAiVoiceId0:
      type: string
      enum:
        - cove
        - moon
        - wildflower
        - eva
        - amber
        - maya
        - lagoon
        - breeze
        - helen
        - joy
        - marsh
        - creek
        - cedar
        - alpine
        - summit
        - nicholas
        - tyler
        - colin
        - hank
        - thunder
        - astra
        - eucalyptus
        - moraine
        - peak
        - tundra
        - mesa_extra
        - talon
        - marlu
        - glacier
        - falcon
        - luna
        - celeste
        - estelle
        - andromeda
        - esther
        - lyra
        - lintel
        - oculus
        - vespera
        - transom
        - bond
        - arcade
        - atrium
        - cupola
        - fern
        - sirius
        - orion
        - masonry
        - albion
        - parapet
      description: >-
        Popular Rime AI voices across mist, mistv2, and arcana models. Any valid Rime AI voice ID is accepted, not just
        these suggestions.
      title: RimeAiVoiceId0
    RimeAIVoiceId:
      oneOf:
        - $ref: '#/components/schemas/RimeAiVoiceId0'
        - type: string
      description: This is the provider-specific ID that will be used.
      title: RimeAIVoiceId
    RimeAiVoiceModel:
      type: string
      enum:
        - arcana
        - mistv2
        - mist
      description: This is the model that will be used. Defaults to 'arcana' when not specified.
      title: RimeAiVoiceModel
    RimeAiVoiceLanguage:
      type: string
      enum:
        - en
        - es
        - de
        - fr
        - ar
        - hi
        - ja
        - he
        - pt
        - ta
        - si
      description: 'Language for speech synthesis. Uses ISO 639 codes. Supported: en, es, de, fr, ar, hi, ja, he, pt, ta, si.'
      title: RimeAiVoiceLanguage
    RimeAIVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/RimeAiVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          $ref: '#/components/schemas/RimeAIVoiceId'
          description: This is the provider-specific ID that will be used.
        model:
          $ref: '#/components/schemas/RimeAiVoiceModel'
          description: This is the model that will be used. Defaults to 'arcana' when not specified.
        speed:
          type: number
          format: double
          description: This is the speed multiplier that will be used.
        pauseBetweenBrackets:
          type: boolean
          description: >-
            This is a flag that controls whether to add slight pauses using angle brackets. Example: "Hi. <200> I'd love
            to have a conversation with you." adds a 200ms pause between the first and second sentences.
        phonemizeBetweenBrackets:
          type: boolean
          description: >-
            This is a flag that controls whether text inside brackets should be phonemized (converted to phonetic
            pronunciation) - Example: "{h'El.o} World" will pronounce "Hello" as expected.
        reduceLatency:
          type: boolean
          description: >-
            This is a flag that controls whether to optimize for reduced latency in streaming.
            https://docs.rime.ai/api-reference/endpoint/websockets#param-reduce-latency
        inlineSpeedAlpha:
          type: string
          description: >-
            This is a string that allows inline speed control using alpha notation.
            https://docs.rime.ai/api-reference/endpoint/websockets#param-inline-speed-alpha
        language:
          $ref: '#/components/schemas/RimeAiVoiceLanguage'
          description: 'Language for speech synthesis. Uses ISO 639 codes. Supported: en, es, de, fr, ar, hi, ja, he, pt, ta, si.'
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
        fallbackPlan:
          $ref: '#/components/schemas/FallbackPlan'
          description: This is the plan for voice provider fallbacks in the event that the primary voice provider fails.
      required:
        - provider
        - voiceId
      title: RimeAIVoice
    SmallestAiVoiceProvider:
      type: string
      enum:
        - smallest-ai
      description: This is the voice provider that will be used.
      title: SmallestAiVoiceProvider
    SmallestAiVoiceId0:
      type: string
      enum:
        - emily
        - jasmine
        - arman
        - james
        - mithali
        - aravind
        - raj
        - diya
        - raman
        - ananya
        - isha
        - william
        - aarav
        - monika
        - niharika
        - deepika
        - raghav
        - kajal
        - radhika
        - mansi
        - nisha
        - saurabh
        - pooja
        - saina
        - sanya
      title: SmallestAiVoiceId0
    SmallestAIVoiceId:
      oneOf:
        - $ref: '#/components/schemas/SmallestAiVoiceId0'
        - type: string
      description: This is the provider-specific ID that will be used.
      title: SmallestAIVoiceId
    SmallestAiVoiceModel:
      type: string
      enum:
        - lightning
      description: Smallest AI voice model to use. Defaults to 'lightning' when not specified.
      title: SmallestAiVoiceModel
    SmallestAIVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/SmallestAiVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          $ref: '#/components/schemas/SmallestAIVoiceId'
          description: This is the provider-specific ID that will be used.
        model:
          $ref: '#/components/schemas/SmallestAiVoiceModel'
          description: Smallest AI voice model to use. Defaults to 'lightning' when not specified.
        speed:
          type: number
          format: double
          description: This is the speed multiplier that will be used.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
        fallbackPlan:
          $ref: '#/components/schemas/FallbackPlan'
          description: This is the plan for voice provider fallbacks in the event that the primary voice provider fails.
      required:
        - provider
        - voiceId
      title: SmallestAIVoice
    TavusVoiceProvider:
      type: string
      enum:
        - tavus
      description: This is the voice provider that will be used.
      title: TavusVoiceProvider
    TavusVoiceVoiceId0:
      type: string
      enum:
        - r52da2535a
      title: TavusVoiceVoiceId0
    TavusVoiceVoiceId:
      oneOf:
        - $ref: '#/components/schemas/TavusVoiceVoiceId0'
        - type: string
      description: This is the provider-specific ID that will be used.
      title: TavusVoiceVoiceId
    TavusVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/TavusVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          $ref: '#/components/schemas/TavusVoiceVoiceId'
          description: This is the provider-specific ID that will be used.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
        personaId:
          type: string
          description: This is the unique identifier for the persona that the replica will use in the conversation.
        callbackUrl:
          type: string
          description: This is the url that will receive webhooks with updates regarding the conversation state.
        conversationName:
          type: string
          description: This is the name for the conversation.
        conversationalContext:
          type: string
          description: This is the context that will be appended to any context provided in the persona, if one is provided.
        customGreeting:
          type: string
          description: This is the custom greeting that the replica will give once a participant joines the conversation.
        properties:
          $ref: '#/components/schemas/TavusConversationProperties'
          description: These are optional properties used to customize the conversation.
        fallbackPlan:
          $ref: '#/components/schemas/FallbackPlan'
          description: This is the plan for voice provider fallbacks in the event that the primary voice provider fails.
      required:
        - provider
        - voiceId
      title: TavusVoice
    VapiVoiceProvider:
      type: string
      enum:
        - vapi
      description: This is the voice provider that will be used.
      title: VapiVoiceProvider
    VapiVoiceVoiceId:
      type: string
      enum:
        - Clara
        - Godfrey
        - Layla
        - Sid
        - Gustavo
        - Elliot
        - Kylie
        - Rohan
        - Lily
        - Savannah
        - Hana
        - Neha
        - Cole
        - Harry
        - Paige
        - Spencer
        - Nico
        - Kai
        - Emma
        - Sagar
        - Neil
        - Naina
        - Leah
        - Tara
        - Jess
        - Leo
        - Dan
        - Mia
        - Zac
        - Zoe
      description: The voices provided by Vapi
      title: VapiVoiceVoiceId
    VapiVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/VapiVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          $ref: '#/components/schemas/VapiVoiceVoiceId'
          description: The voices provided by Vapi
        speed:
          type: number
          format: double
          default: 1
          description: |-
            This is the speed multiplier that will be used.

            @default 1
        pronunciationDictionary:
          type: array
          items:
            $ref: '#/components/schemas/VapiPronunciationDictionaryLocator'
          description: List of pronunciation dictionary locators for custom word pronunciations.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
        fallbackPlan:
          $ref: '#/components/schemas/FallbackPlan'
          description: This is the plan for voice provider fallbacks in the event that the primary voice provider fails.
      required:
        - provider
        - voiceId
      title: VapiVoice
    SesameVoiceProvider:
      type: string
      enum:
        - sesame
      description: This is the voice provider that will be used.
      title: SesameVoiceProvider
    SesameVoiceModel:
      type: string
      enum:
        - csm-1b
      description: This is the model that will be used.
      title: SesameVoiceModel
    SesameVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/SesameVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          type: string
          description: This is the provider-specific ID that will be used.
        model:
          $ref: '#/components/schemas/SesameVoiceModel'
          description: This is the model that will be used.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
        fallbackPlan:
          $ref: '#/components/schemas/FallbackPlan'
          description: This is the plan for voice provider fallbacks in the event that the primary voice provider fails.
      required:
        - provider
        - voiceId
        - model
      title: SesameVoice
    InworldVoiceProvider:
      type: string
      enum:
        - inworld
      description: This is the voice provider that will be used.
      title: InworldVoiceProvider
    InworldVoiceVoiceId:
      type: string
      enum:
        - Alex
        - Ashley
        - Craig
        - Deborah
        - Dennis
        - Edward
        - Elizabeth
        - Hades
        - Julia
        - Pixie
        - Mark
        - Olivia
        - Priya
        - Ronald
        - Sarah
        - Shaun
        - Theodore
        - Timothy
        - Wendy
        - Dominus
        - Hana
        - Clive
        - Carter
        - Blake
        - Luna
        - Yichen
        - Xiaoyin
        - Xinyi
        - Jing
        - Erik
        - Katrien
        - Lennart
        - Lore
        - Alain
        - Hélène
        - Mathieu
        - Étienne
        - Johanna
        - Josef
        - Gianni
        - Orietta
        - Asuka
        - Satoshi
        - Hyunwoo
        - Minji
        - Seojun
        - Yoona
        - Szymon
        - Wojciech
        - Heitor
        - Maitê
        - Diego
        - Lupita
        - Miguel
        - Rafael
        - Svetlana
        - Elena
        - Dmitry
        - Nikolai
        - Riya
        - Manoj
        - Yael
        - Oren
        - Nour
        - Omar
      description: >-
        Available voices by language:

        • en: Alex, Ashley, Craig, Deborah, Dennis, Edward, Elizabeth, Hades, Julia, Pixie, Mark, Olivia, Priya, Ronald,
        Sarah, Shaun, Theodore, Timothy, Wendy, Dominus, Hana, Clive, Carter, Blake, Luna

        • zh: Yichen, Xiaoyin, Xinyi, Jing

        • nl: Erik, Katrien, Lennart, Lore

        • fr: Alain, Hélène, Mathieu, Étienne

        • de: Johanna, Josef

        • it: Gianni, Orietta

        • ja: Asuka, Satoshi

        • ko: Hyunwoo, Minji, Seojun, Yoona

        • pl: Szymon, Wojciech

        • pt: Heitor, Maitê

        • es: Diego, Lupita, Miguel, Rafael

        • ru: Svetlana, Elena, Dmitry, Nikolai

        • hi: Riya, Manoj

        • he: Yael, Oren

        • ar: Nour, Omar
      title: InworldVoiceVoiceId
    InworldVoiceModel:
      type: string
      enum:
        - inworld-tts-1
      default: inworld-tts-1
      description: This is the model that will be used.
      title: InworldVoiceModel
    InworldVoiceLanguageCode:
      type: string
      enum:
        - en
        - zh
        - ko
        - nl
        - fr
        - es
        - ja
        - de
        - it
        - pl
        - pt
        - ru
        - hi
        - he
        - ar
      default: en
      description: Language code for Inworld TTS synthesis
      title: InworldVoiceLanguageCode
    InworldVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/InworldVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          $ref: '#/components/schemas/InworldVoiceVoiceId'
          description: >-
            Available voices by language:

            • en: Alex, Ashley, Craig, Deborah, Dennis, Edward, Elizabeth, Hades, Julia, Pixie, Mark, Olivia, Priya,
            Ronald, Sarah, Shaun, Theodore, Timothy, Wendy, Dominus, Hana, Clive, Carter, Blake, Luna

            • zh: Yichen, Xiaoyin, Xinyi, Jing

            • nl: Erik, Katrien, Lennart, Lore

            • fr: Alain, Hélène, Mathieu, Étienne

            • de: Johanna, Josef

            • it: Gianni, Orietta

            • ja: Asuka, Satoshi

            • ko: Hyunwoo, Minji, Seojun, Yoona

            • pl: Szymon, Wojciech

            • pt: Heitor, Maitê

            • es: Diego, Lupita, Miguel, Rafael

            • ru: Svetlana, Elena, Dmitry, Nikolai

            • hi: Riya, Manoj

            • he: Yael, Oren

            • ar: Nour, Omar
        model:
          $ref: '#/components/schemas/InworldVoiceModel'
          description: This is the model that will be used.
        languageCode:
          $ref: '#/components/schemas/InworldVoiceLanguageCode'
          description: Language code for Inworld TTS synthesis
        temperature:
          type: number
          format: double
          default: 1.1
          description: >-
            A floating point number between 0, exclusive, and 2, inclusive. If equal to null or not provided, the
            model's default temperature of 1.1 will be used. The temperature parameter controls variance.

            Higher values will make the output more random and can lead to more expressive results. Lower values will
            make it more deterministic.

            See https://docs.inworld.ai/docs/tts/capabilities/generating-audio#additional-configurations for more
            details.
        speakingRate:
          type: number
          format: double
          default: 1
          description: >-
            A floating point number between 0.5, inclusive, and 1.5, inclusive. If equal to null or not provided, the
            model's default speaking speed of 1.0 will be used.

            Values above 0.8 are recommended for higher quality.

            See https://docs.inworld.ai/docs/tts/capabilities/generating-audio#additional-configurations for more
            details.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
        fallbackPlan:
          $ref: '#/components/schemas/FallbackPlan'
          description: This is the plan for voice provider fallbacks in the event that the primary voice provider fails.
      required:
        - provider
        - voiceId
      title: InworldVoice
    MinimaxVoiceProvider:
      type: string
      enum:
        - minimax
      description: This is the voice provider that will be used.
      title: MinimaxVoiceProvider
    MinimaxVoiceModel:
      type: string
      enum:
        - speech-02-hd
        - speech-02-turbo
        - speech-2.5-turbo-preview
      default: speech-02-turbo
      description: |-
        This is the model that will be used. Options are 'speech-02-hd' and 'speech-02-turbo'.
        speech-02-hd is optimized for high-fidelity applications like voiceovers and audiobooks.
        speech-02-turbo is designed for real-time applications with low latency.

        @default "speech-02-turbo"
      title: MinimaxVoiceModel
    MinimaxVoiceSubtitleType:
      type: string
      enum:
        - word
        - sentence
      default: sentence
      description: |-
        Controls the granularity of subtitle/timing data returned by Minimax
        during synthesis. Set to 'word' to receive per-word timestamps in
        assistant.speechStarted events for karaoke-style caption rendering.

        @default "sentence"
      title: MinimaxVoiceSubtitleType
    MinimaxVoiceRegion:
      type: string
      enum:
        - worldwide
        - china
      default: worldwide
      description: The region for Minimax API. Defaults to "worldwide".
      title: MinimaxVoiceRegion
    MinimaxVoiceLanguageBoost:
      type: string
      enum:
        - Chinese
        - Chinese,Yue
        - English
        - Arabic
        - Russian
        - Spanish
        - French
        - Portuguese
        - German
        - Turkish
        - Dutch
        - Ukrainian
        - Vietnamese
        - Indonesian
        - Japanese
        - Italian
        - Korean
        - Thai
        - Polish
        - Romanian
        - Greek
        - Czech
        - Finnish
        - Hindi
        - Bulgarian
        - Danish
        - Hebrew
        - Malay
        - Persian
        - Slovak
        - Swedish
        - Croatian
        - Filipino
        - Hungarian
        - Norwegian
        - Slovenian
        - Catalan
        - Nynorsk
        - Tamil
        - Afrikaans
        - auto
      description: 'Language hint for MiniMax T2A. Example: yue (Cantonese), zh (Chinese), en (English).'
      title: MinimaxVoiceLanguageBoost
    MinimaxVoice:
      type: object
      properties:
        cachingEnabled:
          type: boolean
          default: true
          description: This is the flag to toggle voice caching for the assistant.
        provider:
          $ref: '#/components/schemas/MinimaxVoiceProvider'
          description: This is the voice provider that will be used.
        voiceId:
          type: string
          description: >-
            This is the provider-specific ID that will be used. Use a voice from MINIMAX_PREDEFINED_VOICES or a custom
            cloned voice ID.
        model:
          $ref: '#/components/schemas/MinimaxVoiceModel'
          description: |-
            This is the model that will be used. Options are 'speech-02-hd' and 'speech-02-turbo'.
            speech-02-hd is optimized for high-fidelity applications like voiceovers and audiobooks.
            speech-02-turbo is designed for real-time applications with low latency.

            @default "speech-02-turbo"
        emotion:
          type: string
          description: |-
            The emotion to use for the voice. If not provided, will use auto-detect mode.
            Options include: 'happy', 'sad', 'angry', 'fearful', 'surprised', 'disgusted', 'neutral'
        subtitleType:
          $ref: '#/components/schemas/MinimaxVoiceSubtitleType'
          description: |-
            Controls the granularity of subtitle/timing data returned by Minimax
            during synthesis. Set to 'word' to receive per-word timestamps in
            assistant.speechStarted events for karaoke-style caption rendering.

            @default "sentence"
        pitch:
          type: number
          format: double
          default: 0
          description: |-
            Voice pitch adjustment. Range from -12 to 12 semitones.
            @default 0
        speed:
          type: number
          format: double
          default: 1
          description: |-
            Voice speed adjustment. Range from 0.5 to 2.0.
            @default 1.0
        volume:
          type: number
          format: double
          default: 1
          description: |-
            Voice volume adjustment. Range from 0.5 to 2.0.
            @default 1.0
        region:
          $ref: '#/components/schemas/MinimaxVoiceRegion'
          description: The region for Minimax API. Defaults to "worldwide".
        languageBoost:
          $ref: '#/components/schemas/MinimaxVoiceLanguageBoost'
          description: 'Language hint for MiniMax T2A. Example: yue (Cantonese), zh (Chinese), en (English).'
        textNormalizationEnabled:
          type: boolean
          default: true
          description: Enable MiniMax text normalization to improve number reading and formatting.
        chunkPlan:
          $ref: '#/components/schemas/ChunkPlan'
          description: This is the plan for chunking the model output before it is sent to the voice provider.
        fallbackPlan:
          $ref: '#/components/schemas/FallbackPlan'
          description: This is the plan for voice provider fallbacks in the event that the primary voice provider fails.
      required:
        - provider
        - voiceId
      title: MinimaxVoice
    CreateAssistantDtoVoice:
      oneOf:
        - $ref: '#/components/schemas/AzureVoice'
        - $ref: '#/components/schemas/CartesiaVoice'
        - $ref: '#/components/schemas/CustomVoice'
        - $ref: '#/components/schemas/DeepgramVoice'
        - $ref: '#/components/schemas/ElevenLabsVoice'
        - $ref: '#/components/schemas/HumeVoice'
        - $ref: '#/components/schemas/LMNTVoice'
        - $ref: '#/components/schemas/NeuphonicVoice'
        - $ref: '#/components/schemas/OpenAIVoice'
        - $ref: '#/components/schemas/PlayHTVoice'
        - $ref: '#/components/schemas/WellSaidVoice'
        - $ref: '#/components/schemas/RimeAIVoice'
        - $ref: '#/components/schemas/SmallestAIVoice'
        - $ref: '#/components/schemas/TavusVoice'
        - $ref: '#/components/schemas/VapiVoice'
        - $ref: '#/components/schemas/SesameVoice'
        - $ref: '#/components/schemas/InworldVoice'
        - $ref: '#/components/schemas/MinimaxVoice'
      description: These are the options for the assistant's voice.
      title: CreateAssistantDtoVoice
    CreateAssistantDtoFirstMessageMode:
      type: string
      enum:
        - assistant-speaks-first
        - assistant-speaks-first-with-model-generated-message
        - assistant-waits-for-user
      description: >-
        This is the mode for the first message. Default is 'assistant-speaks-first'.


        Use:

        - 'assistant-speaks-first' to have the assistant speak first.

        - 'assistant-waits-for-user' to have the assistant wait for the user to speak first.

        - 'assistant-speaks-first-with-model-generated-message' to have the assistant speak first with a message
        generated by the model based on the conversation state. (`assistant.model.messages` at call start,
        `call.messages` at squad transfer points).


        @default 'assistant-speaks-first'
      title: CreateAssistantDtoFirstMessageMode
    CreateAssistantDtoVoicemailDetection0:
      type: string
      enum:
        - 'off'
      title: CreateAssistantDtoVoicemailDetection0
    GoogleVoicemailDetectionPlanProvider:
      type: string
      enum:
        - google
      description: This is the provider to use for voicemail detection.
      title: GoogleVoicemailDetectionPlanProvider
    VoicemailDetectionBackoffPlan:
      type: object
      properties:
        startAtSeconds:
          type: number
          format: double
          default: 5
          description: This is the number of seconds to wait before starting the first retry attempt.
        frequencySeconds:
          type: number
          format: double
          default: 5
          description: This is the interval in seconds between retry attempts.
        maxRetries:
          type: number
          format: double
          default: 6
          description: This is the maximum number of retry attempts before giving up.
      title: VoicemailDetectionBackoffPlan
    GoogleVoicemailDetectionPlanType:
      type: string
      enum:
        - audio
        - transcript
      description: |-
        This is the detection type to use for voicemail detection.
        - 'audio': Uses native audio models (default)
        - 'transcript': Uses ASR/transcript-based detection
        @default 'audio' (audio detection)
      title: GoogleVoicemailDetectionPlanType
    GoogleVoicemailDetectionPlan:
      type: object
      properties:
        beepMaxAwaitSeconds:
          type: number
          format: double
          default: 30
          description: >-
            This is the maximum duration from the start of the call that we will wait for a voicemail beep, before
            speaking our message


            - If we detect a voicemail beep before this, we will speak the message at that point.


            - Setting too low a value means that the bot will start speaking its voicemail message too early. If it does
            so before the actual beep, it will get cut off. You should definitely tune this to your use case.


            @default 30

            @min 0

            @max 60
        provider:
          $ref: '#/components/schemas/GoogleVoicemailDetectionPlanProvider'
          description: This is the provider to use for voicemail detection.
        backoffPlan:
          $ref: '#/components/schemas/VoicemailDetectionBackoffPlan'
          description: This is the backoff plan for the voicemail detection.
        type:
          $ref: '#/components/schemas/GoogleVoicemailDetectionPlanType'
          description: |-
            This is the detection type to use for voicemail detection.
            - 'audio': Uses native audio models (default)
            - 'transcript': Uses ASR/transcript-based detection
            @default 'audio' (audio detection)
      required:
        - provider
      title: GoogleVoicemailDetectionPlan
    OpenAiVoicemailDetectionPlanProvider:
      type: string
      enum:
        - openai
      description: This is the provider to use for voicemail detection.
      title: OpenAiVoicemailDetectionPlanProvider
    OpenAiVoicemailDetectionPlanType:
      type: string
      enum:
        - audio
        - transcript
      description: |-
        This is the detection type to use for voicemail detection.
        - 'audio': Uses native audio models (default)
        - 'transcript': Uses ASR/transcript-based detection
        @default 'audio' (audio detection)
      title: OpenAiVoicemailDetectionPlanType
    OpenAIVoicemailDetectionPlan:
      type: object
      properties:
        beepMaxAwaitSeconds:
          type: number
          format: double
          default: 30
          description: >-
            This is the maximum duration from the start of the call that we will wait for a voicemail beep, before
            speaking our message


            - If we detect a voicemail beep before this, we will speak the message at that point.


            - Setting too low a value means that the bot will start speaking its voicemail message too early. If it does
            so before the actual beep, it will get cut off. You should definitely tune this to your use case.


            @default 30

            @min 0

            @max 60
        provider:
          $ref: '#/components/schemas/OpenAiVoicemailDetectionPlanProvider'
          description: This is the provider to use for voicemail detection.
        backoffPlan:
          $ref: '#/components/schemas/VoicemailDetectionBackoffPlan'
          description: This is the backoff plan for the voicemail detection.
        type:
          $ref: '#/components/schemas/OpenAiVoicemailDetectionPlanType'
          description: |-
            This is the detection type to use for voicemail detection.
            - 'audio': Uses native audio models (default)
            - 'transcript': Uses ASR/transcript-based detection
            @default 'audio' (audio detection)
      required:
        - provider
      title: OpenAIVoicemailDetectionPlan
    TwilioVoicemailDetectionPlanProvider:
      type: string
      enum:
        - twilio
      description: This is the provider to use for voicemail detection.
      title: TwilioVoicemailDetectionPlanProvider
    TwilioVoicemailDetectionPlanVoicemailDetectionTypes:
      type: string
      enum:
        - machine_start
        - human
        - fax
        - unknown
        - machine_end_beep
        - machine_end_silence
        - machine_end_other
      description: >-
        These are the AMD messages from Twilio that are considered as voicemail. Default is ['machine_end_beep',
        'machine_end_silence'].


        @default {Array} ['machine_end_beep', 'machine_end_silence']
      title: TwilioVoicemailDetectionPlanVoicemailDetectionTypes
    TwilioVoicemailDetectionPlan:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/TwilioVoicemailDetectionPlanProvider'
          description: This is the provider to use for voicemail detection.
        voicemailDetectionTypes:
          $ref: '#/components/schemas/TwilioVoicemailDetectionPlanVoicemailDetectionTypes'
          description: >-
            These are the AMD messages from Twilio that are considered as voicemail. Default is ['machine_end_beep',
            'machine_end_silence'].


            @default {Array} ['machine_end_beep', 'machine_end_silence']
        enabled:
          type: boolean
          description: |-
            This sets whether the assistant should detect voicemail. Defaults to true.

            @default true
        machineDetectionTimeout:
          type: number
          format: double
          description: >-
            The number of seconds that Twilio should attempt to perform answering machine detection before timing out
            and returning AnsweredBy as unknown. Default is 30 seconds.


            Increasing this value will provide the engine more time to make a determination. This can be useful when
            DetectMessageEnd is provided in the MachineDetection parameter and there is an expectation of long answering
            machine greetings that can exceed 30 seconds.


            Decreasing this value will reduce the amount of time the engine has to make a determination. This can be
            particularly useful when the Enable option is provided in the MachineDetection parameter and you want to
            limit the time for initial detection.


            Check the [Twilio
            docs](https://www.twilio.com/docs/voice/answering-machine-detection#optional-api-tuning-parameters) for more
            info.


            @default 30
        machineDetectionSpeechThreshold:
          type: number
          format: double
          description: >-
            The number of milliseconds that is used as the measuring stick for the length of the speech activity.
            Durations lower than this value will be interpreted as a human, longer as a machine. Default is 2400
            milliseconds.


            Increasing this value will reduce the chance of a False Machine (detected machine, actually human) for a
            long human greeting (e.g., a business greeting) but increase the time it takes to detect a machine.


            Decreasing this value will reduce the chances of a False Human (detected human, actually machine) for short
            voicemail greetings. The value of this parameter may need to be reduced by more than 1000ms to detect very
            short voicemail greetings. A reduction of that significance can result in increased False Machine
            detections. Adjusting the MachineDetectionSpeechEndThreshold is likely the better approach for short
            voicemails. Decreasing MachineDetectionSpeechThreshold will also reduce the time it takes to detect a
            machine.


            Check the [Twilio
            docs](https://www.twilio.com/docs/voice/answering-machine-detection#optional-api-tuning-parameters) for more
            info.


            @default 2400
        machineDetectionSpeechEndThreshold:
          type: number
          format: double
          description: >-
            The number of milliseconds of silence after speech activity at which point the speech activity is considered
            complete. Default is 1200 milliseconds.


            Increasing this value will typically be used to better address the short voicemail greeting scenarios. For
            short voicemails, there is typically 1000-2000ms of audio followed by 1200-2400ms of silence and then
            additional audio before the beep. Increasing the MachineDetectionSpeechEndThreshold to ~2500ms will treat
            the 1200-2400ms of silence as a gap in the greeting but not the end of the greeting and will result in a
            machine detection. The downsides of such a change include:

            - Increasing the delay for human detection by the amount you increase this parameter, e.g., a change of
            1200ms to 2500ms increases human detection delay by 1300ms.

            - Cases where a human has two utterances separated by a period of silence (e.g. a "Hello", then 2000ms of
            silence, and another "Hello") may be interpreted as a machine.


            Decreasing this value will result in faster human detection. The consequence is that it can lead to
            increased False Human (detected human, actually machine) detections because a silence gap in a voicemail
            greeting (not necessarily just in short voicemail scenarios) can be incorrectly interpreted as the end of
            speech.


            Check the [Twilio
            docs](https://www.twilio.com/docs/voice/answering-machine-detection#optional-api-tuning-parameters) for more
            info.


            @default 1200
        machineDetectionSilenceTimeout:
          type: number
          format: double
          description: >-
            The number of milliseconds of initial silence after which an unknown AnsweredBy result will be returned.
            Default is 5000 milliseconds.


            Increasing this value will result in waiting for a longer period of initial silence before returning an
            'unknown' AMD result.


            Decreasing this value will result in waiting for a shorter period of initial silence before returning an
            'unknown' AMD result.


            Check the [Twilio
            docs](https://www.twilio.com/docs/voice/answering-machine-detection#optional-api-tuning-parameters) for more
            info.


            @default 5000
      required:
        - provider
      title: TwilioVoicemailDetectionPlan
    VapiVoicemailDetectionPlanProvider:
      type: string
      enum:
        - vapi
      description: This is the provider to use for voicemail detection.
      title: VapiVoicemailDetectionPlanProvider
    VapiVoicemailDetectionPlanType:
      type: string
      enum:
        - audio
        - transcript
      description: |-
        This is the detection type to use for voicemail detection.
        - 'audio': Uses native audio models (default)
        - 'transcript': Uses ASR/transcript-based detection
        @default 'audio' (audio detection)
      title: VapiVoicemailDetectionPlanType
    VapiVoicemailDetectionPlan:
      type: object
      properties:
        beepMaxAwaitSeconds:
          type: number
          format: double
          default: 30
          description: >-
            This is the maximum duration from the start of the call that we will wait for a voicemail beep, before
            speaking our message


            - If we detect a voicemail beep before this, we will speak the message at that point.


            - Setting too low a value means that the bot will start speaking its voicemail message too early. If it does
            so before the actual beep, it will get cut off. You should definitely tune this to your use case.


            @default 30

            @min 0

            @max 60
        provider:
          $ref: '#/components/schemas/VapiVoicemailDetectionPlanProvider'
          description: This is the provider to use for voicemail detection.
        backoffPlan:
          $ref: '#/components/schemas/VoicemailDetectionBackoffPlan'
          description: This is the backoff plan for the voicemail detection.
        type:
          $ref: '#/components/schemas/VapiVoicemailDetectionPlanType'
          description: |-
            This is the detection type to use for voicemail detection.
            - 'audio': Uses native audio models (default)
            - 'transcript': Uses ASR/transcript-based detection
            @default 'audio' (audio detection)
      required:
        - provider
      title: VapiVoicemailDetectionPlan
    CreateAssistantDtoVoicemailDetection:
      oneOf:
        - $ref: '#/components/schemas/CreateAssistantDtoVoicemailDetection0'
        - $ref: '#/components/schemas/GoogleVoicemailDetectionPlan'
        - $ref: '#/components/schemas/OpenAIVoicemailDetectionPlan'
        - $ref: '#/components/schemas/TwilioVoicemailDetectionPlan'
        - $ref: '#/components/schemas/VapiVoicemailDetectionPlan'
      description: >-
        These are the settings to configure or disable voicemail detection. Alternatively, voicemail detection can be
        configured using the model.tools=[VoicemailTool].

        By default, voicemail detection is disabled.
      title: CreateAssistantDtoVoicemailDetection
    CreateAssistantDtoClientMessages:
      type: string
      enum:
        - conversation-update
        - assistant.speechStarted
        - function-call
        - function-call-result
        - hang
        - language-changed
        - metadata
        - model-output
        - speech-update
        - status-update
        - transcript
        - tool-calls
        - tool-calls-result
        - tool.completed
        - transfer-update
        - user-interrupted
        - voice-input
        - workflow.node.started
        - assistant.started
      description: >-
        These are the messages that will be sent to your Client SDKs. Default is
        conversation-update,function-call,hang,model-output,speech-update,status-update,transfer-update,transcript,tool-calls,user-interrupted,voice-input,workflow.node.started,assistant.started.
        You can check the shape of the messages in ClientMessage schema.
      title: CreateAssistantDtoClientMessages
    CreateAssistantDtoServerMessages:
      type: string
      enum:
        - assistant.started
        - assistant.speechStarted
        - conversation-update
        - end-of-call-report
        - function-call
        - hang
        - language-changed
        - language-change-detected
        - model-output
        - phone-call-control
        - speech-update
        - status-update
        - transcript
        - transcript[transcriptType="final"]
        - tool-calls
        - transfer-destination-request
        - handoff-destination-request
        - transfer-update
        - user-interrupted
        - voice-input
        - chat.created
        - chat.deleted
        - session.created
        - session.updated
        - session.deleted
        - call.deleted
        - call.delete.failed
      description: >-
        These are the messages that will be sent to your Server URL. Default is
        conversation-update,end-of-call-report,function-call,hang,speech-update,status-update,tool-calls,transfer-destination-request,handoff-destination-request,user-interrupted,assistant.started.
        You can check the shape of the messages in ServerMessage schema.
      title: CreateAssistantDtoServerMessages
    CreateAssistantDtoBackgroundSound0:
      type: string
      enum:
        - 'off'
        - office
      title: CreateAssistantDtoBackgroundSound0
    CreateAssistantDtoBackgroundSound:
      oneOf:
        - $ref: '#/components/schemas/CreateAssistantDtoBackgroundSound0'
        - type: string
          format: uri
      description: >-
        This is the background sound in the call. Default for phone calls is 'office' and default for web calls is
        'off'.

        You can also provide a custom sound by providing a URL to an audio file.
      title: CreateAssistantDtoBackgroundSound
    TransportConfigurationTwilioProvider:
      type: string
      enum:
        - twilio
      title: TransportConfigurationTwilioProvider
    TransportConfigurationTwilioRecordingChannels:
      type: string
      enum:
        - mono
        - dual
      description: >-
        The number of channels in the final recording.

        Can be: `mono` or `dual`.

        The default is `mono`.

        `mono` records both legs of the call in a single channel of the recording file.

        `dual` records each leg to a separate channel of the recording file.

        The first channel of a dual-channel recording contains the parent call and the second channel contains the child
        call.


        @default 'mono'
      title: TransportConfigurationTwilioRecordingChannels
    TransportConfigurationTwilio:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/TransportConfigurationTwilioProvider'
        timeout:
          type: number
          format: double
          description: >-
            The integer number of seconds that we should allow the phone to ring before assuming there is no answer.

            The default is `60` seconds and the maximum is `600` seconds.

            For some call flows, we will add a 5-second buffer to the timeout value you provide.

            For this reason, a timeout value of 10 seconds could result in an actual timeout closer to 15 seconds.

            You can set this to a short time, such as `15` seconds, to hang up before reaching an answering machine or
            voicemail.


            @default 60
        record:
          type: boolean
          description: |-
            Whether to record the call.
            Can be `true` to record the phone call, or `false` to not.
            The default is `false`.

            @default false
        recordingChannels:
          $ref: '#/components/schemas/TransportConfigurationTwilioRecordingChannels'
          description: >-
            The number of channels in the final recording.

            Can be: `mono` or `dual`.

            The default is `mono`.

            `mono` records both legs of the call in a single channel of the recording file.

            `dual` records each leg to a separate channel of the recording file.

            The first channel of a dual-channel recording contains the parent call and the second channel contains the
            child call.


            @default 'mono'
      required:
        - provider
      title: TransportConfigurationTwilio
    CreateAssistantDtoTransportConfigurationsItems:
      oneOf:
        - $ref: '#/components/schemas/TransportConfigurationTwilio'
      title: CreateAssistantDtoTransportConfigurationsItems
    LangfuseObservabilityPlanProvider:
      type: string
      enum:
        - langfuse
      title: LangfuseObservabilityPlanProvider
    LangfuseObservabilityPlanMetadata:
      type: object
      properties: {}
      description: >-
        This is a JSON object that will be added to the Langfuse trace. Traces can be enriched with metadata to better
        understand your users, application, and experiments. https://langfuse.com/docs/tracing-features/metadata

        By default it includes the call metadata, assistant metadata, and assistant overrides.
      title: LangfuseObservabilityPlanMetadata
    LangfuseObservabilityPlan:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/LangfuseObservabilityPlanProvider'
        promptName:
          type: string
          description: >-
            The name of a Langfuse prompt to link generations to. This enables tracking which prompt version was used
            for each generation. https://langfuse.com/docs/prompt-management/features/link-to-traces
        promptVersion:
          type: number
          format: double
          description: >-
            The version number of the Langfuse prompt to link generations to. Used together with promptName to identify
            the exact prompt version. https://langfuse.com/docs/prompt-management/features/link-to-traces
        traceName:
          type: string
          description: |-
            Custom name for the Langfuse trace. Supports Liquid templates.

            Available variables:
            - {{ call.id }} - Call UUID
            - {{ call.type }} - 'inboundPhoneCall', 'outboundPhoneCall', 'webCall'
            - {{ assistant.name }} - Assistant name
            - {{ assistant.id }} - Assistant ID

            Example: "{{ assistant.name }} - {{ call.type }}"

            Defaults to call ID if not provided.
        tags:
          type: array
          items:
            type: string
          description: >-
            This is an array of tags to be added to the Langfuse trace. Tags allow you to categorize and filter traces.
            https://langfuse.com/docs/tracing-features/tags
        metadata:
          $ref: '#/components/schemas/LangfuseObservabilityPlanMetadata'
          description: >-
            This is a JSON object that will be added to the Langfuse trace. Traces can be enriched with metadata to
            better understand your users, application, and experiments.
            https://langfuse.com/docs/tracing-features/metadata

            By default it includes the call metadata, assistant metadata, and assistant overrides.
      required:
        - provider
        - tags
      title: LangfuseObservabilityPlan
    UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockRegion:
      type: string
      enum:
        - us-east-1
        - us-west-2
        - eu-west-1
        - eu-west-3
        - ap-northeast-1
        - ap-southeast-2
      description: AWS region where Bedrock is configured.
      title: UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockRegion
    AwsiamCredentialsAuthenticationPlanType:
      type: string
      enum:
        - aws-iam
      title: AwsiamCredentialsAuthenticationPlanType
    AWSIAMCredentialsAuthenticationPlan:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/AwsiamCredentialsAuthenticationPlanType'
        awsAccessKeyId:
          type: string
          description: AWS Access Key ID. This is not returned in the API.
        awsSecretAccessKey:
          type: string
          description: AWS Secret Access Key. This is not returned in the API.
      required:
        - type
        - awsAccessKeyId
        - awsSecretAccessKey
      title: AWSIAMCredentialsAuthenticationPlan
    AwsStsAuthenticationPlanType:
      type: string
      enum:
        - aws-sts
      description: This is the type of authentication plan
      title: AwsStsAuthenticationPlanType
    AWSStsAuthenticationPlan:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/AwsStsAuthenticationPlanType'
          description: This is the type of authentication plan
        roleArn:
          type: string
          description: This is the role ARN for the AWS credential
        externalId:
          type: string
          description: Optional external ID for additional security in the role trust policy.
      required:
        - type
        - roleArn
      title: AWSStsAuthenticationPlan
    UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockAuthenticationPlan:
      oneOf:
        - $ref: '#/components/schemas/AWSIAMCredentialsAuthenticationPlan'
        - $ref: '#/components/schemas/AWSStsAuthenticationPlan'
      description: Authentication method - either direct IAM credentials or cross-account role assumption.
      title: UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockAuthenticationPlan
    UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiRegion:
      type: string
      enum:
        - australiaeast
        - canadaeast
        - canadacentral
        - centralus
        - eastus2
        - eastus
        - france
        - germanywestcentral
        - india
        - japaneast
        - japanwest
        - northcentralus
        - norway
        - polandcentral
        - southcentralus
        - spaincentral
        - swedencentral
        - switzerland
        - uaenorth
        - uk
        - westeurope
        - westus
        - westus3
      title: UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiRegion
    UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiModels:
      type: string
      enum:
        - gpt-5.4
        - gpt-5.4-mini
        - gpt-5.4-nano
        - gpt-5.2
        - gpt-5.2-chat
        - gpt-5.1
        - gpt-5.1-chat
        - gpt-5
        - gpt-5-mini
        - gpt-5-nano
        - gpt-4.1-2025-04-14
        - gpt-4.1-mini-2025-04-14
        - gpt-4.1-nano-2025-04-14
        - gpt-4o-2024-11-20
        - gpt-4o-2024-08-06
        - gpt-4o-2024-05-13
        - gpt-4o-mini-2024-07-18
        - gpt-4-turbo-2024-04-09
        - gpt-4-0125-preview
        - gpt-4-1106-preview
        - gpt-4-0613
        - gpt-35-turbo-0125
        - gpt-35-turbo-1106
      title: UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiModels
    UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureService:
      type: string
      enum:
        - speech
        - blob_storage
      default: speech
      description: This is the service being used in Azure.
      title: UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureService
    UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureRegion:
      type: string
      enum:
        - australiaeast
        - canadaeast
        - canadacentral
        - centralus
        - eastus2
        - eastus
        - france
        - germanywestcentral
        - india
        - japaneast
        - japanwest
        - northcentralus
        - norway
        - polandcentral
        - southcentralus
        - spaincentral
        - swedencentral
        - switzerland
        - uaenorth
        - uk
        - westeurope
        - westus
        - westus3
      description: This is the region of the Azure resource.
      title: UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureRegion
    AzureBlobStorageBucketPlan:
      type: object
      properties:
        connectionString:
          type: string
          description: This is the blob storage connection string for the Azure resource.
        containerName:
          type: string
          description: This is the container name for the Azure blob storage.
        path:
          type: string
          description: |-
            This is the path where call artifacts will be stored.

            Usage:
            - To store call artifacts in a specific folder, set this to the full path. Eg. "/folder-name1/folder-name2".
            - To store call artifacts in the root of the bucket, leave this blank.

            @default "/"
      required:
        - connectionString
        - containerName
      title: AzureBlobStorageBucketPlan
    SipTrunkGatewayOutboundProtocol:
      type: string
      enum:
        - tls/srtp
        - tcp
        - tls
        - udp
      description: |-
        This is the protocol to use for SIP signaling outbound calls. Default is udp.

        @default udp
      title: SipTrunkGatewayOutboundProtocol
    SipTrunkGateway:
      type: object
      properties:
        ip:
          type: string
          description: >-
            This is the address of the gateway. It can be an IPv4 address like 1.1.1.1 or a fully qualified domain name
            like my-sip-trunk.pstn.twilio.com.
        port:
          type: number
          format: double
          description: |-
            This is the port number of the gateway. Default is 5060.

            @default 5060
        netmask:
          type: number
          format: double
          description: |-
            This is the netmask of the gateway. Defaults to 32.

            @default 32
        inboundEnabled:
          type: boolean
          description: |-
            This is whether inbound calls are allowed from this gateway. Default is true.

            @default true
        outboundEnabled:
          type: boolean
          description: >-
            This is whether outbound calls should be sent to this gateway. Default is true.


            Note, if netmask is less than 32, it doesn't affect the outbound IPs that are tried. 1 attempt is made to
            `ip:port`.


            @default true
        outboundProtocol:
          $ref: '#/components/schemas/SipTrunkGatewayOutboundProtocol'
          description: |-
            This is the protocol to use for SIP signaling outbound calls. Default is udp.

            @default udp
        optionsPingEnabled:
          type: boolean
          description: >-
            This is whether to send options ping to the gateway. This can be used to check if the gateway is reachable.
            Default is false.


            This is useful for high availability setups where you want to check if the gateway is reachable before
            routing calls to it. Note, if no gateway for a trunk is reachable, outbound calls will be rejected.


            @default false
      required:
        - ip
      title: SipTrunkGateway
    SipTrunkOutboundSipRegisterPlan:
      type: object
      properties:
        domain:
          type: string
        username:
          type: string
        realm:
          type: string
      title: SipTrunkOutboundSipRegisterPlan
    SipTrunkOutboundAuthenticationPlan:
      type: object
      properties:
        authPassword:
          type: string
          description: This is not returned in the API.
        authUsername:
          type: string
        sipRegisterPlan:
          $ref: '#/components/schemas/SipTrunkOutboundSipRegisterPlan'
          description: >-
            This can be used to configure if SIP register is required by the SIP trunk. If not provided, no SIP
            registration will be attempted.
      title: SipTrunkOutboundAuthenticationPlan
    SbcConfiguration:
      type: object
      properties: {}
      title: SbcConfiguration
    CreateCerebrasCredentialDtoProvider:
      type: string
      enum:
        - cerebras
      title: CreateCerebrasCredentialDtoProvider
    CloudflareR2BucketPlan:
      type: object
      properties:
        accessKeyId:
          type: string
          description: Cloudflare R2 Access key ID.
        secretAccessKey:
          type: string
          description: Cloudflare R2 access key secret. This is not returned in the API.
        url:
          type: string
          description: Cloudflare R2 base url.
        name:
          type: string
          description: This is the name of the bucket.
        path:
          type: string
          description: |-
            This is the path where call artifacts will be stored.

            Usage:
            - To store call artifacts in a specific folder, set this to the full path. Eg. "/folder-name1/folder-name2".
            - To store call artifacts in the root of the bucket, leave this blank.

            @default "/"
      required:
        - name
      title: CloudflareR2BucketPlan
    OAuth2AuthenticationPlan:
      type: object
      properties:
        url:
          type: string
          description: This is the OAuth2 URL.
        clientId:
          type: string
          description: This is the OAuth2 client ID.
        clientSecret:
          type: string
          description: This is the OAuth2 client secret.
        scope:
          type: string
          description: This is the scope of the OAuth2 token.
      required:
        - url
        - clientId
        - clientSecret
      title: OAuth2AuthenticationPlan
    GcpKey:
      type: object
      properties:
        type:
          type: string
          description: This is the type of the key. Most likely, this is "service_account".
        projectId:
          type: string
          description: This is the ID of the Google Cloud project associated with this key.
        privateKeyId:
          type: string
          description: This is the unique identifier for the private key.
        privateKey:
          type: string
          description: |-
            This is the private key in PEM format.

            Note: This is not returned in the API.
        clientEmail:
          type: string
          description: This is the email address associated with the service account.
        clientId:
          type: string
          description: This is the unique identifier for the client.
        authUri:
          type: string
          description: This is the URI for the auth provider's authorization endpoint.
        tokenUri:
          type: string
          description: This is the URI for the auth provider's token endpoint.
        authProviderX509CertUrl:
          type: string
          description: This is the URL of the public x509 certificate for the auth provider.
        clientX509CertUrl:
          type: string
          description: This is the URL of the public x509 certificate for the client.
        universeDomain:
          type: string
          description: This is the domain associated with the universe this service account belongs to.
      required:
        - type
        - projectId
        - privateKeyId
        - privateKey
        - clientEmail
        - clientId
        - authUri
        - tokenUri
        - authProviderX509CertUrl
        - clientX509CertUrl
        - universeDomain
      title: GcpKey
    BucketPlan:
      type: object
      properties:
        name:
          type: string
          description: This is the name of the bucket.
        region:
          type: string
          description: >-
            This is the region of the bucket.


            Usage:

            - If `credential.type` is `aws`, then this is required.

            - If `credential.type` is `gcp`, then this is optional since GCP allows buckets to be accessed without a
            region but region is required for data residency requirements. Read here:
            https://cloud.google.com/storage/docs/request-endpoints


            This overrides the `credential.region` field if it is provided.
        path:
          type: string
          description: |-
            This is the path where call artifacts will be stored.

            Usage:
            - To store call artifacts in a specific folder, set this to the full path. Eg. "/folder-name1/folder-name2".
            - To store call artifacts in the root of the bucket, leave this blank.

            @default "/"
        hmacAccessKey:
          type: string
          description: >-
            This is the HMAC access key offered by GCP for interoperability with S3 clients. Here is the guide on how to
            create: https://cloud.google.com/storage/docs/authentication/managing-hmackeys#console


            Usage:

            - If `credential.type` is `gcp`, then this is required.

            - If `credential.type` is `aws`, then this is not required since credential.awsAccessKeyId is used instead.
        hmacSecret:
          type: string
          description: >-
            This is the secret for the HMAC access key. Here is the guide on how to create:
            https://cloud.google.com/storage/docs/authentication/managing-hmackeys#console


            Usage:

            - If `credential.type` is `gcp`, then this is required.

            - If `credential.type` is `aws`, then this is not required since credential.awsSecretAccessKey is used
            instead.


            Note: This is not returned in the API.
      required:
        - name
      title: BucketPlan
    CreateGoogleCredentialDtoProvider:
      type: string
      enum:
        - google
      description: 'This is the key for Gemini in Google AI Studio. Get it from here: https://aistudio.google.com/app/apikey'
      title: CreateGoogleCredentialDtoProvider
    CreateInflectionAiCredentialDtoProvider:
      type: string
      enum:
        - inflection-ai
      description: >-
        This is the api key for Pi in InflectionAI's console. Get it from here: https://developers.inflection.ai/keys,
        billing will need to be setup
      title: CreateInflectionAiCredentialDtoProvider
    SupabaseBucketPlanRegion:
      type: string
      enum:
        - us-west-1
        - us-east-1
        - us-east-2
        - ca-central-1
        - eu-west-1
        - eu-west-2
        - eu-west-3
        - eu-central-1
        - eu-central-2
        - eu-north-1
        - ap-south-1
        - ap-southeast-1
        - ap-northeast-1
        - ap-northeast-2
        - ap-southeast-2
        - sa-east-1
      description: |-
        This is the S3 Region. It should look like us-east-1
        It should be one of the supabase regions defined in the SUPABASE_REGION enum
        Check https://supabase.com/docs/guides/platform/regions for up to date regions
      title: SupabaseBucketPlanRegion
    SupabaseBucketPlan:
      type: object
      properties:
        region:
          $ref: '#/components/schemas/SupabaseBucketPlanRegion'
          description: |-
            This is the S3 Region. It should look like us-east-1
            It should be one of the supabase regions defined in the SUPABASE_REGION enum
            Check https://supabase.com/docs/guides/platform/regions for up to date regions
        url:
          type: string
          description: |-
            This is the S3 compatible URL for Supabase S3
            This should look like https://<project-ID>.supabase.co/storage/v1/s3
        accessKeyId:
          type: string
          description: |-
            This is the Supabase S3 Access Key ID.
            The user creates this in the Supabase project Storage settings
        secretAccessKey:
          type: string
          description: |-
            This is the Supabase S3 Secret Access Key.
            The user creates this in the Supabase project Storage settings along with the access key id
        name:
          type: string
          description: |-
            This is the Supabase S3 Bucket Name.
            The user must create this in Supabase under Storage > Buckets
            A bucket that does not exist will not be checked now, but file uploads will fail
        path:
          type: string
          description: |-
            This is the Supabase S3 Bucket Folder Path.
            The user can create this in Supabase under Storage > Buckets
            A path that does not exist will not be checked now, but file uploads will fail
            A Path is like a folder in the bucket
            Eg. If the bucket is called "my-bucket" and the path is "my-folder", the full path is "my-bucket/my-folder"
      required:
        - region
        - url
        - accessKeyId
        - secretAccessKey
        - name
      title: SupabaseBucketPlan
    HmacAuthenticationPlanType:
      type: string
      enum:
        - hmac
      title: HmacAuthenticationPlanType
    HmacAuthenticationPlanAlgorithm:
      type: string
      enum:
        - sha256
        - sha512
        - sha1
      description: This is the HMAC algorithm to use for signing.
      title: HmacAuthenticationPlanAlgorithm
    HmacAuthenticationPlanSignatureEncoding:
      type: string
      enum:
        - hex
        - base64
      description: The encoding format for the signature. Defaults to 'hex'.
      title: HmacAuthenticationPlanSignatureEncoding
    BearerAuthenticationPlanType:
      type: string
      enum:
        - bearer
      title: BearerAuthenticationPlanType
    UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingWebhookAuthenticationPlan:
      oneOf:
        - type: object
          properties:
            type:
              type: string
              enum:
                - oauth2
              description: 'Discriminator value: oauth2'
            url:
              type: string
              description: This is the OAuth2 URL.
            clientId:
              type: string
              description: This is the OAuth2 client ID.
            clientSecret:
              type: string
              description: This is the OAuth2 client secret.
            scope:
              type: string
              description: This is the scope of the OAuth2 token.
          required:
            - type
            - url
            - clientId
            - clientSecret
          description: oauth2 variant
        - type: object
          properties:
            type:
              $ref: '#/components/schemas/HmacAuthenticationPlanType'
            secretKey:
              type: string
              description: This is the HMAC secret key used to sign requests.
            algorithm:
              $ref: '#/components/schemas/HmacAuthenticationPlanAlgorithm'
              description: This is the HMAC algorithm to use for signing.
            signatureHeader:
              type: string
              description: This is the header name where the signature will be sent. Defaults to 'x-signature'.
            timestampHeader:
              type: string
              description: This is the header name where the timestamp will be sent. Defaults to 'x-timestamp'.
            signaturePrefix:
              type: string
              description: This is the prefix for the signature. For example, 'sha256=' for GitHub-style signatures.
            includeTimestamp:
              type: boolean
              description: Whether to include a timestamp in the signature payload. Defaults to true.
            payloadFormat:
              type: string
              description: >-
                Custom payload format. Use {body} for request body, {timestamp} for timestamp, {method} for HTTP method,
                {url} for URL, {svix-id} for unique message ID. Defaults to '{timestamp}.{body}'.
            messageIdHeader:
              type: string
              description: This is the header name where the unique message ID will be sent. Used for Svix-style webhooks.
            signatureEncoding:
              $ref: '#/components/schemas/HmacAuthenticationPlanSignatureEncoding'
              description: The encoding format for the signature. Defaults to 'hex'.
            secretIsBase64:
              type: boolean
              description: Whether the secret key is base64-encoded and should be decoded before use. Defaults to false.
          required:
            - type
            - secretKey
            - algorithm
          description: hmac variant
        - type: object
          properties:
            type:
              $ref: '#/components/schemas/BearerAuthenticationPlanType'
            token:
              type: string
              description: This is the bearer token value.
            headerName:
              type: string
              description: This is the header name where the bearer token will be sent. Defaults to 'Authorization'.
            bearerPrefixEnabled:
              type: boolean
              description: Whether to include the 'Bearer ' prefix in the header value. Defaults to true.
          required:
            - type
            - token
          description: bearer variant
      discriminator:
        propertyName: type
      description: This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication.
      title: UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingWebhookAuthenticationPlan
    CreateCustomCredentialDtoProvider:
      type: string
      enum:
        - custom-credential
      title: CreateCustomCredentialDtoProvider
    CreateCustomCredentialDtoAuthenticationPlan:
      oneOf:
        - type: object
          properties:
            type:
              type: string
              enum:
                - oauth2
              description: 'Discriminator value: oauth2'
            url:
              type: string
              description: This is the OAuth2 URL.
            clientId:
              type: string
              description: This is the OAuth2 client ID.
            clientSecret:
              type: string
              description: This is the OAuth2 client secret.
            scope:
              type: string
              description: This is the scope of the OAuth2 token.
          required:
            - type
            - url
            - clientId
            - clientSecret
          description: oauth2 variant
        - type: object
          properties:
            type:
              $ref: '#/components/schemas/HmacAuthenticationPlanType'
            secretKey:
              type: string
              description: This is the HMAC secret key used to sign requests.
            algorithm:
              $ref: '#/components/schemas/HmacAuthenticationPlanAlgorithm'
              description: This is the HMAC algorithm to use for signing.
            signatureHeader:
              type: string
              description: This is the header name where the signature will be sent. Defaults to 'x-signature'.
            timestampHeader:
              type: string
              description: This is the header name where the timestamp will be sent. Defaults to 'x-timestamp'.
            signaturePrefix:
              type: string
              description: This is the prefix for the signature. For example, 'sha256=' for GitHub-style signatures.
            includeTimestamp:
              type: boolean
              description: Whether to include a timestamp in the signature payload. Defaults to true.
            payloadFormat:
              type: string
              description: >-
                Custom payload format. Use {body} for request body, {timestamp} for timestamp, {method} for HTTP method,
                {url} for URL, {svix-id} for unique message ID. Defaults to '{timestamp}.{body}'.
            messageIdHeader:
              type: string
              description: This is the header name where the unique message ID will be sent. Used for Svix-style webhooks.
            signatureEncoding:
              $ref: '#/components/schemas/HmacAuthenticationPlanSignatureEncoding'
              description: The encoding format for the signature. Defaults to 'hex'.
            secretIsBase64:
              type: boolean
              description: Whether the secret key is base64-encoded and should be decoded before use. Defaults to false.
          required:
            - type
            - secretKey
            - algorithm
          description: hmac variant
        - type: object
          properties:
            type:
              $ref: '#/components/schemas/BearerAuthenticationPlanType'
            token:
              type: string
              description: This is the bearer token value.
            headerName:
              type: string
              description: This is the header name where the bearer token will be sent. Defaults to 'Authorization'.
            bearerPrefixEnabled:
              type: boolean
              description: Whether to include the 'Bearer ' prefix in the header value. Defaults to true.
          required:
            - type
            - token
          description: bearer variant
      discriminator:
        propertyName: type
      description: This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication.
      title: CreateCustomCredentialDtoAuthenticationPlan
    PublicKeyEncryptionPlanType:
      type: string
      enum:
        - public-key
      description: The type of encryption plan.
      title: PublicKeyEncryptionPlanType
    PublicKeyEncryptionPlanAlgorithm:
      type: string
      enum:
        - RSA-OAEP-256
      description: The encryption algorithm to use.
      title: PublicKeyEncryptionPlanAlgorithm
    SpkiPemPublicKeyConfigFormat:
      type: string
      enum:
        - spki-pem
      description: The format of the public key.
      title: SpkiPemPublicKeyConfigFormat
    SpkiPemPublicKeyConfig:
      type: object
      properties:
        name:
          type: string
          description: Optional name of the key for identification purposes.
        format:
          $ref: '#/components/schemas/SpkiPemPublicKeyConfigFormat'
          description: The format of the public key.
        pem:
          type: string
          description: The PEM-encoded public key.
      required:
        - format
        - pem
      title: SpkiPemPublicKeyConfig
    PublicKeyEncryptionPlan:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/PublicKeyEncryptionPlanType'
          description: The type of encryption plan.
        algorithm:
          $ref: '#/components/schemas/PublicKeyEncryptionPlanAlgorithm'
          description: The encryption algorithm to use.
        publicKey:
          $ref: '#/components/schemas/SpkiPemPublicKeyConfig'
          description: The public key configuration.
      required:
        - type
        - algorithm
        - publicKey
      title: PublicKeyEncryptionPlan
    CreateNeuphonicCredentialDtoProvider:
      type: string
      enum:
        - neuphonic
      title: CreateNeuphonicCredentialDtoProvider
    CreateHumeCredentialDtoProvider:
      type: string
      enum:
        - hume
      title: CreateHumeCredentialDtoProvider
    CreateMistralCredentialDtoProvider:
      type: string
      enum:
        - mistral
      title: CreateMistralCredentialDtoProvider
    CreateSpeechmaticsCredentialDtoProvider:
      type: string
      enum:
        - speechmatics
      title: CreateSpeechmaticsCredentialDtoProvider
    CreateSonioxCredentialDtoProvider:
      type: string
      enum:
        - soniox
      title: CreateSonioxCredentialDtoProvider
    CreateTrieveCredentialDtoProvider:
      type: string
      enum:
        - trieve
      title: CreateTrieveCredentialDtoProvider
    CreateGoHighLevelMcpCredentialDtoProvider:
      type: string
      enum:
        - ghl.oauth2-authorization
      title: CreateGoHighLevelMcpCredentialDtoProvider
    Oauth2AuthenticationSession:
      type: object
      properties:
        accessToken:
          type: string
          description: This is the OAuth2 access token.
        expiresAt:
          type: string
          format: date-time
          description: This is the OAuth2 access token expiration.
        refreshToken:
          type: string
          description: This is the OAuth2 refresh token.
      title: Oauth2AuthenticationSession
    CreateInworldCredentialDtoProvider:
      type: string
      enum:
        - inworld
      title: CreateInworldCredentialDtoProvider
    CreateWellSaidCredentialDtoProvider:
      type: string
      enum:
        - wellsaid
      title: CreateWellSaidCredentialDtoProvider
    CreateEmailCredentialDtoProvider:
      type: string
      enum:
        - email
      title: CreateEmailCredentialDtoProvider
    CreateSlackWebhookCredentialDtoProvider:
      type: string
      enum:
        - slack-webhook
      title: CreateSlackWebhookCredentialDtoProvider
    CreateAssistantDtoCredentialsItems:
      oneOf:
        - type: object
          properties:
            provider:
              type: string
              enum:
                - 11labs
              description: 'Discriminator value: 11labs'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateElevenLabsCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - anthropic
              description: 'Discriminator value: anthropic'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateAnthropicCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - anthropic-bedrock
              description: 'Discriminator value: anthropic-bedrock'
            region:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockRegion'
              description: AWS region where Bedrock is configured.
            authenticationPlan:
              $ref: >-
                #/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockAuthenticationPlan
              description: Authentication method - either direct IAM credentials or cross-account role assumption.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - region
            - authenticationPlan
          description: anthropic-bedrock variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - anyscale
              description: 'Discriminator value: anyscale'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateAnyscaleCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - assembly-ai
              description: 'Discriminator value: assembly-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateAssemblyAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - azure-openai
              description: 'Discriminator value: azure-openai'
            region:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiRegion'
            models:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiModels'
            openAIKey:
              type: string
              description: This is not returned in the API.
            ocpApimSubscriptionKey:
              type: string
              description: This is not returned in the API.
            openAIEndpoint:
              type: string
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - region
            - models
            - openAIKey
            - openAIEndpoint
          description: CreateAzureOpenAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - azure
              description: 'Discriminator value: azure'
            service:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureService'
              description: This is the service being used in Azure.
            region:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureRegion'
              description: This is the region of the Azure resource.
            apiKey:
              type: string
              description: This is not returned in the API.
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            bucketPlan:
              $ref: '#/components/schemas/AzureBlobStorageBucketPlan'
              description: This is the bucket plan that can be provided to store call artifacts in Azure Blob Storage.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - service
          description: CreateAzureCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - byo-sip-trunk
              description: 'Discriminator value: byo-sip-trunk'
            gateways:
              type: array
              items:
                $ref: '#/components/schemas/SipTrunkGateway'
              description: This is the list of SIP trunk's gateways.
            outboundAuthenticationPlan:
              $ref: '#/components/schemas/SipTrunkOutboundAuthenticationPlan'
              description: This can be used to configure the outbound authentication if required by the SIP trunk.
            outboundLeadingPlusEnabled:
              type: boolean
              description: >-
                This ensures the outbound origination attempts have a leading plus. Defaults to false to match
                conventional telecom behavior.


                Usage:

                - Vonage/Twilio requires leading plus for all outbound calls. Set this to true.


                @default false
            techPrefix:
              type: string
              description: This can be used to configure the tech prefix on outbound calls. This is an advanced property.
            sipDiversionHeader:
              type: string
              description: >-
                This can be used to enable the SIP diversion header for authenticating the calling number if the SIP
                trunk supports it. This is an advanced property.
            sbcConfiguration:
              $ref: '#/components/schemas/SbcConfiguration'
              description: >-
                This is an advanced configuration for enterprise deployments. This uses the onprem SBC to trunk into the
                SIP trunk's `gateways`, rather than the managed SBC provided by Vapi.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - gateways
          description: CreateByoSipTrunkCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - cartesia
              description: 'Discriminator value: cartesia'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateCartesiaCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateCerebrasCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateCerebrasCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - cloudflare
              description: 'Discriminator value: cloudflare'
            accountId:
              type: string
              description: Cloudflare Account Id.
            apiKey:
              type: string
              description: Cloudflare API Key / Token.
            accountEmail:
              type: string
              description: Cloudflare Account Email.
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            bucketPlan:
              $ref: '#/components/schemas/CloudflareR2BucketPlan'
              description: This is the bucket plan that can be provided to store call artifacts in R2
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
          description: CreateCloudflareCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - custom-llm
              description: 'Discriminator value: custom-llm'
            apiKey:
              type: string
              description: This is not returned in the API.
            authenticationPlan:
              $ref: '#/components/schemas/OAuth2AuthenticationPlan'
              description: >-
                This is the authentication plan. Currently supports OAuth2 RFC 6749. To use Bearer authentication, use
                apiKey
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateCustomLLMCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - deepgram
              description: 'Discriminator value: deepgram'
            apiKey:
              type: string
              description: This is not returned in the API.
            apiUrl:
              type: string
              description: This can be used to point to an onprem Deepgram instance. Defaults to api.deepgram.com.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateDeepgramCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - deepinfra
              description: 'Discriminator value: deepinfra'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateDeepInfraCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - deep-seek
              description: 'Discriminator value: deep-seek'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateDeepSeekCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - gcp
              description: 'Discriminator value: gcp'
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            gcpKey:
              $ref: '#/components/schemas/GcpKey'
              description: >-
                This is the GCP key. This is the JSON that can be generated in the Google Cloud Console at
                https://console.cloud.google.com/iam-admin/serviceaccounts/details/<service-account-id>/keys.


                The schema is identical to the JSON that GCP outputs.
            region:
              type: string
              description: This is the region of the GCP resource.
            bucketPlan:
              $ref: '#/components/schemas/BucketPlan'
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - gcpKey
          description: CreateGcpCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - gladia
              description: 'Discriminator value: gladia'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateGladiaCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - gohighlevel
              description: 'Discriminator value: gohighlevel'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateGoHighLevelCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateGoogleCredentialDtoProvider'
              description: 'This is the key for Gemini in Google AI Studio. Get it from here: https://aistudio.google.com/app/apikey'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateGoogleCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - groq
              description: 'Discriminator value: groq'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateGroqCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateInflectionAiCredentialDtoProvider'
              description: >-
                This is the api key for Pi in InflectionAI's console. Get it from here:
                https://developers.inflection.ai/keys, billing will need to be setup
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateInflectionAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - langfuse
              description: 'Discriminator value: langfuse'
            publicKey:
              type: string
              description: 'The public key for Langfuse project. Eg: pk-lf-...'
            apiKey:
              type: string
              description: 'The secret key for Langfuse project. Eg: sk-lf-... .This is not returned in the API.'
            apiUrl:
              type: string
              description: 'The host URL for Langfuse project. Eg: https://cloud.langfuse.com'
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - publicKey
            - apiKey
            - apiUrl
          description: CreateLangfuseCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - lmnt
              description: 'Discriminator value: lmnt'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateLmntCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - make
              description: 'Discriminator value: make'
            teamId:
              type: string
              description: Team ID
            region:
              type: string
              description: 'Region of your application. For example: eu1, eu2, us1, us2'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - teamId
            - region
            - apiKey
          description: CreateMakeCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - openai
              description: 'Discriminator value: openai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateOpenAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - openrouter
              description: 'Discriminator value: openrouter'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateOpenRouterCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - perplexity-ai
              description: 'Discriminator value: perplexity-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreatePerplexityAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - playht
              description: 'Discriminator value: playht'
            apiKey:
              type: string
              description: This is not returned in the API.
            userId:
              type: string
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
            - userId
          description: CreatePlayHTCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - rime-ai
              description: 'Discriminator value: rime-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateRimeAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - runpod
              description: 'Discriminator value: runpod'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateRunpodCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - s3
              description: 'Discriminator value: s3'
            awsAccessKeyId:
              type: string
              description: AWS access key ID.
            awsSecretAccessKey:
              type: string
              description: AWS access key secret. This is not returned in the API.
            region:
              type: string
              description: AWS region in which the S3 bucket is located.
            s3BucketName:
              type: string
              description: AWS S3 bucket name.
            s3PathPrefix:
              type: string
              description: The path prefix for the uploaded recording. Ex. "recordings/"
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - awsAccessKeyId
            - awsSecretAccessKey
            - region
            - s3BucketName
            - s3PathPrefix
          description: CreateS3CredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - supabase
              description: 'Discriminator value: supabase'
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            bucketPlan:
              $ref: '#/components/schemas/SupabaseBucketPlan'
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
          description: CreateSupabaseCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - smallest-ai
              description: 'Discriminator value: smallest-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateSmallestAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - tavus
              description: 'Discriminator value: tavus'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateTavusCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - together-ai
              description: 'Discriminator value: together-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateTogetherAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - twilio
              description: 'Discriminator value: twilio'
            authToken:
              type: string
              description: This is not returned in the API.
            apiKey:
              type: string
              description: This is not returned in the API.
            apiSecret:
              type: string
              description: This is not returned in the API.
            accountSid:
              type: string
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - accountSid
          description: CreateTwilioCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - vonage
              description: 'Discriminator value: vonage'
            apiSecret:
              type: string
              description: This is not returned in the API.
            apiKey:
              type: string
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiSecret
            - apiKey
          description: CreateVonageCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - webhook
              description: 'Discriminator value: webhook'
            authenticationPlan:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingWebhookAuthenticationPlan'
              description: This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authenticationPlan
          description: CreateWebhookCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateCustomCredentialDtoProvider'
            authenticationPlan:
              $ref: '#/components/schemas/CreateCustomCredentialDtoAuthenticationPlan'
              description: This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication.
            encryptionPlan:
              $ref: '#/components/schemas/PublicKeyEncryptionPlan'
              description: This is the encryption plan for encrypting sensitive data. Currently supports public-key encryption.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authenticationPlan
          description: custom-credential variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - xai
              description: 'Discriminator value: xai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateXAiCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateNeuphonicCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateNeuphonicCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateHumeCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateHumeCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateMistralCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateMistralCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateSpeechmaticsCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateSpeechmaticsCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateSonioxCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: soniox variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateTrieveCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateTrieveCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - google.calendar.oauth2-client
              description: 'Discriminator value: google.calendar.oauth2-client'
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
          description: CreateGoogleCalendarOAuth2ClientCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - google.calendar.oauth2-authorization
              description: 'Discriminator value: google.calendar.oauth2-authorization'
            authorizationId:
              type: string
              description: The authorization ID for the OAuth2 authorization
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authorizationId
          description: CreateGoogleCalendarOAuth2AuthorizationCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - google.sheets.oauth2-authorization
              description: 'Discriminator value: google.sheets.oauth2-authorization'
            authorizationId:
              type: string
              description: The authorization ID for the OAuth2 authorization
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authorizationId
          description: CreateGoogleSheetsOAuth2AuthorizationCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - slack.oauth2-authorization
              description: 'Discriminator value: slack.oauth2-authorization'
            authorizationId:
              type: string
              description: The authorization ID for the OAuth2 authorization
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authorizationId
          description: CreateSlackOAuth2AuthorizationCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateGoHighLevelMcpCredentialDtoProvider'
            authenticationSession:
              $ref: '#/components/schemas/Oauth2AuthenticationSession'
              description: This is the authentication session for the credential.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authenticationSession
          description: CreateGoHighLevelMCPCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateInworldCredentialDtoProvider'
            apiKey:
              type: string
              description: This is the Inworld Basic (Base64) authentication token. This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: inworld variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - minimax
              description: 'Discriminator value: minimax'
            apiKey:
              type: string
              description: This is not returned in the API.
            groupId:
              type: string
              description: This is the Minimax Group ID.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
            - groupId
          description: minimax variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateWellSaidCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: wellsaid variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateEmailCredentialDtoProvider'
            email:
              type: string
              description: The recipient email address for alerts
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - email
          description: email variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateSlackWebhookCredentialDtoProvider'
            webhookUrl:
              type: string
              description: >-
                Slack incoming webhook URL. See https://api.slack.com/messaging/webhooks for setup instructions. This is
                not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - webhookUrl
          description: slack-webhook variant
      discriminator:
        propertyName: provider
      title: CreateAssistantDtoCredentialsItems
    CallHookCallEndingOn:
      type: string
      enum:
        - call.ending
      description: This is the event that triggers this hook
      title: CallHookCallEndingOn
    ToolCallHookActionType:
      type: string
      enum:
        - tool
      description: This is the type of action - must be "tool"
      title: ToolCallHookActionType
    ToolCallHookActionTool:
      oneOf:
        - $ref: '#/components/schemas/CreateApiRequestToolDTO'
        - $ref: '#/components/schemas/CreateBashToolDTO'
        - $ref: '#/components/schemas/CreateCodeToolDTO'
        - $ref: '#/components/schemas/CreateComputerToolDTO'
        - $ref: '#/components/schemas/CreateDtmfToolDTO'
        - $ref: '#/components/schemas/CreateEndCallToolDTO'
        - $ref: '#/components/schemas/CreateFunctionToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactGetToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCreateEventToolDTO'
        - $ref: '#/components/schemas/CreateGoogleSheetsRowAppendToolDTO'
        - $ref: '#/components/schemas/CreateHandoffToolDTO'
        - $ref: '#/components/schemas/CreateMcpToolDTO'
        - $ref: '#/components/schemas/CreateQueryToolDTO'
        - $ref: '#/components/schemas/CreateSlackSendMessageToolDTO'
        - $ref: '#/components/schemas/CreateSmsToolDTO'
        - $ref: '#/components/schemas/CreateTextEditorToolDTO'
        - $ref: '#/components/schemas/CreateTransferCallToolDTO'
        - $ref: '#/components/schemas/CreateSipRequestToolDTO'
        - $ref: '#/components/schemas/CreateVoicemailToolDTO'
      description: This is the tool to call. To use an existing tool, send `toolId` instead.
      title: ToolCallHookActionTool
    ToolCallHookAction:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/ToolCallHookActionType'
          description: This is the type of action - must be "tool"
        tool:
          $ref: '#/components/schemas/ToolCallHookActionTool'
          description: This is the tool to call. To use an existing tool, send `toolId` instead.
        toolId:
          type: string
          description: This is the tool to call. To use a transient tool, send `tool` instead.
      required:
        - type
      title: ToolCallHookAction
    MessageAddHookActionType:
      type: string
      enum:
        - message.add
      description: This is the type of action - must be "message.add"
      title: MessageAddHookActionType
    MessageAddHookAction:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/MessageAddHookActionType'
          description: This is the type of action - must be "message.add"
        message:
          $ref: '#/components/schemas/OpenAIMessage'
          description: The message to add to the conversation in OpenAI format
        triggerResponseEnabled:
          type: boolean
          default: true
          description: Whether to trigger an assistant response after adding the message
      required:
        - type
        - message
      title: MessageAddHookAction
    CallHookCallEndingDoItems:
      oneOf:
        - $ref: '#/components/schemas/ToolCallHookAction'
        - $ref: '#/components/schemas/MessageAddHookAction'
      title: CallHookCallEndingDoItems
    CallHookFilterType:
      type: string
      enum:
        - oneOf
      description: This is the type of filter - currently only "oneOf" is supported
      title: CallHookFilterType
    CallHookFilter:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/CallHookFilterType'
          description: This is the type of filter - currently only "oneOf" is supported
        key:
          type: string
          description: This is the key to filter on (e.g. "call.endedReason")
        oneOf:
          type: array
          items:
            type: string
          description: This is the array of possible values to match against
      required:
        - type
        - key
        - oneOf
      title: CallHookFilter
    CallHookCallEnding:
      type: object
      properties:
        'on':
          $ref: '#/components/schemas/CallHookCallEndingOn'
          description: This is the event that triggers this hook
        do:
          type: array
          items:
            $ref: '#/components/schemas/CallHookCallEndingDoItems'
          description: This is the set of actions to perform when the hook triggers
        filters:
          type: array
          items:
            $ref: '#/components/schemas/CallHookFilter'
          description: This is the set of filters that must match for the hook to trigger
      required:
        - 'on'
        - do
      title: CallHookCallEnding
    CallHookAssistantSpeechInterruptedOn:
      type: string
      enum:
        - assistant.speech.interrupted
      description: This is the event that triggers this hook
      title: CallHookAssistantSpeechInterruptedOn
    SayHookActionType:
      type: string
      enum:
        - say
      description: This is the type of action - must be "say"
      title: SayHookActionType
    SystemMessage:
      type: object
      properties:
        role:
          type: string
          description: The role of the system in the conversation.
        message:
          type: string
          description: The message content from the system.
        time:
          type: number
          format: double
          description: The timestamp when the message was sent.
        secondsFromStart:
          type: number
          format: double
          description: The number of seconds from the start of the conversation.
      required:
        - role
        - message
        - time
        - secondsFromStart
      title: SystemMessage
    UserMessageMetadata:
      type: object
      properties: {}
      description: The metadata associated with the message. Currently used to store the transcriber's word level confidence.
      title: UserMessageMetadata
    UserMessage:
      type: object
      properties:
        role:
          type: string
          description: The role of the user in the conversation.
        message:
          type: string
          description: The message content from the user.
        time:
          type: number
          format: double
          description: The timestamp when the message was sent.
        endTime:
          type: number
          format: double
          description: The timestamp when the message ended.
        secondsFromStart:
          type: number
          format: double
          description: The number of seconds from the start of the conversation.
        duration:
          type: number
          format: double
          description: The duration of the message in seconds.
        isFiltered:
          type: boolean
          description: Indicates if the message was filtered for security reasons.
        detectedThreats:
          type: array
          items:
            type: string
          description: List of detected security threats if the message was filtered.
        originalMessage:
          type: string
          description: The original message before filtering (only included if content was filtered).
        metadata:
          $ref: '#/components/schemas/UserMessageMetadata'
          description: The metadata associated with the message. Currently used to store the transcriber's word level confidence.
        speakerLabel:
          type: string
          description: Stable speaker label for diarized user speakers (e.g., "Speaker 1").
      required:
        - role
        - message
        - time
        - endTime
        - secondsFromStart
      title: UserMessage
    AssistantMessageRole:
      type: string
      enum:
        - assistant
      default: assistant
      description: This is the role of the message author
      title: AssistantMessageRole
    ToolCallFunction:
      type: object
      properties:
        arguments:
          type: string
          description: This is the arguments to call the function with
        name:
          type: string
          description: This is the name of the function to call
      required:
        - arguments
        - name
      title: ToolCallFunction
    ToolCall:
      type: object
      properties:
        id:
          type: string
          description: This is the ID of the tool call
        type:
          type: string
          description: This is the type of tool
        function:
          $ref: '#/components/schemas/ToolCallFunction'
          description: This is the function that was called
      required:
        - id
        - type
        - function
      title: ToolCall
    AssistantMessageMetadata:
      type: object
      properties: {}
      description: This is an optional metadata for the message
      title: AssistantMessageMetadata
    AssistantMessage:
      type: object
      properties:
        role:
          $ref: '#/components/schemas/AssistantMessageRole'
          description: This is the role of the message author
        content:
          type: string
          description: This is the content of the assistant message
        refusal:
          type: string
          description: This is the refusal message generated by the model
        tool_calls:
          type: array
          items:
            $ref: '#/components/schemas/ToolCall'
          description: This is the tool calls generated by the model
        name:
          type: string
          description: This is an optional name for the participant
        metadata:
          $ref: '#/components/schemas/AssistantMessageMetadata'
          description: This is an optional metadata for the message
      required:
        - role
      title: AssistantMessage
    ToolMessageRole:
      type: string
      enum:
        - tool
      default: tool
      description: This is the role of the message author
      title: ToolMessageRole
    ToolMessageMetadata:
      type: object
      properties: {}
      description: This is an optional metadata for the message
      title: ToolMessageMetadata
    ToolMessage:
      type: object
      properties:
        role:
          $ref: '#/components/schemas/ToolMessageRole'
          description: This is the role of the message author
        content:
          type: string
          description: This is the content of the tool message
        tool_call_id:
          type: string
          description: This is the ID of the tool call this message is responding to
        name:
          type: string
          description: This is an optional name for the participant
        metadata:
          $ref: '#/components/schemas/ToolMessageMetadata'
          description: This is an optional metadata for the message
      required:
        - role
        - content
        - tool_call_id
      title: ToolMessage
    DeveloperMessageRole:
      type: string
      enum:
        - developer
      default: developer
      description: This is the role of the message author
      title: DeveloperMessageRole
    DeveloperMessageMetadata:
      type: object
      properties: {}
      description: This is an optional metadata for the message
      title: DeveloperMessageMetadata
    DeveloperMessage:
      type: object
      properties:
        role:
          $ref: '#/components/schemas/DeveloperMessageRole'
          description: This is the role of the message author
        content:
          type: string
          description: This is the content of the developer message
        name:
          type: string
          description: This is an optional name for the participant
        metadata:
          $ref: '#/components/schemas/DeveloperMessageMetadata'
          description: This is an optional metadata for the message
      required:
        - role
        - content
      title: DeveloperMessage
    SayHookActionPromptOneOf1Items:
      oneOf:
        - $ref: '#/components/schemas/SystemMessage'
        - $ref: '#/components/schemas/UserMessage'
        - $ref: '#/components/schemas/AssistantMessage'
        - $ref: '#/components/schemas/ToolMessage'
        - $ref: '#/components/schemas/DeveloperMessage'
      title: SayHookActionPromptOneOf1Items
    SayHookActionPrompt1:
      type: array
      items:
        $ref: '#/components/schemas/SayHookActionPromptOneOf1Items'
      title: SayHookActionPrompt1
    SayHookActionPrompt:
      oneOf:
        - type: string
        - $ref: '#/components/schemas/SayHookActionPrompt1'
      description: |-
        This is the prompt for the assistant to generate a response based on existing conversation.
        Can be a string or an array of chat messages.
      title: SayHookActionPrompt
    SayHookActionExact:
      type: object
      properties: {}
      description: This is the message to say
      title: SayHookActionExact
    SayHookAction:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/SayHookActionType'
          description: This is the type of action - must be "say"
        prompt:
          $ref: '#/components/schemas/SayHookActionPrompt'
          description: |-
            This is the prompt for the assistant to generate a response based on existing conversation.
            Can be a string or an array of chat messages.
        exact:
          $ref: '#/components/schemas/SayHookActionExact'
          description: This is the message to say
      required:
        - type
      title: SayHookAction
    CallHookAssistantSpeechInterruptedDoItems:
      oneOf:
        - $ref: '#/components/schemas/SayHookAction'
        - $ref: '#/components/schemas/ToolCallHookAction'
        - $ref: '#/components/schemas/MessageAddHookAction'
      title: CallHookAssistantSpeechInterruptedDoItems
    CallHookAssistantSpeechInterrupted:
      type: object
      properties:
        'on':
          $ref: '#/components/schemas/CallHookAssistantSpeechInterruptedOn'
          description: This is the event that triggers this hook
        do:
          type: array
          items:
            $ref: '#/components/schemas/CallHookAssistantSpeechInterruptedDoItems'
          description: This is the set of actions to perform when the hook triggers
      required:
        - 'on'
        - do
      title: CallHookAssistantSpeechInterrupted
    CallHookCustomerSpeechInterruptedOn:
      type: string
      enum:
        - customer.speech.interrupted
      description: This is the event that triggers this hook
      title: CallHookCustomerSpeechInterruptedOn
    CallHookCustomerSpeechInterruptedDoItems:
      oneOf:
        - $ref: '#/components/schemas/SayHookAction'
        - $ref: '#/components/schemas/ToolCallHookAction'
        - $ref: '#/components/schemas/MessageAddHookAction'
      title: CallHookCustomerSpeechInterruptedDoItems
    CallHookCustomerSpeechInterrupted:
      type: object
      properties:
        'on':
          $ref: '#/components/schemas/CallHookCustomerSpeechInterruptedOn'
          description: This is the event that triggers this hook
        do:
          type: array
          items:
            $ref: '#/components/schemas/CallHookCustomerSpeechInterruptedDoItems'
          description: This is the set of actions to perform when the hook triggers
      required:
        - 'on'
        - do
      title: CallHookCustomerSpeechInterrupted
    CallHookCustomerSpeechTimeoutDoItems:
      oneOf:
        - $ref: '#/components/schemas/SayHookAction'
        - $ref: '#/components/schemas/ToolCallHookAction'
        - $ref: '#/components/schemas/MessageAddHookAction'
      title: CallHookCustomerSpeechTimeoutDoItems
    CustomerSpeechTimeoutOptionsTriggerResetMode:
      type: object
      properties: {}
      description: |-
        This is whether the counter for hook trigger resets the user speaks.

        @default never
      title: CustomerSpeechTimeoutOptionsTriggerResetMode
    CustomerSpeechTimeoutOptions:
      type: object
      properties:
        timeoutSeconds:
          type: number
          format: double
          description: |-
            This is the timeout in seconds before action is triggered.
            The clock starts when the assistant finishes speaking and remains active until the user speaks.

            @default 7.5
        triggerMaxCount:
          type: number
          format: double
          description: |-
            This is the maximum number of times the hook will trigger in a call.

            @default 3
        triggerResetMode:
          $ref: '#/components/schemas/CustomerSpeechTimeoutOptionsTriggerResetMode'
          description: |-
            This is whether the counter for hook trigger resets the user speaks.

            @default never
      required:
        - timeoutSeconds
      title: CustomerSpeechTimeoutOptions
    CallHookCustomerSpeechTimeout:
      type: object
      properties:
        'on':
          type: string
          description: Must be either "customer.speech.timeout" or match the pattern "customer.speech.timeout[property=value]"
        do:
          type: array
          items:
            $ref: '#/components/schemas/CallHookCustomerSpeechTimeoutDoItems'
          description: This is the set of actions to perform when the hook triggers
        options:
          $ref: '#/components/schemas/CustomerSpeechTimeoutOptions'
          description: This is the set of filters that must match for the hook to trigger
        name:
          type: string
          description: |-
            This is the name of the hook, it can be set by the user to identify the hook.
            If no name is provided, the hook will be auto generated as UUID.

            @default UUID
      required:
        - 'on'
        - do
      title: CallHookCustomerSpeechTimeout
    SessionCreatedHookOn:
      type: string
      enum:
        - session.created
      description: This is the event that triggers this hook
      title: SessionCreatedHookOn
    SessionCreatedHookDoItems:
      oneOf:
        - $ref: '#/components/schemas/ToolCallHookAction'
      title: SessionCreatedHookDoItems
    SessionCreatedHook:
      type: object
      properties:
        'on':
          $ref: '#/components/schemas/SessionCreatedHookOn'
          description: This is the event that triggers this hook
        do:
          type: array
          items:
            $ref: '#/components/schemas/SessionCreatedHookDoItems'
          description: This is the set of actions to perform when the hook triggers.
        name:
          type: string
          description: |-
            Optional name for this hook instance.
            If no name is provided, the hook will be auto generated as UUID.

            @default UUID
      required:
        - 'on'
        - do
      title: SessionCreatedHook
    CreateAssistantDtoHooksItems:
      oneOf:
        - $ref: '#/components/schemas/CallHookCallEnding'
        - $ref: '#/components/schemas/CallHookAssistantSpeechInterrupted'
        - $ref: '#/components/schemas/CallHookCustomerSpeechInterrupted'
        - $ref: '#/components/schemas/CallHookCustomerSpeechTimeout'
        - $ref: '#/components/schemas/SessionCreatedHook'
      title: CreateAssistantDtoHooksItems
    SecurityFilterBase:
      type: object
      properties: {}
      title: SecurityFilterBase
    SecurityFilterPlanMode:
      type: string
      enum:
        - sanitize
        - reject
        - replace
      default: sanitize
      description: |-
        Mode of operation when a security threat is detected.
        - 'sanitize': Remove or replace the threatening content
        - 'reject': Replace the entire transcript with replacement text
        - 'replace': Replace threatening patterns with replacement text
        @default 'sanitize'
      title: SecurityFilterPlanMode
    SecurityFilterPlan:
      type: object
      properties:
        enabled:
          type: boolean
          default: false
          description: |-
            Whether the security filter is enabled.
            @default false
        filters:
          type: array
          items:
            $ref: '#/components/schemas/SecurityFilterBase'
          description: |-
            Array of security filter types to apply.
            If array is not empty, only those security filters are run.
        mode:
          $ref: '#/components/schemas/SecurityFilterPlanMode'
          description: |-
            Mode of operation when a security threat is detected.
            - 'sanitize': Remove or replace the threatening content
            - 'reject': Replace the entire transcript with replacement text
            - 'replace': Replace threatening patterns with replacement text
            @default 'sanitize'
        replacementText:
          type: string
          default: '[FILTERED]'
          description: |-
            Text to use when replacing filtered content.
            @default '[FILTERED]'
      title: SecurityFilterPlan
    CompliancePlanRecordingConsentPlanDiscriminatorMappingStayOnLineVoice:
      oneOf:
        - $ref: '#/components/schemas/AzureVoice'
        - $ref: '#/components/schemas/CartesiaVoice'
        - $ref: '#/components/schemas/CustomVoice'
        - $ref: '#/components/schemas/DeepgramVoice'
        - $ref: '#/components/schemas/ElevenLabsVoice'
        - $ref: '#/components/schemas/HumeVoice'
        - $ref: '#/components/schemas/LMNTVoice'
        - $ref: '#/components/schemas/NeuphonicVoice'
        - $ref: '#/components/schemas/OpenAIVoice'
        - $ref: '#/components/schemas/PlayHTVoice'
        - $ref: '#/components/schemas/WellSaidVoice'
        - $ref: '#/components/schemas/RimeAIVoice'
        - $ref: '#/components/schemas/SmallestAIVoice'
        - $ref: '#/components/schemas/TavusVoice'
        - $ref: '#/components/schemas/VapiVoice'
        - $ref: '#/components/schemas/SesameVoice'
        - $ref: '#/components/schemas/InworldVoice'
        - $ref: '#/components/schemas/MinimaxVoice'
      description: |-
        This is the voice to use for the consent message. If not specified, inherits from the assistant's voice.
        Use a different voice for the consent message for a better user experience.
      title: CompliancePlanRecordingConsentPlanDiscriminatorMappingStayOnLineVoice
    CompliancePlanRecordingConsentPlanDiscriminatorMappingVerbalVoice:
      oneOf:
        - $ref: '#/components/schemas/AzureVoice'
        - $ref: '#/components/schemas/CartesiaVoice'
        - $ref: '#/components/schemas/CustomVoice'
        - $ref: '#/components/schemas/DeepgramVoice'
        - $ref: '#/components/schemas/ElevenLabsVoice'
        - $ref: '#/components/schemas/HumeVoice'
        - $ref: '#/components/schemas/LMNTVoice'
        - $ref: '#/components/schemas/NeuphonicVoice'
        - $ref: '#/components/schemas/OpenAIVoice'
        - $ref: '#/components/schemas/PlayHTVoice'
        - $ref: '#/components/schemas/WellSaidVoice'
        - $ref: '#/components/schemas/RimeAIVoice'
        - $ref: '#/components/schemas/SmallestAIVoice'
        - $ref: '#/components/schemas/TavusVoice'
        - $ref: '#/components/schemas/VapiVoice'
        - $ref: '#/components/schemas/SesameVoice'
        - $ref: '#/components/schemas/InworldVoice'
        - $ref: '#/components/schemas/MinimaxVoice'
      description: |-
        This is the voice to use for the consent message. If not specified, inherits from the assistant's voice.
        Use a different voice for the consent message for a better user experience.
      title: CompliancePlanRecordingConsentPlanDiscriminatorMappingVerbalVoice
    CompliancePlanRecordingConsentPlanDiscriminatorMappingVerbalDeclineTool:
      type: object
      properties: {}
      description: Tool to execute if user verbally declines recording consent
      title: CompliancePlanRecordingConsentPlanDiscriminatorMappingVerbalDeclineTool
    CompliancePlanRecordingConsentPlan:
      oneOf:
        - type: object
          properties:
            type:
              type: string
              enum:
                - stay-on-line
              description: 'Discriminator value: stay-on-line'
            message:
              type: string
              description: |-
                This is the message asking for consent to record the call.
                If the type is `stay-on-line`, the message should ask the user to hang up if they do not consent.
                If the type is `verbal`, the message should ask the user to verbally consent or decline.
            voice:
              $ref: '#/components/schemas/CompliancePlanRecordingConsentPlanDiscriminatorMappingStayOnLineVoice'
              description: |-
                This is the voice to use for the consent message. If not specified, inherits from the assistant's voice.
                Use a different voice for the consent message for a better user experience.
            waitSeconds:
              type: number
              format: double
              default: 3
              description: Number of seconds to wait before transferring to the assistant if user stays on the call
          required:
            - type
            - message
          description: stay-on-line variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - verbal
              description: 'Discriminator value: verbal'
            message:
              type: string
              description: |-
                This is the message asking for consent to record the call.
                If the type is `stay-on-line`, the message should ask the user to hang up if they do not consent.
                If the type is `verbal`, the message should ask the user to verbally consent or decline.
            voice:
              $ref: '#/components/schemas/CompliancePlanRecordingConsentPlanDiscriminatorMappingVerbalVoice'
              description: |-
                This is the voice to use for the consent message. If not specified, inherits from the assistant's voice.
                Use a different voice for the consent message for a better user experience.
            declineTool:
              $ref: '#/components/schemas/CompliancePlanRecordingConsentPlanDiscriminatorMappingVerbalDeclineTool'
              description: Tool to execute if user verbally declines recording consent
            declineToolId:
              type: string
              description: ID of existing tool to execute if user verbally declines recording consent
          required:
            - type
            - message
          description: verbal variant
      discriminator:
        propertyName: type
      title: CompliancePlanRecordingConsentPlan
    CompliancePlan:
      type: object
      properties:
        hipaaEnabled:
          type: boolean
          description: >-
            When this is enabled, logs, recordings, and transcriptions will be stored in HIPAA-compliant storage.
            Defaults to false. Only HIPAA-compliant providers will be available for LLM, Voice, and Transcriber
            respectively. This setting is only honored if the organization is on an Enterprise subscription or has
            purchased the HIPAA add-on.
        pciEnabled:
          type: boolean
          description: >-
            When this is enabled, the user will be restricted to use PCI-compliant providers, and no logs or transcripts
            are stored.

            At the end of the call, you will receive an end-of-call-report message to store on your server. Defaults to
            false.
        securityFilterPlan:
          $ref: '#/components/schemas/SecurityFilterPlan'
          description: >-
            This is the security filter plan for the assistant. It allows filtering of transcripts for security threats
            before sending to LLM.
        recordingConsentPlan:
          $ref: '#/components/schemas/CompliancePlanRecordingConsentPlan'
      title: CompliancePlan
    CreateAssistantDtoMetadata:
      type: object
      properties: {}
      description: This is for metadata you want to store on the assistant.
      title: CreateAssistantDtoMetadata
    SmartDenoisingPlan:
      type: object
      properties:
        enabled:
          type: boolean
          default: true
          description: Whether smart denoising using Krisp is enabled.
      title: SmartDenoisingPlan
    FourierDenoisingPlan:
      type: object
      properties:
        enabled:
          type: boolean
          default: false
          description: Whether Fourier denoising is enabled. Note that this is experimental and may not work as expected.
        mediaDetectionEnabled:
          type: boolean
          default: true
          description: |-
            Whether automatic media detection is enabled. When enabled, the filter will automatically
            detect consistent background TV/music/radio and switch to more aggressive filtering settings.
            Only applies when enabled is true.
        staticThreshold:
          type: number
          format: double
          default: -35
          description: Static threshold in dB used as fallback when no baseline is established.
        baselineOffsetDb:
          type: number
          format: double
          default: -15
          description: |-
            How far below the rolling baseline to filter audio, in dB.
            Lower values (e.g., -10) are more aggressive, higher values (e.g., -20) are more conservative.
        windowSizeMs:
          type: number
          format: double
          default: 3000
          description: |-
            Rolling window size in milliseconds for calculating the audio baseline.
            Larger windows adapt more slowly but are more stable.
        baselinePercentile:
          type: number
          format: double
          default: 85
          description: |-
            Percentile to use for baseline calculation (1-99).
            Higher percentiles (e.g., 85) focus on louder speech, lower percentiles (e.g., 50) include quieter speech.
      title: FourierDenoisingPlan
    BackgroundSpeechDenoisingPlan:
      type: object
      properties:
        smartDenoisingPlan:
          $ref: '#/components/schemas/SmartDenoisingPlan'
          description: Whether smart denoising using Krisp is enabled.
        fourierDenoisingPlan:
          $ref: '#/components/schemas/FourierDenoisingPlan'
          description: |-
            Whether Fourier denoising is enabled. Note that this is experimental and may not work as expected.

            This can be combined with smart denoising, and will be run afterwards.
      title: BackgroundSpeechDenoisingPlan
    StructuredDataPlanMessagesItems:
      type: object
      properties: {}
      title: StructuredDataPlanMessagesItems
    StructuredDataPlan:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/StructuredDataPlanMessagesItems'
          description: >-
            These are the messages used to generate the structured data.


            @default: ```

            [
              {
                "role": "system",
                "content": "You are an expert data extractor. You will be given a transcript of a call. Extract structured data per the JSON Schema. DO NOT return anything except the structured data.\n\nJson Schema:\\n{{schema}}\n\nOnly respond with the JSON."
              },
              {
                "role": "user",
                "content": "Here is the transcript:\n\n{{transcript}}\n\n. Here is the ended reason of the call:\n\n{{endedReason}}\n\n"
              }
            ]```


            You can customize by providing any messages you want.


            Here are the template variables available:

            - {{transcript}}: the transcript of the call from `call.artifact.transcript`- {{systemPrompt}}: the system
            prompt of the call from `assistant.model.messages[type=system].content`- {{messages}}: the messages of the
            call from `assistant.model.messages`- {{schema}}: the schema of the structured data from
            `structuredDataPlan.schema`- {{endedReason}}: the ended reason of the call from `call.endedReason`
        enabled:
          type: boolean
          description: >-
            This determines whether structured data is generated and stored in `call.analysis.structuredData`. Defaults
            to false.


            Usage:

            - If you want to extract structured data, set this to true and provide a `schema`.


            @default false
        schema:
          $ref: '#/components/schemas/JsonSchema'
          description: |-
            This is the schema of the structured data. The output is stored in `call.analysis.structuredData`.

            Complete guide on JSON Schema can be found [here](https://ajv.js.org/json-schema.html#json-data-type).
        timeoutSeconds:
          type: number
          format: double
          description: >-
            This is how long the request is tried before giving up. When request times out,
            `call.analysis.structuredData` will be empty.


            Usage:

            - To guarantee the structured data is generated, set this value high. Note, this will delay the end of call
            report in cases where model is slow to respond.


            @default 5 seconds
      title: StructuredDataPlan
    StructuredDataMultiPlan:
      type: object
      properties:
        key:
          type: string
          description: This is the key of the structured data plan in the catalog.
        plan:
          $ref: '#/components/schemas/StructuredDataPlan'
          description: This is an individual structured data plan in the catalog.
      required:
        - key
        - plan
      title: StructuredDataMultiPlan
    SuccessEvaluationPlanRubric:
      type: string
      enum:
        - NumericScale
        - DescriptiveScale
        - Checklist
        - Matrix
        - PercentageScale
        - LikertScale
        - AutomaticRubric
        - PassFail
      description: |-
        This enforces the rubric of the evaluation. The output is stored in `call.analysis.successEvaluation`.

        Options include:
        - 'NumericScale': A scale of 1 to 10.
        - 'DescriptiveScale': A scale of Excellent, Good, Fair, Poor.
        - 'Checklist': A checklist of criteria and their status.
        - 'Matrix': A grid that evaluates multiple criteria across different performance levels.
        - 'PercentageScale': A scale of 0% to 100%.
        - 'LikertScale': A scale of Strongly Agree, Agree, Neutral, Disagree, Strongly Disagree.
        - 'AutomaticRubric': Automatically break down evaluation into several criteria, each with its own score.
        - 'PassFail': A simple 'true' if call passed, 'false' if not.

        Default is 'PassFail'.
      title: SuccessEvaluationPlanRubric
    SuccessEvaluationPlanMessagesItems:
      type: object
      properties: {}
      title: SuccessEvaluationPlanMessagesItems
    SuccessEvaluationPlan:
      type: object
      properties:
        rubric:
          $ref: '#/components/schemas/SuccessEvaluationPlanRubric'
          description: |-
            This enforces the rubric of the evaluation. The output is stored in `call.analysis.successEvaluation`.

            Options include:
            - 'NumericScale': A scale of 1 to 10.
            - 'DescriptiveScale': A scale of Excellent, Good, Fair, Poor.
            - 'Checklist': A checklist of criteria and their status.
            - 'Matrix': A grid that evaluates multiple criteria across different performance levels.
            - 'PercentageScale': A scale of 0% to 100%.
            - 'LikertScale': A scale of Strongly Agree, Agree, Neutral, Disagree, Strongly Disagree.
            - 'AutomaticRubric': Automatically break down evaluation into several criteria, each with its own score.
            - 'PassFail': A simple 'true' if call passed, 'false' if not.

            Default is 'PassFail'.
        messages:
          type: array
          items:
            $ref: '#/components/schemas/SuccessEvaluationPlanMessagesItems'
          description: >-
            These are the messages used to generate the success evaluation.


            @default: ```

            [
              {
                "role": "system",
                "content": "You are an expert call evaluator. You will be given a transcript of a call and the system prompt of the AI participant. Determine if the call was successful based on the objectives inferred from the system prompt. DO NOT return anything except the result.\n\nRubric:\\n{{rubric}}\n\nOnly respond with the result."
              },
              {
                "role": "user",
                "content": "Here is the transcript:\n\n{{transcript}}\n\n"
              },
              {
                "role": "user",
                "content": "Here was the system prompt of the call:\n\n{{systemPrompt}}\n\n. Here is the ended reason of the call:\n\n{{endedReason}}\n\n"
              }
            ]```


            You can customize by providing any messages you want.


            Here are the template variables available:

            - {{transcript}}: the transcript of the call from `call.artifact.transcript`- {{systemPrompt}}: the system
            prompt of the call from `assistant.model.messages[type=system].content`- {{messages}}: the messages of the
            call from `assistant.model.messages`- {{rubric}}: the rubric of the success evaluation from
            `successEvaluationPlan.rubric`- {{endedReason}}: the ended reason of the call from `call.endedReason`
        enabled:
          type: boolean
          description: >-
            This determines whether a success evaluation is generated and stored in `call.analysis.successEvaluation`.
            Defaults to true.


            Usage:

            - If you want to disable the success evaluation, set this to false.


            @default true
        timeoutSeconds:
          type: number
          format: double
          description: >-
            This is how long the request is tried before giving up. When request times out,
            `call.analysis.successEvaluation` will be empty.


            Usage:

            - To guarantee the success evaluation is generated, set this value high. Note, this will delay the end of
            call report in cases where model is slow to respond.


            @default 5 seconds
      title: SuccessEvaluationPlan
    AnalysisPlan:
      type: object
      properties:
        minMessagesThreshold:
          type: number
          format: double
          description: |-
            The minimum number of messages required to run the analysis plan.
            If the number of messages is less than this, analysis will be skipped.

            @default 2
        summaryPlan:
          $ref: '#/components/schemas/SummaryPlan'
          description: This is the plan for generating the summary of the call. This outputs to `call.analysis.summary`.
        structuredDataPlan:
          $ref: '#/components/schemas/StructuredDataPlan'
          description: >-
            This is the plan for generating the structured data from the call. This outputs to
            `call.analysis.structuredData`.
        structuredDataMultiPlan:
          type: array
          items:
            $ref: '#/components/schemas/StructuredDataMultiPlan'
          description: >-
            This is an array of structured data plan catalogs. Each entry includes a `key` and a `plan` for generating
            the structured data from the call. This outputs to `call.analysis.structuredDataMulti`.
        successEvaluationPlan:
          $ref: '#/components/schemas/SuccessEvaluationPlan'
          description: >-
            This is the plan for generating the success evaluation of the call. This outputs to
            `call.analysis.successEvaluation`.
        outcomeIds:
          type: array
          items:
            type: string
          description: |-
            This is an array of outcome UUIDs to be calculated during analysis.
            The outcomes will be calculated and stored in `call.analysis.outcomes`.
      title: AnalysisPlan
    ArtifactPlanRecordingFormat:
      type: string
      enum:
        - wav;l16
        - mp3
      description: |-
        This determines the format of the recording. Defaults to `wav;l16`.

        @default 'wav;l16'
      title: ArtifactPlanRecordingFormat
    TranscriptPlan:
      type: object
      properties:
        enabled:
          type: boolean
          description: |-
            This determines whether the transcript is stored in `call.artifact.transcript`. Defaults to true.

            @default true
        assistantName:
          type: string
          description: >-
            This is the name of the assistant in the transcript. Defaults to 'AI'.


            Usage:

            - If you want to change the name of the assistant in the transcript, set this. Example, here is what the
            transcript would look like with `assistantName` set to 'Buyer':

            ```

            User: Hello, how are you?

            Buyer: I'm fine.

            User: Do you want to buy a car?

            Buyer: No.

            ```


            @default 'AI'
        userName:
          type: string
          description: >-
            This is the name of the user in the transcript. Defaults to 'User'.


            Usage:

            - If you want to change the name of the user in the transcript, set this. Example, here is what the
            transcript would look like with `userName` set to 'Seller':

            ```

            Seller: Hello, how are you?

            AI: I'm fine.

            Seller: Do you want to buy a car?

            AI: No.

            ```


            @default 'User'
      title: TranscriptPlan
    CreateStructuredOutputDtoType:
      type: string
      enum:
        - ai
        - regex
      default: ai
      description: |-
        This is the type of structured output.

        - 'ai': Uses an LLM to extract structured data from the conversation (default).
        - 'regex': Uses a regex pattern to extract data from the transcript without an LLM.

        Defaults to 'ai' if not specified.
      title: CreateStructuredOutputDtoType
    WorkflowOpenAiModelProvider:
      type: string
      enum:
        - openai
      description: This is the provider of the model (`openai`).
      title: WorkflowOpenAiModelProvider
    WorkflowOpenAiModelModel:
      type: string
      enum:
        - gpt-5.4
        - gpt-5.4-mini
        - gpt-5.4-nano
        - gpt-5.2
        - gpt-5.2-chat-latest
        - gpt-5.1
        - gpt-5.1-chat-latest
        - gpt-5
        - gpt-5-chat-latest
        - gpt-5-mini
        - gpt-5-nano
        - gpt-4.1-2025-04-14
        - gpt-4.1-mini-2025-04-14
        - gpt-4.1-nano-2025-04-14
        - gpt-4.1
        - gpt-4.1-mini
        - gpt-4.1-nano
        - chatgpt-4o-latest
        - o3
        - o3-mini
        - o4-mini
        - o1-mini
        - o1-mini-2024-09-12
        - gpt-4o-mini-2024-07-18
        - gpt-4o-mini
        - gpt-4o
        - gpt-4o-2024-05-13
        - gpt-4o-2024-08-06
        - gpt-4o-2024-11-20
        - gpt-4-turbo
        - gpt-4-turbo-2024-04-09
        - gpt-4-turbo-preview
        - gpt-4-0125-preview
        - gpt-4-1106-preview
        - gpt-4
        - gpt-4-0613
        - gpt-3.5-turbo
        - gpt-3.5-turbo-0125
        - gpt-3.5-turbo-1106
        - gpt-3.5-turbo-16k
        - gpt-3.5-turbo-0613
        - gpt-4.1-2025-04-14:westus
        - gpt-4.1-2025-04-14:eastus2
        - gpt-4.1-2025-04-14:eastus
        - gpt-4.1-2025-04-14:westus3
        - gpt-4.1-2025-04-14:northcentralus
        - gpt-4.1-2025-04-14:southcentralus
        - gpt-4.1-2025-04-14:westeurope
        - gpt-4.1-2025-04-14:germanywestcentral
        - gpt-4.1-2025-04-14:polandcentral
        - gpt-4.1-2025-04-14:spaincentral
        - gpt-4.1-mini-2025-04-14:westus
        - gpt-4.1-mini-2025-04-14:eastus2
        - gpt-4.1-mini-2025-04-14:eastus
        - gpt-4.1-mini-2025-04-14:westus3
        - gpt-4.1-mini-2025-04-14:northcentralus
        - gpt-4.1-mini-2025-04-14:southcentralus
        - gpt-4.1-mini-2025-04-14:westeurope
        - gpt-4.1-mini-2025-04-14:germanywestcentral
        - gpt-4.1-mini-2025-04-14:polandcentral
        - gpt-4.1-mini-2025-04-14:spaincentral
        - gpt-4.1-nano-2025-04-14:westus
        - gpt-4.1-nano-2025-04-14:eastus2
        - gpt-4.1-nano-2025-04-14:westus3
        - gpt-4.1-nano-2025-04-14:northcentralus
        - gpt-4.1-nano-2025-04-14:southcentralus
        - gpt-4o-2024-11-20:swedencentral
        - gpt-4o-2024-11-20:westus
        - gpt-4o-2024-11-20:eastus2
        - gpt-4o-2024-11-20:eastus
        - gpt-4o-2024-11-20:westus3
        - gpt-4o-2024-11-20:southcentralus
        - gpt-4o-2024-11-20:westeurope
        - gpt-4o-2024-11-20:germanywestcentral
        - gpt-4o-2024-11-20:polandcentral
        - gpt-4o-2024-11-20:spaincentral
        - gpt-4o-2024-08-06:westus
        - gpt-4o-2024-08-06:westus3
        - gpt-4o-2024-08-06:eastus
        - gpt-4o-2024-08-06:eastus2
        - gpt-4o-2024-08-06:northcentralus
        - gpt-4o-2024-08-06:southcentralus
        - gpt-4o-mini-2024-07-18:westus
        - gpt-4o-mini-2024-07-18:westus3
        - gpt-4o-mini-2024-07-18:eastus
        - gpt-4o-mini-2024-07-18:eastus2
        - gpt-4o-mini-2024-07-18:northcentralus
        - gpt-4o-mini-2024-07-18:southcentralus
        - gpt-4o-2024-05-13:eastus2
        - gpt-4o-2024-05-13:eastus
        - gpt-4o-2024-05-13:northcentralus
        - gpt-4o-2024-05-13:southcentralus
        - gpt-4o-2024-05-13:westus3
        - gpt-4o-2024-05-13:westus
        - gpt-4-turbo-2024-04-09:eastus2
        - gpt-4-0125-preview:eastus
        - gpt-4-0125-preview:northcentralus
        - gpt-4-0125-preview:southcentralus
        - gpt-4-1106-preview:australiaeast
        - gpt-4-1106-preview:canadaeast
        - gpt-4-1106-preview:france
        - gpt-4-1106-preview:india
        - gpt-4-1106-preview:norway
        - gpt-4-1106-preview:swedencentral
        - gpt-4-1106-preview:uk
        - gpt-4-1106-preview:westus
        - gpt-4-1106-preview:westus3
        - gpt-4-0613:canadaeast
        - gpt-3.5-turbo-0125:canadaeast
        - gpt-3.5-turbo-0125:northcentralus
        - gpt-3.5-turbo-0125:southcentralus
        - gpt-3.5-turbo-1106:canadaeast
        - gpt-3.5-turbo-1106:westus
      description: >-
        This is the OpenAI model that will be used.


        When using Vapi OpenAI or your own Azure Credentials, you have the option to specify the region for the selected
        model. This shouldn't be specified unless you have a specific reason to do so. Vapi will automatically find the
        fastest region that make sense.

        This is helpful when you are required to comply with Data Residency rules. Learn more about Azure regions here
        https://azure.microsoft.com/en-us/explore/global-infrastructure/data-residency/.
      title: WorkflowOpenAiModelModel
    WorkflowOpenAIModel:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/WorkflowOpenAiModelProvider'
          description: This is the provider of the model (`openai`).
        model:
          $ref: '#/components/schemas/WorkflowOpenAiModelModel'
          description: >-
            This is the OpenAI model that will be used.


            When using Vapi OpenAI or your own Azure Credentials, you have the option to specify the region for the
            selected model. This shouldn't be specified unless you have a specific reason to do so. Vapi will
            automatically find the fastest region that make sense.

            This is helpful when you are required to comply with Data Residency rules. Learn more about Azure regions
            here https://azure.microsoft.com/en-us/explore/global-infrastructure/data-residency/.
        temperature:
          type: number
          format: double
          description: This is the temperature of the model.
        maxTokens:
          type: number
          format: double
          description: This is the max tokens of the model.
      required:
        - provider
        - model
      title: WorkflowOpenAIModel
    WorkflowAnthropicModelProvider:
      type: string
      enum:
        - anthropic
      description: This is the provider of the model (`anthropic`).
      title: WorkflowAnthropicModelProvider
    WorkflowAnthropicModelModel:
      type: string
      enum:
        - claude-3-opus-20240229
        - claude-3-sonnet-20240229
        - claude-3-haiku-20240307
        - claude-3-5-sonnet-20240620
        - claude-3-5-sonnet-20241022
        - claude-3-5-haiku-20241022
        - claude-3-7-sonnet-20250219
        - claude-opus-4-20250514
        - claude-opus-4-5-20251101
        - claude-opus-4-6
        - claude-sonnet-4-20250514
        - claude-sonnet-4-5-20250929
        - claude-sonnet-4-6
        - claude-haiku-4-5-20251001
      description: This is the specific model that will be used.
      title: WorkflowAnthropicModelModel
    WorkflowAnthropicModel:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/WorkflowAnthropicModelProvider'
          description: This is the provider of the model (`anthropic`).
        model:
          $ref: '#/components/schemas/WorkflowAnthropicModelModel'
          description: This is the specific model that will be used.
        thinking:
          $ref: '#/components/schemas/AnthropicThinkingConfig'
          description: |-
            This is the optional configuration for Anthropic's thinking feature.

            - If provided, `maxTokens` must be greater than `thinking.budgetTokens`.
        temperature:
          type: number
          format: double
          description: This is the temperature of the model.
        maxTokens:
          type: number
          format: double
          description: This is the max tokens of the model.
      required:
        - provider
        - model
      title: WorkflowAnthropicModel
    WorkflowAnthropicBedrockModelProvider:
      type: string
      enum:
        - anthropic-bedrock
      description: This is the provider of the model (`anthropic-bedrock`).
      title: WorkflowAnthropicBedrockModelProvider
    WorkflowAnthropicBedrockModelModel:
      type: string
      enum:
        - claude-3-opus-20240229
        - claude-3-sonnet-20240229
        - claude-3-haiku-20240307
        - claude-3-5-sonnet-20240620
        - claude-3-5-sonnet-20241022
        - claude-3-5-haiku-20241022
        - claude-3-7-sonnet-20250219
        - claude-opus-4-20250514
        - claude-opus-4-5-20251101
        - claude-opus-4-6
        - claude-sonnet-4-20250514
        - claude-sonnet-4-5-20250929
        - claude-sonnet-4-6
        - claude-haiku-4-5-20251001
      description: This is the specific model that will be used.
      title: WorkflowAnthropicBedrockModelModel
    WorkflowAnthropicBedrockModel:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/WorkflowAnthropicBedrockModelProvider'
          description: This is the provider of the model (`anthropic-bedrock`).
        model:
          $ref: '#/components/schemas/WorkflowAnthropicBedrockModelModel'
          description: This is the specific model that will be used.
        thinking:
          $ref: '#/components/schemas/AnthropicThinkingConfig'
          description: |-
            This is the optional configuration for Anthropic's thinking feature.

            - If provided, `maxTokens` must be greater than `thinking.budgetTokens`.
        temperature:
          type: number
          format: double
          description: This is the temperature of the model.
        maxTokens:
          type: number
          format: double
          description: This is the max tokens of the model.
      required:
        - provider
        - model
      title: WorkflowAnthropicBedrockModel
    WorkflowGoogleModelProvider:
      type: string
      enum:
        - google
      description: This is the provider of the model (`google`).
      title: WorkflowGoogleModelProvider
    WorkflowGoogleModelModel:
      type: string
      enum:
        - gemini-3-flash-preview
        - gemini-2.5-pro
        - gemini-2.5-flash
        - gemini-2.5-flash-lite
        - gemini-2.0-flash-thinking-exp
        - gemini-2.0-pro-exp-02-05
        - gemini-2.0-flash
        - gemini-2.0-flash-lite
        - gemini-2.0-flash-exp
        - gemini-2.0-flash-realtime-exp
        - gemini-1.5-flash
        - gemini-1.5-flash-002
        - gemini-1.5-pro
        - gemini-1.5-pro-002
        - gemini-1.0-pro
      description: This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b
      title: WorkflowGoogleModelModel
    WorkflowGoogleModel:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/WorkflowGoogleModelProvider'
          description: This is the provider of the model (`google`).
        model:
          $ref: '#/components/schemas/WorkflowGoogleModelModel'
          description: This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b
        temperature:
          type: number
          format: double
          description: This is the temperature of the model.
        maxTokens:
          type: number
          format: double
          description: This is the max tokens of the model.
      required:
        - provider
        - model
      title: WorkflowGoogleModel
    WorkflowCustomModelProvider:
      type: string
      enum:
        - custom-llm
      description: This is the provider of the model (`custom-llm`).
      title: WorkflowCustomModelProvider
    WorkflowCustomModelMetadataSendMode:
      type: string
      enum:
        - 'off'
        - variable
        - destructured
      description: >-
        This determines whether metadata is sent in requests to the custom provider.


        - `off` will not send any metadata. payload will look like `{ messages }`

        - `variable` will send `assistant.metadata` as a variable on the payload. payload will look like `{ messages,
        metadata }`

        - `destructured` will send `assistant.metadata` fields directly on the payload. payload will look like `{
        messages, ...metadata }`


        Further, `variable` and `destructured` will send `call`, `phoneNumber`, and `customer` objects in the payload.


        Default is `variable`.
      title: WorkflowCustomModelMetadataSendMode
    WorkflowCustomModelHeaders:
      type: object
      properties: {}
      description: These are the headers we'll use for the OpenAI client's `headers`.
      title: WorkflowCustomModelHeaders
    WorkflowCustomModel:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/WorkflowCustomModelProvider'
          description: This is the provider of the model (`custom-llm`).
        metadataSendMode:
          $ref: '#/components/schemas/WorkflowCustomModelMetadataSendMode'
          description: >-
            This determines whether metadata is sent in requests to the custom provider.


            - `off` will not send any metadata. payload will look like `{ messages }`

            - `variable` will send `assistant.metadata` as a variable on the payload. payload will look like `{
            messages, metadata }`

            - `destructured` will send `assistant.metadata` fields directly on the payload. payload will look like `{
            messages, ...metadata }`


            Further, `variable` and `destructured` will send `call`, `phoneNumber`, and `customer` objects in the
            payload.


            Default is `variable`.
        url:
          type: string
          description: These is the URL we'll use for the OpenAI client's `baseURL`. Ex. https://openrouter.ai/api/v1
        headers:
          $ref: '#/components/schemas/WorkflowCustomModelHeaders'
          description: These are the headers we'll use for the OpenAI client's `headers`.
        timeoutSeconds:
          type: number
          format: double
          description: >-
            This sets the timeout for the connection to the custom provider without needing to stream any tokens back.
            Default is 20 seconds.
        model:
          type: string
          description: This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b
        temperature:
          type: number
          format: double
          description: This is the temperature of the model.
        maxTokens:
          type: number
          format: double
          description: This is the max tokens of the model.
      required:
        - provider
        - url
        - model
      title: WorkflowCustomModel
    CreateStructuredOutputDtoModel:
      oneOf:
        - $ref: '#/components/schemas/WorkflowOpenAIModel'
        - $ref: '#/components/schemas/WorkflowAnthropicModel'
        - $ref: '#/components/schemas/WorkflowAnthropicBedrockModel'
        - $ref: '#/components/schemas/WorkflowGoogleModel'
        - $ref: '#/components/schemas/WorkflowCustomModel'
      description: >-
        This is the model that will be used to extract the structured output.


        To provide your own custom system and user prompts for structured output extraction, populate the messages array
        with your system and user messages. You can specify liquid templating in your system and user messages.

        Between the system or user messages, you must reference either 'transcript' or 'messages' with the `{{}}` syntax
        to access the conversation history.

        Between the system or user messages, you must reference a variation of the structured output with the `{{}}`
        syntax to access the structured output definition.

        i.e.:

        `{{structuredOutput}}`

        `{{structuredOutput.name}}`

        `{{structuredOutput.description}}`

        `{{structuredOutput.schema}}`


        If model is not specified, GPT-4.1 will be used by default for extraction, utilizing default system and user
        prompts.

        If messages or required fields are not specified, the default system and user prompts will be used.
      title: CreateStructuredOutputDtoModel
    ComplianceOverride:
      type: object
      properties:
        forceStoreOnHipaaEnabled:
          type: boolean
          description: Force storage for this output under HIPAA. Only enable if output contains no sensitive data.
      title: ComplianceOverride
    CreateStructuredOutputDTO:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/CreateStructuredOutputDtoType'
          description: |-
            This is the type of structured output.

            - 'ai': Uses an LLM to extract structured data from the conversation (default).
            - 'regex': Uses a regex pattern to extract data from the transcript without an LLM.

            Defaults to 'ai' if not specified.
        regex:
          type: string
          description: |-
            This is the regex pattern to match against the transcript.

            Only used when type is 'regex'. Supports both raw patterns (e.g. '\d+') and
            regex literal format (e.g. '/\d+/gi'). Uses RE2 syntax for safety.

            The result depends on the schema type:
            - boolean: true if the pattern matches, false otherwise
            - string: the first match or first capture group
            - number/integer: the first match parsed as a number
            - array: all matches
        model:
          $ref: '#/components/schemas/CreateStructuredOutputDtoModel'
          description: >-
            This is the model that will be used to extract the structured output.


            To provide your own custom system and user prompts for structured output extraction, populate the messages
            array with your system and user messages. You can specify liquid templating in your system and user
            messages.

            Between the system or user messages, you must reference either 'transcript' or 'messages' with the `{{}}`
            syntax to access the conversation history.

            Between the system or user messages, you must reference a variation of the structured output with the `{{}}`
            syntax to access the structured output definition.

            i.e.:

            `{{structuredOutput}}`

            `{{structuredOutput.name}}`

            `{{structuredOutput.description}}`

            `{{structuredOutput.schema}}`


            If model is not specified, GPT-4.1 will be used by default for extraction, utilizing default system and user
            prompts.

            If messages or required fields are not specified, the default system and user prompts will be used.
        compliancePlan:
          $ref: '#/components/schemas/ComplianceOverride'
          description: Compliance configuration for this output. Only enable overrides if no sensitive data will be stored.
        name:
          type: string
          description: This is the name of the structured output.
        schema:
          $ref: '#/components/schemas/JsonSchema'
          description: >-
            This is the JSON Schema definition for the structured output.


            This is required when creating a structured output. Defines the structure and validation rules for the data
            that will be extracted. Supports all JSON Schema features including:

            - Objects and nested properties

            - Arrays and array validation

            - String, number, boolean, and null types

            - Enums and const values

            - Validation constraints (min/max, patterns, etc.)

            - Composition with allOf, anyOf, oneOf
        description:
          type: string
          description: |-
            This is the description of what the structured output extracts.

            Use this to provide context about what data will be extracted and how it will be used.
        assistantIds:
          type: array
          items:
            type: string
          description: >-
            These are the assistant IDs that this structured output is linked to.


            When linked to assistants, this structured output will be available for extraction during those assistant's
            calls.
        workflowIds:
          type: array
          items:
            type: string
          description: >-
            These are the workflow IDs that this structured output is linked to.


            When linked to workflows, this structured output will be available for extraction during those workflow's
            execution.
      required:
        - name
        - schema
      title: CreateStructuredOutputDTO
    ScorecardMetricConditionsItems:
      type: object
      properties: {}
      title: ScorecardMetricConditionsItems
    ScorecardMetric:
      type: object
      properties:
        structuredOutputId:
          type: string
          description: |-
            This is the unique identifier for the structured output that will be used to evaluate the scorecard.
            The structured output must be of type number or boolean only for now.
        conditions:
          type: array
          items:
            $ref: '#/components/schemas/ScorecardMetricConditionsItems'
          description: |-
            These are the conditions that will be used to evaluate the scorecard.
            Each condition will have a comparator, value, and points that will be used to calculate the final score.
            The points will be added to the overall score if the condition is met.
            The overall score will be normalized to a 100 point scale to ensure uniformity across different scorecards.
      required:
        - structuredOutputId
        - conditions
      title: ScorecardMetric
    CreateScorecardDTO:
      type: object
      properties:
        name:
          type: string
          description: This is the name of the scorecard. It is only for user reference and will not be used for any evaluation.
        description:
          type: string
          description: >-
            This is the description of the scorecard. It is only for user reference and will not be used for any
            evaluation.
        metrics:
          type: array
          items:
            $ref: '#/components/schemas/ScorecardMetric'
          description: |-
            These are the metrics that will be used to evaluate the scorecard.
            Each metric will have a set of conditions and points that will be used to generate the score.
        assistantIds:
          type: array
          items:
            type: string
          description: |-
            These are the assistant IDs that this scorecard is linked to.
            When linked to assistants, this scorecard will be available for evaluation during those assistants' calls.
      required:
        - metrics
      title: CreateScorecardDTO
    ArtifactPlan:
      type: object
      properties:
        recordingEnabled:
          type: boolean
          description: >-
            This determines whether assistant's calls are recorded. Defaults to true.


            Usage:

            - If you don't want to record the calls, set this to false.

            - If you want to record the calls when `assistant.hipaaEnabled` (deprecated) or
            `assistant.compliancePlan.hipaaEnabled` explicity set this to true and make sure to provide S3 or GCP
            credentials on the Provider Credentials page in the Dashboard.


            You can find the recording at `call.artifact.recordingUrl` and `call.artifact.stereoRecordingUrl` after the
            call is ended.


            @default true
        recordingFormat:
          $ref: '#/components/schemas/ArtifactPlanRecordingFormat'
          description: |-
            This determines the format of the recording. Defaults to `wav;l16`.

            @default 'wav;l16'
        recordingUseCustomStorageEnabled:
          type: boolean
          description: >-
            This determines whether to use custom storage (S3 or GCP) for call recordings when storage credentials are
            configured.


            When set to false, recordings will be stored on Vapi's storage instead of your custom storage, even if you
            have custom storage credentials configured.


            Usage:

            - Set to false if you have custom storage configured but want to store recordings on Vapi's storage for this
            assistant.

            - Set to true (or leave unset) to use your custom storage for recordings when available.


            @default true
        videoRecordingEnabled:
          type: boolean
          description: >-
            This determines whether the video is recorded during the call. Defaults to false. Only relevant for
            `webCall` type.


            You can find the video recording at `call.artifact.videoRecordingUrl` after the call is ended.


            @default false
        fullMessageHistoryEnabled:
          type: boolean
          description: >-
            This determines whether the artifact contains the full message history, even after handoff context
            engineering. Defaults to false.
        pcapEnabled:
          type: boolean
          description: >-
            This determines whether the SIP packet capture is enabled. Defaults to true. Only relevant for `phone` type
            calls where phone number's provider is `vapi` or `byo-phone-number`.


            You can find the packet capture at `call.artifact.pcapUrl` after the call is ended.


            @default true
        pcapS3PathPrefix:
          type: string
          description: >-
            This is the path where the SIP packet capture will be uploaded. This is only used if you have provided S3 or
            GCP credentials on the Provider Credentials page in the Dashboard.


            If credential.s3PathPrefix or credential.bucketPlan.path is set, this will append to it.


            Usage:

            - If you want to upload the packet capture to a specific path, set this to the path. Example:
            `/my-assistant-captures`.

            - If you want to upload the packet capture to the root of the bucket, set this to `/`.


            @default '/'
        pcapUseCustomStorageEnabled:
          type: boolean
          description: >-
            This determines whether to use custom storage (S3 or GCP) for SIP packet captures when storage credentials
            are configured.


            When set to false, packet captures will be stored on Vapi's storage instead of your custom storage, even if
            you have custom storage credentials configured.


            Usage:

            - Set to false if you have custom storage configured but want to store packet captures on Vapi's storage for
            this assistant.

            - Set to true (or leave unset) to use your custom storage for packet captures when available.


            @default true
        loggingEnabled:
          type: boolean
          description: |-
            This determines whether the call logs are enabled. Defaults to true.

            @default true
        loggingUseCustomStorageEnabled:
          type: boolean
          description: >-
            This determines whether to use custom storage (S3 or GCP) for call logs when storage credentials are
            configured.


            When set to false, logs will be stored on Vapi's storage instead of your custom storage, even if you have
            custom storage credentials configured.


            Usage:

            - Set to false if you have custom storage configured but want to store logs on Vapi's storage for this
            assistant.

            - Set to true (or leave unset) to use your custom storage for logs when available.


            @default true
        transcriptPlan:
          $ref: '#/components/schemas/TranscriptPlan'
          description: This is the plan for `call.artifact.transcript`. To disable, set `transcriptPlan.enabled` to false.
        recordingPath:
          type: string
          description: >-
            This is the path where the recording will be uploaded. This is only used if you have provided S3 or GCP
            credentials on the Provider Credentials page in the Dashboard.


            If credential.s3PathPrefix or credential.bucketPlan.path is set, this will append to it.


            Usage:

            - If you want to upload the recording to a specific path, set this to the path. Example:
            `/my-assistant-recordings`.

            - If you want to upload the recording to the root of the bucket, set this to `/`.


            @default '/'
        structuredOutputIds:
          type: array
          items:
            type: string
          description: |-
            This is an array of structured output IDs to be calculated during the call.
            The outputs will be extracted and stored in `call.artifact.structuredOutputs` after the call is ended.
        structuredOutputs:
          type: array
          items:
            $ref: '#/components/schemas/CreateStructuredOutputDTO'
          description: >-
            This is an array of transient structured outputs to be calculated during the call.

            The outputs will be extracted and stored in `call.artifact.structuredOutputs` after the call is ended.

            Use this to provide inline structured output configurations instead of referencing existing ones via
            structuredOutputIds.
        scorecardIds:
          type: array
          items:
            type: string
          description: >-
            This is an array of scorecard IDs that will be evaluated based on the structured outputs extracted during
            the call.

            The scorecards will be evaluated and the results will be stored in `call.artifact.scorecards` after the call
            has ended.
        scorecards:
          type: array
          items:
            $ref: '#/components/schemas/CreateScorecardDTO'
          description: >-
            This is the array of scorecards that will be evaluated based on the structured outputs extracted during the
            call.

            The scorecards will be evaluated and the results will be stored in `call.artifact.scorecards` after the call
            has ended.
        loggingPath:
          type: string
          description: >-
            This is the path where the call logs will be uploaded. This is only used if you have provided S3 or GCP
            credentials on the Provider Credentials page in the Dashboard.


            If credential.s3PathPrefix or credential.bucketPlan.path is set, this will append to it.


            Usage:

            - If you want to upload the call logs to a specific path, set this to the path. Example:
            `/my-assistant-logs`.

            - If you want to upload the call logs to the root of the bucket, set this to `/`.


            @default '/'
      title: ArtifactPlan
    StartSpeakingPlanSmartEndpointingEnabled1:
      type: string
      enum:
        - livekit
      title: StartSpeakingPlanSmartEndpointingEnabled1
    StartSpeakingPlanSmartEndpointingEnabled:
      oneOf:
        - type: boolean
        - $ref: '#/components/schemas/StartSpeakingPlanSmartEndpointingEnabled1'
      title: StartSpeakingPlanSmartEndpointingEnabled
    VapiSmartEndpointingPlanProvider:
      type: string
      enum:
        - vapi
        - livekit
        - custom-endpointing-model
      description: This is the provider for the smart endpointing plan.
      title: VapiSmartEndpointingPlanProvider
    VapiSmartEndpointingPlan:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/VapiSmartEndpointingPlanProvider'
          description: This is the provider for the smart endpointing plan.
      required:
        - provider
      title: VapiSmartEndpointingPlan
    LivekitSmartEndpointingPlanProvider:
      type: string
      enum:
        - vapi
        - livekit
        - custom-endpointing-model
      description: This is the provider for the smart endpointing plan.
      title: LivekitSmartEndpointingPlanProvider
    LivekitSmartEndpointingPlan:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/LivekitSmartEndpointingPlanProvider'
          description: This is the provider for the smart endpointing plan.
        waitFunction:
          type: string
          description: >-
            This expression describes how long the bot will wait to start speaking based on the likelihood that the user
            has reached an endpoint.


            This is a millisecond valued function. It maps probabilities (real numbers on [0,1]) to milliseconds that
            the bot should wait before speaking ([0, \infty]). Any negative values that are returned are set to zero
            (the bot can't start talking in the past).


            A probability of zero represents very high confidence that the caller has stopped speaking, and would like
            the bot to speak to them. A probability of one represents very high confidence that the caller is still
            speaking.


            Under the hood, this is parsed into a mathjs expression. Whatever you use to write your expression needs to
            be valid with respect to mathjs


            @default "20 + 500 * sqrt(x) + 2500 * x^3"
      required:
        - provider
      title: LivekitSmartEndpointingPlan
    CustomEndpointingModelSmartEndpointingPlanProvider:
      type: string
      enum:
        - vapi
        - livekit
        - custom-endpointing-model
      description: >-
        This is the provider for the smart endpointing plan. Use `custom-endpointing-model` for custom endpointing
        providers that are not natively supported.
      title: CustomEndpointingModelSmartEndpointingPlanProvider
    CustomEndpointingModelSmartEndpointingPlan:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/CustomEndpointingModelSmartEndpointingPlanProvider'
          description: >-
            This is the provider for the smart endpointing plan. Use `custom-endpointing-model` for custom endpointing
            providers that are not natively supported.
        server:
          $ref: '#/components/schemas/Server'
          description: >-
            This is where the endpointing request will be sent. If not provided, will be sent to `assistant.server`. If
            that does not exist either, will be sent to `org.server`.


            Request Example:


            POST https://{server.url}

            Content-Type: application/json


            {
              "message": {
                "type": "call.endpointing.request",
                "messages": [
                  {
                    "role": "user",
                    "message": "Hello, how are you?",
                    "time": 1234567890,
                    "secondsFromStart": 0
                  }
                ],
                ...other metadata about the call...
              }
            }


            Response Expected:

            {
              "timeoutSeconds": 0.5
            }


            The timeout is the number of seconds to wait before considering the user's speech as finished. The
            endpointing timeout is automatically reset each time a new transcript is received (and another
            `call.endpointing.request` is sent).
      required:
        - provider
      title: CustomEndpointingModelSmartEndpointingPlan
    StartSpeakingPlanSmartEndpointingPlan:
      oneOf:
        - $ref: '#/components/schemas/VapiSmartEndpointingPlan'
        - $ref: '#/components/schemas/LivekitSmartEndpointingPlan'
        - $ref: '#/components/schemas/CustomEndpointingModelSmartEndpointingPlan'
      description: >-
        This is the plan for smart endpointing. Pick between Vapi smart endpointing, LiveKit, or custom endpointing
        model (or nothing). We strongly recommend using livekit endpointing when working in English. LiveKit endpointing
        is not supported in other languages, yet.


        If this is set, it will override and take precedence over `transcriptionEndpointingPlan`.

        This plan will still be overridden by any matching `customEndpointingRules`.


        If this is not set, the system will automatically use the transcriber's built-in endpointing capabilities if
        available.
      title: StartSpeakingPlanSmartEndpointingPlan
    AssistantCustomEndpointingRuleType:
      type: string
      enum:
        - assistant
      description: >-
        This endpointing rule is based on the last assistant message before customer started speaking.


        Flow:

        - Assistant speaks

        - Customer starts speaking

        - Customer transcription comes in

        - This rule is evaluated on the last assistant message

        - If a match is found based on `regex`, the endpointing timeout is set to `timeoutSeconds`


        Usage:

        - If you have yes/no questions in your use case like "are you interested in a loan?", you can set a shorter
        timeout.

        - If you have questions where the customer may pause to look up information like "what's my account number?",
        you can set a longer timeout.
      title: AssistantCustomEndpointingRuleType
    AssistantCustomEndpointingRule:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/AssistantCustomEndpointingRuleType'
          description: >-
            This endpointing rule is based on the last assistant message before customer started speaking.


            Flow:

            - Assistant speaks

            - Customer starts speaking

            - Customer transcription comes in

            - This rule is evaluated on the last assistant message

            - If a match is found based on `regex`, the endpointing timeout is set to `timeoutSeconds`


            Usage:

            - If you have yes/no questions in your use case like "are you interested in a loan?", you can set a shorter
            timeout.

            - If you have questions where the customer may pause to look up information like "what's my account
            number?", you can set a longer timeout.
        regex:
          type: string
          description: >-
            This is the regex pattern to match.


            Note:

            - This works by using the `RegExp.test` method in Node.JS. Eg. `/hello/.test("hello there")` will return
            `true`.


            Hot tip:

            - In JavaScript, escape `\` when sending the regex pattern. Eg. `"hello\sthere"` will be sent over the wire
            as `"hellosthere"`. Send `"hello\\sthere"` instead.

            - `RegExp.test` does substring matching, so `/cat/.test("I love cats")` will return `true`. To do full
            string matching, send "^cat$".
        regexOptions:
          type: array
          items:
            $ref: '#/components/schemas/RegexOption'
          description: |-
            These are the options for the regex match. Defaults to all disabled.

            @default []
        timeoutSeconds:
          type: number
          format: double
          description: This is the endpointing timeout in seconds, if the rule is matched.
      required:
        - type
        - regex
        - timeoutSeconds
      title: AssistantCustomEndpointingRule
    CustomerCustomEndpointingRuleType:
      type: string
      enum:
        - customer
      description: |-
        This endpointing rule is based on current customer message as they are speaking.

        Flow:
        - Assistant speaks
        - Customer starts speaking
        - Customer transcription comes in
        - This rule is evaluated on the current customer transcription
        - If a match is found based on `regex`, the endpointing timeout is set to `timeoutSeconds`

        Usage:
        - If you want to wait longer while customer is speaking numbers, you can set a longer timeout.
      title: CustomerCustomEndpointingRuleType
    CustomerCustomEndpointingRule:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/CustomerCustomEndpointingRuleType'
          description: |-
            This endpointing rule is based on current customer message as they are speaking.

            Flow:
            - Assistant speaks
            - Customer starts speaking
            - Customer transcription comes in
            - This rule is evaluated on the current customer transcription
            - If a match is found based on `regex`, the endpointing timeout is set to `timeoutSeconds`

            Usage:
            - If you want to wait longer while customer is speaking numbers, you can set a longer timeout.
        regex:
          type: string
          description: >-
            This is the regex pattern to match.


            Note:

            - This works by using the `RegExp.test` method in Node.JS. Eg. `/hello/.test("hello there")` will return
            `true`.


            Hot tip:

            - In JavaScript, escape `\` when sending the regex pattern. Eg. `"hello\sthere"` will be sent over the wire
            as `"hellosthere"`. Send `"hello\\sthere"` instead.

            - `RegExp.test` does substring matching, so `/cat/.test("I love cats")` will return `true`. To do full
            string matching, send "^cat$".
        regexOptions:
          type: array
          items:
            $ref: '#/components/schemas/RegexOption'
          description: |-
            These are the options for the regex match. Defaults to all disabled.

            @default []
        timeoutSeconds:
          type: number
          format: double
          description: This is the endpointing timeout in seconds, if the rule is matched.
      required:
        - type
        - regex
        - timeoutSeconds
      title: CustomerCustomEndpointingRule
    BothCustomEndpointingRuleType:
      type: string
      enum:
        - both
      description: >-
        This endpointing rule is based on both the last assistant message and the current customer message as they are
        speaking.


        Flow:

        - Assistant speaks

        - Customer starts speaking

        - Customer transcription comes in

        - This rule is evaluated on the last assistant message and the current customer transcription

        - If assistant message matches `assistantRegex` AND customer message matches `customerRegex`, the endpointing
        timeout is set to `timeoutSeconds`


        Usage:

        - If you want to wait longer while customer is speaking numbers, you can set a longer timeout.
      title: BothCustomEndpointingRuleType
    BothCustomEndpointingRule:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/BothCustomEndpointingRuleType'
          description: >-
            This endpointing rule is based on both the last assistant message and the current customer message as they
            are speaking.


            Flow:

            - Assistant speaks

            - Customer starts speaking

            - Customer transcription comes in

            - This rule is evaluated on the last assistant message and the current customer transcription

            - If assistant message matches `assistantRegex` AND customer message matches `customerRegex`, the
            endpointing timeout is set to `timeoutSeconds`


            Usage:

            - If you want to wait longer while customer is speaking numbers, you can set a longer timeout.
        assistantRegex:
          type: string
          description: >-
            This is the regex pattern to match the assistant's message.


            Note:

            - This works by using the `RegExp.test` method in Node.JS. Eg. `/hello/.test("hello there")` will return
            `true`.


            Hot tip:

            - In JavaScript, escape `\` when sending the regex pattern. Eg. `"hello\sthere"` will be sent over the wire
            as `"hellosthere"`. Send `"hello\\sthere"` instead.

            - `RegExp.test` does substring matching, so `/cat/.test("I love cats")` will return `true`. To do full
            string matching, send "^cat$".
        assistantRegexOptions:
          type: array
          items:
            $ref: '#/components/schemas/RegexOption'
          description: |-
            These are the options for the assistant's message regex match. Defaults to all disabled.

            @default []
        customerRegex:
          type: string
        customerRegexOptions:
          type: array
          items:
            $ref: '#/components/schemas/RegexOption'
          description: |-
            These are the options for the customer's message regex match. Defaults to all disabled.

            @default []
        timeoutSeconds:
          type: number
          format: double
          description: This is the endpointing timeout in seconds, if the rule is matched.
      required:
        - type
        - assistantRegex
        - customerRegex
        - timeoutSeconds
      title: BothCustomEndpointingRule
    StartSpeakingPlanCustomEndpointingRulesItems:
      oneOf:
        - $ref: '#/components/schemas/AssistantCustomEndpointingRule'
        - $ref: '#/components/schemas/CustomerCustomEndpointingRule'
        - $ref: '#/components/schemas/BothCustomEndpointingRule'
      title: StartSpeakingPlanCustomEndpointingRulesItems
    TranscriptionEndpointingPlan:
      type: object
      properties:
        onPunctuationSeconds:
          type: number
          format: double
          description: >-
            The minimum number of seconds to wait after transcription ending with punctuation before sending a request
            to the model. Defaults to 0.1.


            This setting exists because the transcriber punctuates the transcription when it's more confident that
            customer has completed a thought.


            @default 0.1
        onNoPunctuationSeconds:
          type: number
          format: double
          description: >-
            The minimum number of seconds to wait after transcription ending without punctuation before sending a
            request to the model. Defaults to 1.5.


            This setting exists to catch the cases where the transcriber was not confident enough to punctuate the
            transcription, but the customer is done and has been silent for a long time.


            @default 1.5
        onNumberSeconds:
          type: number
          format: double
          description: >-
            The minimum number of seconds to wait after transcription ending with a number before sending a request to
            the model. Defaults to 0.4.


            This setting exists because the transcriber will sometimes punctuate the transcription ending with a number,
            even though the customer hasn't uttered the full number. This happens commonly for long numbers when the
            customer reads the number in chunks.


            @default 0.5
      title: TranscriptionEndpointingPlan
    StartSpeakingPlan:
      type: object
      properties:
        waitSeconds:
          type: number
          format: double
          description: >-
            This is how long assistant waits before speaking. Defaults to 0.4.


            This is the minimum it will wait but if there is latency is the pipeline, this minimum will be exceeded.
            This is intended as a stopgap in case the pipeline is moving too fast.


            Example:

            - If model generates tokens and voice generates bytes within 100ms, the pipeline still waits 300ms before
            outputting speech.


            Usage:

            - If the customer is taking long pauses, set this to a higher value.

            - If the assistant is accidentally jumping in too much, set this to a higher value.


            @default 0.4
        smartEndpointingEnabled:
          $ref: '#/components/schemas/StartSpeakingPlanSmartEndpointingEnabled'
        smartEndpointingPlan:
          $ref: '#/components/schemas/StartSpeakingPlanSmartEndpointingPlan'
          description: >-
            This is the plan for smart endpointing. Pick between Vapi smart endpointing, LiveKit, or custom endpointing
            model (or nothing). We strongly recommend using livekit endpointing when working in English. LiveKit
            endpointing is not supported in other languages, yet.


            If this is set, it will override and take precedence over `transcriptionEndpointingPlan`.

            This plan will still be overridden by any matching `customEndpointingRules`.


            If this is not set, the system will automatically use the transcriber's built-in endpointing capabilities if
            available.
        customEndpointingRules:
          type: array
          items:
            $ref: '#/components/schemas/StartSpeakingPlanCustomEndpointingRulesItems'
          description: >-
            These are the custom endpointing rules to set an endpointing timeout based on a regex on the customer's
            speech or the assistant's last message.


            Usage:

            - If you have yes/no questions like "are you interested in a loan?", you can set a shorter timeout.

            - If you have questions where the customer may pause to look up information like "what's my account
            number?", you can set a longer timeout.

            - If you want to wait longer while customer is enumerating a list of numbers, you can set a longer timeout.


            These rules have the highest precedence and will override both `smartEndpointingPlan` and
            `transcriptionEndpointingPlan` when a rule is matched.


            The rules are evaluated in order and the first one that matches will be used.


            Order of precedence for endpointing:

            1. customEndpointingRules (if any match)

            2. smartEndpointingPlan (if set)

            3. transcriptionEndpointingPlan


            @default []
        transcriptionEndpointingPlan:
          $ref: '#/components/schemas/TranscriptionEndpointingPlan'
          description: >-
            This determines how a customer speech is considered done (endpointing) using the transcription of customer's
            speech.


            Once an endpoint is triggered, the request is sent to `assistant.model`.


            Note: This plan is only used if `smartEndpointingPlan` is not set and transcriber does not have built-in
            endpointing capabilities. If both are provided, `smartEndpointingPlan` takes precedence.

            This plan will also be overridden by any matching `customEndpointingRules`.
      title: StartSpeakingPlan
    StopSpeakingPlan:
      type: object
      properties:
        numWords:
          type: number
          format: double
          description: >-
            This is the number of words that the customer has to say before the assistant will stop talking.


            Words like "stop", "actually", "no", etc. will always interrupt immediately regardless of this value.


            Words like "okay", "yeah", "right" will never interrupt.


            When set to 0, `voiceSeconds` is used in addition to the transcriptions to determine the customer has
            started speaking.


            Defaults to 0.


            @default 0
        voiceSeconds:
          type: number
          format: double
          description: >-
            This is the seconds customer has to speak before the assistant stops talking. This uses the VAD (Voice
            Activity Detection) spike to determine if the customer has started speaking.


            Considerations:

            - A lower value might be more responsive but could potentially pick up non-speech sounds.

            - A higher value reduces false positives but might slightly delay the detection of speech onset.


            This is only used if `numWords` is set to 0.


            Defaults to 0.2


            @default 0.2
        backoffSeconds:
          type: number
          format: double
          description: |-
            This is the seconds to wait before the assistant will start talking again after being interrupted.

            Defaults to 1.

            @default 1
        acknowledgementPhrases:
          type: array
          items:
            type: string
          description: |-
            These are the phrases that will never interrupt the assistant, even if numWords threshold is met.
            These are typically acknowledgement or backchanneling phrases.
        interruptionPhrases:
          type: array
          items:
            type: string
          description: |-
            These are the phrases that will always interrupt the assistant immediately, regardless of numWords.
            These are typically phrases indicating disagreement or desire to stop.
      title: StopSpeakingPlan
    MonitorPlan:
      type: object
      properties:
        listenEnabled:
          type: boolean
          description: |-
            This determines whether the assistant's calls allow live listening. Defaults to true.

            Fetch `call.monitor.listenUrl` to get the live listening URL.

            @default true
        listenAuthenticationEnabled:
          type: boolean
          description: >-
            This enables authentication on the `call.monitor.listenUrl`.


            If `listenAuthenticationEnabled` is `true`, the `call.monitor.listenUrl` will require an `Authorization:
            Bearer <vapi-public-api-key>` header.


            @default false
        controlEnabled:
          type: boolean
          description: >-
            This determines whether the assistant's calls allow live control. Defaults to true.


            Fetch `call.monitor.controlUrl` to get the live control URL.


            To use, send any control message via a POST request to `call.monitor.controlUrl`. Here are the types of
            controls supported: https://docs.vapi.ai/api-reference/messages/client-inbound-message


            @default true
        controlAuthenticationEnabled:
          type: boolean
          description: >-
            This enables authentication on the `call.monitor.controlUrl`.


            If `controlAuthenticationEnabled` is `true`, the `call.monitor.controlUrl` will require an `Authorization:
            Bearer <vapi-public-api-key>` header.


            @default false
        monitorIds:
          type: array
          items:
            type: string
          description: |-
            This the set of monitor ids that are attached to the assistant.
            The source of truth for the monitor ids is the assistant_monitor join table.
            This field can be used for transient assistants and to update assistants with new monitor ids.

            @default []
      title: MonitorPlan
    KeypadInputPlanDelimiters:
      type: string
      enum:
        - '#'
        - '*'
        - ''
      description: |-
        This is the delimiter(s) that will be used to process the input.
        Can be '#', '*', or an empty array.
      title: KeypadInputPlanDelimiters
    KeypadInputPlan:
      type: object
      properties:
        enabled:
          type: boolean
          description: |-
            This keeps track of whether the user has enabled keypad input.
            By default, it is off.

            @default false
        timeoutSeconds:
          type: number
          format: double
          description: >-
            This is the time in seconds to wait before processing the input.

            If the input is not received within this time, the input will be ignored.

            If set to "off", the input will be processed when the user enters a delimiter or immediately if no delimiter
            is used.


            @default 2
        delimiters:
          $ref: '#/components/schemas/KeypadInputPlanDelimiters'
          description: |-
            This is the delimiter(s) that will be used to process the input.
            Can be '#', '*', or an empty array.
      title: KeypadInputPlan
    CreateAssistantDTO:
      type: object
      properties:
        transcriber:
          $ref: '#/components/schemas/CreateAssistantDtoTranscriber'
          description: These are the options for the assistant's transcriber.
        model:
          $ref: '#/components/schemas/CreateAssistantDtoModel'
          description: These are the options for the assistant's LLM.
        voice:
          $ref: '#/components/schemas/CreateAssistantDtoVoice'
          description: These are the options for the assistant's voice.
        firstMessage:
          type: string
          description: >-
            This is the first message that the assistant will say. This can also be a URL to a containerized audio file
            (mp3, wav, etc.).


            If unspecified, assistant will wait for user to speak and use the model to respond once they speak.
        firstMessageInterruptionsEnabled:
          type: boolean
          default: false
        firstMessageMode:
          $ref: '#/components/schemas/CreateAssistantDtoFirstMessageMode'
          description: >-
            This is the mode for the first message. Default is 'assistant-speaks-first'.


            Use:

            - 'assistant-speaks-first' to have the assistant speak first.

            - 'assistant-waits-for-user' to have the assistant wait for the user to speak first.

            - 'assistant-speaks-first-with-model-generated-message' to have the assistant speak first with a message
            generated by the model based on the conversation state. (`assistant.model.messages` at call start,
            `call.messages` at squad transfer points).


            @default 'assistant-speaks-first'
        voicemailDetection:
          $ref: '#/components/schemas/CreateAssistantDtoVoicemailDetection'
          description: >-
            These are the settings to configure or disable voicemail detection. Alternatively, voicemail detection can
            be configured using the model.tools=[VoicemailTool].

            By default, voicemail detection is disabled.
        clientMessages:
          $ref: '#/components/schemas/CreateAssistantDtoClientMessages'
          description: >-
            These are the messages that will be sent to your Client SDKs. Default is
            conversation-update,function-call,hang,model-output,speech-update,status-update,transfer-update,transcript,tool-calls,user-interrupted,voice-input,workflow.node.started,assistant.started.
            You can check the shape of the messages in ClientMessage schema.
        serverMessages:
          $ref: '#/components/schemas/CreateAssistantDtoServerMessages'
          description: >-
            These are the messages that will be sent to your Server URL. Default is
            conversation-update,end-of-call-report,function-call,hang,speech-update,status-update,tool-calls,transfer-destination-request,handoff-destination-request,user-interrupted,assistant.started.
            You can check the shape of the messages in ServerMessage schema.
        maxDurationSeconds:
          type: number
          format: double
          description: >-
            This is the maximum number of seconds that the call will last. When the call reaches this duration, it will
            be ended.


            @default 600 (10 minutes)
        backgroundSound:
          $ref: '#/components/schemas/CreateAssistantDtoBackgroundSound'
          description: >-
            This is the background sound in the call. Default for phone calls is 'office' and default for web calls is
            'off'.

            You can also provide a custom sound by providing a URL to an audio file.
        modelOutputInMessagesEnabled:
          type: boolean
          description: >-
            This determines whether the model's output is used in conversation history rather than the transcription of
            assistant's speech.


            @default false
        transportConfigurations:
          type: array
          items:
            $ref: '#/components/schemas/CreateAssistantDtoTransportConfigurationsItems'
          description: >-
            These are the configurations to be passed to the transport providers of assistant's calls, like Twilio. You
            can store multiple configurations for different transport providers. For a call, only the configuration
            matching the call transport provider is used.
        observabilityPlan:
          $ref: '#/components/schemas/LangfuseObservabilityPlan'
          description: |-
            This is the plan for observability of assistant's calls.

            Currently, only Langfuse is supported.
        credentials:
          type: array
          items:
            $ref: '#/components/schemas/CreateAssistantDtoCredentialsItems'
          description: >-
            These are dynamic credentials that will be used for the assistant calls. By default, all the credentials are
            available for use in the call but you can supplement an additional credentials using this. Dynamic
            credentials override existing credentials.
        hooks:
          type: array
          items:
            $ref: '#/components/schemas/CreateAssistantDtoHooksItems'
          description: This is a set of actions that will be performed on certain events.
        name:
          type: string
          description: |-
            This is the name of the assistant.

            This is required when you want to transfer between assistants in a call.
        voicemailMessage:
          type: string
          description: |-
            This is the message that the assistant will say if the call is forwarded to voicemail.

            If unspecified, it will hang up.
        endCallMessage:
          type: string
          description: |-
            This is the message that the assistant will say if it ends the call.

            If unspecified, it will hang up without saying anything.
        endCallPhrases:
          type: array
          items:
            type: string
          description: >-
            This list contains phrases that, if spoken by the assistant, will trigger the call to be hung up. Case
            insensitive.
        compliancePlan:
          $ref: '#/components/schemas/CompliancePlan'
        metadata:
          $ref: '#/components/schemas/CreateAssistantDtoMetadata'
          description: This is for metadata you want to store on the assistant.
        backgroundSpeechDenoisingPlan:
          $ref: '#/components/schemas/BackgroundSpeechDenoisingPlan'
          description: |-
            This enables filtering of noise and background speech while the user is talking.

            Features:
            - Smart denoising using Krisp
            - Fourier denoising

            Smart denoising can be combined with or used independently of Fourier denoising.

            Order of precedence:
            - Smart denoising
            - Fourier denoising
        analysisPlan:
          $ref: '#/components/schemas/AnalysisPlan'
          description: This is the plan for analysis of assistant's calls. Stored in `call.analysis`.
        artifactPlan:
          $ref: '#/components/schemas/ArtifactPlan'
          description: This is the plan for artifacts generated during assistant's calls. Stored in `call.artifact`.
        startSpeakingPlan:
          $ref: '#/components/schemas/StartSpeakingPlan'
          description: |-
            This is the plan for when the assistant should start talking.

            You should configure this if you're running into these issues:
            - The assistant is too slow to start talking after the customer is done speaking.
            - The assistant is too fast to start talking after the customer is done speaking.
            - The assistant is so fast that it's actually interrupting the customer.
        stopSpeakingPlan:
          $ref: '#/components/schemas/StopSpeakingPlan'
          description: |-
            This is the plan for when assistant should stop talking on customer interruption.

            You should configure this if you're running into these issues:
            - The assistant is too slow to recognize customer's interruption.
            - The assistant is too fast to recognize customer's interruption.
            - The assistant is getting interrupted by phrases that are just acknowledgments.
            - The assistant is getting interrupted by background noises.
            - The assistant is not properly stopping -- it starts talking right after getting interrupted.
        monitorPlan:
          $ref: '#/components/schemas/MonitorPlan'
          description: |-
            This is the plan for real-time monitoring of the assistant's calls.

            Usage:
            - To enable live listening of the assistant's calls, set `monitorPlan.listenEnabled` to `true`.
            - To enable live control of the assistant's calls, set `monitorPlan.controlEnabled` to `true`.
            - To attach monitors to the assistant, set `monitorPlan.monitorIds` to the set of monitor ids.
        credentialIds:
          type: array
          items:
            type: string
          description: >-
            These are the credentials that will be used for the assistant calls. By default, all the credentials are
            available for use in the call but you can provide a subset using this.
        server:
          $ref: '#/components/schemas/Server'
          description: >-
            This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
            ServerMessage schema.


            The order of precedence is:


            1. assistant.server.url

            2. phoneNumber.serverUrl

            3. org.serverUrl
        keypadInputPlan:
          $ref: '#/components/schemas/KeypadInputPlan'
      title: CreateAssistantDTO
    AssistantOverridesTranscriber:
      oneOf:
        - $ref: '#/components/schemas/AssemblyAITranscriber'
        - $ref: '#/components/schemas/AzureSpeechTranscriber'
        - $ref: '#/components/schemas/CustomTranscriber'
        - $ref: '#/components/schemas/DeepgramTranscriber'
        - $ref: '#/components/schemas/ElevenLabsTranscriber'
        - $ref: '#/components/schemas/GladiaTranscriber'
        - $ref: '#/components/schemas/GoogleTranscriber'
        - $ref: '#/components/schemas/SpeechmaticsTranscriber'
        - $ref: '#/components/schemas/TalkscriberTranscriber'
        - $ref: '#/components/schemas/OpenAITranscriber'
        - $ref: '#/components/schemas/CartesiaTranscriber'
        - $ref: '#/components/schemas/SonioxTranscriber'
      description: These are the options for the assistant's transcriber.
      title: AssistantOverridesTranscriber
    AssistantOverridesModel:
      oneOf:
        - $ref: '#/components/schemas/AnthropicModel'
        - $ref: '#/components/schemas/AnthropicBedrockModel'
        - $ref: '#/components/schemas/AnyscaleModel'
        - $ref: '#/components/schemas/CerebrasModel'
        - $ref: '#/components/schemas/CustomLLMModel'
        - $ref: '#/components/schemas/DeepInfraModel'
        - $ref: '#/components/schemas/DeepSeekModel'
        - $ref: '#/components/schemas/GoogleModel'
        - $ref: '#/components/schemas/GroqModel'
        - $ref: '#/components/schemas/InflectionAIModel'
        - $ref: '#/components/schemas/MinimaxLLMModel'
        - $ref: '#/components/schemas/OpenAIModel'
        - $ref: '#/components/schemas/OpenRouterModel'
        - $ref: '#/components/schemas/PerplexityAIModel'
        - $ref: '#/components/schemas/TogetherAIModel'
        - $ref: '#/components/schemas/XaiModel'
      description: These are the options for the assistant's LLM.
      title: AssistantOverridesModel
    AssistantOverridesVoice:
      oneOf:
        - $ref: '#/components/schemas/AzureVoice'
        - $ref: '#/components/schemas/CartesiaVoice'
        - $ref: '#/components/schemas/CustomVoice'
        - $ref: '#/components/schemas/DeepgramVoice'
        - $ref: '#/components/schemas/ElevenLabsVoice'
        - $ref: '#/components/schemas/HumeVoice'
        - $ref: '#/components/schemas/LMNTVoice'
        - $ref: '#/components/schemas/NeuphonicVoice'
        - $ref: '#/components/schemas/OpenAIVoice'
        - $ref: '#/components/schemas/PlayHTVoice'
        - $ref: '#/components/schemas/WellSaidVoice'
        - $ref: '#/components/schemas/RimeAIVoice'
        - $ref: '#/components/schemas/SmallestAIVoice'
        - $ref: '#/components/schemas/TavusVoice'
        - $ref: '#/components/schemas/VapiVoice'
        - $ref: '#/components/schemas/SesameVoice'
        - $ref: '#/components/schemas/InworldVoice'
        - $ref: '#/components/schemas/MinimaxVoice'
      description: These are the options for the assistant's voice.
      title: AssistantOverridesVoice
    AssistantOverridesFirstMessageMode:
      type: string
      enum:
        - assistant-speaks-first
        - assistant-speaks-first-with-model-generated-message
        - assistant-waits-for-user
      description: >-
        This is the mode for the first message. Default is 'assistant-speaks-first'.


        Use:

        - 'assistant-speaks-first' to have the assistant speak first.

        - 'assistant-waits-for-user' to have the assistant wait for the user to speak first.

        - 'assistant-speaks-first-with-model-generated-message' to have the assistant speak first with a message
        generated by the model based on the conversation state. (`assistant.model.messages` at call start,
        `call.messages` at squad transfer points).


        @default 'assistant-speaks-first'
      title: AssistantOverridesFirstMessageMode
    AssistantOverridesVoicemailDetection0:
      type: string
      enum:
        - 'off'
      title: AssistantOverridesVoicemailDetection0
    AssistantOverridesVoicemailDetection:
      oneOf:
        - $ref: '#/components/schemas/AssistantOverridesVoicemailDetection0'
        - $ref: '#/components/schemas/GoogleVoicemailDetectionPlan'
        - $ref: '#/components/schemas/OpenAIVoicemailDetectionPlan'
        - $ref: '#/components/schemas/TwilioVoicemailDetectionPlan'
        - $ref: '#/components/schemas/VapiVoicemailDetectionPlan'
      description: >-
        These are the settings to configure or disable voicemail detection. Alternatively, voicemail detection can be
        configured using the model.tools=[VoicemailTool].

        By default, voicemail detection is disabled.
      title: AssistantOverridesVoicemailDetection
    AssistantOverridesClientMessages:
      type: string
      enum:
        - conversation-update
        - assistant.speechStarted
        - function-call
        - function-call-result
        - hang
        - language-changed
        - metadata
        - model-output
        - speech-update
        - status-update
        - transcript
        - tool-calls
        - tool-calls-result
        - tool.completed
        - transfer-update
        - user-interrupted
        - voice-input
        - workflow.node.started
        - assistant.started
      description: >-
        These are the messages that will be sent to your Client SDKs. Default is
        conversation-update,function-call,hang,model-output,speech-update,status-update,transfer-update,transcript,tool-calls,user-interrupted,voice-input,workflow.node.started,assistant.started.
        You can check the shape of the messages in ClientMessage schema.
      title: AssistantOverridesClientMessages
    AssistantOverridesServerMessages:
      type: string
      enum:
        - assistant.started
        - assistant.speechStarted
        - conversation-update
        - end-of-call-report
        - function-call
        - hang
        - language-changed
        - language-change-detected
        - model-output
        - phone-call-control
        - speech-update
        - status-update
        - transcript
        - transcript[transcriptType="final"]
        - tool-calls
        - transfer-destination-request
        - handoff-destination-request
        - transfer-update
        - user-interrupted
        - voice-input
        - chat.created
        - chat.deleted
        - session.created
        - session.updated
        - session.deleted
        - call.deleted
        - call.delete.failed
      description: >-
        These are the messages that will be sent to your Server URL. Default is
        conversation-update,end-of-call-report,function-call,hang,speech-update,status-update,tool-calls,transfer-destination-request,handoff-destination-request,user-interrupted,assistant.started.
        You can check the shape of the messages in ServerMessage schema.
      title: AssistantOverridesServerMessages
    AssistantOverridesBackgroundSound0:
      type: string
      enum:
        - 'off'
        - office
      title: AssistantOverridesBackgroundSound0
    AssistantOverridesBackgroundSound:
      oneOf:
        - $ref: '#/components/schemas/AssistantOverridesBackgroundSound0'
        - type: string
          format: uri
      description: >-
        This is the background sound in the call. Default for phone calls is 'office' and default for web calls is
        'off'.

        You can also provide a custom sound by providing a URL to an audio file.
      title: AssistantOverridesBackgroundSound
    AssistantOverridesTransportConfigurationsItems:
      oneOf:
        - $ref: '#/components/schemas/TransportConfigurationTwilio'
      title: AssistantOverridesTransportConfigurationsItems
    AssistantOverridesCredentialsItems:
      oneOf:
        - type: object
          properties:
            provider:
              type: string
              enum:
                - 11labs
              description: 'Discriminator value: 11labs'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateElevenLabsCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - anthropic
              description: 'Discriminator value: anthropic'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateAnthropicCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - anthropic-bedrock
              description: 'Discriminator value: anthropic-bedrock'
            region:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockRegion'
              description: AWS region where Bedrock is configured.
            authenticationPlan:
              $ref: >-
                #/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockAuthenticationPlan
              description: Authentication method - either direct IAM credentials or cross-account role assumption.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - region
            - authenticationPlan
          description: anthropic-bedrock variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - anyscale
              description: 'Discriminator value: anyscale'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateAnyscaleCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - assembly-ai
              description: 'Discriminator value: assembly-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateAssemblyAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - azure-openai
              description: 'Discriminator value: azure-openai'
            region:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiRegion'
            models:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiModels'
            openAIKey:
              type: string
              description: This is not returned in the API.
            ocpApimSubscriptionKey:
              type: string
              description: This is not returned in the API.
            openAIEndpoint:
              type: string
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - region
            - models
            - openAIKey
            - openAIEndpoint
          description: CreateAzureOpenAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - azure
              description: 'Discriminator value: azure'
            service:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureService'
              description: This is the service being used in Azure.
            region:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureRegion'
              description: This is the region of the Azure resource.
            apiKey:
              type: string
              description: This is not returned in the API.
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            bucketPlan:
              $ref: '#/components/schemas/AzureBlobStorageBucketPlan'
              description: This is the bucket plan that can be provided to store call artifacts in Azure Blob Storage.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - service
          description: CreateAzureCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - byo-sip-trunk
              description: 'Discriminator value: byo-sip-trunk'
            gateways:
              type: array
              items:
                $ref: '#/components/schemas/SipTrunkGateway'
              description: This is the list of SIP trunk's gateways.
            outboundAuthenticationPlan:
              $ref: '#/components/schemas/SipTrunkOutboundAuthenticationPlan'
              description: This can be used to configure the outbound authentication if required by the SIP trunk.
            outboundLeadingPlusEnabled:
              type: boolean
              description: >-
                This ensures the outbound origination attempts have a leading plus. Defaults to false to match
                conventional telecom behavior.


                Usage:

                - Vonage/Twilio requires leading plus for all outbound calls. Set this to true.


                @default false
            techPrefix:
              type: string
              description: This can be used to configure the tech prefix on outbound calls. This is an advanced property.
            sipDiversionHeader:
              type: string
              description: >-
                This can be used to enable the SIP diversion header for authenticating the calling number if the SIP
                trunk supports it. This is an advanced property.
            sbcConfiguration:
              $ref: '#/components/schemas/SbcConfiguration'
              description: >-
                This is an advanced configuration for enterprise deployments. This uses the onprem SBC to trunk into the
                SIP trunk's `gateways`, rather than the managed SBC provided by Vapi.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - gateways
          description: CreateByoSipTrunkCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - cartesia
              description: 'Discriminator value: cartesia'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateCartesiaCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateCerebrasCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateCerebrasCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - cloudflare
              description: 'Discriminator value: cloudflare'
            accountId:
              type: string
              description: Cloudflare Account Id.
            apiKey:
              type: string
              description: Cloudflare API Key / Token.
            accountEmail:
              type: string
              description: Cloudflare Account Email.
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            bucketPlan:
              $ref: '#/components/schemas/CloudflareR2BucketPlan'
              description: This is the bucket plan that can be provided to store call artifacts in R2
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
          description: CreateCloudflareCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - custom-llm
              description: 'Discriminator value: custom-llm'
            apiKey:
              type: string
              description: This is not returned in the API.
            authenticationPlan:
              $ref: '#/components/schemas/OAuth2AuthenticationPlan'
              description: >-
                This is the authentication plan. Currently supports OAuth2 RFC 6749. To use Bearer authentication, use
                apiKey
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateCustomLLMCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - deepgram
              description: 'Discriminator value: deepgram'
            apiKey:
              type: string
              description: This is not returned in the API.
            apiUrl:
              type: string
              description: This can be used to point to an onprem Deepgram instance. Defaults to api.deepgram.com.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateDeepgramCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - deepinfra
              description: 'Discriminator value: deepinfra'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateDeepInfraCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - deep-seek
              description: 'Discriminator value: deep-seek'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateDeepSeekCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - gcp
              description: 'Discriminator value: gcp'
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            gcpKey:
              $ref: '#/components/schemas/GcpKey'
              description: >-
                This is the GCP key. This is the JSON that can be generated in the Google Cloud Console at
                https://console.cloud.google.com/iam-admin/serviceaccounts/details/<service-account-id>/keys.


                The schema is identical to the JSON that GCP outputs.
            region:
              type: string
              description: This is the region of the GCP resource.
            bucketPlan:
              $ref: '#/components/schemas/BucketPlan'
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - gcpKey
          description: CreateGcpCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - gladia
              description: 'Discriminator value: gladia'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateGladiaCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - gohighlevel
              description: 'Discriminator value: gohighlevel'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateGoHighLevelCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateGoogleCredentialDtoProvider'
              description: 'This is the key for Gemini in Google AI Studio. Get it from here: https://aistudio.google.com/app/apikey'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateGoogleCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - groq
              description: 'Discriminator value: groq'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateGroqCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateInflectionAiCredentialDtoProvider'
              description: >-
                This is the api key for Pi in InflectionAI's console. Get it from here:
                https://developers.inflection.ai/keys, billing will need to be setup
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateInflectionAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - langfuse
              description: 'Discriminator value: langfuse'
            publicKey:
              type: string
              description: 'The public key for Langfuse project. Eg: pk-lf-...'
            apiKey:
              type: string
              description: 'The secret key for Langfuse project. Eg: sk-lf-... .This is not returned in the API.'
            apiUrl:
              type: string
              description: 'The host URL for Langfuse project. Eg: https://cloud.langfuse.com'
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - publicKey
            - apiKey
            - apiUrl
          description: CreateLangfuseCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - lmnt
              description: 'Discriminator value: lmnt'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateLmntCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - make
              description: 'Discriminator value: make'
            teamId:
              type: string
              description: Team ID
            region:
              type: string
              description: 'Region of your application. For example: eu1, eu2, us1, us2'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - teamId
            - region
            - apiKey
          description: CreateMakeCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - openai
              description: 'Discriminator value: openai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateOpenAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - openrouter
              description: 'Discriminator value: openrouter'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateOpenRouterCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - perplexity-ai
              description: 'Discriminator value: perplexity-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreatePerplexityAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - playht
              description: 'Discriminator value: playht'
            apiKey:
              type: string
              description: This is not returned in the API.
            userId:
              type: string
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
            - userId
          description: CreatePlayHTCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - rime-ai
              description: 'Discriminator value: rime-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateRimeAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - runpod
              description: 'Discriminator value: runpod'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateRunpodCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - s3
              description: 'Discriminator value: s3'
            awsAccessKeyId:
              type: string
              description: AWS access key ID.
            awsSecretAccessKey:
              type: string
              description: AWS access key secret. This is not returned in the API.
            region:
              type: string
              description: AWS region in which the S3 bucket is located.
            s3BucketName:
              type: string
              description: AWS S3 bucket name.
            s3PathPrefix:
              type: string
              description: The path prefix for the uploaded recording. Ex. "recordings/"
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - awsAccessKeyId
            - awsSecretAccessKey
            - region
            - s3BucketName
            - s3PathPrefix
          description: CreateS3CredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - supabase
              description: 'Discriminator value: supabase'
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            bucketPlan:
              $ref: '#/components/schemas/SupabaseBucketPlan'
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
          description: CreateSupabaseCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - smallest-ai
              description: 'Discriminator value: smallest-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateSmallestAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - tavus
              description: 'Discriminator value: tavus'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateTavusCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - together-ai
              description: 'Discriminator value: together-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateTogetherAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - twilio
              description: 'Discriminator value: twilio'
            authToken:
              type: string
              description: This is not returned in the API.
            apiKey:
              type: string
              description: This is not returned in the API.
            apiSecret:
              type: string
              description: This is not returned in the API.
            accountSid:
              type: string
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - accountSid
          description: CreateTwilioCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - vonage
              description: 'Discriminator value: vonage'
            apiSecret:
              type: string
              description: This is not returned in the API.
            apiKey:
              type: string
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiSecret
            - apiKey
          description: CreateVonageCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - webhook
              description: 'Discriminator value: webhook'
            authenticationPlan:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingWebhookAuthenticationPlan'
              description: This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authenticationPlan
          description: CreateWebhookCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateCustomCredentialDtoProvider'
            authenticationPlan:
              $ref: '#/components/schemas/CreateCustomCredentialDtoAuthenticationPlan'
              description: This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication.
            encryptionPlan:
              $ref: '#/components/schemas/PublicKeyEncryptionPlan'
              description: This is the encryption plan for encrypting sensitive data. Currently supports public-key encryption.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authenticationPlan
          description: custom-credential variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - xai
              description: 'Discriminator value: xai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateXAiCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateNeuphonicCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateNeuphonicCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateHumeCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateHumeCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateMistralCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateMistralCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateSpeechmaticsCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateSpeechmaticsCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateSonioxCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: soniox variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateTrieveCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateTrieveCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - google.calendar.oauth2-client
              description: 'Discriminator value: google.calendar.oauth2-client'
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
          description: CreateGoogleCalendarOAuth2ClientCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - google.calendar.oauth2-authorization
              description: 'Discriminator value: google.calendar.oauth2-authorization'
            authorizationId:
              type: string
              description: The authorization ID for the OAuth2 authorization
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authorizationId
          description: CreateGoogleCalendarOAuth2AuthorizationCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - google.sheets.oauth2-authorization
              description: 'Discriminator value: google.sheets.oauth2-authorization'
            authorizationId:
              type: string
              description: The authorization ID for the OAuth2 authorization
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authorizationId
          description: CreateGoogleSheetsOAuth2AuthorizationCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - slack.oauth2-authorization
              description: 'Discriminator value: slack.oauth2-authorization'
            authorizationId:
              type: string
              description: The authorization ID for the OAuth2 authorization
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authorizationId
          description: CreateSlackOAuth2AuthorizationCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateGoHighLevelMcpCredentialDtoProvider'
            authenticationSession:
              $ref: '#/components/schemas/Oauth2AuthenticationSession'
              description: This is the authentication session for the credential.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authenticationSession
          description: CreateGoHighLevelMCPCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateInworldCredentialDtoProvider'
            apiKey:
              type: string
              description: This is the Inworld Basic (Base64) authentication token. This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: inworld variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - minimax
              description: 'Discriminator value: minimax'
            apiKey:
              type: string
              description: This is not returned in the API.
            groupId:
              type: string
              description: This is the Minimax Group ID.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
            - groupId
          description: minimax variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateWellSaidCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: wellsaid variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateEmailCredentialDtoProvider'
            email:
              type: string
              description: The recipient email address for alerts
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - email
          description: email variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateSlackWebhookCredentialDtoProvider'
            webhookUrl:
              type: string
              description: >-
                Slack incoming webhook URL. See https://api.slack.com/messaging/webhooks for setup instructions. This is
                not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - webhookUrl
          description: slack-webhook variant
      discriminator:
        propertyName: provider
      title: AssistantOverridesCredentialsItems
    AssistantOverridesHooksItems:
      oneOf:
        - $ref: '#/components/schemas/CallHookCallEnding'
        - $ref: '#/components/schemas/CallHookAssistantSpeechInterrupted'
        - $ref: '#/components/schemas/CallHookCustomerSpeechInterrupted'
        - $ref: '#/components/schemas/CallHookCustomerSpeechTimeout'
        - $ref: '#/components/schemas/SessionCreatedHook'
      title: AssistantOverridesHooksItems
    AssistantOverridesToolsAppendItems:
      oneOf:
        - $ref: '#/components/schemas/CreateApiRequestToolDTO'
        - $ref: '#/components/schemas/CreateBashToolDTO'
        - $ref: '#/components/schemas/CreateCodeToolDTO'
        - $ref: '#/components/schemas/CreateComputerToolDTO'
        - $ref: '#/components/schemas/CreateDtmfToolDTO'
        - $ref: '#/components/schemas/CreateEndCallToolDTO'
        - $ref: '#/components/schemas/CreateFunctionToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactGetToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCreateEventToolDTO'
        - $ref: '#/components/schemas/CreateGoogleSheetsRowAppendToolDTO'
        - $ref: '#/components/schemas/CreateHandoffToolDTO'
        - $ref: '#/components/schemas/CreateMcpToolDTO'
        - $ref: '#/components/schemas/CreateQueryToolDTO'
        - $ref: '#/components/schemas/CreateSlackSendMessageToolDTO'
        - $ref: '#/components/schemas/CreateSmsToolDTO'
        - $ref: '#/components/schemas/CreateTextEditorToolDTO'
        - $ref: '#/components/schemas/CreateTransferCallToolDTO'
        - $ref: '#/components/schemas/CreateSipRequestToolDTO'
        - $ref: '#/components/schemas/CreateVoicemailToolDTO'
      title: AssistantOverridesToolsAppendItems
    AssistantOverridesVariableValues:
      type: object
      properties: {}
      description: >-
        These are values that will be used to replace the template variables in the assistant messages and other
        text-based fields.

        This uses LiquidJS syntax. https://liquidjs.com/tutorials/intro-to-liquid.html


        So for example, `{{ name }}` will be replaced with the value of `name` in `variableValues`.

        `{{"now" | date: "%b %d, %Y, %I:%M %p", "America/New_York"}}` will be replaced with the current date and time in
        New York.
         Some VAPI reserved defaults:
         - *customer* - the customer object
      title: AssistantOverridesVariableValues
    AssistantOverridesMetadata:
      type: object
      properties: {}
      description: This is for metadata you want to store on the assistant.
      title: AssistantOverridesMetadata
    AssistantOverrides:
      type: object
      properties:
        transcriber:
          $ref: '#/components/schemas/AssistantOverridesTranscriber'
          description: These are the options for the assistant's transcriber.
        model:
          $ref: '#/components/schemas/AssistantOverridesModel'
          description: These are the options for the assistant's LLM.
        voice:
          $ref: '#/components/schemas/AssistantOverridesVoice'
          description: These are the options for the assistant's voice.
        firstMessage:
          type: string
          description: >-
            This is the first message that the assistant will say. This can also be a URL to a containerized audio file
            (mp3, wav, etc.).


            If unspecified, assistant will wait for user to speak and use the model to respond once they speak.
        firstMessageInterruptionsEnabled:
          type: boolean
          default: false
        firstMessageMode:
          $ref: '#/components/schemas/AssistantOverridesFirstMessageMode'
          description: >-
            This is the mode for the first message. Default is 'assistant-speaks-first'.


            Use:

            - 'assistant-speaks-first' to have the assistant speak first.

            - 'assistant-waits-for-user' to have the assistant wait for the user to speak first.

            - 'assistant-speaks-first-with-model-generated-message' to have the assistant speak first with a message
            generated by the model based on the conversation state. (`assistant.model.messages` at call start,
            `call.messages` at squad transfer points).


            @default 'assistant-speaks-first'
        voicemailDetection:
          $ref: '#/components/schemas/AssistantOverridesVoicemailDetection'
          description: >-
            These are the settings to configure or disable voicemail detection. Alternatively, voicemail detection can
            be configured using the model.tools=[VoicemailTool].

            By default, voicemail detection is disabled.
        clientMessages:
          $ref: '#/components/schemas/AssistantOverridesClientMessages'
          description: >-
            These are the messages that will be sent to your Client SDKs. Default is
            conversation-update,function-call,hang,model-output,speech-update,status-update,transfer-update,transcript,tool-calls,user-interrupted,voice-input,workflow.node.started,assistant.started.
            You can check the shape of the messages in ClientMessage schema.
        serverMessages:
          $ref: '#/components/schemas/AssistantOverridesServerMessages'
          description: >-
            These are the messages that will be sent to your Server URL. Default is
            conversation-update,end-of-call-report,function-call,hang,speech-update,status-update,tool-calls,transfer-destination-request,handoff-destination-request,user-interrupted,assistant.started.
            You can check the shape of the messages in ServerMessage schema.
        maxDurationSeconds:
          type: number
          format: double
          description: >-
            This is the maximum number of seconds that the call will last. When the call reaches this duration, it will
            be ended.


            @default 600 (10 minutes)
        backgroundSound:
          $ref: '#/components/schemas/AssistantOverridesBackgroundSound'
          description: >-
            This is the background sound in the call. Default for phone calls is 'office' and default for web calls is
            'off'.

            You can also provide a custom sound by providing a URL to an audio file.
        modelOutputInMessagesEnabled:
          type: boolean
          description: >-
            This determines whether the model's output is used in conversation history rather than the transcription of
            assistant's speech.


            @default false
        transportConfigurations:
          type: array
          items:
            $ref: '#/components/schemas/AssistantOverridesTransportConfigurationsItems'
          description: >-
            These are the configurations to be passed to the transport providers of assistant's calls, like Twilio. You
            can store multiple configurations for different transport providers. For a call, only the configuration
            matching the call transport provider is used.
        observabilityPlan:
          $ref: '#/components/schemas/LangfuseObservabilityPlan'
          description: |-
            This is the plan for observability of assistant's calls.

            Currently, only Langfuse is supported.
        credentials:
          type: array
          items:
            $ref: '#/components/schemas/AssistantOverridesCredentialsItems'
          description: >-
            These are dynamic credentials that will be used for the assistant calls. By default, all the credentials are
            available for use in the call but you can supplement an additional credentials using this. Dynamic
            credentials override existing credentials.
        hooks:
          type: array
          items:
            $ref: '#/components/schemas/AssistantOverridesHooksItems'
          description: This is a set of actions that will be performed on certain events.
        tools:append:
          type: array
          items:
            $ref: '#/components/schemas/AssistantOverridesToolsAppendItems'
        variableValues:
          $ref: '#/components/schemas/AssistantOverridesVariableValues'
          description: >-
            These are values that will be used to replace the template variables in the assistant messages and other
            text-based fields.

            This uses LiquidJS syntax. https://liquidjs.com/tutorials/intro-to-liquid.html


            So for example, `{{ name }}` will be replaced with the value of `name` in `variableValues`.

            `{{"now" | date: "%b %d, %Y, %I:%M %p", "America/New_York"}}` will be replaced with the current date and
            time in New York.
             Some VAPI reserved defaults:
             - *customer* - the customer object
        name:
          type: string
          description: |-
            This is the name of the assistant.

            This is required when you want to transfer between assistants in a call.
        voicemailMessage:
          type: string
          description: |-
            This is the message that the assistant will say if the call is forwarded to voicemail.

            If unspecified, it will hang up.
        endCallMessage:
          type: string
          description: |-
            This is the message that the assistant will say if it ends the call.

            If unspecified, it will hang up without saying anything.
        endCallPhrases:
          type: array
          items:
            type: string
          description: >-
            This list contains phrases that, if spoken by the assistant, will trigger the call to be hung up. Case
            insensitive.
        compliancePlan:
          $ref: '#/components/schemas/CompliancePlan'
        metadata:
          $ref: '#/components/schemas/AssistantOverridesMetadata'
          description: This is for metadata you want to store on the assistant.
        backgroundSpeechDenoisingPlan:
          $ref: '#/components/schemas/BackgroundSpeechDenoisingPlan'
          description: |-
            This enables filtering of noise and background speech while the user is talking.

            Features:
            - Smart denoising using Krisp
            - Fourier denoising

            Smart denoising can be combined with or used independently of Fourier denoising.

            Order of precedence:
            - Smart denoising
            - Fourier denoising
        analysisPlan:
          $ref: '#/components/schemas/AnalysisPlan'
          description: This is the plan for analysis of assistant's calls. Stored in `call.analysis`.
        artifactPlan:
          $ref: '#/components/schemas/ArtifactPlan'
          description: This is the plan for artifacts generated during assistant's calls. Stored in `call.artifact`.
        startSpeakingPlan:
          $ref: '#/components/schemas/StartSpeakingPlan'
          description: |-
            This is the plan for when the assistant should start talking.

            You should configure this if you're running into these issues:
            - The assistant is too slow to start talking after the customer is done speaking.
            - The assistant is too fast to start talking after the customer is done speaking.
            - The assistant is so fast that it's actually interrupting the customer.
        stopSpeakingPlan:
          $ref: '#/components/schemas/StopSpeakingPlan'
          description: |-
            This is the plan for when assistant should stop talking on customer interruption.

            You should configure this if you're running into these issues:
            - The assistant is too slow to recognize customer's interruption.
            - The assistant is too fast to recognize customer's interruption.
            - The assistant is getting interrupted by phrases that are just acknowledgments.
            - The assistant is getting interrupted by background noises.
            - The assistant is not properly stopping -- it starts talking right after getting interrupted.
        monitorPlan:
          $ref: '#/components/schemas/MonitorPlan'
          description: |-
            This is the plan for real-time monitoring of the assistant's calls.

            Usage:
            - To enable live listening of the assistant's calls, set `monitorPlan.listenEnabled` to `true`.
            - To enable live control of the assistant's calls, set `monitorPlan.controlEnabled` to `true`.
            - To attach monitors to the assistant, set `monitorPlan.monitorIds` to the set of monitor ids.
        credentialIds:
          type: array
          items:
            type: string
          description: >-
            These are the credentials that will be used for the assistant calls. By default, all the credentials are
            available for use in the call but you can provide a subset using this.
        server:
          $ref: '#/components/schemas/Server'
          description: >-
            This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
            ServerMessage schema.


            The order of precedence is:


            1. assistant.server.url

            2. phoneNumber.serverUrl

            3. org.serverUrl
        keypadInputPlan:
          $ref: '#/components/schemas/KeypadInputPlan'
      title: AssistantOverrides
    HandoffDestinationAssistant:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/HandoffDestinationAssistantType'
        contextEngineeringPlan:
          $ref: '#/components/schemas/HandoffDestinationAssistantContextEngineeringPlan'
          description: This is the plan for manipulating the message context before handing off the call to the next assistant.
        assistantName:
          type: string
          description: This is the assistant to transfer the call to. You must provide either assistantName or assistantId.
        assistantId:
          type: string
          description: This is the assistant id to transfer the call to. You must provide either assistantName or assistantId.
        assistant:
          $ref: '#/components/schemas/CreateAssistantDTO'
          description: >-
            This is a transient assistant to transfer the call to. You may provide a transient assistant in the
            response  `handoff-destination-request` in a dynamic handoff.
        variableExtractionPlan:
          $ref: '#/components/schemas/VariableExtractionPlan'
          description: This is the variable extraction plan for the handoff tool.
        assistantOverrides:
          $ref: '#/components/schemas/AssistantOverrides'
          description: These are the assistant overrides to apply to the destination assistant.
        description:
          type: string
          description: This is the description of the destination, used by the AI to choose when and how to transfer the call.
      required:
        - type
      title: HandoffDestinationAssistant
    HandoffDestinationDynamicType:
      type: string
      enum:
        - dynamic
      title: HandoffDestinationDynamicType
    HandoffDestinationDynamic:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/HandoffDestinationDynamicType'
        server:
          $ref: '#/components/schemas/Server'
          description: |-
            This is where Vapi will send the handoff-destination-request webhook in a dynamic handoff.

            The order of precedence is:

            1. tool.server.url
            2. assistant.server.url
            3. phoneNumber.server.url
            4. org.server.url
        description:
          type: string
          description: This is the description of the destination, used by the AI to choose when and how to transfer the call.
      required:
        - type
      title: HandoffDestinationDynamic
    HandoffDestinationSquadType:
      type: string
      enum:
        - squad
      title: HandoffDestinationSquadType
    HandoffDestinationSquadContextEngineeringPlan:
      oneOf:
        - $ref: '#/components/schemas/ContextEngineeringPlanLastNMessages'
        - $ref: '#/components/schemas/ContextEngineeringPlanNone'
        - $ref: '#/components/schemas/ContextEngineeringPlanAll'
        - $ref: '#/components/schemas/ContextEngineeringPlanUserAndAssistantMessages'
      description: This is the plan for manipulating the message context before handing off the call to the squad.
      title: HandoffDestinationSquadContextEngineeringPlan
    SquadMemberDtoAssistantDestinationsItems:
      oneOf:
        - $ref: '#/components/schemas/TransferDestinationAssistant'
        - $ref: '#/components/schemas/HandoffDestinationAssistant'
      title: SquadMemberDtoAssistantDestinationsItems
    SquadMemberDTO:
      type: object
      properties:
        assistantDestinations:
          type: array
          items:
            $ref: '#/components/schemas/SquadMemberDtoAssistantDestinationsItems'
        assistantId:
          type:
            - string
            - 'null'
          description: This is the assistant that will be used for the call. To use a transient assistant, use `assistant` instead.
        assistant:
          $ref: '#/components/schemas/CreateAssistantDTO'
          description: >-
            This is the assistant that will be used for the call. To use an existing assistant, use `assistantId`
            instead.
        assistantOverrides:
          $ref: '#/components/schemas/AssistantOverrides'
          description: This can be used to override the assistant's settings and provide values for it's template variables.
      title: SquadMemberDTO
    CreateSquadDTO:
      type: object
      properties:
        name:
          type: string
          description: This is the name of the squad.
        members:
          type: array
          items:
            $ref: '#/components/schemas/SquadMemberDTO'
          description: |-
            This is the list of assistants that make up the squad.

            The call will start with the first assistant in the list.
        membersOverrides:
          $ref: '#/components/schemas/AssistantOverrides'
          description: >-
            This can be used to override all the assistants' settings and provide values for their template variables.


            Both `membersOverrides` and `members[n].assistantOverrides` can be used together. First,
            `members[n].assistantOverrides` is applied. Then, `membersOverrides` is applied as a global override.
      required:
        - members
      title: CreateSquadDTO
    HandoffDestinationSquad:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/HandoffDestinationSquadType'
        contextEngineeringPlan:
          $ref: '#/components/schemas/HandoffDestinationSquadContextEngineeringPlan'
          description: This is the plan for manipulating the message context before handing off the call to the squad.
        squadId:
          type: string
          description: This is the squad id to transfer the call to.
        squad:
          $ref: '#/components/schemas/CreateSquadDTO'
          description: This is a transient squad to transfer the call to.
        entryAssistantName:
          type: string
          description: |-
            This is the name of the entry assistant to start with when handing off to the squad.
            If not provided, the first member of the squad will be used.
        variableExtractionPlan:
          $ref: '#/components/schemas/VariableExtractionPlan'
          description: This is the variable extraction plan for the handoff tool.
        squadOverrides:
          $ref: '#/components/schemas/AssistantOverrides'
          description: |-
            These are the overrides to apply to the squad configuration.
            Maps to squad-level membersOverrides.
        description:
          type: string
          description: This is the description of the destination, used by the AI to choose when and how to transfer the call.
      required:
        - type
      title: HandoffDestinationSquad
    ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems:
      oneOf:
        - $ref: '#/components/schemas/HandoffDestinationAssistant'
        - $ref: '#/components/schemas/HandoffDestinationDynamic'
        - $ref: '#/components/schemas/HandoffDestinationSquad'
      title: ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems
    CreateHandoffToolDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: >-
              #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems
          description: >-
            These are the messages that will be spoken to the user as the tool is running.


            For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the
            function tool, these can be custom configured.
        defaultResult:
          type: string
          description: This is the default local tool result message used when no runtime handoff result override is returned.
        destinations:
          type: array
          items:
            $ref: >-
              #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems
          description: >-
            These are the destinations that the call can be handed off to.


            Usage:

            1. Single destination


            Use `assistantId` to handoff the call to a saved assistant, or `assistantName` to handoff the call to an
            assistant in the same squad.


            ```json

            {
              "tools": [
                {
                  "type": "handoff",
                  "destinations": [
                    {
                      "type": "assistant",
                      "assistantId": "assistant-123", // or "assistantName": "Assistant123"
                      "description": "customer wants to be handed off to assistant-123",
                      "contextEngineeringPlan": {
                        "type": "all"
                      }
                    }
                  ],
                }
              ]
            }

            ```


            2. Multiple destinations


            2.1. Multiple Tools, Each With One Destination (OpenAI recommended)


            ```json

            {
              "tools": [
                {
                  "type": "handoff",
                  "destinations": [
                    {
                      "type": "assistant",
                      "assistantId": "assistant-123",
                      "description": "customer wants to be handed off to assistant-123",
                      "contextEngineeringPlan": {
                        "type": "all"
                      }
                    },
                  ],
                },
                {
                  "type": "handoff",
                  "destinations": [
                    {
                      "type": "assistant",
                      "assistantId": "assistant-456",
                      "description": "customer wants to be handed off to assistant-456",
                      "contextEngineeringPlan": {
                        "type": "all"
                      }
                    }
                  ],
                }
              ]
            }

            ```


            2.2. One Tool, Multiple Destinations (Anthropic recommended)


            ```json

            {
              "tools": [
                {
                  "type": "handoff",
                  "destinations": [
                    {
                      "type": "assistant",
                      "assistantId": "assistant-123",
                      "description": "customer wants to be handed off to assistant-123",
                      "contextEngineeringPlan": {
                        "type": "all"
                      }
                    },
                    {
                      "type": "assistant",
                      "assistantId": "assistant-456",
                      "description": "customer wants to be handed off to assistant-456",
                      "contextEngineeringPlan": {
                        "type": "all"
                      }
                    }
                  ],
                }
              ]
            }

            ```


            3. Dynamic destination


            3.1 To determine the destination dynamically, supply a `dynamic` handoff destination type and a `server`
            object.
                VAPI will send a handoff-destination-request webhook to the `server.url`.
                The response from the server will be used as the destination (if valid).

            ```json

            {
              "tools": [
                {
                  "type": "handoff",
                  "destinations": [
                    {
                      "type": "dynamic",
                      "server": {
                        "url": "https://example.com"
                      }
                    }
                  ],
                }
              ]
            }

            ```


            3.2. To pass custom parameters to the server, you can use the `function` object.


            ```json

            {
              "tools": [
                {
                  "type": "handoff",
                  "destinations": [
                    {
                      "type": "dynamic",
                      "server": {
                        "url": "https://example.com"
                      },
                    }
                  ],
                  "function": {
                    "name": "handoff",
                    "description": "Call this function when the customer is ready to be handed off to the next assistant",
                    "parameters": {
                      "type": "object",
                      "properties": {
                        "destination": {
                          "type": "string",
                          "description": "Use dynamic when customer is ready to be handed off to the next assistant",
                          "enum": ["dynamic"]
                        },
                        "customerAreaCode": {
                          "type": "number",
                          "description": "Area code of the customer"
                        },
                        "customerIntent": {
                          "type": "string",
                          "enum": ["new-customer", "existing-customer"],
                          "description": "Use new-customer when customer is a new customer, existing-customer when customer is an existing customer"
                        },
                        "customerSentiment": {
                          "type": "string",
                          "enum": ["positive", "negative", "neutral"],
                          "description": "Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral"
                        }
                      }
                    }
                  }
                }
              ]
            }

            ```


            The properties `customerAreaCode`, `customerIntent`, and `customerSentiment` will be passed to the server in
            the webhook request body.
        function:
          $ref: '#/components/schemas/OpenAIFunction'
          description: >-
            This is the optional function definition that will be passed to the LLM.

            If this is not defined, we will construct this based on the other properties.


            For example, given the following tools definition:

            ```json

            {
              "tools": [
                {
                  "type": "handoff",
                  "destinations": [
                    {
                      "type": "assistant",
                      "assistantId": "assistant-123",
                      "description": "customer wants to be handed off to assistant-123",
                      "contextEngineeringPlan": {
                        "type": "all"
                      }
                    },
                    {
                      "type": "assistant",
                      "assistantId": "assistant-456",
                      "description": "customer wants to be handed off to assistant-456",
                      "contextEngineeringPlan": {
                        "type": "all"
                      }
                    }
                  ],
                }
              ]
            }

            ```


            We will construct the following function definition:

            ```json

            {
              "function": {
                "name": "handoff_to_assistant-123",
                "description": "
                     Use this function to handoff the call to the next assistant.
                     Only use it when instructions explicitly ask you to use the handoff_to_assistant function.
                     DO NOT call this function unless you are instructed to do so.
                     Here are the destinations you can handoff the call to:
                     1. assistant-123. When: customer wants to be handed off to assistant-123
                     2. assistant-456. When: customer wants to be handed off to assistant-456
                ",
                "parameters": {
                  "type": "object",
                  "properties": {
                    "destination": {
                      "type": "string",
                      "description": "Options: assistant-123 (customer wants to be handed off to assistant-123), assistant-456 (customer wants to be handed off to assistant-456)",
                      "enum": ["assistant-123", "assistant-456"]
                    },
                  },
                  "required": ["destination"]
                }
              }
            }

            ```


            To override this function, please provide an OpenAI function definition and refer to it in the system
            prompt.

            You may override parts of the function definition (i.e. you may only want to change the function name for
            your prompt).

            If you choose to override the function parameters, it must include `destination` as a required parameter,
            and it must evaluate to either an assistantId, assistantName, or a the string literal `dynamic`.


            To pass custom parameters to the server in a dynamic handoff, you can use the function parameters, with
            `dynamic` as the destination.

            ```json

            {
              "function": {
                "name": "dynamic_handoff",
                "description": "
                     Call this function when the customer is ready to be handed off to the next assistant
                ",
                "parameters": {
                  "type": "object",
                  "properties": {
                    "destination": {
                      "type": "string",
                      "enum": ["dynamic"]
                    },
                    "customerAreaCode": {
                      "type": "number",
                      "description": "Area code of the customer"
                    },
                    "customerIntent": {
                      "type": "string",
                      "enum": ["new-customer", "existing-customer"],
                      "description": "Use new-customer when customer is a new customer, existing-customer when customer is an existing customer"
                    },
                    "customerSentiment": {
                      "type": "string",
                      "enum": ["positive", "negative", "neutral"],
                      "description": "Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral"
                    }
                  },
                  "required": ["destination", "customerAreaCode", "customerIntent", "customerSentiment"]
                }
              }
            }

            ```
        rejectionPlan:
          $ref: '#/components/schemas/ToolRejectionPlan'
          description: |-
            This is the plan to reject a tool call based on the conversation state.

            // Example 1: Reject endCall if user didn't say goodbye
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                target: { position: -1, role: 'user' },
                negate: true  // Reject if pattern does NOT match
              }]
            }
            ```

            // Example 2: Reject transfer if user is actually asking a question
            ```json
            {
              conditions: [{
                type: 'regex',
                regex: '\\?',
                target: { position: -1, role: 'user' }
              }]
            }
            ```

            // Example 3: Reject transfer if user didn't mention transfer recently
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 5 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' %}
            {% assign mentioned = false %}
            {% for msg in userMessages %}
              {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                {% assign mentioned = true %}
                {% break %}
              {% endif %}
            {% endfor %}
            {% if mentioned %}
              false
            {% else %}
              true
            {% endif %}`
              }]
            }
            ```

            // Example 4: Reject endCall if the bot is looping and trying to exit
            ```json
            {
              conditions: [{
                type: 'liquid',
                liquid: `{% assign recentMessages = messages | last: 6 %}
            {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
            {% if userMessages.size < 3 %}
              false
            {% else %}
              {% assign msg1 = userMessages[0].content | downcase %}
              {% assign msg2 = userMessages[1].content | downcase %}
              {% assign msg3 = userMessages[2].content | downcase %}
              {% comment %} Check for repetitive messages {% endcomment %}
              {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                true
              {% comment %} Check for common loop phrases {% endcomment %}
              {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                true
              {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                true
              {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                true
              {% else %}
                false
              {% endif %}
            {% endif %}`
              }]
            }
            ```
      title: CreateHandoffToolDTO
    AnthropicModelToolsItems:
      oneOf:
        - $ref: '#/components/schemas/CreateApiRequestToolDTO'
        - $ref: '#/components/schemas/CreateBashToolDTO'
        - $ref: '#/components/schemas/CreateCodeToolDTO'
        - $ref: '#/components/schemas/CreateComputerToolDTO'
        - $ref: '#/components/schemas/CreateDtmfToolDTO'
        - $ref: '#/components/schemas/CreateEndCallToolDTO'
        - $ref: '#/components/schemas/CreateFunctionToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactGetToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCreateEventToolDTO'
        - $ref: '#/components/schemas/CreateGoogleSheetsRowAppendToolDTO'
        - $ref: '#/components/schemas/CreateHandoffToolDTO'
        - $ref: '#/components/schemas/CreateMcpToolDTO'
        - $ref: '#/components/schemas/CreateQueryToolDTO'
        - $ref: '#/components/schemas/CreateSlackSendMessageToolDTO'
        - $ref: '#/components/schemas/CreateSmsToolDTO'
        - $ref: '#/components/schemas/CreateTextEditorToolDTO'
        - $ref: '#/components/schemas/CreateTransferCallToolDTO'
        - $ref: '#/components/schemas/CreateSipRequestToolDTO'
        - $ref: '#/components/schemas/CreateVoicemailToolDTO'
      title: AnthropicModelToolsItems
    AnthropicModelKnowledgeBase:
      oneOf:
        - $ref: '#/components/schemas/CreateCustomKnowledgeBaseDTO'
      description: These are the options for the knowledge base.
      title: AnthropicModelKnowledgeBase
    AnthropicModelModel:
      type: string
      enum:
        - claude-3-opus-20240229
        - claude-3-sonnet-20240229
        - claude-3-haiku-20240307
        - claude-3-5-sonnet-20240620
        - claude-3-5-sonnet-20241022
        - claude-3-5-haiku-20241022
        - claude-3-7-sonnet-20250219
        - claude-opus-4-20250514
        - claude-opus-4-5-20251101
        - claude-opus-4-6
        - claude-sonnet-4-20250514
        - claude-sonnet-4-5-20250929
        - claude-sonnet-4-6
        - claude-haiku-4-5-20251001
      description: The specific Anthropic/Claude model that will be used.
      title: AnthropicModelModel
    AnthropicModelProvider:
      type: string
      enum:
        - anthropic
      description: The provider identifier for Anthropic.
      title: AnthropicModelProvider
    AnthropicModel:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/OpenAIMessage'
          description: This is the starting state for the conversation.
        tools:
          type: array
          items:
            $ref: '#/components/schemas/AnthropicModelToolsItems'
          description: |-
            These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.

            Both `tools` and `toolIds` can be used together.
        toolIds:
          type: array
          items:
            type: string
          description: |-
            These are the tools that the assistant can use during the call. To use transient tools, use `tools`.

            Both `tools` and `toolIds` can be used together.
        knowledgeBase:
          $ref: '#/components/schemas/AnthropicModelKnowledgeBase'
          description: These are the options for the knowledge base.
        model:
          $ref: '#/components/schemas/AnthropicModelModel'
          description: The specific Anthropic/Claude model that will be used.
        provider:
          $ref: '#/components/schemas/AnthropicModelProvider'
          description: The provider identifier for Anthropic.
        thinking:
          $ref: '#/components/schemas/AnthropicThinkingConfig'
          description: |-
            Optional configuration for Anthropic's thinking feature.
            Only applicable for claude-3-7-sonnet-20250219 model.
            If provided, maxTokens must be greater than thinking.budgetTokens.
        temperature:
          type: number
          format: double
          description: This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.
        maxTokens:
          type: number
          format: double
          description: >-
            This is the max number of tokens that the assistant will be allowed to generate in each turn of the
            conversation. Default is 250.
        emotionRecognitionEnabled:
          type: boolean
          description: >-
            This determines whether we detect user's emotion while they speak and send it as an additional info to
            model.


            Default `false` because the model is usually are good at understanding the user's emotion from text.


            @default false
        numFastTurns:
          type: number
          format: double
          description: >-
            This sets how many turns at the start of the conversation to use a smaller, faster model from the same
            provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.


            Default is 0.


            @default 0
      required:
        - model
        - provider
      title: AnthropicModel
    AssistantModel:
      oneOf:
        - $ref: '#/components/schemas/AnthropicModel'
        - $ref: '#/components/schemas/AnthropicBedrockModel'
        - $ref: '#/components/schemas/AnyscaleModel'
        - $ref: '#/components/schemas/CerebrasModel'
        - $ref: '#/components/schemas/CustomLLMModel'
        - $ref: '#/components/schemas/DeepInfraModel'
        - $ref: '#/components/schemas/DeepSeekModel'
        - $ref: '#/components/schemas/GoogleModel'
        - $ref: '#/components/schemas/GroqModel'
        - $ref: '#/components/schemas/InflectionAIModel'
        - $ref: '#/components/schemas/MinimaxLLMModel'
        - $ref: '#/components/schemas/OpenAIModel'
        - $ref: '#/components/schemas/OpenRouterModel'
        - $ref: '#/components/schemas/PerplexityAIModel'
        - $ref: '#/components/schemas/TogetherAIModel'
        - $ref: '#/components/schemas/XaiModel'
      description: These are the options for the assistant's LLM.
      title: AssistantModel
    AssistantVoice:
      oneOf:
        - $ref: '#/components/schemas/AzureVoice'
        - $ref: '#/components/schemas/CartesiaVoice'
        - $ref: '#/components/schemas/CustomVoice'
        - $ref: '#/components/schemas/DeepgramVoice'
        - $ref: '#/components/schemas/ElevenLabsVoice'
        - $ref: '#/components/schemas/HumeVoice'
        - $ref: '#/components/schemas/LMNTVoice'
        - $ref: '#/components/schemas/NeuphonicVoice'
        - $ref: '#/components/schemas/OpenAIVoice'
        - $ref: '#/components/schemas/PlayHTVoice'
        - $ref: '#/components/schemas/WellSaidVoice'
        - $ref: '#/components/schemas/RimeAIVoice'
        - $ref: '#/components/schemas/SmallestAIVoice'
        - $ref: '#/components/schemas/TavusVoice'
        - $ref: '#/components/schemas/VapiVoice'
        - $ref: '#/components/schemas/SesameVoice'
        - $ref: '#/components/schemas/InworldVoice'
        - $ref: '#/components/schemas/MinimaxVoice'
      description: These are the options for the assistant's voice.
      title: AssistantVoice
    AssistantFirstMessageMode:
      type: string
      enum:
        - assistant-speaks-first
        - assistant-speaks-first-with-model-generated-message
        - assistant-waits-for-user
      description: >-
        This is the mode for the first message. Default is 'assistant-speaks-first'.


        Use:

        - 'assistant-speaks-first' to have the assistant speak first.

        - 'assistant-waits-for-user' to have the assistant wait for the user to speak first.

        - 'assistant-speaks-first-with-model-generated-message' to have the assistant speak first with a message
        generated by the model based on the conversation state. (`assistant.model.messages` at call start,
        `call.messages` at squad transfer points).


        @default 'assistant-speaks-first'
      title: AssistantFirstMessageMode
    AssistantVoicemailDetection0:
      type: string
      enum:
        - 'off'
      title: AssistantVoicemailDetection0
    AssistantVoicemailDetection:
      oneOf:
        - $ref: '#/components/schemas/AssistantVoicemailDetection0'
        - $ref: '#/components/schemas/GoogleVoicemailDetectionPlan'
        - $ref: '#/components/schemas/OpenAIVoicemailDetectionPlan'
        - $ref: '#/components/schemas/TwilioVoicemailDetectionPlan'
        - $ref: '#/components/schemas/VapiVoicemailDetectionPlan'
      description: >-
        These are the settings to configure or disable voicemail detection. Alternatively, voicemail detection can be
        configured using the model.tools=[VoicemailTool].

        By default, voicemail detection is disabled.
      title: AssistantVoicemailDetection
    AssistantClientMessages:
      type: string
      enum:
        - conversation-update
        - assistant.speechStarted
        - function-call
        - function-call-result
        - hang
        - language-changed
        - metadata
        - model-output
        - speech-update
        - status-update
        - transcript
        - tool-calls
        - tool-calls-result
        - tool.completed
        - transfer-update
        - user-interrupted
        - voice-input
        - workflow.node.started
        - assistant.started
      description: >-
        These are the messages that will be sent to your Client SDKs. Default is
        conversation-update,function-call,hang,model-output,speech-update,status-update,transfer-update,transcript,tool-calls,user-interrupted,voice-input,workflow.node.started,assistant.started.
        You can check the shape of the messages in ClientMessage schema.
      title: AssistantClientMessages
    AssistantServerMessages:
      type: string
      enum:
        - assistant.started
        - assistant.speechStarted
        - conversation-update
        - end-of-call-report
        - function-call
        - hang
        - language-changed
        - language-change-detected
        - model-output
        - phone-call-control
        - speech-update
        - status-update
        - transcript
        - transcript[transcriptType="final"]
        - tool-calls
        - transfer-destination-request
        - handoff-destination-request
        - transfer-update
        - user-interrupted
        - voice-input
        - chat.created
        - chat.deleted
        - session.created
        - session.updated
        - session.deleted
        - call.deleted
        - call.delete.failed
      description: >-
        These are the messages that will be sent to your Server URL. Default is
        conversation-update,end-of-call-report,function-call,hang,speech-update,status-update,tool-calls,transfer-destination-request,handoff-destination-request,user-interrupted,assistant.started.
        You can check the shape of the messages in ServerMessage schema.
      title: AssistantServerMessages
    AssistantBackgroundSound0:
      type: string
      enum:
        - 'off'
        - office
      title: AssistantBackgroundSound0
    AssistantBackgroundSound:
      oneOf:
        - $ref: '#/components/schemas/AssistantBackgroundSound0'
        - type: string
          format: uri
      description: >-
        This is the background sound in the call. Default for phone calls is 'office' and default for web calls is
        'off'.

        You can also provide a custom sound by providing a URL to an audio file.
      title: AssistantBackgroundSound
    AssistantTransportConfigurationsItems:
      oneOf:
        - $ref: '#/components/schemas/TransportConfigurationTwilio'
      title: AssistantTransportConfigurationsItems
    AssistantCredentialsItems:
      oneOf:
        - type: object
          properties:
            provider:
              type: string
              enum:
                - 11labs
              description: 'Discriminator value: 11labs'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateElevenLabsCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - anthropic
              description: 'Discriminator value: anthropic'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateAnthropicCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - anthropic-bedrock
              description: 'Discriminator value: anthropic-bedrock'
            region:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockRegion'
              description: AWS region where Bedrock is configured.
            authenticationPlan:
              $ref: >-
                #/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockAuthenticationPlan
              description: Authentication method - either direct IAM credentials or cross-account role assumption.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - region
            - authenticationPlan
          description: anthropic-bedrock variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - anyscale
              description: 'Discriminator value: anyscale'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateAnyscaleCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - assembly-ai
              description: 'Discriminator value: assembly-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateAssemblyAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - azure-openai
              description: 'Discriminator value: azure-openai'
            region:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiRegion'
            models:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiModels'
            openAIKey:
              type: string
              description: This is not returned in the API.
            ocpApimSubscriptionKey:
              type: string
              description: This is not returned in the API.
            openAIEndpoint:
              type: string
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - region
            - models
            - openAIKey
            - openAIEndpoint
          description: CreateAzureOpenAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - azure
              description: 'Discriminator value: azure'
            service:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureService'
              description: This is the service being used in Azure.
            region:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureRegion'
              description: This is the region of the Azure resource.
            apiKey:
              type: string
              description: This is not returned in the API.
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            bucketPlan:
              $ref: '#/components/schemas/AzureBlobStorageBucketPlan'
              description: This is the bucket plan that can be provided to store call artifacts in Azure Blob Storage.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - service
          description: CreateAzureCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - byo-sip-trunk
              description: 'Discriminator value: byo-sip-trunk'
            gateways:
              type: array
              items:
                $ref: '#/components/schemas/SipTrunkGateway'
              description: This is the list of SIP trunk's gateways.
            outboundAuthenticationPlan:
              $ref: '#/components/schemas/SipTrunkOutboundAuthenticationPlan'
              description: This can be used to configure the outbound authentication if required by the SIP trunk.
            outboundLeadingPlusEnabled:
              type: boolean
              description: >-
                This ensures the outbound origination attempts have a leading plus. Defaults to false to match
                conventional telecom behavior.


                Usage:

                - Vonage/Twilio requires leading plus for all outbound calls. Set this to true.


                @default false
            techPrefix:
              type: string
              description: This can be used to configure the tech prefix on outbound calls. This is an advanced property.
            sipDiversionHeader:
              type: string
              description: >-
                This can be used to enable the SIP diversion header for authenticating the calling number if the SIP
                trunk supports it. This is an advanced property.
            sbcConfiguration:
              $ref: '#/components/schemas/SbcConfiguration'
              description: >-
                This is an advanced configuration for enterprise deployments. This uses the onprem SBC to trunk into the
                SIP trunk's `gateways`, rather than the managed SBC provided by Vapi.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - gateways
          description: CreateByoSipTrunkCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - cartesia
              description: 'Discriminator value: cartesia'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateCartesiaCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateCerebrasCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateCerebrasCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - cloudflare
              description: 'Discriminator value: cloudflare'
            accountId:
              type: string
              description: Cloudflare Account Id.
            apiKey:
              type: string
              description: Cloudflare API Key / Token.
            accountEmail:
              type: string
              description: Cloudflare Account Email.
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            bucketPlan:
              $ref: '#/components/schemas/CloudflareR2BucketPlan'
              description: This is the bucket plan that can be provided to store call artifacts in R2
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
          description: CreateCloudflareCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - custom-llm
              description: 'Discriminator value: custom-llm'
            apiKey:
              type: string
              description: This is not returned in the API.
            authenticationPlan:
              $ref: '#/components/schemas/OAuth2AuthenticationPlan'
              description: >-
                This is the authentication plan. Currently supports OAuth2 RFC 6749. To use Bearer authentication, use
                apiKey
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateCustomLLMCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - deepgram
              description: 'Discriminator value: deepgram'
            apiKey:
              type: string
              description: This is not returned in the API.
            apiUrl:
              type: string
              description: This can be used to point to an onprem Deepgram instance. Defaults to api.deepgram.com.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateDeepgramCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - deepinfra
              description: 'Discriminator value: deepinfra'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateDeepInfraCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - deep-seek
              description: 'Discriminator value: deep-seek'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateDeepSeekCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - gcp
              description: 'Discriminator value: gcp'
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            gcpKey:
              $ref: '#/components/schemas/GcpKey'
              description: >-
                This is the GCP key. This is the JSON that can be generated in the Google Cloud Console at
                https://console.cloud.google.com/iam-admin/serviceaccounts/details/<service-account-id>/keys.


                The schema is identical to the JSON that GCP outputs.
            region:
              type: string
              description: This is the region of the GCP resource.
            bucketPlan:
              $ref: '#/components/schemas/BucketPlan'
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - gcpKey
          description: CreateGcpCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - gladia
              description: 'Discriminator value: gladia'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateGladiaCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - gohighlevel
              description: 'Discriminator value: gohighlevel'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateGoHighLevelCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateGoogleCredentialDtoProvider'
              description: 'This is the key for Gemini in Google AI Studio. Get it from here: https://aistudio.google.com/app/apikey'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateGoogleCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - groq
              description: 'Discriminator value: groq'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateGroqCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateInflectionAiCredentialDtoProvider'
              description: >-
                This is the api key for Pi in InflectionAI's console. Get it from here:
                https://developers.inflection.ai/keys, billing will need to be setup
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateInflectionAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - langfuse
              description: 'Discriminator value: langfuse'
            publicKey:
              type: string
              description: 'The public key for Langfuse project. Eg: pk-lf-...'
            apiKey:
              type: string
              description: 'The secret key for Langfuse project. Eg: sk-lf-... .This is not returned in the API.'
            apiUrl:
              type: string
              description: 'The host URL for Langfuse project. Eg: https://cloud.langfuse.com'
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - publicKey
            - apiKey
            - apiUrl
          description: CreateLangfuseCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - lmnt
              description: 'Discriminator value: lmnt'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateLmntCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - make
              description: 'Discriminator value: make'
            teamId:
              type: string
              description: Team ID
            region:
              type: string
              description: 'Region of your application. For example: eu1, eu2, us1, us2'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - teamId
            - region
            - apiKey
          description: CreateMakeCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - openai
              description: 'Discriminator value: openai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateOpenAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - openrouter
              description: 'Discriminator value: openrouter'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateOpenRouterCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - perplexity-ai
              description: 'Discriminator value: perplexity-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreatePerplexityAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - playht
              description: 'Discriminator value: playht'
            apiKey:
              type: string
              description: This is not returned in the API.
            userId:
              type: string
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
            - userId
          description: CreatePlayHTCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - rime-ai
              description: 'Discriminator value: rime-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateRimeAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - runpod
              description: 'Discriminator value: runpod'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateRunpodCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - s3
              description: 'Discriminator value: s3'
            awsAccessKeyId:
              type: string
              description: AWS access key ID.
            awsSecretAccessKey:
              type: string
              description: AWS access key secret. This is not returned in the API.
            region:
              type: string
              description: AWS region in which the S3 bucket is located.
            s3BucketName:
              type: string
              description: AWS S3 bucket name.
            s3PathPrefix:
              type: string
              description: The path prefix for the uploaded recording. Ex. "recordings/"
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - awsAccessKeyId
            - awsSecretAccessKey
            - region
            - s3BucketName
            - s3PathPrefix
          description: CreateS3CredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - supabase
              description: 'Discriminator value: supabase'
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            bucketPlan:
              $ref: '#/components/schemas/SupabaseBucketPlan'
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
          description: CreateSupabaseCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - smallest-ai
              description: 'Discriminator value: smallest-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateSmallestAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - tavus
              description: 'Discriminator value: tavus'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateTavusCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - together-ai
              description: 'Discriminator value: together-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateTogetherAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - twilio
              description: 'Discriminator value: twilio'
            authToken:
              type: string
              description: This is not returned in the API.
            apiKey:
              type: string
              description: This is not returned in the API.
            apiSecret:
              type: string
              description: This is not returned in the API.
            accountSid:
              type: string
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - accountSid
          description: CreateTwilioCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - vonage
              description: 'Discriminator value: vonage'
            apiSecret:
              type: string
              description: This is not returned in the API.
            apiKey:
              type: string
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiSecret
            - apiKey
          description: CreateVonageCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - webhook
              description: 'Discriminator value: webhook'
            authenticationPlan:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingWebhookAuthenticationPlan'
              description: This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authenticationPlan
          description: CreateWebhookCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateCustomCredentialDtoProvider'
            authenticationPlan:
              $ref: '#/components/schemas/CreateCustomCredentialDtoAuthenticationPlan'
              description: This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication.
            encryptionPlan:
              $ref: '#/components/schemas/PublicKeyEncryptionPlan'
              description: This is the encryption plan for encrypting sensitive data. Currently supports public-key encryption.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authenticationPlan
          description: custom-credential variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - xai
              description: 'Discriminator value: xai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateXAiCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateNeuphonicCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateNeuphonicCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateHumeCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateHumeCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateMistralCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateMistralCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateSpeechmaticsCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateSpeechmaticsCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateSonioxCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: soniox variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateTrieveCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateTrieveCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - google.calendar.oauth2-client
              description: 'Discriminator value: google.calendar.oauth2-client'
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
          description: CreateGoogleCalendarOAuth2ClientCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - google.calendar.oauth2-authorization
              description: 'Discriminator value: google.calendar.oauth2-authorization'
            authorizationId:
              type: string
              description: The authorization ID for the OAuth2 authorization
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authorizationId
          description: CreateGoogleCalendarOAuth2AuthorizationCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - google.sheets.oauth2-authorization
              description: 'Discriminator value: google.sheets.oauth2-authorization'
            authorizationId:
              type: string
              description: The authorization ID for the OAuth2 authorization
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authorizationId
          description: CreateGoogleSheetsOAuth2AuthorizationCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - slack.oauth2-authorization
              description: 'Discriminator value: slack.oauth2-authorization'
            authorizationId:
              type: string
              description: The authorization ID for the OAuth2 authorization
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authorizationId
          description: CreateSlackOAuth2AuthorizationCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateGoHighLevelMcpCredentialDtoProvider'
            authenticationSession:
              $ref: '#/components/schemas/Oauth2AuthenticationSession'
              description: This is the authentication session for the credential.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authenticationSession
          description: CreateGoHighLevelMCPCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateInworldCredentialDtoProvider'
            apiKey:
              type: string
              description: This is the Inworld Basic (Base64) authentication token. This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: inworld variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - minimax
              description: 'Discriminator value: minimax'
            apiKey:
              type: string
              description: This is not returned in the API.
            groupId:
              type: string
              description: This is the Minimax Group ID.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
            - groupId
          description: minimax variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateWellSaidCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: wellsaid variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateEmailCredentialDtoProvider'
            email:
              type: string
              description: The recipient email address for alerts
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - email
          description: email variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateSlackWebhookCredentialDtoProvider'
            webhookUrl:
              type: string
              description: >-
                Slack incoming webhook URL. See https://api.slack.com/messaging/webhooks for setup instructions. This is
                not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - webhookUrl
          description: slack-webhook variant
      discriminator:
        propertyName: provider
      title: AssistantCredentialsItems
    AssistantHooksItems:
      oneOf:
        - $ref: '#/components/schemas/CallHookCallEnding'
        - $ref: '#/components/schemas/CallHookAssistantSpeechInterrupted'
        - $ref: '#/components/schemas/CallHookCustomerSpeechInterrupted'
        - $ref: '#/components/schemas/CallHookCustomerSpeechTimeout'
        - $ref: '#/components/schemas/SessionCreatedHook'
      title: AssistantHooksItems
    AssistantMetadata:
      type: object
      properties: {}
      description: This is for metadata you want to store on the assistant.
      title: AssistantMetadata
    Assistant:
      type: object
      properties:
        transcriber:
          $ref: '#/components/schemas/AssistantTranscriber'
          description: These are the options for the assistant's transcriber.
        model:
          $ref: '#/components/schemas/AssistantModel'
          description: These are the options for the assistant's LLM.
        voice:
          $ref: '#/components/schemas/AssistantVoice'
          description: These are the options for the assistant's voice.
        firstMessage:
          type: string
          description: >-
            This is the first message that the assistant will say. This can also be a URL to a containerized audio file
            (mp3, wav, etc.).


            If unspecified, assistant will wait for user to speak and use the model to respond once they speak.
        firstMessageInterruptionsEnabled:
          type: boolean
          default: false
        firstMessageMode:
          $ref: '#/components/schemas/AssistantFirstMessageMode'
          description: >-
            This is the mode for the first message. Default is 'assistant-speaks-first'.


            Use:

            - 'assistant-speaks-first' to have the assistant speak first.

            - 'assistant-waits-for-user' to have the assistant wait for the user to speak first.

            - 'assistant-speaks-first-with-model-generated-message' to have the assistant speak first with a message
            generated by the model based on the conversation state. (`assistant.model.messages` at call start,
            `call.messages` at squad transfer points).


            @default 'assistant-speaks-first'
        voicemailDetection:
          $ref: '#/components/schemas/AssistantVoicemailDetection'
          description: >-
            These are the settings to configure or disable voicemail detection. Alternatively, voicemail detection can
            be configured using the model.tools=[VoicemailTool].

            By default, voicemail detection is disabled.
        clientMessages:
          $ref: '#/components/schemas/AssistantClientMessages'
          description: >-
            These are the messages that will be sent to your Client SDKs. Default is
            conversation-update,function-call,hang,model-output,speech-update,status-update,transfer-update,transcript,tool-calls,user-interrupted,voice-input,workflow.node.started,assistant.started.
            You can check the shape of the messages in ClientMessage schema.
        serverMessages:
          $ref: '#/components/schemas/AssistantServerMessages'
          description: >-
            These are the messages that will be sent to your Server URL. Default is
            conversation-update,end-of-call-report,function-call,hang,speech-update,status-update,tool-calls,transfer-destination-request,handoff-destination-request,user-interrupted,assistant.started.
            You can check the shape of the messages in ServerMessage schema.
        maxDurationSeconds:
          type: number
          format: double
          description: >-
            This is the maximum number of seconds that the call will last. When the call reaches this duration, it will
            be ended.


            @default 600 (10 minutes)
        backgroundSound:
          $ref: '#/components/schemas/AssistantBackgroundSound'
          description: >-
            This is the background sound in the call. Default for phone calls is 'office' and default for web calls is
            'off'.

            You can also provide a custom sound by providing a URL to an audio file.
        modelOutputInMessagesEnabled:
          type: boolean
          description: >-
            This determines whether the model's output is used in conversation history rather than the transcription of
            assistant's speech.


            @default false
        transportConfigurations:
          type: array
          items:
            $ref: '#/components/schemas/AssistantTransportConfigurationsItems'
          description: >-
            These are the configurations to be passed to the transport providers of assistant's calls, like Twilio. You
            can store multiple configurations for different transport providers. For a call, only the configuration
            matching the call transport provider is used.
        observabilityPlan:
          $ref: '#/components/schemas/LangfuseObservabilityPlan'
          description: |-
            This is the plan for observability of assistant's calls.

            Currently, only Langfuse is supported.
        credentials:
          type: array
          items:
            $ref: '#/components/schemas/AssistantCredentialsItems'
          description: >-
            These are dynamic credentials that will be used for the assistant calls. By default, all the credentials are
            available for use in the call but you can supplement an additional credentials using this. Dynamic
            credentials override existing credentials.
        hooks:
          type: array
          items:
            $ref: '#/components/schemas/AssistantHooksItems'
          description: This is a set of actions that will be performed on certain events.
        name:
          type: string
          description: |-
            This is the name of the assistant.

            This is required when you want to transfer between assistants in a call.
        voicemailMessage:
          type: string
          description: |-
            This is the message that the assistant will say if the call is forwarded to voicemail.

            If unspecified, it will hang up.
        endCallMessage:
          type: string
          description: |-
            This is the message that the assistant will say if it ends the call.

            If unspecified, it will hang up without saying anything.
        endCallPhrases:
          type: array
          items:
            type: string
          description: >-
            This list contains phrases that, if spoken by the assistant, will trigger the call to be hung up. Case
            insensitive.
        compliancePlan:
          $ref: '#/components/schemas/CompliancePlan'
        metadata:
          $ref: '#/components/schemas/AssistantMetadata'
          description: This is for metadata you want to store on the assistant.
        backgroundSpeechDenoisingPlan:
          $ref: '#/components/schemas/BackgroundSpeechDenoisingPlan'
          description: |-
            This enables filtering of noise and background speech while the user is talking.

            Features:
            - Smart denoising using Krisp
            - Fourier denoising

            Smart denoising can be combined with or used independently of Fourier denoising.

            Order of precedence:
            - Smart denoising
            - Fourier denoising
        analysisPlan:
          $ref: '#/components/schemas/AnalysisPlan'
          description: This is the plan for analysis of assistant's calls. Stored in `call.analysis`.
        artifactPlan:
          $ref: '#/components/schemas/ArtifactPlan'
          description: This is the plan for artifacts generated during assistant's calls. Stored in `call.artifact`.
        startSpeakingPlan:
          $ref: '#/components/schemas/StartSpeakingPlan'
          description: |-
            This is the plan for when the assistant should start talking.

            You should configure this if you're running into these issues:
            - The assistant is too slow to start talking after the customer is done speaking.
            - The assistant is too fast to start talking after the customer is done speaking.
            - The assistant is so fast that it's actually interrupting the customer.
        stopSpeakingPlan:
          $ref: '#/components/schemas/StopSpeakingPlan'
          description: |-
            This is the plan for when assistant should stop talking on customer interruption.

            You should configure this if you're running into these issues:
            - The assistant is too slow to recognize customer's interruption.
            - The assistant is too fast to recognize customer's interruption.
            - The assistant is getting interrupted by phrases that are just acknowledgments.
            - The assistant is getting interrupted by background noises.
            - The assistant is not properly stopping -- it starts talking right after getting interrupted.
        monitorPlan:
          $ref: '#/components/schemas/MonitorPlan'
          description: |-
            This is the plan for real-time monitoring of the assistant's calls.

            Usage:
            - To enable live listening of the assistant's calls, set `monitorPlan.listenEnabled` to `true`.
            - To enable live control of the assistant's calls, set `monitorPlan.controlEnabled` to `true`.
            - To attach monitors to the assistant, set `monitorPlan.monitorIds` to the set of monitor ids.
        credentialIds:
          type: array
          items:
            type: string
          description: >-
            These are the credentials that will be used for the assistant calls. By default, all the credentials are
            available for use in the call but you can provide a subset using this.
        server:
          $ref: '#/components/schemas/Server'
          description: >-
            This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
            ServerMessage schema.


            The order of precedence is:


            1. assistant.server.url

            2. phoneNumber.serverUrl

            3. org.serverUrl
        keypadInputPlan:
          $ref: '#/components/schemas/KeypadInputPlan'
        id:
          type: string
          description: This is the unique identifier for the assistant.
        orgId:
          type: string
          description: This is the unique identifier for the org that this assistant belongs to.
        createdAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the assistant was created.
        updatedAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the assistant was last updated.
      required:
        - id
        - orgId
        - createdAt
        - updatedAt
      title: Assistant
    UpdateAssistantDtoTranscriber:
      oneOf:
        - $ref: '#/components/schemas/AssemblyAITranscriber'
        - $ref: '#/components/schemas/AzureSpeechTranscriber'
        - $ref: '#/components/schemas/CustomTranscriber'
        - $ref: '#/components/schemas/DeepgramTranscriber'
        - $ref: '#/components/schemas/ElevenLabsTranscriber'
        - $ref: '#/components/schemas/GladiaTranscriber'
        - $ref: '#/components/schemas/GoogleTranscriber'
        - $ref: '#/components/schemas/SpeechmaticsTranscriber'
        - $ref: '#/components/schemas/TalkscriberTranscriber'
        - $ref: '#/components/schemas/OpenAITranscriber'
        - $ref: '#/components/schemas/CartesiaTranscriber'
        - $ref: '#/components/schemas/SonioxTranscriber'
      description: These are the options for the assistant's transcriber.
      title: UpdateAssistantDtoTranscriber
    UpdateAssistantDtoModel:
      oneOf:
        - $ref: '#/components/schemas/AnthropicModel'
        - $ref: '#/components/schemas/AnthropicBedrockModel'
        - $ref: '#/components/schemas/AnyscaleModel'
        - $ref: '#/components/schemas/CerebrasModel'
        - $ref: '#/components/schemas/CustomLLMModel'
        - $ref: '#/components/schemas/DeepInfraModel'
        - $ref: '#/components/schemas/DeepSeekModel'
        - $ref: '#/components/schemas/GoogleModel'
        - $ref: '#/components/schemas/GroqModel'
        - $ref: '#/components/schemas/InflectionAIModel'
        - $ref: '#/components/schemas/MinimaxLLMModel'
        - $ref: '#/components/schemas/OpenAIModel'
        - $ref: '#/components/schemas/OpenRouterModel'
        - $ref: '#/components/schemas/PerplexityAIModel'
        - $ref: '#/components/schemas/TogetherAIModel'
        - $ref: '#/components/schemas/XaiModel'
      description: These are the options for the assistant's LLM.
      title: UpdateAssistantDtoModel
    UpdateAssistantDtoVoice:
      oneOf:
        - $ref: '#/components/schemas/AzureVoice'
        - $ref: '#/components/schemas/CartesiaVoice'
        - $ref: '#/components/schemas/CustomVoice'
        - $ref: '#/components/schemas/DeepgramVoice'
        - $ref: '#/components/schemas/ElevenLabsVoice'
        - $ref: '#/components/schemas/HumeVoice'
        - $ref: '#/components/schemas/LMNTVoice'
        - $ref: '#/components/schemas/NeuphonicVoice'
        - $ref: '#/components/schemas/OpenAIVoice'
        - $ref: '#/components/schemas/PlayHTVoice'
        - $ref: '#/components/schemas/WellSaidVoice'
        - $ref: '#/components/schemas/RimeAIVoice'
        - $ref: '#/components/schemas/SmallestAIVoice'
        - $ref: '#/components/schemas/TavusVoice'
        - $ref: '#/components/schemas/VapiVoice'
        - $ref: '#/components/schemas/SesameVoice'
        - $ref: '#/components/schemas/InworldVoice'
        - $ref: '#/components/schemas/MinimaxVoice'
      description: These are the options for the assistant's voice.
      title: UpdateAssistantDtoVoice
    UpdateAssistantDtoFirstMessageMode:
      type: string
      enum:
        - assistant-speaks-first
        - assistant-speaks-first-with-model-generated-message
        - assistant-waits-for-user
      description: >-
        This is the mode for the first message. Default is 'assistant-speaks-first'.


        Use:

        - 'assistant-speaks-first' to have the assistant speak first.

        - 'assistant-waits-for-user' to have the assistant wait for the user to speak first.

        - 'assistant-speaks-first-with-model-generated-message' to have the assistant speak first with a message
        generated by the model based on the conversation state. (`assistant.model.messages` at call start,
        `call.messages` at squad transfer points).


        @default 'assistant-speaks-first'
      title: UpdateAssistantDtoFirstMessageMode
    UpdateAssistantDtoVoicemailDetection0:
      type: string
      enum:
        - 'off'
      title: UpdateAssistantDtoVoicemailDetection0
    UpdateAssistantDtoVoicemailDetection:
      oneOf:
        - $ref: '#/components/schemas/UpdateAssistantDtoVoicemailDetection0'
        - $ref: '#/components/schemas/GoogleVoicemailDetectionPlan'
        - $ref: '#/components/schemas/OpenAIVoicemailDetectionPlan'
        - $ref: '#/components/schemas/TwilioVoicemailDetectionPlan'
        - $ref: '#/components/schemas/VapiVoicemailDetectionPlan'
      description: >-
        These are the settings to configure or disable voicemail detection. Alternatively, voicemail detection can be
        configured using the model.tools=[VoicemailTool].

        By default, voicemail detection is disabled.
      title: UpdateAssistantDtoVoicemailDetection
    UpdateAssistantDtoClientMessages:
      type: string
      enum:
        - conversation-update
        - assistant.speechStarted
        - function-call
        - function-call-result
        - hang
        - language-changed
        - metadata
        - model-output
        - speech-update
        - status-update
        - transcript
        - tool-calls
        - tool-calls-result
        - tool.completed
        - transfer-update
        - user-interrupted
        - voice-input
        - workflow.node.started
        - assistant.started
      description: >-
        These are the messages that will be sent to your Client SDKs. Default is
        conversation-update,function-call,hang,model-output,speech-update,status-update,transfer-update,transcript,tool-calls,user-interrupted,voice-input,workflow.node.started,assistant.started.
        You can check the shape of the messages in ClientMessage schema.
      title: UpdateAssistantDtoClientMessages
    UpdateAssistantDtoServerMessages:
      type: string
      enum:
        - assistant.started
        - assistant.speechStarted
        - conversation-update
        - end-of-call-report
        - function-call
        - hang
        - language-changed
        - language-change-detected
        - model-output
        - phone-call-control
        - speech-update
        - status-update
        - transcript
        - transcript[transcriptType="final"]
        - tool-calls
        - transfer-destination-request
        - handoff-destination-request
        - transfer-update
        - user-interrupted
        - voice-input
        - chat.created
        - chat.deleted
        - session.created
        - session.updated
        - session.deleted
        - call.deleted
        - call.delete.failed
      description: >-
        These are the messages that will be sent to your Server URL. Default is
        conversation-update,end-of-call-report,function-call,hang,speech-update,status-update,tool-calls,transfer-destination-request,handoff-destination-request,user-interrupted,assistant.started.
        You can check the shape of the messages in ServerMessage schema.
      title: UpdateAssistantDtoServerMessages
    UpdateAssistantDtoBackgroundSound0:
      type: string
      enum:
        - 'off'
        - office
      title: UpdateAssistantDtoBackgroundSound0
    UpdateAssistantDtoBackgroundSound:
      oneOf:
        - $ref: '#/components/schemas/UpdateAssistantDtoBackgroundSound0'
        - type: string
          format: uri
      description: >-
        This is the background sound in the call. Default for phone calls is 'office' and default for web calls is
        'off'.

        You can also provide a custom sound by providing a URL to an audio file.
      title: UpdateAssistantDtoBackgroundSound
    UpdateAssistantDtoTransportConfigurationsItems:
      oneOf:
        - $ref: '#/components/schemas/TransportConfigurationTwilio'
      title: UpdateAssistantDtoTransportConfigurationsItems
    UpdateAssistantDtoCredentialsItems:
      oneOf:
        - type: object
          properties:
            provider:
              type: string
              enum:
                - 11labs
              description: 'Discriminator value: 11labs'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateElevenLabsCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - anthropic
              description: 'Discriminator value: anthropic'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateAnthropicCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - anthropic-bedrock
              description: 'Discriminator value: anthropic-bedrock'
            region:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockRegion'
              description: AWS region where Bedrock is configured.
            authenticationPlan:
              $ref: >-
                #/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockAuthenticationPlan
              description: Authentication method - either direct IAM credentials or cross-account role assumption.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - region
            - authenticationPlan
          description: anthropic-bedrock variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - anyscale
              description: 'Discriminator value: anyscale'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateAnyscaleCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - assembly-ai
              description: 'Discriminator value: assembly-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateAssemblyAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - azure-openai
              description: 'Discriminator value: azure-openai'
            region:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiRegion'
            models:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiModels'
            openAIKey:
              type: string
              description: This is not returned in the API.
            ocpApimSubscriptionKey:
              type: string
              description: This is not returned in the API.
            openAIEndpoint:
              type: string
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - region
            - models
            - openAIKey
            - openAIEndpoint
          description: CreateAzureOpenAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - azure
              description: 'Discriminator value: azure'
            service:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureService'
              description: This is the service being used in Azure.
            region:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureRegion'
              description: This is the region of the Azure resource.
            apiKey:
              type: string
              description: This is not returned in the API.
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            bucketPlan:
              $ref: '#/components/schemas/AzureBlobStorageBucketPlan'
              description: This is the bucket plan that can be provided to store call artifacts in Azure Blob Storage.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - service
          description: CreateAzureCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - byo-sip-trunk
              description: 'Discriminator value: byo-sip-trunk'
            gateways:
              type: array
              items:
                $ref: '#/components/schemas/SipTrunkGateway'
              description: This is the list of SIP trunk's gateways.
            outboundAuthenticationPlan:
              $ref: '#/components/schemas/SipTrunkOutboundAuthenticationPlan'
              description: This can be used to configure the outbound authentication if required by the SIP trunk.
            outboundLeadingPlusEnabled:
              type: boolean
              description: >-
                This ensures the outbound origination attempts have a leading plus. Defaults to false to match
                conventional telecom behavior.


                Usage:

                - Vonage/Twilio requires leading plus for all outbound calls. Set this to true.


                @default false
            techPrefix:
              type: string
              description: This can be used to configure the tech prefix on outbound calls. This is an advanced property.
            sipDiversionHeader:
              type: string
              description: >-
                This can be used to enable the SIP diversion header for authenticating the calling number if the SIP
                trunk supports it. This is an advanced property.
            sbcConfiguration:
              $ref: '#/components/schemas/SbcConfiguration'
              description: >-
                This is an advanced configuration for enterprise deployments. This uses the onprem SBC to trunk into the
                SIP trunk's `gateways`, rather than the managed SBC provided by Vapi.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - gateways
          description: CreateByoSipTrunkCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - cartesia
              description: 'Discriminator value: cartesia'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateCartesiaCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateCerebrasCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateCerebrasCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - cloudflare
              description: 'Discriminator value: cloudflare'
            accountId:
              type: string
              description: Cloudflare Account Id.
            apiKey:
              type: string
              description: Cloudflare API Key / Token.
            accountEmail:
              type: string
              description: Cloudflare Account Email.
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            bucketPlan:
              $ref: '#/components/schemas/CloudflareR2BucketPlan'
              description: This is the bucket plan that can be provided to store call artifacts in R2
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
          description: CreateCloudflareCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - custom-llm
              description: 'Discriminator value: custom-llm'
            apiKey:
              type: string
              description: This is not returned in the API.
            authenticationPlan:
              $ref: '#/components/schemas/OAuth2AuthenticationPlan'
              description: >-
                This is the authentication plan. Currently supports OAuth2 RFC 6749. To use Bearer authentication, use
                apiKey
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateCustomLLMCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - deepgram
              description: 'Discriminator value: deepgram'
            apiKey:
              type: string
              description: This is not returned in the API.
            apiUrl:
              type: string
              description: This can be used to point to an onprem Deepgram instance. Defaults to api.deepgram.com.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateDeepgramCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - deepinfra
              description: 'Discriminator value: deepinfra'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateDeepInfraCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - deep-seek
              description: 'Discriminator value: deep-seek'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateDeepSeekCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - gcp
              description: 'Discriminator value: gcp'
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            gcpKey:
              $ref: '#/components/schemas/GcpKey'
              description: >-
                This is the GCP key. This is the JSON that can be generated in the Google Cloud Console at
                https://console.cloud.google.com/iam-admin/serviceaccounts/details/<service-account-id>/keys.


                The schema is identical to the JSON that GCP outputs.
            region:
              type: string
              description: This is the region of the GCP resource.
            bucketPlan:
              $ref: '#/components/schemas/BucketPlan'
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - gcpKey
          description: CreateGcpCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - gladia
              description: 'Discriminator value: gladia'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateGladiaCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - gohighlevel
              description: 'Discriminator value: gohighlevel'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateGoHighLevelCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateGoogleCredentialDtoProvider'
              description: 'This is the key for Gemini in Google AI Studio. Get it from here: https://aistudio.google.com/app/apikey'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateGoogleCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - groq
              description: 'Discriminator value: groq'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateGroqCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateInflectionAiCredentialDtoProvider'
              description: >-
                This is the api key for Pi in InflectionAI's console. Get it from here:
                https://developers.inflection.ai/keys, billing will need to be setup
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateInflectionAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - langfuse
              description: 'Discriminator value: langfuse'
            publicKey:
              type: string
              description: 'The public key for Langfuse project. Eg: pk-lf-...'
            apiKey:
              type: string
              description: 'The secret key for Langfuse project. Eg: sk-lf-... .This is not returned in the API.'
            apiUrl:
              type: string
              description: 'The host URL for Langfuse project. Eg: https://cloud.langfuse.com'
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - publicKey
            - apiKey
            - apiUrl
          description: CreateLangfuseCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - lmnt
              description: 'Discriminator value: lmnt'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateLmntCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - make
              description: 'Discriminator value: make'
            teamId:
              type: string
              description: Team ID
            region:
              type: string
              description: 'Region of your application. For example: eu1, eu2, us1, us2'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - teamId
            - region
            - apiKey
          description: CreateMakeCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - openai
              description: 'Discriminator value: openai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateOpenAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - openrouter
              description: 'Discriminator value: openrouter'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateOpenRouterCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - perplexity-ai
              description: 'Discriminator value: perplexity-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreatePerplexityAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - playht
              description: 'Discriminator value: playht'
            apiKey:
              type: string
              description: This is not returned in the API.
            userId:
              type: string
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
            - userId
          description: CreatePlayHTCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - rime-ai
              description: 'Discriminator value: rime-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateRimeAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - runpod
              description: 'Discriminator value: runpod'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateRunpodCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - s3
              description: 'Discriminator value: s3'
            awsAccessKeyId:
              type: string
              description: AWS access key ID.
            awsSecretAccessKey:
              type: string
              description: AWS access key secret. This is not returned in the API.
            region:
              type: string
              description: AWS region in which the S3 bucket is located.
            s3BucketName:
              type: string
              description: AWS S3 bucket name.
            s3PathPrefix:
              type: string
              description: The path prefix for the uploaded recording. Ex. "recordings/"
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - awsAccessKeyId
            - awsSecretAccessKey
            - region
            - s3BucketName
            - s3PathPrefix
          description: CreateS3CredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - supabase
              description: 'Discriminator value: supabase'
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            bucketPlan:
              $ref: '#/components/schemas/SupabaseBucketPlan'
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
          description: CreateSupabaseCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - smallest-ai
              description: 'Discriminator value: smallest-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateSmallestAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - tavus
              description: 'Discriminator value: tavus'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateTavusCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - together-ai
              description: 'Discriminator value: together-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateTogetherAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - twilio
              description: 'Discriminator value: twilio'
            authToken:
              type: string
              description: This is not returned in the API.
            apiKey:
              type: string
              description: This is not returned in the API.
            apiSecret:
              type: string
              description: This is not returned in the API.
            accountSid:
              type: string
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - accountSid
          description: CreateTwilioCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - vonage
              description: 'Discriminator value: vonage'
            apiSecret:
              type: string
              description: This is not returned in the API.
            apiKey:
              type: string
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiSecret
            - apiKey
          description: CreateVonageCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - webhook
              description: 'Discriminator value: webhook'
            authenticationPlan:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingWebhookAuthenticationPlan'
              description: This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authenticationPlan
          description: CreateWebhookCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateCustomCredentialDtoProvider'
            authenticationPlan:
              $ref: '#/components/schemas/CreateCustomCredentialDtoAuthenticationPlan'
              description: This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication.
            encryptionPlan:
              $ref: '#/components/schemas/PublicKeyEncryptionPlan'
              description: This is the encryption plan for encrypting sensitive data. Currently supports public-key encryption.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authenticationPlan
          description: custom-credential variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - xai
              description: 'Discriminator value: xai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateXAiCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateNeuphonicCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateNeuphonicCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateHumeCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateHumeCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateMistralCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateMistralCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateSpeechmaticsCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateSpeechmaticsCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateSonioxCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: soniox variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateTrieveCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateTrieveCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - google.calendar.oauth2-client
              description: 'Discriminator value: google.calendar.oauth2-client'
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
          description: CreateGoogleCalendarOAuth2ClientCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - google.calendar.oauth2-authorization
              description: 'Discriminator value: google.calendar.oauth2-authorization'
            authorizationId:
              type: string
              description: The authorization ID for the OAuth2 authorization
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authorizationId
          description: CreateGoogleCalendarOAuth2AuthorizationCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - google.sheets.oauth2-authorization
              description: 'Discriminator value: google.sheets.oauth2-authorization'
            authorizationId:
              type: string
              description: The authorization ID for the OAuth2 authorization
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authorizationId
          description: CreateGoogleSheetsOAuth2AuthorizationCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - slack.oauth2-authorization
              description: 'Discriminator value: slack.oauth2-authorization'
            authorizationId:
              type: string
              description: The authorization ID for the OAuth2 authorization
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authorizationId
          description: CreateSlackOAuth2AuthorizationCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateGoHighLevelMcpCredentialDtoProvider'
            authenticationSession:
              $ref: '#/components/schemas/Oauth2AuthenticationSession'
              description: This is the authentication session for the credential.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authenticationSession
          description: CreateGoHighLevelMCPCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateInworldCredentialDtoProvider'
            apiKey:
              type: string
              description: This is the Inworld Basic (Base64) authentication token. This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: inworld variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - minimax
              description: 'Discriminator value: minimax'
            apiKey:
              type: string
              description: This is not returned in the API.
            groupId:
              type: string
              description: This is the Minimax Group ID.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
            - groupId
          description: minimax variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateWellSaidCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: wellsaid variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateEmailCredentialDtoProvider'
            email:
              type: string
              description: The recipient email address for alerts
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - email
          description: email variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateSlackWebhookCredentialDtoProvider'
            webhookUrl:
              type: string
              description: >-
                Slack incoming webhook URL. See https://api.slack.com/messaging/webhooks for setup instructions. This is
                not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - webhookUrl
          description: slack-webhook variant
      discriminator:
        propertyName: provider
      title: UpdateAssistantDtoCredentialsItems
    UpdateAssistantDtoHooksItems:
      oneOf:
        - $ref: '#/components/schemas/CallHookCallEnding'
        - $ref: '#/components/schemas/CallHookAssistantSpeechInterrupted'
        - $ref: '#/components/schemas/CallHookCustomerSpeechInterrupted'
        - $ref: '#/components/schemas/CallHookCustomerSpeechTimeout'
        - $ref: '#/components/schemas/SessionCreatedHook'
      title: UpdateAssistantDtoHooksItems
    UpdateAssistantDtoMetadata:
      type: object
      properties: {}
      description: This is for metadata you want to store on the assistant.
      title: UpdateAssistantDtoMetadata
    UpdateAssistantDTO:
      type: object
      properties:
        transcriber:
          $ref: '#/components/schemas/UpdateAssistantDtoTranscriber'
          description: These are the options for the assistant's transcriber.
        model:
          $ref: '#/components/schemas/UpdateAssistantDtoModel'
          description: These are the options for the assistant's LLM.
        voice:
          $ref: '#/components/schemas/UpdateAssistantDtoVoice'
          description: These are the options for the assistant's voice.
        firstMessage:
          type: string
          description: >-
            This is the first message that the assistant will say. This can also be a URL to a containerized audio file
            (mp3, wav, etc.).


            If unspecified, assistant will wait for user to speak and use the model to respond once they speak.
        firstMessageInterruptionsEnabled:
          type: boolean
          default: false
        firstMessageMode:
          $ref: '#/components/schemas/UpdateAssistantDtoFirstMessageMode'
          description: >-
            This is the mode for the first message. Default is 'assistant-speaks-first'.


            Use:

            - 'assistant-speaks-first' to have the assistant speak first.

            - 'assistant-waits-for-user' to have the assistant wait for the user to speak first.

            - 'assistant-speaks-first-with-model-generated-message' to have the assistant speak first with a message
            generated by the model based on the conversation state. (`assistant.model.messages` at call start,
            `call.messages` at squad transfer points).


            @default 'assistant-speaks-first'
        voicemailDetection:
          $ref: '#/components/schemas/UpdateAssistantDtoVoicemailDetection'
          description: >-
            These are the settings to configure or disable voicemail detection. Alternatively, voicemail detection can
            be configured using the model.tools=[VoicemailTool].

            By default, voicemail detection is disabled.
        clientMessages:
          $ref: '#/components/schemas/UpdateAssistantDtoClientMessages'
          description: >-
            These are the messages that will be sent to your Client SDKs. Default is
            conversation-update,function-call,hang,model-output,speech-update,status-update,transfer-update,transcript,tool-calls,user-interrupted,voice-input,workflow.node.started,assistant.started.
            You can check the shape of the messages in ClientMessage schema.
        serverMessages:
          $ref: '#/components/schemas/UpdateAssistantDtoServerMessages'
          description: >-
            These are the messages that will be sent to your Server URL. Default is
            conversation-update,end-of-call-report,function-call,hang,speech-update,status-update,tool-calls,transfer-destination-request,handoff-destination-request,user-interrupted,assistant.started.
            You can check the shape of the messages in ServerMessage schema.
        maxDurationSeconds:
          type: number
          format: double
          description: >-
            This is the maximum number of seconds that the call will last. When the call reaches this duration, it will
            be ended.


            @default 600 (10 minutes)
        backgroundSound:
          $ref: '#/components/schemas/UpdateAssistantDtoBackgroundSound'
          description: >-
            This is the background sound in the call. Default for phone calls is 'office' and default for web calls is
            'off'.

            You can also provide a custom sound by providing a URL to an audio file.
        modelOutputInMessagesEnabled:
          type: boolean
          description: >-
            This determines whether the model's output is used in conversation history rather than the transcription of
            assistant's speech.


            @default false
        transportConfigurations:
          type: array
          items:
            $ref: '#/components/schemas/UpdateAssistantDtoTransportConfigurationsItems'
          description: >-
            These are the configurations to be passed to the transport providers of assistant's calls, like Twilio. You
            can store multiple configurations for different transport providers. For a call, only the configuration
            matching the call transport provider is used.
        observabilityPlan:
          $ref: '#/components/schemas/LangfuseObservabilityPlan'
          description: |-
            This is the plan for observability of assistant's calls.

            Currently, only Langfuse is supported.
        credentials:
          type: array
          items:
            $ref: '#/components/schemas/UpdateAssistantDtoCredentialsItems'
          description: >-
            These are dynamic credentials that will be used for the assistant calls. By default, all the credentials are
            available for use in the call but you can supplement an additional credentials using this. Dynamic
            credentials override existing credentials.
        hooks:
          type: array
          items:
            $ref: '#/components/schemas/UpdateAssistantDtoHooksItems'
          description: This is a set of actions that will be performed on certain events.
        name:
          type: string
          description: |-
            This is the name of the assistant.

            This is required when you want to transfer between assistants in a call.
        voicemailMessage:
          type: string
          description: |-
            This is the message that the assistant will say if the call is forwarded to voicemail.

            If unspecified, it will hang up.
        endCallMessage:
          type: string
          description: |-
            This is the message that the assistant will say if it ends the call.

            If unspecified, it will hang up without saying anything.
        endCallPhrases:
          type: array
          items:
            type: string
          description: >-
            This list contains phrases that, if spoken by the assistant, will trigger the call to be hung up. Case
            insensitive.
        compliancePlan:
          $ref: '#/components/schemas/CompliancePlan'
        metadata:
          $ref: '#/components/schemas/UpdateAssistantDtoMetadata'
          description: This is for metadata you want to store on the assistant.
        backgroundSpeechDenoisingPlan:
          $ref: '#/components/schemas/BackgroundSpeechDenoisingPlan'
          description: |-
            This enables filtering of noise and background speech while the user is talking.

            Features:
            - Smart denoising using Krisp
            - Fourier denoising

            Smart denoising can be combined with or used independently of Fourier denoising.

            Order of precedence:
            - Smart denoising
            - Fourier denoising
        analysisPlan:
          $ref: '#/components/schemas/AnalysisPlan'
          description: This is the plan for analysis of assistant's calls. Stored in `call.analysis`.
        artifactPlan:
          $ref: '#/components/schemas/ArtifactPlan'
          description: This is the plan for artifacts generated during assistant's calls. Stored in `call.artifact`.
        startSpeakingPlan:
          $ref: '#/components/schemas/StartSpeakingPlan'
          description: |-
            This is the plan for when the assistant should start talking.

            You should configure this if you're running into these issues:
            - The assistant is too slow to start talking after the customer is done speaking.
            - The assistant is too fast to start talking after the customer is done speaking.
            - The assistant is so fast that it's actually interrupting the customer.
        stopSpeakingPlan:
          $ref: '#/components/schemas/StopSpeakingPlan'
          description: |-
            This is the plan for when assistant should stop talking on customer interruption.

            You should configure this if you're running into these issues:
            - The assistant is too slow to recognize customer's interruption.
            - The assistant is too fast to recognize customer's interruption.
            - The assistant is getting interrupted by phrases that are just acknowledgments.
            - The assistant is getting interrupted by background noises.
            - The assistant is not properly stopping -- it starts talking right after getting interrupted.
        monitorPlan:
          $ref: '#/components/schemas/MonitorPlan'
          description: |-
            This is the plan for real-time monitoring of the assistant's calls.

            Usage:
            - To enable live listening of the assistant's calls, set `monitorPlan.listenEnabled` to `true`.
            - To enable live control of the assistant's calls, set `monitorPlan.controlEnabled` to `true`.
            - To attach monitors to the assistant, set `monitorPlan.monitorIds` to the set of monitor ids.
        credentialIds:
          type: array
          items:
            type: string
          description: >-
            These are the credentials that will be used for the assistant calls. By default, all the credentials are
            available for use in the call but you can provide a subset using this.
        server:
          $ref: '#/components/schemas/Server'
          description: >-
            This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
            ServerMessage schema.


            The order of precedence is:


            1. assistant.server.url

            2. phoneNumber.serverUrl

            3. org.serverUrl
        keypadInputPlan:
          $ref: '#/components/schemas/KeypadInputPlan'
      title: UpdateAssistantDTO
    Squad:
      type: object
      properties:
        name:
          type: string
          description: This is the name of the squad.
        members:
          type: array
          items:
            $ref: '#/components/schemas/SquadMemberDTO'
          description: |-
            This is the list of assistants that make up the squad.

            The call will start with the first assistant in the list.
        membersOverrides:
          $ref: '#/components/schemas/AssistantOverrides'
          description: >-
            This can be used to override all the assistants' settings and provide values for their template variables.


            Both `membersOverrides` and `members[n].assistantOverrides` can be used together. First,
            `members[n].assistantOverrides` is applied. Then, `membersOverrides` is applied as a global override.
        id:
          type: string
          description: This is the unique identifier for the squad.
        orgId:
          type: string
          description: This is the unique identifier for the org that this squad belongs to.
        createdAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the squad was created.
        updatedAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the squad was last updated.
      required:
        - members
        - id
        - orgId
        - createdAt
        - updatedAt
      title: Squad
    UpdateSquadDTO:
      type: object
      properties:
        name:
          type: string
          description: This is the name of the squad.
        members:
          type: array
          items:
            $ref: '#/components/schemas/SquadMemberDTO'
          description: |-
            This is the list of assistants that make up the squad.

            The call will start with the first assistant in the list.
        membersOverrides:
          $ref: '#/components/schemas/AssistantOverrides'
          description: >-
            This can be used to override all the assistants' settings and provide values for their template variables.


            Both `membersOverrides` and `members[n].assistantOverrides` can be used together. First,
            `members[n].assistantOverrides` is applied. Then, `membersOverrides` is applied as a global override.
      required:
        - members
      title: UpdateSquadDTO
    CallType:
      type: string
      enum:
        - inboundPhoneCall
        - outboundPhoneCall
        - webCall
        - vapi.websocketCall
      description: This is the type of call.
      title: CallType
    TransportCostType:
      type: string
      enum:
        - transport
      description: This is the type of cost, always 'transport' for this class.
      title: TransportCostType
    TransportCostProvider:
      type: string
      enum:
        - daily
        - vapi.websocket
        - twilio
        - vonage
        - telnyx
        - vapi.sip
      title: TransportCostProvider
    TransportCost:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/TransportCostType'
          description: This is the type of cost, always 'transport' for this class.
        provider:
          $ref: '#/components/schemas/TransportCostProvider'
        minutes:
          type: number
          format: double
          description: This is the minutes of `transport` usage. This should match `call.endedAt` - `call.startedAt`.
        cost:
          type: number
          format: double
          description: This is the cost of the component in USD.
      required:
        - type
        - minutes
        - cost
      title: TransportCost
    TranscriberCostType:
      type: string
      enum:
        - transcriber
      description: This is the type of cost, always 'transcriber' for this class.
      title: TranscriberCostType
    TranscriberCostTranscriber:
      type: object
      properties: {}
      description: |-
        This is the transcriber that was used during the call.

        This matches one of the below:
        - `call.assistant.transcriber`,
        - `call.assistantId->transcriber`,
        - `call.squad[n].assistant.transcriber`,
        - `call.squad[n].assistantId->transcriber`,
        - `call.squadId->[n].assistant.transcriber`,
        - `call.squadId->[n].assistantId->transcriber`.
      title: TranscriberCostTranscriber
    TranscriberCost:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/TranscriberCostType'
          description: This is the type of cost, always 'transcriber' for this class.
        transcriber:
          $ref: '#/components/schemas/TranscriberCostTranscriber'
          description: |-
            This is the transcriber that was used during the call.

            This matches one of the below:
            - `call.assistant.transcriber`,
            - `call.assistantId->transcriber`,
            - `call.squad[n].assistant.transcriber`,
            - `call.squad[n].assistantId->transcriber`,
            - `call.squadId->[n].assistant.transcriber`,
            - `call.squadId->[n].assistantId->transcriber`.
        minutes:
          type: number
          format: double
          description: >-
            This is the minutes of `transcriber` usage. This should match `call.endedAt` - `call.startedAt` for single
            assistant calls, while squad calls will have multiple transcriber costs one for each assistant that was
            used.
        cost:
          type: number
          format: double
          description: This is the cost of the component in USD.
      required:
        - type
        - transcriber
        - minutes
        - cost
      title: TranscriberCost
    ModelCostType:
      type: string
      enum:
        - model
      description: This is the type of cost, always 'model' for this class.
      title: ModelCostType
    ModelCostModel:
      type: object
      properties: {}
      description: |-
        This is the model that was used during the call.

        This matches one of the following:
        - `call.assistant.model`,
        - `call.assistantId->model`,
        - `call.squad[n].assistant.model`,
        - `call.squad[n].assistantId->model`,
        - `call.squadId->[n].assistant.model`,
        - `call.squadId->[n].assistantId->model`.
      title: ModelCostModel
    ModelCost:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/ModelCostType'
          description: This is the type of cost, always 'model' for this class.
        model:
          $ref: '#/components/schemas/ModelCostModel'
          description: |-
            This is the model that was used during the call.

            This matches one of the following:
            - `call.assistant.model`,
            - `call.assistantId->model`,
            - `call.squad[n].assistant.model`,
            - `call.squad[n].assistantId->model`,
            - `call.squadId->[n].assistant.model`,
            - `call.squadId->[n].assistantId->model`.
        promptTokens:
          type: number
          format: double
          description: >-
            This is the number of prompt tokens used in the call. These should be total prompt tokens used in the call
            for single assistant calls, while squad calls will have multiple model costs one for each assistant that was
            used.
        completionTokens:
          type: number
          format: double
          description: >-
            This is the number of completion tokens generated in the call. These should be total completion tokens used
            in the call for single assistant calls, while squad calls will have multiple model costs one for each
            assistant that was used.
        cachedPromptTokens:
          type: number
          format: double
          description: >-
            This is the number of cached prompt tokens used in the call. This is only applicable to certain providers
            (e.g., OpenAI, Azure OpenAI) that support prompt caching. Cached tokens are billed at a discounted rate.
        cost:
          type: number
          format: double
          description: This is the cost of the component in USD.
      required:
        - type
        - model
        - promptTokens
        - completionTokens
        - cost
      title: ModelCost
    VoiceCostType:
      type: string
      enum:
        - voice
      description: This is the type of cost, always 'voice' for this class.
      title: VoiceCostType
    VoiceCostVoice:
      type: object
      properties: {}
      description: |-
        This is the voice that was used during the call.

        This matches one of the following:
        - `call.assistant.voice`,
        - `call.assistantId->voice`,
        - `call.squad[n].assistant.voice`,
        - `call.squad[n].assistantId->voice`,
        - `call.squadId->[n].assistant.voice`,
        - `call.squadId->[n].assistantId->voice`.
      title: VoiceCostVoice
    VoiceCost:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/VoiceCostType'
          description: This is the type of cost, always 'voice' for this class.
        voice:
          $ref: '#/components/schemas/VoiceCostVoice'
          description: |-
            This is the voice that was used during the call.

            This matches one of the following:
            - `call.assistant.voice`,
            - `call.assistantId->voice`,
            - `call.squad[n].assistant.voice`,
            - `call.squad[n].assistantId->voice`,
            - `call.squadId->[n].assistant.voice`,
            - `call.squadId->[n].assistantId->voice`.
        characters:
          type: number
          format: double
          description: >-
            This is the number of characters that were generated during the call. These should be total characters used
            in the call for single assistant calls, while squad calls will have multiple voice costs one for each
            assistant that was used.
        cost:
          type: number
          format: double
          description: This is the cost of the component in USD.
      required:
        - type
        - voice
        - characters
        - cost
      title: VoiceCost
    VapiCostType:
      type: string
      enum:
        - vapi
      description: This is the type of cost, always 'vapi' for this class.
      title: VapiCostType
    VapiCostSubType:
      type: string
      enum:
        - normal
        - overage
      description: This is the sub type of the cost.
      title: VapiCostSubType
    VapiCost:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/VapiCostType'
          description: This is the type of cost, always 'vapi' for this class.
        subType:
          $ref: '#/components/schemas/VapiCostSubType'
          description: This is the sub type of the cost.
        minutes:
          type: number
          format: double
          description: This is the minutes of Vapi usage. This should match `call.endedAt` - `call.startedAt`.
        cost:
          type: number
          format: double
          description: This is the cost of the component in USD.
      required:
        - type
        - subType
        - minutes
        - cost
      title: VapiCost
    VoicemailDetectionCostType:
      type: string
      enum:
        - voicemail-detection
      description: This is the type of cost, always 'voicemail-detection' for this class.
      title: VoicemailDetectionCostType
    VoicemailDetectionCostModel:
      type: object
      properties: {}
      description: This is the model that was used to perform the analysis.
      title: VoicemailDetectionCostModel
    VoicemailDetectionCostProvider:
      type: string
      enum:
        - twilio
        - google
        - openai
        - vapi
      description: This is the provider that was used to detect the voicemail.
      title: VoicemailDetectionCostProvider
    VoicemailDetectionCost:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/VoicemailDetectionCostType'
          description: This is the type of cost, always 'voicemail-detection' for this class.
        model:
          $ref: '#/components/schemas/VoicemailDetectionCostModel'
          description: This is the model that was used to perform the analysis.
        provider:
          $ref: '#/components/schemas/VoicemailDetectionCostProvider'
          description: This is the provider that was used to detect the voicemail.
        promptTextTokens:
          type: number
          format: double
          description: This is the number of prompt text tokens used in the voicemail detection.
        promptAudioTokens:
          type: number
          format: double
          description: This is the number of prompt audio tokens used in the voicemail detection.
        completionTextTokens:
          type: number
          format: double
          description: This is the number of completion text tokens used in the voicemail detection.
        completionAudioTokens:
          type: number
          format: double
          description: This is the number of completion audio tokens used in the voicemail detection.
        cost:
          type: number
          format: double
          description: This is the cost of the component in USD.
      required:
        - type
        - model
        - provider
        - promptTextTokens
        - promptAudioTokens
        - completionTextTokens
        - completionAudioTokens
        - cost
      title: VoicemailDetectionCost
    AnalysisCostType:
      type: string
      enum:
        - analysis
      description: This is the type of cost, always 'analysis' for this class.
      title: AnalysisCostType
    AnalysisCostAnalysisType:
      type: string
      enum:
        - summary
        - structuredData
        - successEvaluation
        - structuredOutput
      description: This is the type of analysis performed.
      title: AnalysisCostAnalysisType
    AnalysisCostModel:
      type: object
      properties: {}
      description: This is the model that was used to perform the analysis.
      title: AnalysisCostModel
    AnalysisCost:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/AnalysisCostType'
          description: This is the type of cost, always 'analysis' for this class.
        analysisType:
          $ref: '#/components/schemas/AnalysisCostAnalysisType'
          description: This is the type of analysis performed.
        model:
          $ref: '#/components/schemas/AnalysisCostModel'
          description: This is the model that was used to perform the analysis.
        promptTokens:
          type: number
          format: double
          description: This is the number of prompt tokens used in the analysis.
        completionTokens:
          type: number
          format: double
          description: This is the number of completion tokens generated in the analysis.
        cachedPromptTokens:
          type: number
          format: double
          description: >-
            This is the number of cached prompt tokens used in the analysis. This is only applicable to certain
            providers (e.g., OpenAI, Azure OpenAI) that support prompt caching. Cached tokens are billed at a discounted
            rate.
        cost:
          type: number
          format: double
          description: This is the cost of the component in USD.
      required:
        - type
        - analysisType
        - model
        - promptTokens
        - completionTokens
        - cost
      title: AnalysisCost
    KnowledgeBaseCostType:
      type: string
      enum:
        - knowledge-base
      description: This is the type of cost, always 'knowledge-base' for this class.
      title: KnowledgeBaseCostType
    KnowledgeBaseCostModel:
      type: object
      properties: {}
      description: This is the model that was used for processing the knowledge base.
      title: KnowledgeBaseCostModel
    KnowledgeBaseCost:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/KnowledgeBaseCostType'
          description: This is the type of cost, always 'knowledge-base' for this class.
        model:
          $ref: '#/components/schemas/KnowledgeBaseCostModel'
          description: This is the model that was used for processing the knowledge base.
        promptTokens:
          type: number
          format: double
          description: This is the number of prompt tokens used in the knowledge base query.
        completionTokens:
          type: number
          format: double
          description: This is the number of completion tokens generated in the knowledge base query.
        cost:
          type: number
          format: double
          description: This is the cost of the component in USD.
      required:
        - type
        - model
        - promptTokens
        - completionTokens
        - cost
      title: KnowledgeBaseCost
    CallCostsItems:
      oneOf:
        - $ref: '#/components/schemas/TransportCost'
        - $ref: '#/components/schemas/TranscriberCost'
        - $ref: '#/components/schemas/ModelCost'
        - $ref: '#/components/schemas/VoiceCost'
        - $ref: '#/components/schemas/VapiCost'
        - $ref: '#/components/schemas/VoicemailDetectionCost'
        - $ref: '#/components/schemas/AnalysisCost'
        - $ref: '#/components/schemas/KnowledgeBaseCost'
      title: CallCostsItems
    BotMessage:
      type: object
      properties:
        role:
          type: string
          description: The role of the bot in the conversation.
        message:
          type: string
          description: The message content from the bot.
        time:
          type: number
          format: double
          description: The timestamp when the message was sent.
        endTime:
          type: number
          format: double
          description: The timestamp when the message ended.
        secondsFromStart:
          type: number
          format: double
          description: The number of seconds from the start of the conversation.
        source:
          type: string
          description: The source of the message.
        duration:
          type: number
          format: double
          description: The duration of the message in seconds.
      required:
        - role
        - message
        - time
        - endTime
        - secondsFromStart
      title: BotMessage
    ToolCallMessageToolCallsItems:
      type: object
      properties: {}
      title: ToolCallMessageToolCallsItems
    ToolCallMessage:
      type: object
      properties:
        role:
          type: string
          description: The role of the tool call in the conversation.
        toolCalls:
          type: array
          items:
            $ref: '#/components/schemas/ToolCallMessageToolCallsItems'
          description: The list of tool calls made during the conversation.
        message:
          type: string
          description: The message content for the tool call.
        time:
          type: number
          format: double
          description: The timestamp when the message was sent.
        secondsFromStart:
          type: number
          format: double
          description: The number of seconds from the start of the conversation.
      required:
        - role
        - toolCalls
        - message
        - time
        - secondsFromStart
      title: ToolCallMessage
    ToolCallResultMessageMetadata:
      type: object
      properties: {}
      description: The metadata for the tool call result.
      title: ToolCallResultMessageMetadata
    ToolCallResultMessage:
      type: object
      properties:
        role:
          type: string
          description: The role of the tool call result in the conversation.
        toolCallId:
          type: string
          description: The ID of the tool call.
        name:
          type: string
          description: The name of the tool that returned the result.
        result:
          type: string
          description: The result of the tool call in JSON format.
        time:
          type: number
          format: double
          description: The timestamp when the message was sent.
        secondsFromStart:
          type: number
          format: double
          description: The number of seconds from the start of the conversation.
        metadata:
          $ref: '#/components/schemas/ToolCallResultMessageMetadata'
          description: The metadata for the tool call result.
      required:
        - role
        - toolCallId
        - name
        - result
        - time
        - secondsFromStart
      title: ToolCallResultMessage
    CallMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/UserMessage'
        - $ref: '#/components/schemas/SystemMessage'
        - $ref: '#/components/schemas/BotMessage'
        - $ref: '#/components/schemas/ToolCallMessage'
        - $ref: '#/components/schemas/ToolCallResultMessage'
      title: CallMessagesItems
    CallPhoneCallProvider:
      type: string
      enum:
        - twilio
        - vonage
        - vapi
        - telnyx
      description: |-
        This is the provider of the call.

        Only relevant for `outboundPhoneCall` and `inboundPhoneCall` type.
      title: CallPhoneCallProvider
    CallPhoneCallTransport:
      type: string
      enum:
        - sip
        - pstn
      description: |-
        This is the transport of the phone call.

        Only relevant for `outboundPhoneCall` and `inboundPhoneCall` type.
      title: CallPhoneCallTransport
    CallStatus:
      type: string
      enum:
        - scheduled
        - queued
        - ringing
        - in-progress
        - forwarding
        - ended
        - not-found
        - deletion-failed
      description: This is the status of the call.
      title: CallStatus
    CallEndedReason:
      type: string
      enum:
        - call-start-error-neither-assistant-nor-server-set
        - assistant-request-failed
        - assistant-request-returned-error
        - assistant-request-returned-unspeakable-error
        - assistant-request-returned-invalid-assistant
        - assistant-request-returned-no-assistant
        - assistant-request-returned-forwarding-phone-number
        - scheduled-call-deleted
        - call.start.error-vapifault-get-org
        - call.start.error-vapifault-get-subscription
        - call.start.error-get-assistant
        - call.start.error-get-phone-number
        - call.start.error-get-customer
        - call.start.error-get-resources-validation
        - call.start.error-vapi-number-international
        - call.start.error-vapi-number-outbound-daily-limit
        - call.start.error-get-transport
        - call.start.error-subscription-wallet-does-not-exist
        - call.start.error-fraud-check-failed
        - call.start.error-subscription-frozen
        - call.start.error-subscription-insufficient-credits
        - call.start.error-subscription-upgrade-failed
        - call.start.error-subscription-concurrency-limit-reached
        - call.start.error-enterprise-feature-not-available-recording-consent
        - assistant-not-valid
        - call.start.error-vapifault-database-error
        - assistant-not-found
        - pipeline-error-openai-voice-failed
        - pipeline-error-cartesia-voice-failed
        - pipeline-error-deepgram-voice-failed
        - pipeline-error-eleven-labs-voice-failed
        - pipeline-error-playht-voice-failed
        - pipeline-error-lmnt-voice-failed
        - pipeline-error-azure-voice-failed
        - pipeline-error-rime-ai-voice-failed
        - pipeline-error-smallest-ai-voice-failed
        - pipeline-error-vapi-voice-failed
        - pipeline-error-neuphonic-voice-failed
        - pipeline-error-hume-voice-failed
        - pipeline-error-sesame-voice-failed
        - pipeline-error-inworld-voice-failed
        - pipeline-error-minimax-voice-failed
        - pipeline-error-wellsaid-voice-failed
        - pipeline-error-tavus-video-failed
        - call.in-progress.error-vapifault-openai-voice-failed
        - call.in-progress.error-vapifault-cartesia-voice-failed
        - call.in-progress.error-vapifault-deepgram-voice-failed
        - call.in-progress.error-vapifault-eleven-labs-voice-failed
        - call.in-progress.error-vapifault-playht-voice-failed
        - call.in-progress.error-vapifault-lmnt-voice-failed
        - call.in-progress.error-vapifault-azure-voice-failed
        - call.in-progress.error-vapifault-rime-ai-voice-failed
        - call.in-progress.error-vapifault-smallest-ai-voice-failed
        - call.in-progress.error-vapifault-vapi-voice-failed
        - call.in-progress.error-vapifault-neuphonic-voice-failed
        - call.in-progress.error-vapifault-hume-voice-failed
        - call.in-progress.error-vapifault-sesame-voice-failed
        - call.in-progress.error-vapifault-inworld-voice-failed
        - call.in-progress.error-vapifault-minimax-voice-failed
        - call.in-progress.error-vapifault-wellsaid-voice-failed
        - call.in-progress.error-vapifault-tavus-video-failed
        - pipeline-error-vapi-llm-failed
        - pipeline-error-vapi-400-bad-request-validation-failed
        - pipeline-error-vapi-401-unauthorized
        - pipeline-error-vapi-403-model-access-denied
        - pipeline-error-vapi-429-exceeded-quota
        - pipeline-error-vapi-500-server-error
        - pipeline-error-vapi-503-server-overloaded-error
        - call.in-progress.error-providerfault-vapi-llm-failed
        - call.in-progress.error-vapifault-vapi-400-bad-request-validation-failed
        - call.in-progress.error-vapifault-vapi-401-unauthorized
        - call.in-progress.error-vapifault-vapi-403-model-access-denied
        - call.in-progress.error-vapifault-vapi-429-exceeded-quota
        - call.in-progress.error-providerfault-vapi-500-server-error
        - call.in-progress.error-providerfault-vapi-503-server-overloaded-error
        - pipeline-error-deepgram-transcriber-failed
        - pipeline-error-deepgram-transcriber-api-key-missing
        - call.in-progress.error-vapifault-deepgram-transcriber-failed
        - pipeline-error-gladia-transcriber-failed
        - call.in-progress.error-vapifault-gladia-transcriber-failed
        - pipeline-error-speechmatics-transcriber-failed
        - call.in-progress.error-vapifault-speechmatics-transcriber-failed
        - pipeline-error-assembly-ai-transcriber-failed
        - pipeline-error-assembly-ai-returning-400-insufficent-funds
        - pipeline-error-assembly-ai-returning-400-paid-only-feature
        - pipeline-error-assembly-ai-returning-401-invalid-credentials
        - pipeline-error-assembly-ai-returning-500-invalid-schema
        - pipeline-error-assembly-ai-returning-500-word-boost-parsing-failed
        - call.in-progress.error-vapifault-assembly-ai-transcriber-failed
        - call.in-progress.error-vapifault-assembly-ai-returning-400-insufficent-funds
        - call.in-progress.error-vapifault-assembly-ai-returning-400-paid-only-feature
        - call.in-progress.error-vapifault-assembly-ai-returning-401-invalid-credentials
        - call.in-progress.error-vapifault-assembly-ai-returning-500-invalid-schema
        - call.in-progress.error-vapifault-assembly-ai-returning-500-word-boost-parsing-failed
        - pipeline-error-talkscriber-transcriber-failed
        - call.in-progress.error-vapifault-talkscriber-transcriber-failed
        - pipeline-error-azure-speech-transcriber-failed
        - call.in-progress.error-vapifault-azure-speech-transcriber-failed
        - pipeline-error-eleven-labs-transcriber-failed
        - call.in-progress.error-vapifault-eleven-labs-transcriber-failed
        - pipeline-error-google-transcriber-failed
        - call.in-progress.error-vapifault-google-transcriber-failed
        - pipeline-error-openai-transcriber-failed
        - call.in-progress.error-vapifault-openai-transcriber-failed
        - pipeline-error-soniox-transcriber-auth-failed
        - pipeline-error-soniox-transcriber-rate-limited
        - pipeline-error-soniox-transcriber-invalid-config
        - pipeline-error-soniox-transcriber-server-error
        - pipeline-error-soniox-transcriber-failed
        - call.in-progress.error-vapifault-soniox-transcriber-auth-failed
        - call.in-progress.error-vapifault-soniox-transcriber-rate-limited
        - call.in-progress.error-vapifault-soniox-transcriber-invalid-config
        - call.in-progress.error-vapifault-soniox-transcriber-server-error
        - call.in-progress.error-vapifault-soniox-transcriber-failed
        - call.in-progress.error-pipeline-no-available-llm-model
        - worker-shutdown
        - vonage-disconnected
        - vonage-failed-to-connect-call
        - vonage-completed
        - phone-call-provider-bypass-enabled-but-no-call-received
        - call.in-progress.error-providerfault-transport-never-connected
        - call.in-progress.error-vapifault-worker-not-available
        - call.in-progress.error-vapifault-transport-never-connected
        - call.in-progress.error-vapifault-transport-connected-but-call-not-active
        - call.in-progress.error-vapifault-call-started-but-connection-to-transport-missing
        - call.in-progress.error-vapifault-worker-died
        - call.in-progress.twilio-completed-call
        - call.in-progress.sip-completed-call
        - call.in-progress.error-sip-inbound-call-failed-to-connect
        - call.in-progress.error-providerfault-outbound-sip-503-service-unavailable
        - call.in-progress.error-sip-outbound-call-failed-to-connect
        - call.ringing.error-sip-inbound-call-failed-to-connect
        - call.in-progress.error-providerfault-openai-llm-failed
        - call.in-progress.error-providerfault-azure-openai-llm-failed
        - call.in-progress.error-providerfault-groq-llm-failed
        - call.in-progress.error-providerfault-google-llm-failed
        - call.in-progress.error-providerfault-xai-llm-failed
        - call.in-progress.error-providerfault-mistral-llm-failed
        - call.in-progress.error-providerfault-minimax-llm-failed
        - call.in-progress.error-providerfault-inflection-ai-llm-failed
        - call.in-progress.error-providerfault-cerebras-llm-failed
        - call.in-progress.error-providerfault-deep-seek-llm-failed
        - call.in-progress.error-providerfault-baseten-llm-failed
        - call.in-progress.error-vapifault-chat-pipeline-failed-to-start
        - pipeline-error-openai-400-bad-request-validation-failed
        - pipeline-error-openai-401-unauthorized
        - pipeline-error-openai-401-incorrect-api-key
        - pipeline-error-openai-401-account-not-in-organization
        - pipeline-error-openai-403-model-access-denied
        - pipeline-error-openai-429-exceeded-quota
        - pipeline-error-openai-429-rate-limit-reached
        - pipeline-error-openai-500-server-error
        - pipeline-error-openai-503-server-overloaded-error
        - pipeline-error-openai-llm-failed
        - call.in-progress.error-vapifault-openai-400-bad-request-validation-failed
        - call.in-progress.error-vapifault-openai-401-unauthorized
        - call.in-progress.error-vapifault-openai-401-incorrect-api-key
        - call.in-progress.error-vapifault-openai-401-account-not-in-organization
        - call.in-progress.error-vapifault-openai-403-model-access-denied
        - call.in-progress.error-vapifault-openai-429-exceeded-quota
        - call.in-progress.error-vapifault-openai-429-rate-limit-reached
        - call.in-progress.error-providerfault-openai-500-server-error
        - call.in-progress.error-providerfault-openai-503-server-overloaded-error
        - pipeline-error-azure-openai-400-bad-request-validation-failed
        - pipeline-error-azure-openai-401-unauthorized
        - pipeline-error-azure-openai-403-model-access-denied
        - pipeline-error-azure-openai-429-exceeded-quota
        - pipeline-error-azure-openai-500-server-error
        - pipeline-error-azure-openai-503-server-overloaded-error
        - pipeline-error-azure-openai-llm-failed
        - call.in-progress.error-vapifault-azure-openai-400-bad-request-validation-failed
        - call.in-progress.error-vapifault-azure-openai-401-unauthorized
        - call.in-progress.error-vapifault-azure-openai-403-model-access-denied
        - call.in-progress.error-vapifault-azure-openai-429-exceeded-quota
        - call.in-progress.error-providerfault-azure-openai-500-server-error
        - call.in-progress.error-providerfault-azure-openai-503-server-overloaded-error
        - pipeline-error-google-400-bad-request-validation-failed
        - pipeline-error-google-401-unauthorized
        - pipeline-error-google-403-model-access-denied
        - pipeline-error-google-429-exceeded-quota
        - pipeline-error-google-500-server-error
        - pipeline-error-google-503-server-overloaded-error
        - pipeline-error-google-llm-failed
        - call.in-progress.error-vapifault-google-400-bad-request-validation-failed
        - call.in-progress.error-vapifault-google-401-unauthorized
        - call.in-progress.error-vapifault-google-403-model-access-denied
        - call.in-progress.error-vapifault-google-429-exceeded-quota
        - call.in-progress.error-providerfault-google-500-server-error
        - call.in-progress.error-providerfault-google-503-server-overloaded-error
        - pipeline-error-xai-400-bad-request-validation-failed
        - pipeline-error-xai-401-unauthorized
        - pipeline-error-xai-403-model-access-denied
        - pipeline-error-xai-429-exceeded-quota
        - pipeline-error-xai-500-server-error
        - pipeline-error-xai-503-server-overloaded-error
        - pipeline-error-xai-llm-failed
        - call.in-progress.error-vapifault-xai-400-bad-request-validation-failed
        - call.in-progress.error-vapifault-xai-401-unauthorized
        - call.in-progress.error-vapifault-xai-403-model-access-denied
        - call.in-progress.error-vapifault-xai-429-exceeded-quota
        - call.in-progress.error-providerfault-xai-500-server-error
        - call.in-progress.error-providerfault-xai-503-server-overloaded-error
        - pipeline-error-baseten-400-bad-request-validation-failed
        - pipeline-error-baseten-401-unauthorized
        - pipeline-error-baseten-403-model-access-denied
        - pipeline-error-baseten-429-exceeded-quota
        - pipeline-error-baseten-500-server-error
        - pipeline-error-baseten-503-server-overloaded-error
        - pipeline-error-baseten-llm-failed
        - call.in-progress.error-vapifault-baseten-400-bad-request-validation-failed
        - call.in-progress.error-vapifault-baseten-401-unauthorized
        - call.in-progress.error-vapifault-baseten-403-model-access-denied
        - call.in-progress.error-vapifault-baseten-429-exceeded-quota
        - call.in-progress.error-providerfault-baseten-500-server-error
        - call.in-progress.error-providerfault-baseten-503-server-overloaded-error
        - pipeline-error-mistral-400-bad-request-validation-failed
        - pipeline-error-mistral-401-unauthorized
        - pipeline-error-mistral-403-model-access-denied
        - pipeline-error-mistral-429-exceeded-quota
        - pipeline-error-mistral-500-server-error
        - pipeline-error-mistral-503-server-overloaded-error
        - pipeline-error-mistral-llm-failed
        - call.in-progress.error-vapifault-mistral-400-bad-request-validation-failed
        - call.in-progress.error-vapifault-mistral-401-unauthorized
        - call.in-progress.error-vapifault-mistral-403-model-access-denied
        - call.in-progress.error-vapifault-mistral-429-exceeded-quota
        - call.in-progress.error-providerfault-mistral-500-server-error
        - call.in-progress.error-providerfault-mistral-503-server-overloaded-error
        - pipeline-error-minimax-400-bad-request-validation-failed
        - pipeline-error-minimax-401-unauthorized
        - pipeline-error-minimax-403-model-access-denied
        - pipeline-error-minimax-429-exceeded-quota
        - pipeline-error-minimax-500-server-error
        - pipeline-error-minimax-503-server-overloaded-error
        - pipeline-error-minimax-llm-failed
        - call.in-progress.error-vapifault-minimax-400-bad-request-validation-failed
        - call.in-progress.error-vapifault-minimax-401-unauthorized
        - call.in-progress.error-vapifault-minimax-403-model-access-denied
        - call.in-progress.error-vapifault-minimax-429-exceeded-quota
        - call.in-progress.error-providerfault-minimax-500-server-error
        - call.in-progress.error-providerfault-minimax-503-server-overloaded-error
        - pipeline-error-inflection-ai-400-bad-request-validation-failed
        - pipeline-error-inflection-ai-401-unauthorized
        - pipeline-error-inflection-ai-403-model-access-denied
        - pipeline-error-inflection-ai-429-exceeded-quota
        - pipeline-error-inflection-ai-500-server-error
        - pipeline-error-inflection-ai-503-server-overloaded-error
        - pipeline-error-inflection-ai-llm-failed
        - call.in-progress.error-vapifault-inflection-ai-400-bad-request-validation-failed
        - call.in-progress.error-vapifault-inflection-ai-401-unauthorized
        - call.in-progress.error-vapifault-inflection-ai-403-model-access-denied
        - call.in-progress.error-vapifault-inflection-ai-429-exceeded-quota
        - call.in-progress.error-providerfault-inflection-ai-500-server-error
        - call.in-progress.error-providerfault-inflection-ai-503-server-overloaded-error
        - pipeline-error-deep-seek-400-bad-request-validation-failed
        - pipeline-error-deep-seek-401-unauthorized
        - pipeline-error-deep-seek-403-model-access-denied
        - pipeline-error-deep-seek-429-exceeded-quota
        - pipeline-error-deep-seek-500-server-error
        - pipeline-error-deep-seek-503-server-overloaded-error
        - pipeline-error-deep-seek-llm-failed
        - call.in-progress.error-vapifault-deep-seek-400-bad-request-validation-failed
        - call.in-progress.error-vapifault-deep-seek-401-unauthorized
        - call.in-progress.error-vapifault-deep-seek-403-model-access-denied
        - call.in-progress.error-vapifault-deep-seek-429-exceeded-quota
        - call.in-progress.error-providerfault-deep-seek-500-server-error
        - call.in-progress.error-providerfault-deep-seek-503-server-overloaded-error
        - pipeline-error-groq-400-bad-request-validation-failed
        - pipeline-error-groq-401-unauthorized
        - pipeline-error-groq-403-model-access-denied
        - pipeline-error-groq-429-exceeded-quota
        - pipeline-error-groq-500-server-error
        - pipeline-error-groq-503-server-overloaded-error
        - pipeline-error-groq-llm-failed
        - call.in-progress.error-vapifault-groq-400-bad-request-validation-failed
        - call.in-progress.error-vapifault-groq-401-unauthorized
        - call.in-progress.error-vapifault-groq-403-model-access-denied
        - call.in-progress.error-vapifault-groq-429-exceeded-quota
        - call.in-progress.error-providerfault-groq-500-server-error
        - call.in-progress.error-providerfault-groq-503-server-overloaded-error
        - pipeline-error-cerebras-400-bad-request-validation-failed
        - pipeline-error-cerebras-401-unauthorized
        - pipeline-error-cerebras-403-model-access-denied
        - pipeline-error-cerebras-429-exceeded-quota
        - pipeline-error-cerebras-500-server-error
        - pipeline-error-cerebras-503-server-overloaded-error
        - pipeline-error-cerebras-llm-failed
        - call.in-progress.error-vapifault-cerebras-400-bad-request-validation-failed
        - call.in-progress.error-vapifault-cerebras-401-unauthorized
        - call.in-progress.error-vapifault-cerebras-403-model-access-denied
        - call.in-progress.error-vapifault-cerebras-429-exceeded-quota
        - call.in-progress.error-providerfault-cerebras-500-server-error
        - call.in-progress.error-providerfault-cerebras-503-server-overloaded-error
        - pipeline-error-anthropic-400-bad-request-validation-failed
        - pipeline-error-anthropic-401-unauthorized
        - pipeline-error-anthropic-403-model-access-denied
        - pipeline-error-anthropic-429-exceeded-quota
        - pipeline-error-anthropic-500-server-error
        - pipeline-error-anthropic-503-server-overloaded-error
        - pipeline-error-anthropic-llm-failed
        - call.in-progress.error-providerfault-anthropic-llm-failed
        - call.in-progress.error-vapifault-anthropic-400-bad-request-validation-failed
        - call.in-progress.error-vapifault-anthropic-401-unauthorized
        - call.in-progress.error-vapifault-anthropic-403-model-access-denied
        - call.in-progress.error-vapifault-anthropic-429-exceeded-quota
        - call.in-progress.error-providerfault-anthropic-500-server-error
        - call.in-progress.error-providerfault-anthropic-503-server-overloaded-error
        - pipeline-error-anthropic-bedrock-400-bad-request-validation-failed
        - pipeline-error-anthropic-bedrock-401-unauthorized
        - pipeline-error-anthropic-bedrock-403-model-access-denied
        - pipeline-error-anthropic-bedrock-429-exceeded-quota
        - pipeline-error-anthropic-bedrock-500-server-error
        - pipeline-error-anthropic-bedrock-503-server-overloaded-error
        - pipeline-error-anthropic-bedrock-llm-failed
        - call.in-progress.error-providerfault-anthropic-bedrock-llm-failed
        - call.in-progress.error-vapifault-anthropic-bedrock-400-bad-request-validation-failed
        - call.in-progress.error-vapifault-anthropic-bedrock-401-unauthorized
        - call.in-progress.error-vapifault-anthropic-bedrock-403-model-access-denied
        - call.in-progress.error-vapifault-anthropic-bedrock-429-exceeded-quota
        - call.in-progress.error-providerfault-anthropic-bedrock-500-server-error
        - call.in-progress.error-providerfault-anthropic-bedrock-503-server-overloaded-error
        - pipeline-error-anthropic-vertex-400-bad-request-validation-failed
        - pipeline-error-anthropic-vertex-401-unauthorized
        - pipeline-error-anthropic-vertex-403-model-access-denied
        - pipeline-error-anthropic-vertex-429-exceeded-quota
        - pipeline-error-anthropic-vertex-500-server-error
        - pipeline-error-anthropic-vertex-503-server-overloaded-error
        - pipeline-error-anthropic-vertex-llm-failed
        - call.in-progress.error-providerfault-anthropic-vertex-llm-failed
        - call.in-progress.error-vapifault-anthropic-vertex-400-bad-request-validation-failed
        - call.in-progress.error-vapifault-anthropic-vertex-401-unauthorized
        - call.in-progress.error-vapifault-anthropic-vertex-403-model-access-denied
        - call.in-progress.error-vapifault-anthropic-vertex-429-exceeded-quota
        - call.in-progress.error-providerfault-anthropic-vertex-500-server-error
        - call.in-progress.error-providerfault-anthropic-vertex-503-server-overloaded-error
        - pipeline-error-together-ai-400-bad-request-validation-failed
        - pipeline-error-together-ai-401-unauthorized
        - pipeline-error-together-ai-403-model-access-denied
        - pipeline-error-together-ai-429-exceeded-quota
        - pipeline-error-together-ai-500-server-error
        - pipeline-error-together-ai-503-server-overloaded-error
        - pipeline-error-together-ai-llm-failed
        - call.in-progress.error-providerfault-together-ai-llm-failed
        - call.in-progress.error-vapifault-together-ai-400-bad-request-validation-failed
        - call.in-progress.error-vapifault-together-ai-401-unauthorized
        - call.in-progress.error-vapifault-together-ai-403-model-access-denied
        - call.in-progress.error-vapifault-together-ai-429-exceeded-quota
        - call.in-progress.error-providerfault-together-ai-500-server-error
        - call.in-progress.error-providerfault-together-ai-503-server-overloaded-error
        - pipeline-error-anyscale-400-bad-request-validation-failed
        - pipeline-error-anyscale-401-unauthorized
        - pipeline-error-anyscale-403-model-access-denied
        - pipeline-error-anyscale-429-exceeded-quota
        - pipeline-error-anyscale-500-server-error
        - pipeline-error-anyscale-503-server-overloaded-error
        - pipeline-error-anyscale-llm-failed
        - call.in-progress.error-providerfault-anyscale-llm-failed
        - call.in-progress.error-vapifault-anyscale-400-bad-request-validation-failed
        - call.in-progress.error-vapifault-anyscale-401-unauthorized
        - call.in-progress.error-vapifault-anyscale-403-model-access-denied
        - call.in-progress.error-vapifault-anyscale-429-exceeded-quota
        - call.in-progress.error-providerfault-anyscale-500-server-error
        - call.in-progress.error-providerfault-anyscale-503-server-overloaded-error
        - pipeline-error-openrouter-400-bad-request-validation-failed
        - pipeline-error-openrouter-401-unauthorized
        - pipeline-error-openrouter-403-model-access-denied
        - pipeline-error-openrouter-429-exceeded-quota
        - pipeline-error-openrouter-500-server-error
        - pipeline-error-openrouter-503-server-overloaded-error
        - pipeline-error-openrouter-llm-failed
        - call.in-progress.error-providerfault-openrouter-llm-failed
        - call.in-progress.error-vapifault-openrouter-400-bad-request-validation-failed
        - call.in-progress.error-vapifault-openrouter-401-unauthorized
        - call.in-progress.error-vapifault-openrouter-403-model-access-denied
        - call.in-progress.error-vapifault-openrouter-429-exceeded-quota
        - call.in-progress.error-providerfault-openrouter-500-server-error
        - call.in-progress.error-providerfault-openrouter-503-server-overloaded-error
        - pipeline-error-perplexity-ai-400-bad-request-validation-failed
        - pipeline-error-perplexity-ai-401-unauthorized
        - pipeline-error-perplexity-ai-403-model-access-denied
        - pipeline-error-perplexity-ai-429-exceeded-quota
        - pipeline-error-perplexity-ai-500-server-error
        - pipeline-error-perplexity-ai-503-server-overloaded-error
        - pipeline-error-perplexity-ai-llm-failed
        - call.in-progress.error-providerfault-perplexity-ai-llm-failed
        - call.in-progress.error-vapifault-perplexity-ai-400-bad-request-validation-failed
        - call.in-progress.error-vapifault-perplexity-ai-401-unauthorized
        - call.in-progress.error-vapifault-perplexity-ai-403-model-access-denied
        - call.in-progress.error-vapifault-perplexity-ai-429-exceeded-quota
        - call.in-progress.error-providerfault-perplexity-ai-500-server-error
        - call.in-progress.error-providerfault-perplexity-ai-503-server-overloaded-error
        - pipeline-error-deepinfra-400-bad-request-validation-failed
        - pipeline-error-deepinfra-401-unauthorized
        - pipeline-error-deepinfra-403-model-access-denied
        - pipeline-error-deepinfra-429-exceeded-quota
        - pipeline-error-deepinfra-500-server-error
        - pipeline-error-deepinfra-503-server-overloaded-error
        - pipeline-error-deepinfra-llm-failed
        - call.in-progress.error-providerfault-deepinfra-llm-failed
        - call.in-progress.error-vapifault-deepinfra-400-bad-request-validation-failed
        - call.in-progress.error-vapifault-deepinfra-401-unauthorized
        - call.in-progress.error-vapifault-deepinfra-403-model-access-denied
        - call.in-progress.error-vapifault-deepinfra-429-exceeded-quota
        - call.in-progress.error-providerfault-deepinfra-500-server-error
        - call.in-progress.error-providerfault-deepinfra-503-server-overloaded-error
        - pipeline-error-runpod-400-bad-request-validation-failed
        - pipeline-error-runpod-401-unauthorized
        - pipeline-error-runpod-403-model-access-denied
        - pipeline-error-runpod-429-exceeded-quota
        - pipeline-error-runpod-500-server-error
        - pipeline-error-runpod-503-server-overloaded-error
        - pipeline-error-runpod-llm-failed
        - call.in-progress.error-providerfault-runpod-llm-failed
        - call.in-progress.error-vapifault-runpod-400-bad-request-validation-failed
        - call.in-progress.error-vapifault-runpod-401-unauthorized
        - call.in-progress.error-vapifault-runpod-403-model-access-denied
        - call.in-progress.error-vapifault-runpod-429-exceeded-quota
        - call.in-progress.error-providerfault-runpod-500-server-error
        - call.in-progress.error-providerfault-runpod-503-server-overloaded-error
        - pipeline-error-custom-llm-400-bad-request-validation-failed
        - pipeline-error-custom-llm-401-unauthorized
        - pipeline-error-custom-llm-403-model-access-denied
        - pipeline-error-custom-llm-429-exceeded-quota
        - pipeline-error-custom-llm-500-server-error
        - pipeline-error-custom-llm-503-server-overloaded-error
        - pipeline-error-custom-llm-llm-failed
        - call.in-progress.error-providerfault-custom-llm-llm-failed
        - call.in-progress.error-vapifault-custom-llm-400-bad-request-validation-failed
        - call.in-progress.error-vapifault-custom-llm-401-unauthorized
        - call.in-progress.error-vapifault-custom-llm-403-model-access-denied
        - call.in-progress.error-vapifault-custom-llm-429-exceeded-quota
        - call.in-progress.error-providerfault-custom-llm-500-server-error
        - call.in-progress.error-providerfault-custom-llm-503-server-overloaded-error
        - call.in-progress.error-pipeline-ws-model-connection-failed
        - pipeline-error-custom-voice-failed
        - pipeline-error-cartesia-socket-hang-up
        - pipeline-error-cartesia-requested-payment
        - pipeline-error-cartesia-500-server-error
        - pipeline-error-cartesia-502-server-error
        - pipeline-error-cartesia-503-server-error
        - pipeline-error-cartesia-522-server-error
        - call.in-progress.error-vapifault-cartesia-socket-hang-up
        - call.in-progress.error-vapifault-cartesia-requested-payment
        - call.in-progress.error-providerfault-cartesia-500-server-error
        - call.in-progress.error-providerfault-cartesia-503-server-error
        - call.in-progress.error-providerfault-cartesia-522-server-error
        - pipeline-error-eleven-labs-voice-not-found
        - pipeline-error-eleven-labs-quota-exceeded
        - pipeline-error-eleven-labs-unauthorized-access
        - pipeline-error-eleven-labs-unauthorized-to-access-model
        - pipeline-error-eleven-labs-professional-voices-only-for-creator-plus
        - pipeline-error-eleven-labs-blocked-free-plan-and-requested-upgrade
        - pipeline-error-eleven-labs-blocked-concurrent-requests-and-requested-upgrade
        - pipeline-error-eleven-labs-blocked-using-instant-voice-clone-and-requested-upgrade
        - pipeline-error-eleven-labs-system-busy-and-requested-upgrade
        - pipeline-error-eleven-labs-voice-not-fine-tuned
        - pipeline-error-eleven-labs-invalid-api-key
        - pipeline-error-eleven-labs-invalid-voice-samples
        - pipeline-error-eleven-labs-voice-disabled-by-owner
        - pipeline-error-eleven-labs-vapi-voice-disabled-by-owner
        - pipeline-error-eleven-labs-blocked-account-in-probation
        - pipeline-error-eleven-labs-blocked-content-against-their-policy
        - pipeline-error-eleven-labs-missing-samples-for-voice-clone
        - pipeline-error-eleven-labs-voice-not-fine-tuned-and-cannot-be-used
        - pipeline-error-eleven-labs-voice-not-allowed-for-free-users
        - pipeline-error-eleven-labs-max-character-limit-exceeded
        - pipeline-error-eleven-labs-blocked-voice-potentially-against-terms-of-service-and-awaiting-verification
        - pipeline-error-eleven-labs-500-server-error
        - pipeline-error-eleven-labs-503-server-error
        - call.in-progress.error-vapifault-eleven-labs-voice-not-found
        - call.in-progress.error-vapifault-eleven-labs-quota-exceeded
        - call.in-progress.error-vapifault-eleven-labs-unauthorized-access
        - call.in-progress.error-vapifault-eleven-labs-unauthorized-to-access-model
        - call.in-progress.error-vapifault-eleven-labs-professional-voices-only-for-creator-plus
        - call.in-progress.error-vapifault-eleven-labs-blocked-free-plan-and-requested-upgrade
        - call.in-progress.error-vapifault-eleven-labs-blocked-concurrent-requests-and-requested-upgrade
        - call.in-progress.error-vapifault-eleven-labs-blocked-using-instant-voice-clone-and-requested-upgrade
        - call.in-progress.error-vapifault-eleven-labs-system-busy-and-requested-upgrade
        - call.in-progress.error-vapifault-eleven-labs-voice-not-fine-tuned
        - call.in-progress.error-vapifault-eleven-labs-invalid-api-key
        - call.in-progress.error-vapifault-eleven-labs-invalid-voice-samples
        - call.in-progress.error-vapifault-eleven-labs-voice-disabled-by-owner
        - call.in-progress.error-vapifault-eleven-labs-blocked-account-in-probation
        - call.in-progress.error-vapifault-eleven-labs-blocked-content-against-their-policy
        - call.in-progress.error-vapifault-eleven-labs-missing-samples-for-voice-clone
        - call.in-progress.error-vapifault-eleven-labs-voice-not-fine-tuned-and-cannot-be-used
        - call.in-progress.error-vapifault-eleven-labs-voice-not-allowed-for-free-users
        - call.in-progress.error-vapifault-eleven-labs-max-character-limit-exceeded
        - >-
          call.in-progress.error-vapifault-eleven-labs-blocked-voice-potentially-against-terms-of-service-and-awaiting-verification
        - call.in-progress.error-providerfault-eleven-labs-system-busy-and-requested-upgrade
        - call.in-progress.error-providerfault-eleven-labs-500-server-error
        - call.in-progress.error-providerfault-eleven-labs-503-server-error
        - pipeline-error-playht-request-timed-out
        - pipeline-error-playht-invalid-voice
        - pipeline-error-playht-unexpected-error
        - pipeline-error-playht-out-of-credits
        - pipeline-error-playht-invalid-emotion
        - pipeline-error-playht-voice-must-be-a-valid-voice-manifest-uri
        - pipeline-error-playht-401-unauthorized
        - pipeline-error-playht-403-forbidden-out-of-characters
        - pipeline-error-playht-403-forbidden-api-access-not-available
        - pipeline-error-playht-429-exceeded-quota
        - pipeline-error-playht-502-gateway-error
        - pipeline-error-playht-504-gateway-error
        - call.in-progress.error-vapifault-playht-request-timed-out
        - call.in-progress.error-vapifault-playht-invalid-voice
        - call.in-progress.error-vapifault-playht-unexpected-error
        - call.in-progress.error-vapifault-playht-out-of-credits
        - call.in-progress.error-vapifault-playht-invalid-emotion
        - call.in-progress.error-vapifault-playht-voice-must-be-a-valid-voice-manifest-uri
        - call.in-progress.error-vapifault-playht-401-unauthorized
        - call.in-progress.error-vapifault-playht-403-forbidden-out-of-characters
        - call.in-progress.error-vapifault-playht-403-forbidden-api-access-not-available
        - call.in-progress.error-vapifault-playht-429-exceeded-quota
        - call.in-progress.error-providerfault-playht-502-gateway-error
        - call.in-progress.error-providerfault-playht-504-gateway-error
        - pipeline-error-custom-transcriber-failed
        - call.in-progress.error-vapifault-custom-transcriber-failed
        - pipeline-error-eleven-labs-transcriber-failed
        - call.in-progress.error-vapifault-eleven-labs-transcriber-failed
        - pipeline-error-deepgram-returning-400-no-such-model-language-tier-combination
        - pipeline-error-deepgram-returning-401-invalid-credentials
        - pipeline-error-deepgram-returning-403-model-access-denied
        - pipeline-error-deepgram-returning-404-not-found
        - pipeline-error-deepgram-returning-500-invalid-json
        - pipeline-error-deepgram-returning-502-network-error
        - pipeline-error-deepgram-returning-502-bad-gateway-ehostunreach
        - pipeline-error-deepgram-returning-econnreset
        - call.in-progress.error-vapifault-deepgram-returning-400-no-such-model-language-tier-combination
        - call.in-progress.error-vapifault-deepgram-returning-401-invalid-credentials
        - call.in-progress.error-vapifault-deepgram-returning-404-not-found
        - call.in-progress.error-vapifault-deepgram-returning-403-model-access-denied
        - call.in-progress.error-providerfault-deepgram-returning-500-invalid-json
        - call.in-progress.error-providerfault-deepgram-returning-502-network-error
        - call.in-progress.error-providerfault-deepgram-returning-502-bad-gateway-ehostunreach
        - pipeline-error-google-transcriber-failed
        - call.in-progress.error-vapifault-google-transcriber-failed
        - pipeline-error-openai-transcriber-failed
        - call.in-progress.error-vapifault-openai-transcriber-failed
        - pipeline-error-soniox-transcriber-auth-failed
        - pipeline-error-soniox-transcriber-rate-limited
        - pipeline-error-soniox-transcriber-invalid-config
        - pipeline-error-soniox-transcriber-server-error
        - pipeline-error-soniox-transcriber-failed
        - call.in-progress.error-vapifault-soniox-transcriber-auth-failed
        - call.in-progress.error-vapifault-soniox-transcriber-rate-limited
        - call.in-progress.error-vapifault-soniox-transcriber-invalid-config
        - call.in-progress.error-vapifault-soniox-transcriber-server-error
        - call.in-progress.error-vapifault-soniox-transcriber-failed
        - call.in-progress.error-warm-transfer-max-duration
        - call.in-progress.error-warm-transfer-assistant-cancelled
        - call.in-progress.error-warm-transfer-silence-timeout
        - call.in-progress.error-warm-transfer-microphone-timeout
        - assistant-ended-call
        - assistant-said-end-call-phrase
        - assistant-ended-call-with-hangup-task
        - assistant-ended-call-after-message-spoken
        - assistant-forwarded-call
        - assistant-join-timed-out
        - call.in-progress.error-assistant-did-not-receive-customer-audio
        - call.in-progress.error-transfer-failed
        - customer-busy
        - customer-ended-call
        - customer-ended-call-before-warm-transfer
        - customer-ended-call-after-warm-transfer-attempt
        - customer-ended-call-during-transfer
        - customer-did-not-answer
        - customer-did-not-give-microphone-permission
        - exceeded-max-duration
        - manually-canceled
        - phone-call-provider-closed-websocket
        - call.forwarding.operator-busy
        - silence-timed-out
        - call.in-progress.error-sip-inbound-call-failed-to-connect
        - call.in-progress.error-providerfault-outbound-sip-403-forbidden
        - call.in-progress.error-providerfault-outbound-sip-407-proxy-authentication-required
        - call.in-progress.error-providerfault-outbound-sip-408-request-timeout
        - call.in-progress.error-providerfault-outbound-sip-503-service-unavailable
        - call.in-progress.error-providerfault-outbound-sip-480-temporarily-unavailable
        - call.in-progress.error-sip-outbound-call-failed-to-connect
        - call.ringing.hook-executed-say
        - call.ringing.hook-executed-transfer
        - call.ending.hook-executed-say
        - call.ending.hook-executed-transfer
        - call.ringing.sip-inbound-caller-hungup-before-call-connect
        - call.ringing.error-sip-inbound-call-failed-to-connect
        - twilio-failed-to-connect-call
        - twilio-reported-customer-misdialed
        - vonage-rejected
        - voicemail
        - call-deleted
      description: This is the explanation for how the call ended.
      title: CallEndedReason
    CallDestination:
      oneOf:
        - $ref: '#/components/schemas/TransferDestinationNumber'
        - $ref: '#/components/schemas/TransferDestinationSip'
      description: >-
        This is the destination where the call ended up being transferred to. If the call was not transferred, this will
        be empty.
      title: CallDestination
    AnalysisCostBreakdown:
      type: object
      properties:
        summary:
          type: number
          format: double
          description: This is the cost to summarize the call.
        summaryPromptTokens:
          type: number
          format: double
          description: This is the number of prompt tokens used to summarize the call.
        summaryCompletionTokens:
          type: number
          format: double
          description: This is the number of completion tokens used to summarize the call.
        summaryCachedPromptTokens:
          type: number
          format: double
          description: This is the number of cached prompt tokens used to summarize the call.
        structuredData:
          type: number
          format: double
          description: This is the cost to extract structured data from the call.
        structuredDataPromptTokens:
          type: number
          format: double
          description: This is the number of prompt tokens used to extract structured data from the call.
        structuredDataCompletionTokens:
          type: number
          format: double
          description: This is the number of completion tokens used to extract structured data from the call.
        structuredDataCachedPromptTokens:
          type: number
          format: double
          description: This is the number of cached prompt tokens used to extract structured data from the call.
        successEvaluation:
          type: number
          format: double
          description: This is the cost to evaluate if the call was successful.
        successEvaluationPromptTokens:
          type: number
          format: double
          description: This is the number of prompt tokens used to evaluate if the call was successful.
        successEvaluationCompletionTokens:
          type: number
          format: double
          description: This is the number of completion tokens used to evaluate if the call was successful.
        successEvaluationCachedPromptTokens:
          type: number
          format: double
          description: This is the number of cached prompt tokens used to evaluate if the call was successful.
        structuredOutput:
          type: number
          format: double
          description: This is the cost to evaluate structuredOutputs from the call.
        structuredOutputPromptTokens:
          type: number
          format: double
          description: This is the number of prompt tokens used to evaluate structuredOutputs from the call.
        structuredOutputCompletionTokens:
          type: number
          format: double
          description: This is the number of completion tokens used to evaluate structuredOutputs from the call.
        structuredOutputCachedPromptTokens:
          type: number
          format: double
          description: This is the number of cached prompt tokens used to evaluate structuredOutputs from the call.
      title: AnalysisCostBreakdown
    CostBreakdown:
      type: object
      properties:
        transport:
          type: number
          format: double
          description: This is the cost of the transport provider, like Twilio or Vonage.
        stt:
          type: number
          format: double
          description: This is the cost of the speech-to-text service.
        llm:
          type: number
          format: double
          description: This is the cost of the language model.
        tts:
          type: number
          format: double
          description: This is the cost of the text-to-speech service.
        vapi:
          type: number
          format: double
          description: This is the cost of Vapi.
        chat:
          type: number
          format: double
          description: This is the cost of chat interactions.
        total:
          type: number
          format: double
          description: This is the total cost of the call.
        llmPromptTokens:
          type: number
          format: double
          description: This is the LLM prompt tokens used for the call.
        llmCompletionTokens:
          type: number
          format: double
          description: This is the LLM completion tokens used for the call.
        llmCachedPromptTokens:
          type: number
          format: double
          description: This is the LLM cached prompt tokens used for the call.
        ttsCharacters:
          type: number
          format: double
          description: This is the TTS characters used for the call.
        analysisCostBreakdown:
          $ref: '#/components/schemas/AnalysisCostBreakdown'
          description: This is the cost of the analysis.
      title: CostBreakdown
    AnalysisStructuredData:
      type: object
      properties: {}
      description: >-
        This is the structured data extracted from the call. Customize by setting
        `assistant.analysisPlan.structuredDataPrompt` and/or `assistant.analysisPlan.structuredDataSchema`.
      title: AnalysisStructuredData
    AnalysisStructuredDataMultiItems:
      type: object
      properties: {}
      title: AnalysisStructuredDataMultiItems
    Analysis:
      type: object
      properties:
        summary:
          type: string
          description: This is the summary of the call. Customize by setting `assistant.analysisPlan.summaryPrompt`.
        structuredData:
          $ref: '#/components/schemas/AnalysisStructuredData'
          description: >-
            This is the structured data extracted from the call. Customize by setting
            `assistant.analysisPlan.structuredDataPrompt` and/or `assistant.analysisPlan.structuredDataSchema`.
        structuredDataMulti:
          type: array
          items:
            $ref: '#/components/schemas/AnalysisStructuredDataMultiItems'
          description: >-
            This is the structured data catalog of the call. Customize by setting
            `assistant.analysisPlan.structuredDataMultiPlan`.
        successEvaluation:
          type: string
          description: >-
            This is the evaluation of the call. Customize by setting `assistant.analysisPlan.successEvaluationPrompt`
            and/or `assistant.analysisPlan.successEvaluationRubric`.
      title: Analysis
    MonitorResult:
      type: object
      properties:
        monitorId:
          type: string
        filterPassed:
          type: boolean
      required:
        - monitorId
        - filterPassed
      title: MonitorResult
    Monitor:
      type: object
      properties:
        monitors:
          type: array
          items:
            $ref: '#/components/schemas/MonitorResult'
        listenUrl:
          type: string
          description: >-
            This is the URL where the assistant's calls can be listened to in real-time. To enable, set
            `assistant.monitorPlan.listenEnabled` to `true`.
        controlUrl:
          type: string
          description: >-
            This is the URL where the assistant's calls can be controlled in real-time. To enable, set
            `assistant.monitorPlan.controlEnabled` to `true`.
      title: Monitor
    ArtifactMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/UserMessage'
        - $ref: '#/components/schemas/SystemMessage'
        - $ref: '#/components/schemas/BotMessage'
        - $ref: '#/components/schemas/ToolCallMessage'
        - $ref: '#/components/schemas/ToolCallResultMessage'
      title: ArtifactMessagesItems
    Mono:
      type: object
      properties:
        combinedUrl:
          type: string
          description: This is the combined recording url for the call. To enable, set `assistant.artifactPlan.recordingEnabled`.
        assistantUrl:
          type: string
          description: This is the mono recording url for the assistant. To enable, set `assistant.artifactPlan.recordingEnabled`.
        customerUrl:
          type: string
          description: This is the mono recording url for the customer. To enable, set `assistant.artifactPlan.recordingEnabled`.
      title: Mono
    Recording:
      type: object
      properties:
        stereoUrl:
          type: string
          description: This is the stereo recording url for the call. To enable, set `assistant.artifactPlan.recordingEnabled`.
        videoUrl:
          type: string
          description: This is the video recording url for the call. To enable, set `assistant.artifactPlan.videoRecordingEnabled`.
        videoRecordingStartDelaySeconds:
          type: number
          format: double
          description: >-
            This is video recording start delay in ms. To enable, set `assistant.artifactPlan.videoRecordingEnabled`.
            This can be used to align the playback of the recording with artifact.messages timestamps.
        mono:
          $ref: '#/components/schemas/Mono'
          description: This is the mono recording url for the call. To enable, set `assistant.artifactPlan.recordingEnabled`.
      title: Recording
    NodeArtifactMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/UserMessage'
        - $ref: '#/components/schemas/SystemMessage'
        - $ref: '#/components/schemas/BotMessage'
        - $ref: '#/components/schemas/ToolCallMessage'
        - $ref: '#/components/schemas/ToolCallResultMessage'
      title: NodeArtifactMessagesItems
    NodeArtifactVariableValues:
      type: object
      properties: {}
      description: These are the variable values that were extracted from the node.
      title: NodeArtifactVariableValues
    NodeArtifact:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/NodeArtifactMessagesItems'
          description: These are the messages that were spoken during the node.
        nodeName:
          type: string
          description: This is the node name.
        variableValues:
          $ref: '#/components/schemas/NodeArtifactVariableValues'
          description: These are the variable values that were extracted from the node.
      title: NodeArtifact
    AssistantActivation:
      type: object
      properties:
        assistantName:
          type: string
          description: This is the name of the assistant that was active during the call.
        assistantId:
          type: string
          description: This is the ID of the assistant that was active during the call.
      required:
        - assistantName
      title: AssistantActivation
    ArtifactVariableValues:
      type: object
      properties: {}
      description: These are the variable values at the end of the workflow execution.
      title: ArtifactVariableValues
    TurnLatency:
      type: object
      properties:
        modelLatency:
          type: number
          format: double
          description: This is the model latency for the first token.
        voiceLatency:
          type: number
          format: double
          description: This is the voice latency from the model output.
        transcriberLatency:
          type: number
          format: double
          description: This is the transcriber latency from the user speech.
        endpointingLatency:
          type: number
          format: double
          description: This is the endpointing latency.
        turnLatency:
          type: number
          format: double
          description: This is the latency for the whole turn.
      title: TurnLatency
    PerformanceMetrics:
      type: object
      properties:
        turnLatencies:
          type: array
          items:
            $ref: '#/components/schemas/TurnLatency'
          description: These are the individual latencies for each turn.
        modelLatencyAverage:
          type: number
          format: double
          description: This is the average latency for the model to output the first token.
        voiceLatencyAverage:
          type: number
          format: double
          description: This is the average latency for the text to speech.
        transcriberLatencyAverage:
          type: number
          format: double
          description: This is the average latency for the transcriber.
        endpointingLatencyAverage:
          type: number
          format: double
          description: This is the average latency for the endpointing.
        turnLatencyAverage:
          type: number
          format: double
          description: This is the average latency for complete turns.
        fromTransportLatencyAverage:
          type: number
          format: double
          description: This is the average latency for packets received from the transport provider in milliseconds.
        toTransportLatencyAverage:
          type: number
          format: double
          description: This is the average latency for packets sent to the transport provider in milliseconds.
        numUserInterrupted:
          type: number
          format: double
          description: This is the number of times the user was interrupted by the assistant during the call.
        numAssistantInterrupted:
          type: number
          format: double
          description: This is the number of times the assistant was interrupted by the user during the call.
      title: PerformanceMetrics
    ArtifactStructuredOutputs:
      type: object
      properties: {}
      description: >-
        These are the structured outputs that will be extracted from the call.

        To enable, set `assistant.artifactPlan.structuredOutputIds` with the IDs of the structured outputs you want to
        extract.
      title: ArtifactStructuredOutputs
    ArtifactScorecards:
      type: object
      properties: {}
      description: >-
        These are the scorecards that have been evaluated based on the structured outputs extracted during the call.

        To enable, set `assistant.artifactPlan.scorecardIds` or `assistant.artifactPlan.scorecards` with the IDs or
        objects of the scorecards you want to evaluate.
      title: ArtifactScorecards
    Artifact:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/ArtifactMessagesItems'
          description: These are the messages that were spoken during the call.
        messagesOpenAIFormatted:
          type: array
          items:
            $ref: '#/components/schemas/OpenAIMessage'
          description: These are the messages that were spoken during the call, formatted for OpenAI.
        recordingUrl:
          type: string
          description: This is the recording url for the call. To enable, set `assistant.artifactPlan.recordingEnabled`.
        stereoRecordingUrl:
          type: string
          description: This is the stereo recording url for the call. To enable, set `assistant.artifactPlan.recordingEnabled`.
        videoRecordingUrl:
          type: string
          description: This is video recording url for the call. To enable, set `assistant.artifactPlan.videoRecordingEnabled`.
        videoRecordingStartDelaySeconds:
          type: number
          format: double
          description: >-
            This is video recording start delay in ms. To enable, set `assistant.artifactPlan.videoRecordingEnabled`.
            This can be used to align the playback of the recording with artifact.messages timestamps.
        recording:
          $ref: '#/components/schemas/Recording'
          description: This is the recording url for the call. To enable, set `assistant.artifactPlan.recordingEnabled`.
        transcript:
          type: string
          description: This is the transcript of the call. This is derived from `artifact.messages` but provided for convenience.
        pcapUrl:
          type: string
          description: >-
            This is the packet capture url for the call. This is only available for `phone` type calls where phone
            number's provider is `vapi` or `byo-phone-number`.
        logUrl:
          type: string
          description: This is the url for the call logs. This includes all logging output during the call for debugging purposes.
        nodes:
          type: array
          items:
            $ref: '#/components/schemas/NodeArtifact'
          description: This is the history of workflow nodes that were executed during the call.
        assistantActivations:
          type: array
          items:
            $ref: '#/components/schemas/AssistantActivation'
          description: Ordered list of assistants that were active during the call, including after transfers and handoffs.
        variableValues:
          $ref: '#/components/schemas/ArtifactVariableValues'
          description: These are the variable values at the end of the workflow execution.
        performanceMetrics:
          $ref: '#/components/schemas/PerformanceMetrics'
          description: This is the performance metrics for the call. It contains the turn latency, broken down by component.
        structuredOutputs:
          $ref: '#/components/schemas/ArtifactStructuredOutputs'
          description: >-
            These are the structured outputs that will be extracted from the call.

            To enable, set `assistant.artifactPlan.structuredOutputIds` with the IDs of the structured outputs you want
            to extract.
        scorecards:
          $ref: '#/components/schemas/ArtifactScorecards'
          description: >-
            These are the scorecards that have been evaluated based on the structured outputs extracted during the call.

            To enable, set `assistant.artifactPlan.scorecardIds` or `assistant.artifactPlan.scorecards` with the IDs or
            objects of the scorecards you want to evaluate.
        transfers:
          type: array
          items:
            type: string
          description: These are the transfer records from warm transfers, including destinations, transcripts, and status.
        structuredOutputsLastUpdatedAt:
          type: string
          format: date-time
          description: This is when the structured outputs were last updated
      title: Artifact
    RecordingConsentType:
      type: object
      properties: {}
      description: This is the type of recording consent.
      title: RecordingConsentType
    RecordingConsent:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/RecordingConsentType'
          description: This is the type of recording consent.
        grantedAt:
          type: string
          format: date-time
          description: |-
            This is the date and time the recording consent was granted.
            If not specified, it means the recording consent was not granted.
      required:
        - type
      title: RecordingConsent
    Compliance:
      type: object
      properties:
        recordingConsent:
          $ref: '#/components/schemas/RecordingConsent'
          description: This is the recording consent of the call. Configure in `assistant.compliancePlan.recordingConsentPlan`.
      title: Compliance
    ConversationNodeType:
      type: string
      enum:
        - conversation
      description: |-
        This is the Conversation node. This can be used to start a conversation with the customer.

        The flow is:
        - Workflow starts the conversation node
        - Model is active with the `prompt` and global context.
        - Model will call a tool to exit this node.
        - Workflow will extract variables from the conversation.
        - Workflow continues.
      title: ConversationNodeType
    ConversationNodeModel:
      oneOf:
        - $ref: '#/components/schemas/WorkflowOpenAIModel'
        - $ref: '#/components/schemas/WorkflowAnthropicModel'
        - $ref: '#/components/schemas/WorkflowAnthropicBedrockModel'
        - $ref: '#/components/schemas/WorkflowGoogleModel'
        - $ref: '#/components/schemas/WorkflowCustomModel'
      description: |-
        This is the model for the node.

        This overrides `workflow.model`.
      title: ConversationNodeModel
    ConversationNodeTranscriber:
      oneOf:
        - $ref: '#/components/schemas/AssemblyAITranscriber'
        - $ref: '#/components/schemas/AzureSpeechTranscriber'
        - $ref: '#/components/schemas/CustomTranscriber'
        - $ref: '#/components/schemas/DeepgramTranscriber'
        - $ref: '#/components/schemas/ElevenLabsTranscriber'
        - $ref: '#/components/schemas/GladiaTranscriber'
        - $ref: '#/components/schemas/GoogleTranscriber'
        - $ref: '#/components/schemas/SpeechmaticsTranscriber'
        - $ref: '#/components/schemas/TalkscriberTranscriber'
        - $ref: '#/components/schemas/OpenAITranscriber'
        - $ref: '#/components/schemas/CartesiaTranscriber'
        - $ref: '#/components/schemas/SonioxTranscriber'
      description: |-
        This is the transcriber for the node.

        This overrides `workflow.transcriber`.
      title: ConversationNodeTranscriber
    ConversationNodeVoice:
      oneOf:
        - $ref: '#/components/schemas/AzureVoice'
        - $ref: '#/components/schemas/CartesiaVoice'
        - $ref: '#/components/schemas/CustomVoice'
        - $ref: '#/components/schemas/DeepgramVoice'
        - $ref: '#/components/schemas/ElevenLabsVoice'
        - $ref: '#/components/schemas/HumeVoice'
        - $ref: '#/components/schemas/LMNTVoice'
        - $ref: '#/components/schemas/NeuphonicVoice'
        - $ref: '#/components/schemas/OpenAIVoice'
        - $ref: '#/components/schemas/PlayHTVoice'
        - $ref: '#/components/schemas/WellSaidVoice'
        - $ref: '#/components/schemas/RimeAIVoice'
        - $ref: '#/components/schemas/SmallestAIVoice'
        - $ref: '#/components/schemas/TavusVoice'
        - $ref: '#/components/schemas/VapiVoice'
        - $ref: '#/components/schemas/SesameVoice'
        - $ref: '#/components/schemas/InworldVoice'
        - $ref: '#/components/schemas/MinimaxVoice'
      description: |-
        This is the voice for the node.

        This overrides `workflow.voice`.
      title: ConversationNodeVoice
    ConversationNodeToolsItems:
      oneOf:
        - $ref: '#/components/schemas/CreateApiRequestToolDTO'
        - $ref: '#/components/schemas/CreateBashToolDTO'
        - $ref: '#/components/schemas/CreateCodeToolDTO'
        - $ref: '#/components/schemas/CreateComputerToolDTO'
        - $ref: '#/components/schemas/CreateDtmfToolDTO'
        - $ref: '#/components/schemas/CreateEndCallToolDTO'
        - $ref: '#/components/schemas/CreateFunctionToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactGetToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCreateEventToolDTO'
        - $ref: '#/components/schemas/CreateGoogleSheetsRowAppendToolDTO'
        - $ref: '#/components/schemas/CreateHandoffToolDTO'
        - $ref: '#/components/schemas/CreateMcpToolDTO'
        - $ref: '#/components/schemas/CreateQueryToolDTO'
        - $ref: '#/components/schemas/CreateSlackSendMessageToolDTO'
        - $ref: '#/components/schemas/CreateSmsToolDTO'
        - $ref: '#/components/schemas/CreateTextEditorToolDTO'
        - $ref: '#/components/schemas/CreateTransferCallToolDTO'
        - $ref: '#/components/schemas/CreateSipRequestToolDTO'
        - $ref: '#/components/schemas/CreateVoicemailToolDTO'
      title: ConversationNodeToolsItems
    GlobalNodePlan:
      type: object
      properties:
        enabled:
          type: boolean
          default: false
          description: |-
            This is the flag to determine if this node is a global node

            @default false
        enterCondition:
          type: string
          default: ''
          description: |-
            This is the condition that will be checked to determine if the global node should be executed.

            @default ''
      title: GlobalNodePlan
    ConversationNodeMetadata:
      type: object
      properties: {}
      description: This is for metadata you want to store on the task.
      title: ConversationNodeMetadata
    ConversationNode:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/ConversationNodeType'
          description: |-
            This is the Conversation node. This can be used to start a conversation with the customer.

            The flow is:
            - Workflow starts the conversation node
            - Model is active with the `prompt` and global context.
            - Model will call a tool to exit this node.
            - Workflow will extract variables from the conversation.
            - Workflow continues.
        model:
          $ref: '#/components/schemas/ConversationNodeModel'
          description: |-
            This is the model for the node.

            This overrides `workflow.model`.
        transcriber:
          $ref: '#/components/schemas/ConversationNodeTranscriber'
          description: |-
            This is the transcriber for the node.

            This overrides `workflow.transcriber`.
        voice:
          $ref: '#/components/schemas/ConversationNodeVoice'
          description: |-
            This is the voice for the node.

            This overrides `workflow.voice`.
        tools:
          type: array
          items:
            $ref: '#/components/schemas/ConversationNodeToolsItems'
          description: >-
            These are the tools that the conversation node can use during the call. To use existing tools, use
            `toolIds`.


            Both `tools` and `toolIds` can be used together.
        toolIds:
          type: array
          items:
            type: string
          description: |-
            These are the tools that the conversation node can use during the call. To use transient tools, use `tools`.

            Both `tools` and `toolIds` can be used together.
        prompt:
          type: string
        globalNodePlan:
          $ref: '#/components/schemas/GlobalNodePlan'
          description: This is the plan for the global node.
        variableExtractionPlan:
          $ref: '#/components/schemas/VariableExtractionPlan'
          description: >-
            This is the plan that controls the variable extraction from the user's responses.


            Usage:

            Use `schema` to specify what you want to extract from the user's responses.

            ```json

            {
              "schema": {
                "type": "object",
                "properties": {
                  "user": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "string"
                      },
                      "age": {
                        "type": "number"
                      }
                    }
                  }
                }
              }
            }

            ```


            This will be extracted as `{{ user.name }}` and `{{ user.age }}` respectively.


            (Optional) Use `aliases` to create new variables.


            ```json

            {
              "aliases": [
                {
                  "key": "userAge",
                  "value": "{{user.age}}"
                },
                {
                  "key": "userName",
                  "value": "{{user.name}}"
                }
              ]
            }

            ```


            This will be extracted as `{{ userAge }}` and `{{ userName }}` respectively.


            Note: The `schema` field is required for Conversation nodes if you want to extract variables from the user's
            responses. `aliases` is just a convenience.
        name:
          type: string
        isStart:
          type: boolean
          description: This is whether or not the node is the start of the workflow.
        metadata:
          $ref: '#/components/schemas/ConversationNodeMetadata'
          description: This is for metadata you want to store on the task.
      required:
        - type
        - name
      title: ConversationNode
    ToolNodeType:
      type: string
      enum:
        - tool
      description: |-
        This is the Tool node. This can be used to call a tool in your workflow.

        The flow is:
        - Workflow starts the tool node
        - Model is called to extract parameters needed by the tool from the conversation history
        - Tool is called with the parameters
        - Server returns a response
        - Workflow continues with the response
      title: ToolNodeType
    ToolNodeTool:
      oneOf:
        - $ref: '#/components/schemas/CreateApiRequestToolDTO'
        - $ref: '#/components/schemas/CreateBashToolDTO'
        - $ref: '#/components/schemas/CreateCodeToolDTO'
        - $ref: '#/components/schemas/CreateComputerToolDTO'
        - $ref: '#/components/schemas/CreateDtmfToolDTO'
        - $ref: '#/components/schemas/CreateEndCallToolDTO'
        - $ref: '#/components/schemas/CreateFunctionToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactCreateToolDTO'
        - $ref: '#/components/schemas/CreateGoHighLevelContactGetToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO'
        - $ref: '#/components/schemas/CreateGoogleCalendarCreateEventToolDTO'
        - $ref: '#/components/schemas/CreateGoogleSheetsRowAppendToolDTO'
        - $ref: '#/components/schemas/CreateHandoffToolDTO'
        - $ref: '#/components/schemas/CreateMcpToolDTO'
        - $ref: '#/components/schemas/CreateQueryToolDTO'
        - $ref: '#/components/schemas/CreateSlackSendMessageToolDTO'
        - $ref: '#/components/schemas/CreateSmsToolDTO'
        - $ref: '#/components/schemas/CreateTextEditorToolDTO'
        - $ref: '#/components/schemas/CreateTransferCallToolDTO'
        - $ref: '#/components/schemas/CreateSipRequestToolDTO'
        - $ref: '#/components/schemas/CreateVoicemailToolDTO'
      description: This is the tool to call. To use an existing tool, send `toolId` instead.
      title: ToolNodeTool
    ToolNodeMetadata:
      type: object
      properties: {}
      description: This is for metadata you want to store on the task.
      title: ToolNodeMetadata
    ToolNode:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/ToolNodeType'
          description: |-
            This is the Tool node. This can be used to call a tool in your workflow.

            The flow is:
            - Workflow starts the tool node
            - Model is called to extract parameters needed by the tool from the conversation history
            - Tool is called with the parameters
            - Server returns a response
            - Workflow continues with the response
        tool:
          $ref: '#/components/schemas/ToolNodeTool'
          description: This is the tool to call. To use an existing tool, send `toolId` instead.
        toolId:
          type: string
          description: This is the tool to call. To use a transient tool, send `tool` instead.
        name:
          type: string
        isStart:
          type: boolean
          description: This is whether or not the node is the start of the workflow.
        metadata:
          $ref: '#/components/schemas/ToolNodeMetadata'
          description: This is for metadata you want to store on the task.
      required:
        - type
        - name
      title: ToolNode
    CreateWorkflowDtoNodesItems:
      oneOf:
        - $ref: '#/components/schemas/ConversationNode'
        - $ref: '#/components/schemas/ToolNode'
      title: CreateWorkflowDtoNodesItems
    CreateWorkflowDtoModel:
      oneOf:
        - $ref: '#/components/schemas/WorkflowOpenAIModel'
        - $ref: '#/components/schemas/WorkflowAnthropicModel'
        - $ref: '#/components/schemas/WorkflowAnthropicBedrockModel'
        - $ref: '#/components/schemas/WorkflowGoogleModel'
        - $ref: '#/components/schemas/WorkflowCustomModel'
      description: |-
        This is the model for the workflow.

        This can be overridden at node level using `nodes[n].model`.
      title: CreateWorkflowDtoModel
    CreateWorkflowDtoTranscriber:
      oneOf:
        - $ref: '#/components/schemas/AssemblyAITranscriber'
        - $ref: '#/components/schemas/AzureSpeechTranscriber'
        - $ref: '#/components/schemas/CustomTranscriber'
        - $ref: '#/components/schemas/DeepgramTranscriber'
        - $ref: '#/components/schemas/ElevenLabsTranscriber'
        - $ref: '#/components/schemas/GladiaTranscriber'
        - $ref: '#/components/schemas/GoogleTranscriber'
        - $ref: '#/components/schemas/SpeechmaticsTranscriber'
        - $ref: '#/components/schemas/TalkscriberTranscriber'
        - $ref: '#/components/schemas/OpenAITranscriber'
        - $ref: '#/components/schemas/CartesiaTranscriber'
        - $ref: '#/components/schemas/SonioxTranscriber'
      description: |-
        This is the transcriber for the workflow.

        This can be overridden at node level using `nodes[n].transcriber`.
      title: CreateWorkflowDtoTranscriber
    CreateWorkflowDtoVoice:
      oneOf:
        - $ref: '#/components/schemas/AzureVoice'
        - $ref: '#/components/schemas/CartesiaVoice'
        - $ref: '#/components/schemas/CustomVoice'
        - $ref: '#/components/schemas/DeepgramVoice'
        - $ref: '#/components/schemas/ElevenLabsVoice'
        - $ref: '#/components/schemas/HumeVoice'
        - $ref: '#/components/schemas/LMNTVoice'
        - $ref: '#/components/schemas/NeuphonicVoice'
        - $ref: '#/components/schemas/OpenAIVoice'
        - $ref: '#/components/schemas/PlayHTVoice'
        - $ref: '#/components/schemas/WellSaidVoice'
        - $ref: '#/components/schemas/RimeAIVoice'
        - $ref: '#/components/schemas/SmallestAIVoice'
        - $ref: '#/components/schemas/TavusVoice'
        - $ref: '#/components/schemas/VapiVoice'
        - $ref: '#/components/schemas/SesameVoice'
        - $ref: '#/components/schemas/InworldVoice'
        - $ref: '#/components/schemas/MinimaxVoice'
      description: |-
        This is the voice for the workflow.

        This can be overridden at node level using `nodes[n].voice`.
      title: CreateWorkflowDtoVoice
    CreateWorkflowDtoBackgroundSound0:
      type: string
      enum:
        - 'off'
        - office
      title: CreateWorkflowDtoBackgroundSound0
    CreateWorkflowDtoBackgroundSound:
      oneOf:
        - $ref: '#/components/schemas/CreateWorkflowDtoBackgroundSound0'
        - type: string
          format: uri
      description: >-
        This is the background sound in the call. Default for phone calls is 'office' and default for web calls is
        'off'.

        You can also provide a custom sound by providing a URL to an audio file.
      title: CreateWorkflowDtoBackgroundSound
    CallHookModelResponseTimeoutOn:
      type: string
      enum:
        - model.response.timeout
      description: This is the event that triggers this hook
      title: CallHookModelResponseTimeoutOn
    CallHookModelResponseTimeoutDoItems:
      oneOf:
        - $ref: '#/components/schemas/SayHookAction'
        - $ref: '#/components/schemas/ToolCallHookAction'
        - $ref: '#/components/schemas/MessageAddHookAction'
      title: CallHookModelResponseTimeoutDoItems
    CallHookModelResponseTimeout:
      type: object
      properties:
        'on':
          $ref: '#/components/schemas/CallHookModelResponseTimeoutOn'
          description: This is the event that triggers this hook
        do:
          type: array
          items:
            $ref: '#/components/schemas/CallHookModelResponseTimeoutDoItems'
          description: This is the set of actions to perform when the hook triggers
      required:
        - 'on'
        - do
      title: CallHookModelResponseTimeout
    CreateWorkflowDtoHooksItems:
      oneOf:
        - $ref: '#/components/schemas/CallHookCallEnding'
        - $ref: '#/components/schemas/CallHookAssistantSpeechInterrupted'
        - $ref: '#/components/schemas/CallHookCustomerSpeechInterrupted'
        - $ref: '#/components/schemas/CallHookCustomerSpeechTimeout'
        - $ref: '#/components/schemas/CallHookModelResponseTimeout'
      title: CreateWorkflowDtoHooksItems
    CreateWorkflowDtoCredentialsItems:
      oneOf:
        - type: object
          properties:
            provider:
              type: string
              enum:
                - 11labs
              description: 'Discriminator value: 11labs'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateElevenLabsCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - anthropic
              description: 'Discriminator value: anthropic'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateAnthropicCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - anthropic-bedrock
              description: 'Discriminator value: anthropic-bedrock'
            region:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockRegion'
              description: AWS region where Bedrock is configured.
            authenticationPlan:
              $ref: >-
                #/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAnthropicBedrockAuthenticationPlan
              description: Authentication method - either direct IAM credentials or cross-account role assumption.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - region
            - authenticationPlan
          description: anthropic-bedrock variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - anyscale
              description: 'Discriminator value: anyscale'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateAnyscaleCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - assembly-ai
              description: 'Discriminator value: assembly-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateAssemblyAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - azure-openai
              description: 'Discriminator value: azure-openai'
            region:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiRegion'
            models:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureOpenaiModels'
            openAIKey:
              type: string
              description: This is not returned in the API.
            ocpApimSubscriptionKey:
              type: string
              description: This is not returned in the API.
            openAIEndpoint:
              type: string
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - region
            - models
            - openAIKey
            - openAIEndpoint
          description: CreateAzureOpenAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - azure
              description: 'Discriminator value: azure'
            service:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureService'
              description: This is the service being used in Azure.
            region:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingAzureRegion'
              description: This is the region of the Azure resource.
            apiKey:
              type: string
              description: This is not returned in the API.
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            bucketPlan:
              $ref: '#/components/schemas/AzureBlobStorageBucketPlan'
              description: This is the bucket plan that can be provided to store call artifacts in Azure Blob Storage.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - service
          description: CreateAzureCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - byo-sip-trunk
              description: 'Discriminator value: byo-sip-trunk'
            gateways:
              type: array
              items:
                $ref: '#/components/schemas/SipTrunkGateway'
              description: This is the list of SIP trunk's gateways.
            outboundAuthenticationPlan:
              $ref: '#/components/schemas/SipTrunkOutboundAuthenticationPlan'
              description: This can be used to configure the outbound authentication if required by the SIP trunk.
            outboundLeadingPlusEnabled:
              type: boolean
              description: >-
                This ensures the outbound origination attempts have a leading plus. Defaults to false to match
                conventional telecom behavior.


                Usage:

                - Vonage/Twilio requires leading plus for all outbound calls. Set this to true.


                @default false
            techPrefix:
              type: string
              description: This can be used to configure the tech prefix on outbound calls. This is an advanced property.
            sipDiversionHeader:
              type: string
              description: >-
                This can be used to enable the SIP diversion header for authenticating the calling number if the SIP
                trunk supports it. This is an advanced property.
            sbcConfiguration:
              $ref: '#/components/schemas/SbcConfiguration'
              description: >-
                This is an advanced configuration for enterprise deployments. This uses the onprem SBC to trunk into the
                SIP trunk's `gateways`, rather than the managed SBC provided by Vapi.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - gateways
          description: CreateByoSipTrunkCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - cartesia
              description: 'Discriminator value: cartesia'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateCartesiaCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateCerebrasCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateCerebrasCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - cloudflare
              description: 'Discriminator value: cloudflare'
            accountId:
              type: string
              description: Cloudflare Account Id.
            apiKey:
              type: string
              description: Cloudflare API Key / Token.
            accountEmail:
              type: string
              description: Cloudflare Account Email.
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            bucketPlan:
              $ref: '#/components/schemas/CloudflareR2BucketPlan'
              description: This is the bucket plan that can be provided to store call artifacts in R2
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
          description: CreateCloudflareCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - custom-llm
              description: 'Discriminator value: custom-llm'
            apiKey:
              type: string
              description: This is not returned in the API.
            authenticationPlan:
              $ref: '#/components/schemas/OAuth2AuthenticationPlan'
              description: >-
                This is the authentication plan. Currently supports OAuth2 RFC 6749. To use Bearer authentication, use
                apiKey
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateCustomLLMCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - deepgram
              description: 'Discriminator value: deepgram'
            apiKey:
              type: string
              description: This is not returned in the API.
            apiUrl:
              type: string
              description: This can be used to point to an onprem Deepgram instance. Defaults to api.deepgram.com.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateDeepgramCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - deepinfra
              description: 'Discriminator value: deepinfra'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateDeepInfraCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - deep-seek
              description: 'Discriminator value: deep-seek'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateDeepSeekCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - gcp
              description: 'Discriminator value: gcp'
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            gcpKey:
              $ref: '#/components/schemas/GcpKey'
              description: >-
                This is the GCP key. This is the JSON that can be generated in the Google Cloud Console at
                https://console.cloud.google.com/iam-admin/serviceaccounts/details/<service-account-id>/keys.


                The schema is identical to the JSON that GCP outputs.
            region:
              type: string
              description: This is the region of the GCP resource.
            bucketPlan:
              $ref: '#/components/schemas/BucketPlan'
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - gcpKey
          description: CreateGcpCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - gladia
              description: 'Discriminator value: gladia'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateGladiaCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - gohighlevel
              description: 'Discriminator value: gohighlevel'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateGoHighLevelCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateGoogleCredentialDtoProvider'
              description: 'This is the key for Gemini in Google AI Studio. Get it from here: https://aistudio.google.com/app/apikey'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateGoogleCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - groq
              description: 'Discriminator value: groq'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateGroqCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateInflectionAiCredentialDtoProvider'
              description: >-
                This is the api key for Pi in InflectionAI's console. Get it from here:
                https://developers.inflection.ai/keys, billing will need to be setup
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateInflectionAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - langfuse
              description: 'Discriminator value: langfuse'
            publicKey:
              type: string
              description: 'The public key for Langfuse project. Eg: pk-lf-...'
            apiKey:
              type: string
              description: 'The secret key for Langfuse project. Eg: sk-lf-... .This is not returned in the API.'
            apiUrl:
              type: string
              description: 'The host URL for Langfuse project. Eg: https://cloud.langfuse.com'
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - publicKey
            - apiKey
            - apiUrl
          description: CreateLangfuseCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - lmnt
              description: 'Discriminator value: lmnt'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateLmntCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - make
              description: 'Discriminator value: make'
            teamId:
              type: string
              description: Team ID
            region:
              type: string
              description: 'Region of your application. For example: eu1, eu2, us1, us2'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - teamId
            - region
            - apiKey
          description: CreateMakeCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - openai
              description: 'Discriminator value: openai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateOpenAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - openrouter
              description: 'Discriminator value: openrouter'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateOpenRouterCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - perplexity-ai
              description: 'Discriminator value: perplexity-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreatePerplexityAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - playht
              description: 'Discriminator value: playht'
            apiKey:
              type: string
              description: This is not returned in the API.
            userId:
              type: string
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
            - userId
          description: CreatePlayHTCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - rime-ai
              description: 'Discriminator value: rime-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateRimeAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - runpod
              description: 'Discriminator value: runpod'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateRunpodCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - s3
              description: 'Discriminator value: s3'
            awsAccessKeyId:
              type: string
              description: AWS access key ID.
            awsSecretAccessKey:
              type: string
              description: AWS access key secret. This is not returned in the API.
            region:
              type: string
              description: AWS region in which the S3 bucket is located.
            s3BucketName:
              type: string
              description: AWS S3 bucket name.
            s3PathPrefix:
              type: string
              description: The path prefix for the uploaded recording. Ex. "recordings/"
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - awsAccessKeyId
            - awsSecretAccessKey
            - region
            - s3BucketName
            - s3PathPrefix
          description: CreateS3CredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - supabase
              description: 'Discriminator value: supabase'
            fallbackIndex:
              type: number
              format: double
              description: >-
                This is the order in which this storage provider is tried during upload retries. Lower numbers are tried
                first in increasing order.
            bucketPlan:
              $ref: '#/components/schemas/SupabaseBucketPlan'
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
          description: CreateSupabaseCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - smallest-ai
              description: 'Discriminator value: smallest-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateSmallestAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - tavus
              description: 'Discriminator value: tavus'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateTavusCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - together-ai
              description: 'Discriminator value: together-ai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateTogetherAICredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - twilio
              description: 'Discriminator value: twilio'
            authToken:
              type: string
              description: This is not returned in the API.
            apiKey:
              type: string
              description: This is not returned in the API.
            apiSecret:
              type: string
              description: This is not returned in the API.
            accountSid:
              type: string
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - accountSid
          description: CreateTwilioCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - vonage
              description: 'Discriminator value: vonage'
            apiSecret:
              type: string
              description: This is not returned in the API.
            apiKey:
              type: string
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiSecret
            - apiKey
          description: CreateVonageCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - webhook
              description: 'Discriminator value: webhook'
            authenticationPlan:
              $ref: '#/components/schemas/UpdateWorkflowDtoCredentialsItemsDiscriminatorMappingWebhookAuthenticationPlan'
              description: This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authenticationPlan
          description: CreateWebhookCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateCustomCredentialDtoProvider'
            authenticationPlan:
              $ref: '#/components/schemas/CreateCustomCredentialDtoAuthenticationPlan'
              description: This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication.
            encryptionPlan:
              $ref: '#/components/schemas/PublicKeyEncryptionPlan'
              description: This is the encryption plan for encrypting sensitive data. Currently supports public-key encryption.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authenticationPlan
          description: custom-credential variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - xai
              description: 'Discriminator value: xai'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateXAiCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateNeuphonicCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateNeuphonicCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateHumeCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateHumeCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateMistralCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateMistralCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateSpeechmaticsCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateSpeechmaticsCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateSonioxCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: soniox variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateTrieveCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: CreateTrieveCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - google.calendar.oauth2-client
              description: 'Discriminator value: google.calendar.oauth2-client'
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
          description: CreateGoogleCalendarOAuth2ClientCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - google.calendar.oauth2-authorization
              description: 'Discriminator value: google.calendar.oauth2-authorization'
            authorizationId:
              type: string
              description: The authorization ID for the OAuth2 authorization
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authorizationId
          description: CreateGoogleCalendarOAuth2AuthorizationCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - google.sheets.oauth2-authorization
              description: 'Discriminator value: google.sheets.oauth2-authorization'
            authorizationId:
              type: string
              description: The authorization ID for the OAuth2 authorization
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authorizationId
          description: CreateGoogleSheetsOAuth2AuthorizationCredentialDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - slack.oauth2-authorization
              description: 'Discriminator value: slack.oauth2-authorization'
            authorizationId:
              type: string
              description: The authorization ID for the OAuth2 authorization
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authorizationId
          description: CreateSlackOAuth2AuthorizationCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateGoHighLevelMcpCredentialDtoProvider'
            authenticationSession:
              $ref: '#/components/schemas/Oauth2AuthenticationSession'
              description: This is the authentication session for the credential.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - authenticationSession
          description: CreateGoHighLevelMCPCredentialDTO variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateInworldCredentialDtoProvider'
            apiKey:
              type: string
              description: This is the Inworld Basic (Base64) authentication token. This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: inworld variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - minimax
              description: 'Discriminator value: minimax'
            apiKey:
              type: string
              description: This is not returned in the API.
            groupId:
              type: string
              description: This is the Minimax Group ID.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
            - groupId
          description: minimax variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateWellSaidCredentialDtoProvider'
            apiKey:
              type: string
              description: This is not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - apiKey
          description: wellsaid variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateEmailCredentialDtoProvider'
            email:
              type: string
              description: The recipient email address for alerts
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - email
          description: email variant
        - type: object
          properties:
            provider:
              $ref: '#/components/schemas/CreateSlackWebhookCredentialDtoProvider'
            webhookUrl:
              type: string
              description: >-
                Slack incoming webhook URL. See https://api.slack.com/messaging/webhooks for setup instructions. This is
                not returned in the API.
            name:
              type: string
              description: This is the name of credential. This is just for your reference.
          required:
            - provider
            - webhookUrl
          description: slack-webhook variant
      discriminator:
        propertyName: provider
      title: CreateWorkflowDtoCredentialsItems
    CreateWorkflowDtoVoicemailDetection0:
      type: string
      enum:
        - 'off'
      title: CreateWorkflowDtoVoicemailDetection0
    CreateWorkflowDtoVoicemailDetection:
      oneOf:
        - $ref: '#/components/schemas/CreateWorkflowDtoVoicemailDetection0'
        - $ref: '#/components/schemas/GoogleVoicemailDetectionPlan'
        - $ref: '#/components/schemas/OpenAIVoicemailDetectionPlan'
        - $ref: '#/components/schemas/TwilioVoicemailDetectionPlan'
        - $ref: '#/components/schemas/VapiVoicemailDetectionPlan'
      description: This is the voicemail detection plan for the workflow.
      title: CreateWorkflowDtoVoicemailDetection
    AiEdgeConditionType:
      type: string
      enum:
        - ai
      title: AiEdgeConditionType
    AIEdgeCondition:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/AiEdgeConditionType'
        prompt:
          type: string
          description: This is the prompt for the AI edge condition. It should evaluate to a boolean.
      required:
        - type
        - prompt
      title: AIEdgeCondition
    EdgeCondition:
      oneOf:
        - $ref: '#/components/schemas/AIEdgeCondition'
      title: EdgeCondition
    EdgeMetadata:
      type: object
      properties: {}
      description: This is for metadata you want to store on the edge.
      title: EdgeMetadata
    Edge:
      type: object
      properties:
        condition:
          $ref: '#/components/schemas/EdgeCondition'
        from:
          type: string
        to:
          type: string
        metadata:
          $ref: '#/components/schemas/EdgeMetadata'
          description: This is for metadata you want to store on the edge.
      required:
        - from
        - to
      title: Edge
    CreateWorkflowDTO:
      type: object
      properties:
        nodes:
          type: array
          items:
            $ref: '#/components/schemas/CreateWorkflowDtoNodesItems'
        model:
          $ref: '#/components/schemas/CreateWorkflowDtoModel'
          description: |-
            This is the model for the workflow.

            This can be overridden at node level using `nodes[n].model`.
        transcriber:
          $ref: '#/components/schemas/CreateWorkflowDtoTranscriber'
          description: |-
            This is the transcriber for the workflow.

            This can be overridden at node level using `nodes[n].transcriber`.
        voice:
          $ref: '#/components/schemas/CreateWorkflowDtoVoice'
          description: |-
            This is the voice for the workflow.

            This can be overridden at node level using `nodes[n].voice`.
        observabilityPlan:
          $ref: '#/components/schemas/LangfuseObservabilityPlan'
          description: |-
            This is the plan for observability of workflow's calls.

            Currently, only Langfuse is supported.
        backgroundSound:
          $ref: '#/components/schemas/CreateWorkflowDtoBackgroundSound'
          description: >-
            This is the background sound in the call. Default for phone calls is 'office' and default for web calls is
            'off'.

            You can also provide a custom sound by providing a URL to an audio file.
        hooks:
          type: array
          items:
            $ref: '#/components/schemas/CreateWorkflowDtoHooksItems'
          description: This is a set of actions that will be performed on certain events.
        credentials:
          type: array
          items:
            $ref: '#/components/schemas/CreateWorkflowDtoCredentialsItems'
          description: >-
            These are dynamic credentials that will be used for the workflow calls. By default, all the credentials are
            available for use in the call but you can supplement an additional credentials using this. Dynamic
            credentials override existing credentials.
        voicemailDetection:
          $ref: '#/components/schemas/CreateWorkflowDtoVoicemailDetection'
          description: This is the voicemail detection plan for the workflow.
        maxDurationSeconds:
          type: number
          format: double
          description: |-
            This is the maximum duration of the call in seconds.

            After this duration, the call will automatically end.

            Default is 1800 (30 minutes), max is 43200 (12 hours), and min is 10 seconds.
        name:
          type: string
        edges:
          type: array
          items:
            $ref: '#/components/schemas/Edge'
        globalPrompt:
          type: string
        server:
          $ref: '#/components/schemas/Server'
          description: >-
            This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
            ServerMessage schema.


            The order of precedence is:


            1. tool.server

            2. workflow.server / assistant.server

            3. phoneNumber.server

            4. org.server
        compliancePlan:
          $ref: '#/components/schemas/CompliancePlan'
          description: >-
            This is the compliance plan for the workflow. It allows you to configure HIPAA and other compliance
            settings.
        analysisPlan:
          $ref: '#/components/schemas/AnalysisPlan'
          description: This is the plan for analysis of workflow's calls. Stored in `call.analysis`.
        artifactPlan:
          $ref: '#/components/schemas/ArtifactPlan'
          description: This is the plan for artifacts generated during workflow's calls. Stored in `call.artifact`.
        startSpeakingPlan:
          $ref: '#/components/schemas/StartSpeakingPlan'
          description: |-
            This is the plan for when the workflow nodes should start talking.

            You should configure this if you're running into these issues:
            - The assistant is too slow to start talking after the customer is done speaking.
            - The assistant is too fast to start talking after the customer is done speaking.
            - The assistant is so fast that it's actually interrupting the customer.
        stopSpeakingPlan:
          $ref: '#/components/schemas/StopSpeakingPlan'
          description: |-
            This is the plan for when workflow nodes should stop talking on customer interruption.

            You should configure this if you're running into these issues:
            - The assistant is too slow to recognize customer's interruption.
            - The assistant is too fast to recognize customer's interruption.
            - The assistant is getting interrupted by phrases that are just acknowledgments.
            - The assistant is getting interrupted by background noises.
            - The assistant is not properly stopping -- it starts talking right after getting interrupted.
        monitorPlan:
          $ref: '#/components/schemas/MonitorPlan'
          description: |-
            This is the plan for real-time monitoring of the workflow's calls.

            Usage:
            - To enable live listening of the workflow's calls, set `monitorPlan.listenEnabled` to `true`.
            - To enable live control of the workflow's calls, set `monitorPlan.controlEnabled` to `true`.
        backgroundSpeechDenoisingPlan:
          $ref: '#/components/schemas/BackgroundSpeechDenoisingPlan'
          description: |-
            This enables filtering of noise and background speech while the user is talking.

            Features:
            - Smart denoising using Krisp
            - Fourier denoising

            Both can be used together. Order of precedence:
            - Smart denoising
            - Fourier denoising
        credentialIds:
          type: array
          items:
            type: string
          description: >-
            These are the credentials that will be used for the workflow calls. By default, all the credentials are
            available for use in the call but you can provide a subset using this.
        keypadInputPlan:
          $ref: '#/components/schemas/KeypadInputPlan'
          description: This is the plan for keypad input handling during workflow calls.
        voicemailMessage:
          type: string
          description: |-
            This is the message that the assistant will say if the call is forwarded to voicemail.

            If unspecified, it will hang up.
      required:
        - nodes
        - name
        - edges
      title: CreateWorkflowDTO
    WorkflowOverridesVariableValues:
      type: object
      properties: {}
      description: >-
        These are values that will be used to replace the template variables in the workflow messages and other
        text-based fields.

        This uses LiquidJS syntax. https://liquidjs.com/tutorials/intro-to-liquid.html


        So for example, `{{ name }}` will be replaced with the value of `name` in `variableValues`.

        `{{"now" | date: "%b %d, %Y, %I:%M %p", "America/New_York"}}` will be replaced with the current date and time in
        New York.
         Some VAPI reserved defaults:
         - *customer* - the customer object
      title: WorkflowOverridesVariableValues
    WorkflowOverrides:
      type: object
      properties:
        variableValues:
          $ref: '#/components/schemas/WorkflowOverridesVariableValues'
          description: >-
            These are values that will be used to replace the template variables in the workflow messages and other
            text-based fields.

            This uses LiquidJS syntax. https://liquidjs.com/tutorials/intro-to-liquid.html


            So for example, `{{ name }}` will be replaced with the value of `name` in `variableValues`.

            `{{"now" | date: "%b %d, %Y, %I:%M %p", "America/New_York"}}` will be replaced with the current date and
            time in New York.
             Some VAPI reserved defaults:
             - *customer* - the customer object
      title: WorkflowOverrides
    ImportTwilioPhoneNumberDtoFallbackDestination:
      oneOf:
        - $ref: '#/components/schemas/TransferDestinationNumber'
        - $ref: '#/components/schemas/TransferDestinationSip'
      description: |-
        This is the fallback destination an inbound call will be transferred to if:
        1. `assistantId` is not set
        2. `squadId` is not set
        3. and, `assistant-request` message to the `serverUrl` fails

        If this is not set and above conditions are met, the inbound call is hung up with an error message.
      title: ImportTwilioPhoneNumberDtoFallbackDestination
    PhoneNumberHookCallRingingOn:
      type: string
      enum:
        - call.ringing
      description: This is the event to trigger the hook on
      title: PhoneNumberHookCallRingingOn
    PhoneNumberCallRingingHookFilterType:
      type: string
      enum:
        - startsWith
      description: This is the type of filter - matches when the specified field starts with any of the given prefixes
      title: PhoneNumberCallRingingHookFilterType
    PhoneNumberCallRingingHookFilterKey:
      type: string
      enum:
        - number
      description: The field to check. Currently only "number" (the caller's phone number) is supported.
      title: PhoneNumberCallRingingHookFilterKey
    PhoneNumberCallRingingHookFilter:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/PhoneNumberCallRingingHookFilterType'
          description: This is the type of filter - matches when the specified field starts with any of the given prefixes
        key:
          $ref: '#/components/schemas/PhoneNumberCallRingingHookFilterKey'
          description: The field to check. Currently only "number" (the caller's phone number) is supported.
        startsWith:
          type: array
          items:
            type: string
          description: >-
            Array of prefixes to match. Do not include the + prefix. Inbound calls from numbers starting with any of
            these prefixes will trigger the hook actions.
      required:
        - type
        - key
        - startsWith
      title: PhoneNumberCallRingingHookFilter
    TransferPhoneNumberHookActionType:
      type: string
      enum:
        - transfer
      description: This is the type of action - must be "transfer"
      title: TransferPhoneNumberHookActionType
    TransferPhoneNumberHookActionDestination:
      oneOf:
        - $ref: '#/components/schemas/TransferDestinationNumber'
        - $ref: '#/components/schemas/TransferDestinationSip'
      description: This is the destination details for the transfer - can be a phone number or SIP URI
      title: TransferPhoneNumberHookActionDestination
    TransferPhoneNumberHookAction:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/TransferPhoneNumberHookActionType'
          description: This is the type of action - must be "transfer"
        destination:
          $ref: '#/components/schemas/TransferPhoneNumberHookActionDestination'
          description: This is the destination details for the transfer - can be a phone number or SIP URI
      required:
        - type
      title: TransferPhoneNumberHookAction
    SayPhoneNumberHookActionType:
      type: string
      enum:
        - say
      description: This is the type of action - must be "say"
      title: SayPhoneNumberHookActionType
    SayPhoneNumberHookAction:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/SayPhoneNumberHookActionType'
          description: This is the type of action - must be "say"
        exact:
          type: string
          description: This is the message to say
      required:
        - type
        - exact
      title: SayPhoneNumberHookAction
    PhoneNumberHookCallRingingDoItems:
      oneOf:
        - $ref: '#/components/schemas/TransferPhoneNumberHookAction'
        - $ref: '#/components/schemas/SayPhoneNumberHookAction'
      title: PhoneNumberHookCallRingingDoItems
    PhoneNumberHookCallRinging:
      type: object
      properties:
        'on':
          $ref: '#/components/schemas/PhoneNumberHookCallRingingOn'
          description: This is the event to trigger the hook on
        filters:
          type: array
          items:
            $ref: '#/components/schemas/PhoneNumberCallRingingHookFilter'
          description: Optional filters to decide when to trigger the hook. Currently supports filtering by caller country code.
        do:
          type: array
          items:
            $ref: '#/components/schemas/PhoneNumberHookCallRingingDoItems'
          description: Only the first action will be executed. Additional actions will be ignored.
      required:
        - 'on'
        - do
      title: PhoneNumberHookCallRinging
    PhoneNumberHookCallEndingOn:
      type: string
      enum:
        - call.ending
      description: This is the event to trigger the hook on
      title: PhoneNumberHookCallEndingOn
    PhoneNumberCallEndingHookFilterType:
      type: string
      enum:
        - oneOf
      description: This is the type of filter - currently only "oneOf" is supported
      title: PhoneNumberCallEndingHookFilterType
    PhoneNumberCallEndingHookFilterKey:
      type: string
      enum:
        - call.endedReason
      description: This is the key to filter on - only "call.endedReason" is allowed for phone number call ending hooks
      title: PhoneNumberCallEndingHookFilterKey
    PhoneNumberCallEndingHookFilterOneOf:
      type: string
      enum:
        - assistant-request-failed
        - assistant-request-returned-error
        - assistant-request-returned-unspeakable-error
        - assistant-request-returned-invalid-assistant
        - assistant-request-returned-no-assistant
        - assistant-request-returned-forwarding-phone-number
      description: This is the array of assistant-request related ended reasons to match against
      title: PhoneNumberCallEndingHookFilterOneOf
    PhoneNumberCallEndingHookFilter:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/PhoneNumberCallEndingHookFilterType'
          description: This is the type of filter - currently only "oneOf" is supported
        key:
          $ref: '#/components/schemas/PhoneNumberCallEndingHookFilterKey'
          description: This is the key to filter on - only "call.endedReason" is allowed for phone number call ending hooks
        oneOf:
          $ref: '#/components/schemas/PhoneNumberCallEndingHookFilterOneOf'
          description: This is the array of assistant-request related ended reasons to match against
      required:
        - type
        - key
        - oneOf
      title: PhoneNumberCallEndingHookFilter
    PhoneNumberHookCallEndingDo:
      oneOf:
        - $ref: '#/components/schemas/TransferPhoneNumberHookAction'
        - $ref: '#/components/schemas/SayPhoneNumberHookAction'
      description: This is the action to perform when the hook triggers
      title: PhoneNumberHookCallEndingDo
    PhoneNumberHookCallEnding:
      type: object
      properties:
        'on':
          $ref: '#/components/schemas/PhoneNumberHookCallEndingOn'
          description: This is the event to trigger the hook on
        filters:
          type: array
          items:
            $ref: '#/components/schemas/PhoneNumberCallEndingHookFilter'
          description: Optional filters to decide when to trigger - restricted to assistant-request related ended reasons
        do:
          $ref: '#/components/schemas/PhoneNumberHookCallEndingDo'
          description: This is the action to perform when the hook triggers
      required:
        - 'on'
      title: PhoneNumberHookCallEnding
    ImportTwilioPhoneNumberDtoHooksItems:
      oneOf:
        - $ref: '#/components/schemas/PhoneNumberHookCallRinging'
        - $ref: '#/components/schemas/PhoneNumberHookCallEnding'
      title: ImportTwilioPhoneNumberDtoHooksItems
    ImportTwilioPhoneNumberDTO:
      type: object
      properties:
        fallbackDestination:
          $ref: '#/components/schemas/ImportTwilioPhoneNumberDtoFallbackDestination'
          description: |-
            This is the fallback destination an inbound call will be transferred to if:
            1. `assistantId` is not set
            2. `squadId` is not set
            3. and, `assistant-request` message to the `serverUrl` fails

            If this is not set and above conditions are met, the inbound call is hung up with an error message.
        hooks:
          type: array
          items:
            $ref: '#/components/schemas/ImportTwilioPhoneNumberDtoHooksItems'
          description: This is the hooks that will be used for incoming calls to this phone number.
        smsEnabled:
          type: boolean
          default: true
          description: |-
            Controls whether Vapi sets the messaging webhook URL on the Twilio number during import.

            If set to `false`, Vapi will not update the Twilio messaging URL, leaving it as is.
            If `true` or omitted (default), Vapi will configure both the voice and messaging URLs.

            @default true
        twilioPhoneNumber:
          type: string
          description: These are the digits of the phone number you own on your Twilio.
        twilioAccountSid:
          type: string
          description: This is your Twilio Account SID that will be used to handle this phone number.
        twilioAuthToken:
          type: string
          description: This is the Twilio Auth Token that will be used to handle this phone number.
        twilioApiKey:
          type: string
          description: >-
            This is the Twilio API Key that will be used to handle this phone number. If AuthToken is provided, this
            will be ignored.
        twilioApiSecret:
          type: string
          description: >-
            This is the Twilio API Secret that will be used to handle this phone number. If AuthToken is provided, this
            will be ignored.
        name:
          type: string
          description: This is the name of the phone number. This is just for your own reference.
        assistantId:
          type: string
          description: >-
            This is the assistant that will be used for incoming calls to this phone number.


            If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your Server
            URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is
            expected.
        workflowId:
          type: string
          description: >-
            This is the workflow that will be used for incoming calls to this phone number.


            If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
            Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that
            is expected.
        squadId:
          type: string
          description: >-
            This is the squad that will be used for incoming calls to this phone number.


            If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
            Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that
            is expected.
        server:
          $ref: '#/components/schemas/Server'
          description: >-
            This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
            ServerMessage schema.


            The order of precedence is:


            1. assistant.server

            2. phoneNumber.server

            3. org.server
      required:
        - twilioPhoneNumber
        - twilioAccountSid
      title: ImportTwilioPhoneNumberDTO
    CreateCustomerDTO:
      type: object
      properties:
        numberE164CheckEnabled:
          type: boolean
          default: true
          description: >-
            This is the flag to toggle the E164 check for the `number` field. This is an advanced property which should
            be used if you know your use case requires it.


            Use cases:

            - `false`: To allow non-E164 numbers like `+001234567890`, `1234`, or `abc`. This is useful for dialing out
            to non-E164 numbers on your SIP trunks.

            - `true` (default): To allow only E164 numbers like `+14155551234`. This is standard for PSTN calls.


            If `false`, the `number` is still required to only contain alphanumeric characters (regex:
            `/^\+?[a-zA-Z0-9]+$/`).


            @default true (E164 check is enabled)
        extension:
          type: string
          description: This is the extension that will be dialed after the call is answered.
        assistantOverrides:
          $ref: '#/components/schemas/AssistantOverrides'
          description: |-
            These are the overrides for the assistant's settings and template variables specific to this customer.
            This allows customization of the assistant's behavior for individual customers in batch calls.
        number:
          type: string
          description: This is the number of the customer.
        sipUri:
          type: string
          description: This is the SIP URI of the customer.
        name:
          type: string
          description: >-
            This is the name of the customer. This is just for your own reference.


            For SIP inbound calls, this is extracted from the `From` SIP header with format `"Display Name"
            <sip:username@domain>`.
        email:
          type: string
          description: This is the email of the customer.
        externalId:
          type: string
          description: This is the external ID of the customer.
      title: CreateCustomerDTO
    SchedulePlan:
      type: object
      properties:
        earliestAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of the earliest time the call can be scheduled.
        latestAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of the latest time the call can be scheduled.
      required:
        - earliestAt
      title: SchedulePlan
    CallTransport:
      type: object
      properties: {}
      description: This is the transport of the call.
      title: CallTransport
    SubscriptionLimits:
      type: object
      properties:
        concurrencyBlocked:
          type: boolean
          default: false
          description: True if this call was blocked by the Call Concurrency limit
        concurrencyLimit:
          type: number
          format: double
          description: Account Call Concurrency limit
        remainingConcurrentCalls:
          type: number
          format: double
          description: Incremental number of concurrent calls that will be allowed, including this call
      title: SubscriptionLimits
    Call:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/CallType'
          description: This is the type of call.
        costs:
          type: array
          items:
            $ref: '#/components/schemas/CallCostsItems'
          description: These are the costs of individual components of the call in USD.
        messages:
          type: array
          items:
            $ref: '#/components/schemas/CallMessagesItems'
        phoneCallProvider:
          $ref: '#/components/schemas/CallPhoneCallProvider'
          description: |-
            This is the provider of the call.

            Only relevant for `outboundPhoneCall` and `inboundPhoneCall` type.
        phoneCallTransport:
          $ref: '#/components/schemas/CallPhoneCallTransport'
          description: |-
            This is the transport of the phone call.

            Only relevant for `outboundPhoneCall` and `inboundPhoneCall` type.
        status:
          $ref: '#/components/schemas/CallStatus'
          description: This is the status of the call.
        endedReason:
          $ref: '#/components/schemas/CallEndedReason'
          description: This is the explanation for how the call ended.
        endedMessage:
          type: string
          description: >-
            This is the message that adds more context to the ended reason. It can be used to provide potential error
            messages or warnings.
        destination:
          $ref: '#/components/schemas/CallDestination'
          description: >-
            This is the destination where the call ended up being transferred to. If the call was not transferred, this
            will be empty.
        id:
          type: string
          description: This is the unique identifier for the call.
        orgId:
          type: string
          description: This is the unique identifier for the org that this call belongs to.
        createdAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the call was created.
        updatedAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the call was last updated.
        startedAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the call was started.
        endedAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the call was ended.
        cost:
          type: number
          format: double
          description: This is the cost of the call in USD.
        costBreakdown:
          $ref: '#/components/schemas/CostBreakdown'
          description: This is the cost of the call in USD.
        artifactPlan:
          $ref: '#/components/schemas/ArtifactPlan'
          description: >-
            This is a copy of assistant artifact plan. This isn't actually stored on the call but rather just returned
            in POST /call/web to enable artifact creation client side.
        analysis:
          $ref: '#/components/schemas/Analysis'
          description: This is the analysis of the call. Configure in `assistant.analysisPlan`.
        monitor:
          $ref: '#/components/schemas/Monitor'
          description: This is to real-time monitor the call. Configure in `assistant.monitorPlan`.
        artifact:
          $ref: '#/components/schemas/Artifact'
          description: These are the artifacts created from the call. Configure in `assistant.artifactPlan`.
        compliance:
          $ref: '#/components/schemas/Compliance'
          description: This is the compliance of the call. Configure in `assistant.compliancePlan`.
        phoneCallProviderId:
          type: string
          description: >-
            The ID of the call as provided by the phone number service. callSid in Twilio. conversationUuid in Vonage.
            callControlId in Telnyx.


            Only relevant for `outboundPhoneCall` and `inboundPhoneCall` type.
        campaignId:
          type: string
          description: This is the campaign ID that the call belongs to.
        assistantId:
          type: string
          description: >-
            This is the assistant ID that will be used for the call. To use a transient assistant, use `assistant`
            instead.


            To start a call with:

            - Assistant, use `assistantId` or `assistant`

            - Squad, use `squadId` or `squad`

            - Workflow, use `workflowId` or `workflow`
        assistant:
          $ref: '#/components/schemas/CreateAssistantDTO'
          description: >-
            This is the assistant that will be used for the call. To use an existing assistant, use `assistantId`
            instead.


            To start a call with:

            - Assistant, use `assistant`

            - Squad, use `squad`

            - Workflow, use `workflow`
        assistantOverrides:
          $ref: '#/components/schemas/AssistantOverrides'
          description: These are the overrides for the `assistant` or `assistantId`'s settings and template variables.
        squadId:
          type: string
          description: |-
            This is the squad that will be used for the call. To use a transient squad, use `squad` instead.

            To start a call with:
            - Assistant, use `assistant` or `assistantId`
            - Squad, use `squad` or `squadId`
            - Workflow, use `workflow` or `workflowId`
        squad:
          $ref: '#/components/schemas/CreateSquadDTO'
          description: |-
            This is a squad that will be used for the call. To use an existing squad, use `squadId` instead.

            To start a call with:
            - Assistant, use `assistant` or `assistantId`
            - Squad, use `squad` or `squadId`
            - Workflow, use `workflow` or `workflowId`
        squadOverrides:
          $ref: '#/components/schemas/AssistantOverrides'
          description: |-
            These are the overrides for the `squad` or `squadId`'s member settings and template variables.
            This will apply to all members of the squad.
        workflowId:
          type: string
          description: |-
            This is the workflow that will be used for the call. To use a transient workflow, use `workflow` instead.

            To start a call with:
            - Assistant, use `assistant` or `assistantId`
            - Squad, use `squad` or `squadId`
            - Workflow, use `workflow` or `workflowId`
        workflow:
          $ref: '#/components/schemas/CreateWorkflowDTO'
          description: |-
            This is a workflow that will be used for the call. To use an existing workflow, use `workflowId` instead.

            To start a call with:
            - Assistant, use `assistant` or `assistantId`
            - Squad, use `squad` or `squadId`
            - Workflow, use `workflow` or `workflowId`
        workflowOverrides:
          $ref: '#/components/schemas/WorkflowOverrides'
          description: These are the overrides for the `workflow` or `workflowId`'s settings and template variables.
        phoneNumberId:
          type: string
          description: >-
            This is the phone number that will be used for the call. To use a transient number, use `phoneNumber`
            instead.


            Only relevant for `outboundPhoneCall` and `inboundPhoneCall` type.
        phoneNumber:
          $ref: '#/components/schemas/ImportTwilioPhoneNumberDTO'
          description: >-
            This is the phone number that will be used for the call. To use an existing number, use `phoneNumberId`
            instead.


            Only relevant for `outboundPhoneCall` and `inboundPhoneCall` type.
        customerId:
          type: string
          description: |-
            This is the customer that will be called. To call a transient customer , use `customer` instead.

            Only relevant for `outboundPhoneCall` and `inboundPhoneCall` type.
        customer:
          $ref: '#/components/schemas/CreateCustomerDTO'
          description: |-
            This is the customer that will be called. To call an existing customer, use `customerId` instead.

            Only relevant for `outboundPhoneCall` and `inboundPhoneCall` type.
        name:
          type: string
          description: This is the name of the call. This is just for your own reference.
        schedulePlan:
          $ref: '#/components/schemas/SchedulePlan'
          description: This is the schedule plan of the call.
        transport:
          $ref: '#/components/schemas/CallTransport'
          description: This is the transport of the call.
        subscriptionLimits:
          $ref: '#/components/schemas/SubscriptionLimits'
          description: >-
            These are the subscription limits for the org at the time of the call. Includes concurrency limit
            information.
      required:
        - id
        - orgId
        - createdAt
        - updatedAt
      title: Call
    CreateCallDtoTransport:
      type: object
      properties: {}
      description: This is the transport of the call.
      title: CreateCallDtoTransport
    CreateCallDTO:
      type: object
      properties:
        customers:
          type: array
          items:
            $ref: '#/components/schemas/CreateCustomerDTO'
          description: |-
            This is used to issue batch calls to multiple customers.

            Only relevant for `outboundPhoneCall`. To call a single customer, use `customer` instead.
        name:
          type: string
          description: This is the name of the call. This is just for your own reference.
        schedulePlan:
          $ref: '#/components/schemas/SchedulePlan'
          description: This is the schedule plan of the call.
        transport:
          $ref: '#/components/schemas/CreateCallDtoTransport'
          description: This is the transport of the call.
        assistantId:
          type: string
          description: >-
            This is the assistant ID that will be used for the call. To use a transient assistant, use `assistant`
            instead.


            To start a call with:

            - Assistant, use `assistantId` or `assistant`

            - Squad, use `squadId` or `squad`

            - Workflow, use `workflowId` or `workflow`
        assistant:
          $ref: '#/components/schemas/CreateAssistantDTO'
          description: >-
            This is the assistant that will be used for the call. To use an existing assistant, use `assistantId`
            instead.


            To start a call with:

            - Assistant, use `assistant`

            - Squad, use `squad`

            - Workflow, use `workflow`
        assistantOverrides:
          $ref: '#/components/schemas/AssistantOverrides'
          description: These are the overrides for the `assistant` or `assistantId`'s settings and template variables.
        squadId:
          type: string
          description: |-
            This is the squad that will be used for the call. To use a transient squad, use `squad` instead.

            To start a call with:
            - Assistant, use `assistant` or `assistantId`
            - Squad, use `squad` or `squadId`
            - Workflow, use `workflow` or `workflowId`
        squad:
          $ref: '#/components/schemas/CreateSquadDTO'
          description: |-
            This is a squad that will be used for the call. To use an existing squad, use `squadId` instead.

            To start a call with:
            - Assistant, use `assistant` or `assistantId`
            - Squad, use `squad` or `squadId`
            - Workflow, use `workflow` or `workflowId`
        squadOverrides:
          $ref: '#/components/schemas/AssistantOverrides'
          description: |-
            These are the overrides for the `squad` or `squadId`'s member settings and template variables.
            This will apply to all members of the squad.
        workflowId:
          type: string
          description: |-
            This is the workflow that will be used for the call. To use a transient workflow, use `workflow` instead.

            To start a call with:
            - Assistant, use `assistant` or `assistantId`
            - Squad, use `squad` or `squadId`
            - Workflow, use `workflow` or `workflowId`
        workflow:
          $ref: '#/components/schemas/CreateWorkflowDTO'
          description: |-
            This is a workflow that will be used for the call. To use an existing workflow, use `workflowId` instead.

            To start a call with:
            - Assistant, use `assistant` or `assistantId`
            - Squad, use `squad` or `squadId`
            - Workflow, use `workflow` or `workflowId`
        workflowOverrides:
          $ref: '#/components/schemas/WorkflowOverrides'
          description: These are the overrides for the `workflow` or `workflowId`'s settings and template variables.
        phoneNumberId:
          type: string
          description: >-
            This is the phone number that will be used for the call. To use a transient number, use `phoneNumber`
            instead.


            Only relevant for `outboundPhoneCall` and `inboundPhoneCall` type.
        phoneNumber:
          $ref: '#/components/schemas/ImportTwilioPhoneNumberDTO'
          description: >-
            This is the phone number that will be used for the call. To use an existing number, use `phoneNumberId`
            instead.


            Only relevant for `outboundPhoneCall` and `inboundPhoneCall` type.
        customerId:
          type: string
          description: |-
            This is the customer that will be called. To call a transient customer , use `customer` instead.

            Only relevant for `outboundPhoneCall` and `inboundPhoneCall` type.
        customer:
          $ref: '#/components/schemas/CreateCustomerDTO'
          description: |-
            This is the customer that will be called. To call an existing customer, use `customerId` instead.

            Only relevant for `outboundPhoneCall` and `inboundPhoneCall` type.
      title: CreateCallDTO
    CallBatchError:
      type: object
      properties:
        customer:
          $ref: '#/components/schemas/CreateCustomerDTO'
        error:
          type: string
      required:
        - customer
        - error
      title: CallBatchError
    CallBatchResponse:
      type: object
      properties:
        subscriptionLimits:
          $ref: '#/components/schemas/SubscriptionLimits'
          description: Subscription limits at the end of this batch
        results:
          type: array
          items:
            $ref: '#/components/schemas/Call'
          description: This is the list of calls that were created.
        errors:
          type: array
          items:
            $ref: '#/components/schemas/CallBatchError'
          description: This is the list of calls that failed to be created.
      required:
        - results
        - errors
      title: CallBatchResponse
    calls_create_Response_201:
      oneOf:
        - $ref: '#/components/schemas/Call'
        - $ref: '#/components/schemas/CallBatchResponse'
      title: calls_create_Response_201
    DeleteCallDTO:
      type: object
      properties:
        ids:
          type: array
          items:
            type: string
          description: >-
            These are the Call IDs to be bulk deleted.

            If provided, the call ID if any in the request query will be ignored

            When requesting a bulk delete, updates when a call is deleted will be sent as a webhook to the server URL
            configured in the Org settings.

            It may take up to a few hours to complete the bulk delete, and will be asynchronous.
      title: DeleteCallDTO
    UpdateCallDTO:
      type: object
      properties:
        name:
          type: string
          description: This is the name of the call. This is just for your own reference.
      title: UpdateCallDTO
    ChatGetParametersSortOrder:
      type: string
      enum:
        - ASC
        - DESC
      title: ChatGetParametersSortOrder
    ChatInputOneOf1Items:
      oneOf:
        - $ref: '#/components/schemas/SystemMessage'
        - $ref: '#/components/schemas/UserMessage'
        - $ref: '#/components/schemas/AssistantMessage'
        - $ref: '#/components/schemas/ToolMessage'
        - $ref: '#/components/schemas/DeveloperMessage'
      title: ChatInputOneOf1Items
    ChatInput1:
      type: array
      items:
        $ref: '#/components/schemas/ChatInputOneOf1Items'
      title: ChatInput1
    ChatInput:
      oneOf:
        - type: string
        - $ref: '#/components/schemas/ChatInput1'
      description: |-
        This is the input text for the chat.
        Can be a string or an array of chat messages.
      title: ChatInput
    ChatMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/SystemMessage'
        - $ref: '#/components/schemas/UserMessage'
        - $ref: '#/components/schemas/AssistantMessage'
        - $ref: '#/components/schemas/ToolMessage'
        - $ref: '#/components/schemas/DeveloperMessage'
      title: ChatMessagesItems
    ChatOutputItems:
      oneOf:
        - $ref: '#/components/schemas/SystemMessage'
        - $ref: '#/components/schemas/UserMessage'
        - $ref: '#/components/schemas/AssistantMessage'
        - $ref: '#/components/schemas/ToolMessage'
        - $ref: '#/components/schemas/DeveloperMessage'
      title: ChatOutputItems
    ChatCostType:
      type: string
      enum:
        - chat
      description: This is the type of cost, always 'chat' for this class.
      title: ChatCostType
    ChatCost:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/ChatCostType'
          description: This is the type of cost, always 'chat' for this class.
        cost:
          type: number
          format: double
          description: This is the cost of the component in USD.
      required:
        - type
        - cost
      title: ChatCost
    ChatCostsItems:
      oneOf:
        - $ref: '#/components/schemas/ModelCost'
        - $ref: '#/components/schemas/ChatCost'
      title: ChatCostsItems
    Chat:
      type: object
      properties:
        assistantId:
          type: string
          description: >-
            This is the assistant that will be used for the chat. To use an existing assistant, use `assistantId`
            instead.
        assistant:
          $ref: '#/components/schemas/CreateAssistantDTO'
          description: >-
            This is the assistant that will be used for the chat. To use an existing assistant, use `assistantId`
            instead.
        assistantOverrides:
          $ref: '#/components/schemas/AssistantOverrides'
          description: |-
            These are the variable values that will be used to replace template variables in the assistant messages.
            Only variable substitution is supported in chat contexts - other assistant properties cannot be overridden.
        squadId:
          type: string
          description: This is the squad that will be used for the chat. To use a transient squad, use `squad` instead.
        squad:
          $ref: '#/components/schemas/CreateSquadDTO'
          description: This is the squad that will be used for the chat. To use an existing squad, use `squadId` instead.
        name:
          type: string
          description: This is the name of the chat. This is just for your own reference.
        sessionId:
          type: string
          description: |-
            This is the ID of the session that will be used for the chat.
            Mutually exclusive with previousChatId.
        input:
          $ref: '#/components/schemas/ChatInput'
          description: |-
            This is the input text for the chat.
            Can be a string or an array of chat messages.
        stream:
          type: boolean
          default: false
          description: |-
            This is a flag that determines whether the response should be streamed.
            When true, the response will be sent as chunks of text.
        previousChatId:
          type: string
          description: |-
            This is the ID of the chat that will be used as context for the new chat.
            The messages from the previous chat will be used as context.
            Mutually exclusive with sessionId.
        id:
          type: string
          description: This is the unique identifier for the chat.
        orgId:
          type: string
          description: This is the unique identifier for the org that this chat belongs to.
        messages:
          type: array
          items:
            $ref: '#/components/schemas/ChatMessagesItems'
          description: |-
            This is an array of messages used as context for the chat.
            Used to provide message history for multi-turn conversations.
        output:
          type: array
          items:
            $ref: '#/components/schemas/ChatOutputItems'
          description: This is the output messages generated by the system in response to the input.
        createdAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the chat was created.
        updatedAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the chat was last updated.
        costs:
          type: array
          items:
            $ref: '#/components/schemas/ChatCostsItems'
          description: These are the costs of individual components of the chat in USD.
        cost:
          type: number
          format: double
          description: This is the cost of the chat in USD.
      required:
        - id
        - orgId
        - createdAt
        - updatedAt
      title: Chat
    PaginationMeta:
      type: object
      properties:
        itemsPerPage:
          type: number
          format: double
        totalItems:
          type: number
          format: double
        currentPage:
          type: number
          format: double
        itemsBeyondRetention:
          type: boolean
        createdAtLe:
          type: string
          format: date-time
        createdAtGe:
          type: string
          format: date-time
      required:
        - itemsPerPage
        - totalItems
        - currentPage
      title: PaginationMeta
    ChatPaginatedResponse:
      type: object
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/Chat'
        metadata:
          $ref: '#/components/schemas/PaginationMeta'
      required:
        - results
        - metadata
      title: ChatPaginatedResponse
    CreateChatDtoInputOneOf1Items:
      oneOf:
        - $ref: '#/components/schemas/SystemMessage'
        - $ref: '#/components/schemas/UserMessage'
        - $ref: '#/components/schemas/AssistantMessage'
        - $ref: '#/components/schemas/ToolMessage'
        - $ref: '#/components/schemas/DeveloperMessage'
      title: CreateChatDtoInputOneOf1Items
    CreateChatDtoInput1:
      type: array
      items:
        $ref: '#/components/schemas/CreateChatDtoInputOneOf1Items'
      title: CreateChatDtoInput1
    CreateChatDtoInput:
      oneOf:
        - type: string
        - $ref: '#/components/schemas/CreateChatDtoInput1'
      description: |-
        This is the input text for the chat.
        Can be a string or an array of chat messages.
        This field is REQUIRED for chat creation.
      title: CreateChatDtoInput
    TwilioSmsChatTransportConversationType:
      type: string
      enum:
        - chat
      default: chat
      description: This is the conversation type of the call (ie, voice or chat).
      title: TwilioSmsChatTransportConversationType
    TwilioSmsChatTransportType:
      type: string
      enum:
        - twilio.sms
      description: |-
        The type of transport to use for sending the chat response.
        Currently supports 'twilio.sms' for SMS delivery via Twilio.
      title: TwilioSmsChatTransportType
    TwilioSMSChatTransport:
      type: object
      properties:
        conversationType:
          $ref: '#/components/schemas/TwilioSmsChatTransportConversationType'
          description: This is the conversation type of the call (ie, voice or chat).
        phoneNumberId:
          type: string
          description: |-
            This is the phone number that will be used to send the SMS.
            If provided, will create a new session. If not provided, uses existing session's phoneNumberId.
            The phone number must have SMS enabled and belong to your organization.
        customer:
          $ref: '#/components/schemas/CreateCustomerDTO'
          description: |-
            This is the customer who will receive the SMS.
            If provided, will create a new session. If not provided, uses existing session's customer.
        customerId:
          type: string
          description: This is the customerId of the customer who will receive the SMS.
        useLLMGeneratedMessageForOutbound:
          type: boolean
          default: true
          description: |-
            Whether to use LLM-generated messages for outbound SMS.
            When true (default), input is processed by the assistant for a response.
            When false, the input text is forwarded directly as the SMS message without LLM processing.
            Useful for sending pre-defined messages or notifications.
        type:
          $ref: '#/components/schemas/TwilioSmsChatTransportType'
          description: |-
            The type of transport to use for sending the chat response.
            Currently supports 'twilio.sms' for SMS delivery via Twilio.
      required:
        - type
      title: TwilioSMSChatTransport
    CreateChatDTO:
      type: object
      properties:
        assistantId:
          type: string
          description: >-
            This is the assistant that will be used for the chat. To use an existing assistant, use `assistantId`
            instead.
        assistant:
          $ref: '#/components/schemas/CreateAssistantDTO'
          description: >-
            This is the assistant that will be used for the chat. To use an existing assistant, use `assistantId`
            instead.
        assistantOverrides:
          $ref: '#/components/schemas/AssistantOverrides'
          description: |-
            These are the variable values that will be used to replace template variables in the assistant messages.
            Only variable substitution is supported in chat contexts - other assistant properties cannot be overridden.
        squadId:
          type: string
          description: This is the squad that will be used for the chat. To use a transient squad, use `squad` instead.
        squad:
          $ref: '#/components/schemas/CreateSquadDTO'
          description: This is the squad that will be used for the chat. To use an existing squad, use `squadId` instead.
        name:
          type: string
          description: This is the name of the chat. This is just for your own reference.
        sessionId:
          type: string
          description: |-
            This is the ID of the session that will be used for the chat.
            Mutually exclusive with previousChatId.
        input:
          $ref: '#/components/schemas/CreateChatDtoInput'
          description: |-
            This is the input text for the chat.
            Can be a string or an array of chat messages.
            This field is REQUIRED for chat creation.
        stream:
          type: boolean
          default: false
          description: |-
            This is a flag that determines whether the response should be streamed.
            When true, the response will be sent as chunks of text.
        previousChatId:
          type: string
          description: |-
            This is the ID of the chat that will be used as context for the new chat.
            The messages from the previous chat will be used as context.
            Mutually exclusive with sessionId.
        transport:
          $ref: '#/components/schemas/TwilioSMSChatTransport'
          description: |-
            This is used to send the chat through a transport like SMS.
            If transport.phoneNumberId and transport.customer are provided, creates a new session.
            If sessionId is provided without transport fields, uses existing session data.
            Cannot specify both sessionId and transport fields (phoneNumberId/customer) together.
      required:
        - input
      title: CreateChatDTO
    CreateChatStreamResponse:
      type: object
      properties:
        id:
          type: string
          description: This is the unique identifier for the streaming response.
        sessionId:
          type: string
          description: |-
            This is the ID of the session that will be used for the chat.
            Helps track conversation context across multiple messages.
        path:
          type: string
          description: |-
            This is the path to the content being updated.
            Format: `chat.output[{contentIndex}].content` where contentIndex identifies the specific content item.
        delta:
          type: string
          description: This is the incremental content chunk being streamed.
      required:
        - id
        - path
        - delta
      title: CreateChatStreamResponse
    chats_create_Response_200:
      oneOf:
        - $ref: '#/components/schemas/Chat'
        - $ref: '#/components/schemas/CreateChatStreamResponse'
      title: chats_create_Response_200
    OpenAiResponsesRequestInputOneOf1Items:
      oneOf:
        - $ref: '#/components/schemas/SystemMessage'
        - $ref: '#/components/schemas/UserMessage'
        - $ref: '#/components/schemas/AssistantMessage'
        - $ref: '#/components/schemas/ToolMessage'
        - $ref: '#/components/schemas/DeveloperMessage'
      title: OpenAiResponsesRequestInputOneOf1Items
    OpenAiResponsesRequestInput1:
      type: array
      items:
        $ref: '#/components/schemas/OpenAiResponsesRequestInputOneOf1Items'
      title: OpenAiResponsesRequestInput1
    OpenAiResponsesRequestInput:
      oneOf:
        - type: string
        - $ref: '#/components/schemas/OpenAiResponsesRequestInput1'
      description: |-
        This is the input text for the chat.
        Can be a string or an array of chat messages.
        This field is REQUIRED for chat creation.
      title: OpenAiResponsesRequestInput
    OpenAIResponsesRequest:
      type: object
      properties:
        assistantId:
          type: string
          description: >-
            This is the assistant that will be used for the chat. To use an existing assistant, use `assistantId`
            instead.
        assistant:
          $ref: '#/components/schemas/CreateAssistantDTO'
          description: >-
            This is the assistant that will be used for the chat. To use an existing assistant, use `assistantId`
            instead.
        assistantOverrides:
          $ref: '#/components/schemas/AssistantOverrides'
          description: |-
            These are the variable values that will be used to replace template variables in the assistant messages.
            Only variable substitution is supported in chat contexts - other assistant properties cannot be overridden.
        squadId:
          type: string
          description: This is the squad that will be used for the chat. To use a transient squad, use `squad` instead.
        squad:
          $ref: '#/components/schemas/CreateSquadDTO'
          description: This is the squad that will be used for the chat. To use an existing squad, use `squadId` instead.
        name:
          type: string
          description: This is the name of the chat. This is just for your own reference.
        sessionId:
          type: string
          description: |-
            This is the ID of the session that will be used for the chat.
            Mutually exclusive with previousChatId.
        input:
          $ref: '#/components/schemas/OpenAiResponsesRequestInput'
          description: |-
            This is the input text for the chat.
            Can be a string or an array of chat messages.
            This field is REQUIRED for chat creation.
        stream:
          type: boolean
          default: true
          description: Whether to stream the response or not.
        previousChatId:
          type: string
          description: |-
            This is the ID of the chat that will be used as context for the new chat.
            The messages from the previous chat will be used as context.
            Mutually exclusive with sessionId.
        transport:
          $ref: '#/components/schemas/TwilioSMSChatTransport'
          description: |-
            This is used to send the chat through a transport like SMS.
            If transport.phoneNumberId and transport.customer are provided, creates a new session.
            If sessionId is provided without transport fields, uses existing session data.
            Cannot specify both sessionId and transport fields (phoneNumberId/customer) together.
      required:
        - input
      title: OpenAIResponsesRequest
    ResponseObjectObject:
      type: string
      enum:
        - response
      default: response
      description: The object type
      title: ResponseObjectObject
    ResponseObjectStatus:
      type: string
      enum:
        - completed
        - failed
        - in_progress
        - incomplete
      description: Status of the response
      title: ResponseObjectStatus
    ResponseOutputTextAnnotationsItems:
      type: object
      properties: {}
      title: ResponseOutputTextAnnotationsItems
    ResponseOutputTextType:
      type: string
      enum:
        - output_text
      default: output_text
      description: The type of the output text
      title: ResponseOutputTextType
    ResponseOutputText:
      type: object
      properties:
        annotations:
          type: array
          items:
            $ref: '#/components/schemas/ResponseOutputTextAnnotationsItems'
          description: Annotations in the text output
        text:
          type: string
          description: The text output from the model
        type:
          $ref: '#/components/schemas/ResponseOutputTextType'
          description: The type of the output text
      required:
        - annotations
        - text
        - type
      title: ResponseOutputText
    ResponseOutputMessageRole:
      type: string
      enum:
        - assistant
      default: assistant
      description: The role of the output message
      title: ResponseOutputMessageRole
    ResponseOutputMessageStatus:
      type: string
      enum:
        - in_progress
        - completed
        - incomplete
      description: The status of the message
      title: ResponseOutputMessageStatus
    ResponseOutputMessageType:
      type: string
      enum:
        - message
      default: message
      description: The type of the output message
      title: ResponseOutputMessageType
    ResponseOutputMessage:
      type: object
      properties:
        id:
          type: string
          description: The unique ID of the output message
        content:
          type: array
          items:
            $ref: '#/components/schemas/ResponseOutputText'
          description: Content of the output message
        role:
          $ref: '#/components/schemas/ResponseOutputMessageRole'
          description: The role of the output message
        status:
          $ref: '#/components/schemas/ResponseOutputMessageStatus'
          description: The status of the message
        type:
          $ref: '#/components/schemas/ResponseOutputMessageType'
          description: The type of the output message
      required:
        - id
        - content
        - role
        - status
        - type
      title: ResponseOutputMessage
    ResponseObject:
      type: object
      properties:
        id:
          type: string
          description: Unique identifier for this Response
        object:
          $ref: '#/components/schemas/ResponseObjectObject'
          description: The object type
        created_at:
          type: number
          format: double
          description: Unix timestamp (in seconds) of when this Response was created
        status:
          $ref: '#/components/schemas/ResponseObjectStatus'
          description: Status of the response
        error:
          type:
            - string
            - 'null'
          description: Error message if the response failed
        output:
          type: array
          items:
            $ref: '#/components/schemas/ResponseOutputMessage'
          description: Output messages from the model
      required:
        - id
        - object
        - created_at
        - status
        - output
      title: ResponseObject
    ResponseTextDeltaEventType:
      type: string
      enum:
        - response.output_text.delta
      default: response.output_text.delta
      description: Event type
      title: ResponseTextDeltaEventType
    ResponseTextDeltaEvent:
      type: object
      properties:
        content_index:
          type: number
          format: double
          description: Index of the content part
        delta:
          type: string
          description: Text delta being added
        item_id:
          type: string
          description: ID of the output item
        output_index:
          type: number
          format: double
          description: Index of the output item
        type:
          $ref: '#/components/schemas/ResponseTextDeltaEventType'
          description: Event type
      required:
        - content_index
        - delta
        - item_id
        - output_index
        - type
      title: ResponseTextDeltaEvent
    ResponseTextDoneEventType:
      type: string
      enum:
        - response.output_text.done
      default: response.output_text.done
      description: Event type
      title: ResponseTextDoneEventType
    ResponseTextDoneEvent:
      type: object
      properties:
        content_index:
          type: number
          format: double
          description: Index of the content part
        item_id:
          type: string
          description: ID of the output item
        output_index:
          type: number
          format: double
          description: Index of the output item
        text:
          type: string
          description: Complete text content
        type:
          $ref: '#/components/schemas/ResponseTextDoneEventType'
          description: Event type
      required:
        - content_index
        - item_id
        - output_index
        - text
        - type
      title: ResponseTextDoneEvent
    ResponseCompletedEventType:
      type: string
      enum:
        - response.completed
      default: response.completed
      description: Event type
      title: ResponseCompletedEventType
    ResponseCompletedEvent:
      type: object
      properties:
        response:
          $ref: '#/components/schemas/ResponseObject'
          description: The completed response
        type:
          $ref: '#/components/schemas/ResponseCompletedEventType'
          description: Event type
      required:
        - response
        - type
      title: ResponseCompletedEvent
    ResponseErrorEventType:
      type: string
      enum:
        - error
      default: error
      description: Event type
      title: ResponseErrorEventType
    ResponseErrorEvent:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/ResponseErrorEventType'
          description: Event type
        code:
          type: string
          description: Error code
        message:
          type: string
          description: Error message
        param:
          type:
            - string
            - 'null'
          description: Parameter that caused the error
        sequence_number:
          type: number
          format: double
          description: Sequence number of the event
      required:
        - type
        - code
        - message
        - sequence_number
      title: ResponseErrorEvent
    chats_createResponse_Response_200:
      oneOf:
        - $ref: '#/components/schemas/ResponseObject'
        - $ref: '#/components/schemas/ResponseTextDeltaEvent'
        - $ref: '#/components/schemas/ResponseTextDoneEvent'
        - $ref: '#/components/schemas/ResponseCompletedEvent'
        - $ref: '#/components/schemas/ResponseErrorEvent'
      title: chats_createResponse_Response_200
    CampaignGetParametersStatus:
      type: string
      enum:
        - scheduled
        - in-progress
        - ended
      title: CampaignGetParametersStatus
    CampaignGetParametersSortOrder:
      type: string
      enum:
        - ASC
        - DESC
      title: CampaignGetParametersSortOrder
    CampaignStatus:
      type: string
      enum:
        - scheduled
        - in-progress
        - ended
      description: This is the status of the campaign.
      title: CampaignStatus
    CampaignEndedReason:
      type: string
      enum:
        - campaign.scheduled.ended-by-user
        - campaign.in-progress.ended-by-user
        - campaign.ended.success
      description: This is the explanation for how the campaign ended.
      title: CampaignEndedReason
    DialPlanEntry:
      type: object
      properties:
        phoneNumberId:
          type: string
          description: The phone number ID to use for calling the customers in this entry.
        customers:
          type: array
          items:
            $ref: '#/components/schemas/CreateCustomerDTO'
          description: The list of customers to call using this phone number.
      required:
        - phoneNumberId
        - customers
      title: DialPlanEntry
    CampaignCalls:
      type: object
      properties: {}
      description: This is a map of call IDs to campaign call details.
      title: CampaignCalls
    Campaign:
      type: object
      properties:
        status:
          $ref: '#/components/schemas/CampaignStatus'
          description: This is the status of the campaign.
        endedReason:
          $ref: '#/components/schemas/CampaignEndedReason'
          description: This is the explanation for how the campaign ended.
        name:
          type: string
          description: This is the name of the campaign. This is just for your own reference.
        assistantId:
          type: string
          description: >-
            This is the assistant ID that will be used for the campaign calls. Note: Only one of assistantId,
            workflowId, or squadId can be used.
        workflowId:
          type: string
          description: >-
            This is the workflow ID that will be used for the campaign calls. Note: Only one of assistantId, workflowId,
            or squadId can be used.
        squadId:
          type: string
          description: >-
            This is the squad ID that will be used for the campaign calls. Note: Only one of assistantId, workflowId, or
            squadId can be used.
        phoneNumberId:
          type: string
          description: >-
            This is the phone number ID that will be used for the campaign calls. Required if dialPlan is not provided.
            Note: phoneNumberId and dialPlan are mutually exclusive.
        dialPlan:
          type: array
          items:
            $ref: '#/components/schemas/DialPlanEntry'
          description: >-
            This is a list of dial entries, each specifying a phone number and the customers to call using that number.
            Use this when you want different phone numbers to call different sets of customers. Note: phoneNumberId and
            dialPlan are mutually exclusive.
        schedulePlan:
          $ref: '#/components/schemas/SchedulePlan'
          description: >-
            This is the schedule plan for the campaign. Calls will start at startedAt and continue until your
            organization’s concurrency limit is reached. Any remaining calls will be retried for up to one hour as
            capacity becomes available. After that hour or after latestAt, whichever comes first, any calls that
            couldn’t be placed won’t be retried.
        customers:
          type: array
          items:
            $ref: '#/components/schemas/CreateCustomerDTO'
          description: These are the customers that will be called in the campaign. Required if dialPlan is not provided.
        id:
          type: string
          description: This is the unique identifier for the campaign.
        orgId:
          type: string
          description: This is the unique identifier for the org that this campaign belongs to.
        createdAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the campaign was created.
        updatedAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the campaign was last updated.
        calls:
          $ref: '#/components/schemas/CampaignCalls'
          description: This is a map of call IDs to campaign call details.
        callsCounterScheduled:
          type: number
          format: double
          description: This is the number of calls that have been scheduled.
        callsCounterQueued:
          type: number
          format: double
          description: This is the number of calls that have been queued.
        callsCounterInProgress:
          type: number
          format: double
          description: This is the number of calls that have been in progress.
        callsCounterEndedVoicemail:
          type: number
          format: double
          description: This is the number of calls whose ended reason is 'voicemail'.
        callsCounterEnded:
          type: number
          format: double
          description: This is the number of calls that have ended.
      required:
        - status
        - name
        - id
        - orgId
        - createdAt
        - updatedAt
        - calls
        - callsCounterScheduled
        - callsCounterQueued
        - callsCounterInProgress
        - callsCounterEndedVoicemail
        - callsCounterEnded
      title: Campaign
    CampaignPaginatedResponse:
      type: object
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/Campaign'
        metadata:
          $ref: '#/components/schemas/PaginationMeta'
      required:
        - results
        - metadata
      title: CampaignPaginatedResponse
    CreateCampaignDTO:
      type: object
      properties:
        name:
          type: string
          description: This is the name of the campaign. This is just for your own reference.
        assistantId:
          type: string
          description: >-
            This is the assistant ID that will be used for the campaign calls. Note: Only one of assistantId,
            workflowId, or squadId can be used.
        workflowId:
          type: string
          description: >-
            This is the workflow ID that will be used for the campaign calls. Note: Only one of assistantId, workflowId,
            or squadId can be used.
        squadId:
          type: string
          description: >-
            This is the squad ID that will be used for the campaign calls. Note: Only one of assistantId, workflowId, or
            squadId can be used.
        phoneNumberId:
          type: string
          description: >-
            This is the phone number ID that will be used for the campaign calls. Required if dialPlan is not provided.
            Note: phoneNumberId and dialPlan are mutually exclusive.
        dialPlan:
          type: array
          items:
            $ref: '#/components/schemas/DialPlanEntry'
          description: >-
            This is a list of dial entries, each specifying a phone number and the customers to call using that number.
            Use this when you want different phone numbers to call different sets of customers. Note: phoneNumberId and
            dialPlan are mutually exclusive.
        schedulePlan:
          $ref: '#/components/schemas/SchedulePlan'
          description: >-
            This is the schedule plan for the campaign. Calls will start at startedAt and continue until your
            organization’s concurrency limit is reached. Any remaining calls will be retried for up to one hour as
            capacity becomes available. After that hour or after latestAt, whichever comes first, any calls that
            couldn’t be placed won’t be retried.
        customers:
          type: array
          items:
            $ref: '#/components/schemas/CreateCustomerDTO'
          description: These are the customers that will be called in the campaign. Required if dialPlan is not provided.
      required:
        - name
      title: CreateCampaignDTO
    UpdateCampaignDtoStatus:
      type: string
      enum:
        - ended
      description: |-
        This is the status of the campaign.
        Can only be updated to 'ended' if you want to end the campaign.
        When set to 'ended', it will delete all scheduled calls. Calls in progress will be allowed to complete.
      title: UpdateCampaignDtoStatus
    UpdateCampaignDTO:
      type: object
      properties:
        name:
          type: string
          description: This is the name of the campaign. This is just for your own reference.
        assistantId:
          type: string
          description: |-
            This is the assistant ID that will be used for the campaign calls.
            Can only be updated if campaign is not in progress or has ended.
        workflowId:
          type: string
          description: |-
            This is the workflow ID that will be used for the campaign calls.
            Can only be updated if campaign is not in progress or has ended.
        squadId:
          type: string
          description: |-
            This is the squad ID that will be used for the campaign calls.
            Can only be updated if campaign is not in progress or has ended.
        phoneNumberId:
          type: string
          description: |-
            This is the phone number ID that will be used for the campaign calls.
            Can only be updated if campaign is not in progress or has ended.
            Note: `phoneNumberId` and `dialPlan` are mutually exclusive.
        dialPlan:
          type: array
          items:
            $ref: '#/components/schemas/DialPlanEntry'
          description: >-
            This is a list of dial entries, each specifying a phone number and the customers to call using that number.
            Can only be updated if campaign is not in progress or has ended. Note: phoneNumberId and dialPlan are
            mutually exclusive.
        schedulePlan:
          $ref: '#/components/schemas/SchedulePlan'
          description: |-
            This is the schedule plan for the campaign.
            Can only be updated if campaign is not in progress or has ended.
        status:
          $ref: '#/components/schemas/UpdateCampaignDtoStatus'
          description: |-
            This is the status of the campaign.
            Can only be updated to 'ended' if you want to end the campaign.
            When set to 'ended', it will delete all scheduled calls. Calls in progress will be allowed to complete.
      title: UpdateCampaignDTO
    SessionGetParametersSortOrder:
      type: string
      enum:
        - ASC
        - DESC
      title: SessionGetParametersSortOrder
    SessionCostType:
      type: string
      enum:
        - session
      description: This is the type of cost, always 'session' for this class.
      title: SessionCostType
    SessionCost:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/SessionCostType'
          description: This is the type of cost, always 'session' for this class.
        cost:
          type: number
          format: double
          description: This is the cost of the component in USD.
      required:
        - type
        - cost
      title: SessionCost
    SessionCostsItems:
      oneOf:
        - $ref: '#/components/schemas/ModelCost'
        - $ref: '#/components/schemas/AnalysisCost'
        - $ref: '#/components/schemas/SessionCost'
      title: SessionCostsItems
    SessionStatus:
      type: string
      enum:
        - active
        - completed
      description: This is the current status of the session. Can be either 'active' or 'completed'.
      title: SessionStatus
    SessionMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/SystemMessage'
        - $ref: '#/components/schemas/UserMessage'
        - $ref: '#/components/schemas/AssistantMessage'
        - $ref: '#/components/schemas/ToolMessage'
        - $ref: '#/components/schemas/DeveloperMessage'
      title: SessionMessagesItems
    Session:
      type: object
      properties:
        id:
          type: string
          description: This is the unique identifier for the session.
        orgId:
          type: string
          description: This is the unique identifier for the organization that owns this session.
        createdAt:
          type: string
          format: date-time
          description: This is the ISO 8601 timestamp indicating when the session was created.
        updatedAt:
          type: string
          format: date-time
          description: This is the ISO 8601 timestamp indicating when the session was last updated.
        cost:
          type: number
          format: double
          description: This is the cost of the session in USD.
        costs:
          type: array
          items:
            $ref: '#/components/schemas/SessionCostsItems'
          description: These are the costs of individual components of the session in USD.
        name:
          type: string
          description: This is a user-defined name for the session. Maximum length is 40 characters.
        status:
          $ref: '#/components/schemas/SessionStatus'
          description: This is the current status of the session. Can be either 'active' or 'completed'.
        expirationSeconds:
          type: number
          format: double
          description: Session expiration time in seconds. Defaults to 24 hours (86400 seconds) if not set.
        assistantId:
          type: string
          description: >-
            This is the ID of the assistant associated with this session. Use this when referencing an existing
            assistant.
        assistant:
          $ref: '#/components/schemas/CreateAssistantDTO'
          description: |-
            This is the assistant configuration for this session. Use this when creating a new assistant configuration.
            If assistantId is provided, this will be ignored.
        assistantOverrides:
          $ref: '#/components/schemas/AssistantOverrides'
          description: |-
            These are the overrides for the assistant configuration.
            Use this to provide variable values and other overrides when using assistantId.
            Variable substitution will be applied to the assistant's messages and other text-based fields.
        squadId:
          type: string
          description: This is the squad ID associated with this session. Use this when referencing an existing squad.
        squad:
          $ref: '#/components/schemas/CreateSquadDTO'
          description: |-
            This is the squad configuration for this session. Use this when creating a new squad configuration.
            If squadId is provided, this will be ignored.
        messages:
          type: array
          items:
            $ref: '#/components/schemas/SessionMessagesItems'
          description: This is an array of chat messages in the session.
        customer:
          $ref: '#/components/schemas/CreateCustomerDTO'
          description: This is the customer information associated with this session.
        customerId:
          type: string
          description: This is the customerId of the customer associated with this session.
        phoneNumberId:
          type: string
          description: This is the ID of the phone number associated with this session.
        phoneNumber:
          $ref: '#/components/schemas/ImportTwilioPhoneNumberDTO'
          description: This is the phone number configuration for this session.
        artifact:
          $ref: '#/components/schemas/Artifact'
          description: |-
            These are the artifacts that were extracted from the session messages.
            They are only available after the session has completed.
            The artifact plan from the assistant or active assistant of squad is used to generate the artifact.
            Currently the only supported fields of assistant artifact plan are:
            - structuredOutputIds
      required:
        - id
        - orgId
        - createdAt
        - updatedAt
      title: Session
    SessionPaginatedResponse:
      type: object
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/Session'
        metadata:
          $ref: '#/components/schemas/PaginationMeta'
      required:
        - results
        - metadata
      title: SessionPaginatedResponse
    CreateSessionDtoStatus:
      type: string
      enum:
        - active
        - completed
      description: This is the current status of the session. Can be either 'active' or 'completed'.
      title: CreateSessionDtoStatus
    CreateSessionDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/SystemMessage'
        - $ref: '#/components/schemas/UserMessage'
        - $ref: '#/components/schemas/AssistantMessage'
        - $ref: '#/components/schemas/ToolMessage'
        - $ref: '#/components/schemas/DeveloperMessage'
      title: CreateSessionDtoMessagesItems
    CreateSessionDTO:
      type: object
      properties:
        name:
          type: string
          description: This is a user-defined name for the session. Maximum length is 40 characters.
        status:
          $ref: '#/components/schemas/CreateSessionDtoStatus'
          description: This is the current status of the session. Can be either 'active' or 'completed'.
        expirationSeconds:
          type: number
          format: double
          description: Session expiration time in seconds. Defaults to 24 hours (86400 seconds) if not set.
        assistantId:
          type: string
          description: >-
            This is the ID of the assistant associated with this session. Use this when referencing an existing
            assistant.
        assistant:
          $ref: '#/components/schemas/CreateAssistantDTO'
          description: |-
            This is the assistant configuration for this session. Use this when creating a new assistant configuration.
            If assistantId is provided, this will be ignored.
        assistantOverrides:
          $ref: '#/components/schemas/AssistantOverrides'
          description: |-
            These are the overrides for the assistant configuration.
            Use this to provide variable values and other overrides when using assistantId.
            Variable substitution will be applied to the assistant's messages and other text-based fields.
        squadId:
          type: string
          description: This is the squad ID associated with this session. Use this when referencing an existing squad.
        squad:
          $ref: '#/components/schemas/CreateSquadDTO'
          description: |-
            This is the squad configuration for this session. Use this when creating a new squad configuration.
            If squadId is provided, this will be ignored.
        messages:
          type: array
          items:
            $ref: '#/components/schemas/CreateSessionDtoMessagesItems'
          description: This is an array of chat messages in the session.
        customer:
          $ref: '#/components/schemas/CreateCustomerDTO'
          description: This is the customer information associated with this session.
        customerId:
          type: string
          description: This is the customerId of the customer associated with this session.
        phoneNumberId:
          type: string
          description: This is the ID of the phone number associated with this session.
        phoneNumber:
          $ref: '#/components/schemas/ImportTwilioPhoneNumberDTO'
          description: This is the phone number configuration for this session.
      title: CreateSessionDTO
    UpdateSessionDtoStatus:
      type: string
      enum:
        - active
        - completed
      description: This is the new status for the session.
      title: UpdateSessionDtoStatus
    UpdateSessionDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/SystemMessage'
        - $ref: '#/components/schemas/UserMessage'
        - $ref: '#/components/schemas/AssistantMessage'
        - $ref: '#/components/schemas/ToolMessage'
        - $ref: '#/components/schemas/DeveloperMessage'
      title: UpdateSessionDtoMessagesItems
    UpdateSessionDTO:
      type: object
      properties:
        name:
          type: string
          description: This is the new name for the session. Maximum length is 40 characters.
        status:
          $ref: '#/components/schemas/UpdateSessionDtoStatus'
          description: This is the new status for the session.
        expirationSeconds:
          type: number
          format: double
          description: Session expiration time in seconds. Defaults to 24 hours (86400 seconds) if not set.
        messages:
          type: array
          items:
            $ref: '#/components/schemas/UpdateSessionDtoMessagesItems'
          description: This is the updated array of chat messages.
      title: UpdateSessionDTO
    PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination:
      oneOf:
        - $ref: '#/components/schemas/TransferDestinationNumber'
        - $ref: '#/components/schemas/TransferDestinationSip'
      description: |-
        This is the fallback destination an inbound call will be transferred to if:
        1. `assistantId` is not set
        2. `squadId` is not set
        3. and, `assistant-request` message to the `serverUrl` fails

        If this is not set and above conditions are met, the inbound call is hung up with an error message.
      title: PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination
    PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems:
      oneOf:
        - $ref: '#/components/schemas/PhoneNumberHookCallRinging'
        - $ref: '#/components/schemas/PhoneNumberHookCallEnding'
      title: PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems
    PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberStatus:
      type: string
      enum:
        - active
        - activating
        - blocked
      description: This is the status of the phone number.
      title: PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberStatus
    PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination:
      oneOf:
        - $ref: '#/components/schemas/TransferDestinationNumber'
        - $ref: '#/components/schemas/TransferDestinationSip'
      description: |-
        This is the fallback destination an inbound call will be transferred to if:
        1. `assistantId` is not set
        2. `squadId` is not set
        3. and, `assistant-request` message to the `serverUrl` fails

        If this is not set and above conditions are met, the inbound call is hung up with an error message.
      title: PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination
    PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems:
      oneOf:
        - $ref: '#/components/schemas/PhoneNumberHookCallRinging'
        - $ref: '#/components/schemas/PhoneNumberHookCallEnding'
      title: PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems
    PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioStatus:
      type: string
      enum:
        - active
        - activating
        - blocked
      description: This is the status of the phone number.
      title: PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioStatus
    PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination:
      oneOf:
        - $ref: '#/components/schemas/TransferDestinationNumber'
        - $ref: '#/components/schemas/TransferDestinationSip'
      description: |-
        This is the fallback destination an inbound call will be transferred to if:
        1. `assistantId` is not set
        2. `squadId` is not set
        3. and, `assistant-request` message to the `serverUrl` fails

        If this is not set and above conditions are met, the inbound call is hung up with an error message.
      title: PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination
    PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems:
      oneOf:
        - $ref: '#/components/schemas/PhoneNumberHookCallRinging'
        - $ref: '#/components/schemas/PhoneNumberHookCallEnding'
      title: PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems
    PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageStatus:
      type: string
      enum:
        - active
        - activating
        - blocked
      description: This is the status of the phone number.
      title: PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageStatus
    PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination:
      oneOf:
        - $ref: '#/components/schemas/TransferDestinationNumber'
        - $ref: '#/components/schemas/TransferDestinationSip'
      description: |-
        This is the fallback destination an inbound call will be transferred to if:
        1. `assistantId` is not set
        2. `squadId` is not set
        3. and, `assistant-request` message to the `serverUrl` fails

        If this is not set and above conditions are met, the inbound call is hung up with an error message.
      title: PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination
    PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems:
      oneOf:
        - $ref: '#/components/schemas/PhoneNumberHookCallRinging'
        - $ref: '#/components/schemas/PhoneNumberHookCallEnding'
      title: PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems
    PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiStatus:
      type: string
      enum:
        - active
        - activating
        - blocked
      description: This is the status of the phone number.
      title: PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiStatus
    SipAuthentication:
      type: object
      properties:
        realm:
          type: string
          description: >-
            This will be expected in the `realm` field of the `authorization` header of the SIP INVITE. Defaults to
            sip.vapi.ai.
        username:
          type: string
          description: This will be expected in the `username` field of the `authorization` header of the SIP INVITE.
        password:
          type: string
          description: >-
            This will be expected to generate the `response` field of the `authorization` header of the SIP INVITE,
            through digest authentication.
      required:
        - username
        - password
      title: SipAuthentication
    PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination:
      oneOf:
        - $ref: '#/components/schemas/TransferDestinationNumber'
        - $ref: '#/components/schemas/TransferDestinationSip'
      description: |-
        This is the fallback destination an inbound call will be transferred to if:
        1. `assistantId` is not set
        2. `squadId` is not set
        3. and, `assistant-request` message to the `serverUrl` fails

        If this is not set and above conditions are met, the inbound call is hung up with an error message.
      title: PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination
    PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems:
      oneOf:
        - $ref: '#/components/schemas/PhoneNumberHookCallRinging'
        - $ref: '#/components/schemas/PhoneNumberHookCallEnding'
      title: PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems
    PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxStatus:
      type: string
      enum:
        - active
        - activating
        - blocked
      description: This is the status of the phone number.
      title: PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxStatus
    PhoneNumberGetResponsesContentApplicationJsonSchemaItems:
      oneOf:
        - type: object
          properties:
            provider:
              type: string
              enum:
                - byo-phone-number
              description: 'Discriminator value: byo-phone-number'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            numberE164CheckEnabled:
              type: boolean
              default: true
              description: >-
                This is the flag to toggle the E164 check for the `number` field. This is an advanced property which
                should be used if you know your use case requires it.


                Use cases:

                - `false`: To allow non-E164 numbers like `+001234567890`, `1234`, or `abc`. This is useful for dialing
                out to non-E164 numbers on your SIP trunks.

                - `true` (default): To allow only E164 numbers like `+14155551234`. This is standard for PSTN calls.


                If `false`, the `number` is still required to only contain alphanumeric characters (regex:
                `/^\+?[a-zA-Z0-9]+$/`).


                @default true (E164 check is enabled)
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberStatus
              description: This is the status of the phone number.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            number:
              type: string
              description: This is the number of the customer.
            credentialId:
              type: string
              description: >-
                This is the credential of your own SIP trunk or Carrier (type `byo-sip-trunk`) which can be used to make
                calls to this phone number.


                You can add the SIP trunk or Carrier credential in the Provider Credentials page on the Dashboard to get
                the credentialId.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
            - credentialId
          description: ByoPhoneNumber variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - twilio
              description: 'Discriminator value: twilio'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            smsEnabled:
              type: boolean
              default: true
              description: |-
                Controls whether Vapi sets the messaging webhook URL on the Twilio number during import.

                If set to `false`, Vapi will not update the Twilio messaging URL, leaving it as is.
                If `true` or omitted (default), Vapi will configure both the voice and messaging URLs.

                @default true
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioStatus
              description: This is the status of the phone number.
            twilioAuthToken:
              type: string
              description: This is the Twilio Auth Token for the phone number.
            twilioApiKey:
              type: string
              description: This is the Twilio API Key for the phone number.
            twilioApiSecret:
              type: string
              description: This is the Twilio API Secret for the phone number.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            number:
              type: string
              description: These are the digits of the phone number you own on your Twilio.
            twilioAccountSid:
              type: string
              description: This is the Twilio Account SID for the phone number.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
            - number
            - twilioAccountSid
          description: TwilioPhoneNumber variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - vonage
              description: 'Discriminator value: vonage'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageStatus
              description: This is the status of the phone number.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            number:
              type: string
              description: These are the digits of the phone number you own on your Vonage.
            credentialId:
              type: string
              description: >-
                This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send
                inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
            - number
            - credentialId
          description: VonagePhoneNumber variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - vapi
              description: 'Discriminator value: vapi'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiStatus
              description: This is the status of the phone number.
            number:
              type: string
              description: These are the digits of the phone number you purchased from Vapi.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            numberDesiredAreaCode:
              type: string
              description: This is the area code of the phone number to purchase.
            sipUri:
              type: string
              description: >-
                This is the SIP URI of the phone number. You can SIP INVITE this. The assistant attached to this number
                will answer.


                This is case-insensitive.
            authentication:
              $ref: '#/components/schemas/SipAuthentication'
              description: |-
                This enables authentication for incoming SIP INVITE requests to the `sipUri`.

                If not set, any username/password to the 401 challenge of the SIP INVITE will be accepted.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
          description: VapiPhoneNumber variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - telnyx
              description: 'Discriminator value: telnyx'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxStatus
              description: This is the status of the phone number.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            number:
              type: string
              description: These are the digits of the phone number you own on your Telnyx.
            credentialId:
              type: string
              description: >-
                This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send
                inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
            - number
            - credentialId
          description: TelnyxPhoneNumber variant
      discriminator:
        propertyName: provider
      title: PhoneNumberGetResponsesContentApplicationJsonSchemaItems
    PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination:
      oneOf:
        - $ref: '#/components/schemas/TransferDestinationNumber'
        - $ref: '#/components/schemas/TransferDestinationSip'
      description: |-
        This is the fallback destination an inbound call will be transferred to if:
        1. `assistantId` is not set
        2. `squadId` is not set
        3. and, `assistant-request` message to the `serverUrl` fails

        If this is not set and above conditions are met, the inbound call is hung up with an error message.
      title: PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination
    PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems:
      oneOf:
        - $ref: '#/components/schemas/PhoneNumberHookCallRinging'
        - $ref: '#/components/schemas/PhoneNumberHookCallEnding'
      title: PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems
    PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination:
      oneOf:
        - $ref: '#/components/schemas/TransferDestinationNumber'
        - $ref: '#/components/schemas/TransferDestinationSip'
      description: |-
        This is the fallback destination an inbound call will be transferred to if:
        1. `assistantId` is not set
        2. `squadId` is not set
        3. and, `assistant-request` message to the `serverUrl` fails

        If this is not set and above conditions are met, the inbound call is hung up with an error message.
      title: PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination
    PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems:
      oneOf:
        - $ref: '#/components/schemas/PhoneNumberHookCallRinging'
        - $ref: '#/components/schemas/PhoneNumberHookCallEnding'
      title: PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems
    PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination:
      oneOf:
        - $ref: '#/components/schemas/TransferDestinationNumber'
        - $ref: '#/components/schemas/TransferDestinationSip'
      description: |-
        This is the fallback destination an inbound call will be transferred to if:
        1. `assistantId` is not set
        2. `squadId` is not set
        3. and, `assistant-request` message to the `serverUrl` fails

        If this is not set and above conditions are met, the inbound call is hung up with an error message.
      title: PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination
    PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems:
      oneOf:
        - $ref: '#/components/schemas/PhoneNumberHookCallRinging'
        - $ref: '#/components/schemas/PhoneNumberHookCallEnding'
      title: PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems
    PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination:
      oneOf:
        - $ref: '#/components/schemas/TransferDestinationNumber'
        - $ref: '#/components/schemas/TransferDestinationSip'
      description: |-
        This is the fallback destination an inbound call will be transferred to if:
        1. `assistantId` is not set
        2. `squadId` is not set
        3. and, `assistant-request` message to the `serverUrl` fails

        If this is not set and above conditions are met, the inbound call is hung up with an error message.
      title: PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination
    PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems:
      oneOf:
        - $ref: '#/components/schemas/PhoneNumberHookCallRinging'
        - $ref: '#/components/schemas/PhoneNumberHookCallEnding'
      title: PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems
    PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination:
      oneOf:
        - $ref: '#/components/schemas/TransferDestinationNumber'
        - $ref: '#/components/schemas/TransferDestinationSip'
      description: |-
        This is the fallback destination an inbound call will be transferred to if:
        1. `assistantId` is not set
        2. `squadId` is not set
        3. and, `assistant-request` message to the `serverUrl` fails

        If this is not set and above conditions are met, the inbound call is hung up with an error message.
      title: PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination
    PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems:
      oneOf:
        - $ref: '#/components/schemas/PhoneNumberHookCallRinging'
        - $ref: '#/components/schemas/PhoneNumberHookCallEnding'
      title: PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems
    phoneNumbers_create_Request:
      oneOf:
        - type: object
          properties:
            provider:
              type: string
              enum:
                - byo-phone-number
              description: 'Discriminator value: byo-phone-number'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            numberE164CheckEnabled:
              type: boolean
              default: true
              description: >-
                This is the flag to toggle the E164 check for the `number` field. This is an advanced property which
                should be used if you know your use case requires it.


                Use cases:

                - `false`: To allow non-E164 numbers like `+001234567890`, `1234`, or `abc`. This is useful for dialing
                out to non-E164 numbers on your SIP trunks.

                - `true` (default): To allow only E164 numbers like `+14155551234`. This is standard for PSTN calls.


                If `false`, the `number` is still required to only contain alphanumeric characters (regex:
                `/^\+?[a-zA-Z0-9]+$/`).


                @default true (E164 check is enabled)
            number:
              type: string
              description: This is the number of the customer.
            credentialId:
              type: string
              description: >-
                This is the credential of your own SIP trunk or Carrier (type `byo-sip-trunk`) which can be used to make
                calls to this phone number.


                You can add the SIP trunk or Carrier credential in the Provider Credentials page on the Dashboard to get
                the credentialId.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
          required:
            - provider
            - credentialId
          description: CreateByoPhoneNumberDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - twilio
              description: 'Discriminator value: twilio'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            smsEnabled:
              type: boolean
              default: true
              description: |-
                Controls whether Vapi sets the messaging webhook URL on the Twilio number during import.

                If set to `false`, Vapi will not update the Twilio messaging URL, leaving it as is.
                If `true` or omitted (default), Vapi will configure both the voice and messaging URLs.

                @default true
            number:
              type: string
              description: These are the digits of the phone number you own on your Twilio.
            twilioAccountSid:
              type: string
              description: This is the Twilio Account SID for the phone number.
            twilioAuthToken:
              type: string
              description: This is the Twilio Auth Token for the phone number.
            twilioApiKey:
              type: string
              description: This is the Twilio API Key for the phone number.
            twilioApiSecret:
              type: string
              description: This is the Twilio API Secret for the phone number.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
          required:
            - provider
            - number
            - twilioAccountSid
          description: CreateTwilioPhoneNumberDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - vonage
              description: 'Discriminator value: vonage'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            number:
              type: string
              description: These are the digits of the phone number you own on your Vonage.
            credentialId:
              type: string
              description: >-
                This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send
                inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
          required:
            - provider
            - number
            - credentialId
          description: CreateVonagePhoneNumberDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - vapi
              description: 'Discriminator value: vapi'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            numberDesiredAreaCode:
              type: string
              description: This is the area code of the phone number to purchase.
            sipUri:
              type: string
              description: >-
                This is the SIP URI of the phone number. You can SIP INVITE this. The assistant attached to this number
                will answer.


                This is case-insensitive.
            authentication:
              $ref: '#/components/schemas/SipAuthentication'
              description: |-
                This enables authentication for incoming SIP INVITE requests to the `sipUri`.

                If not set, any username/password to the 401 challenge of the SIP INVITE will be accepted.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
          required:
            - provider
          description: CreateVapiPhoneNumberDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - telnyx
              description: 'Discriminator value: telnyx'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            number:
              type: string
              description: These are the digits of the phone number you own on your Telnyx.
            credentialId:
              type: string
              description: >-
                This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send
                inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
          required:
            - provider
            - number
            - credentialId
          description: CreateTelnyxPhoneNumberDTO variant
      discriminator:
        propertyName: provider
      title: phoneNumbers_create_Request
    phoneNumbers_create_Response_201:
      oneOf:
        - type: object
          properties:
            provider:
              type: string
              enum:
                - byo-phone-number
              description: 'Discriminator value: byo-phone-number'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            numberE164CheckEnabled:
              type: boolean
              default: true
              description: >-
                This is the flag to toggle the E164 check for the `number` field. This is an advanced property which
                should be used if you know your use case requires it.


                Use cases:

                - `false`: To allow non-E164 numbers like `+001234567890`, `1234`, or `abc`. This is useful for dialing
                out to non-E164 numbers on your SIP trunks.

                - `true` (default): To allow only E164 numbers like `+14155551234`. This is standard for PSTN calls.


                If `false`, the `number` is still required to only contain alphanumeric characters (regex:
                `/^\+?[a-zA-Z0-9]+$/`).


                @default true (E164 check is enabled)
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberStatus
              description: This is the status of the phone number.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            number:
              type: string
              description: This is the number of the customer.
            credentialId:
              type: string
              description: >-
                This is the credential of your own SIP trunk or Carrier (type `byo-sip-trunk`) which can be used to make
                calls to this phone number.


                You can add the SIP trunk or Carrier credential in the Provider Credentials page on the Dashboard to get
                the credentialId.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
            - credentialId
          description: ByoPhoneNumber variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - twilio
              description: 'Discriminator value: twilio'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            smsEnabled:
              type: boolean
              default: true
              description: |-
                Controls whether Vapi sets the messaging webhook URL on the Twilio number during import.

                If set to `false`, Vapi will not update the Twilio messaging URL, leaving it as is.
                If `true` or omitted (default), Vapi will configure both the voice and messaging URLs.

                @default true
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioStatus
              description: This is the status of the phone number.
            twilioAuthToken:
              type: string
              description: This is the Twilio Auth Token for the phone number.
            twilioApiKey:
              type: string
              description: This is the Twilio API Key for the phone number.
            twilioApiSecret:
              type: string
              description: This is the Twilio API Secret for the phone number.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            number:
              type: string
              description: These are the digits of the phone number you own on your Twilio.
            twilioAccountSid:
              type: string
              description: This is the Twilio Account SID for the phone number.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
            - number
            - twilioAccountSid
          description: TwilioPhoneNumber variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - vonage
              description: 'Discriminator value: vonage'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageStatus
              description: This is the status of the phone number.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            number:
              type: string
              description: These are the digits of the phone number you own on your Vonage.
            credentialId:
              type: string
              description: >-
                This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send
                inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
            - number
            - credentialId
          description: VonagePhoneNumber variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - vapi
              description: 'Discriminator value: vapi'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiStatus
              description: This is the status of the phone number.
            number:
              type: string
              description: These are the digits of the phone number you purchased from Vapi.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            numberDesiredAreaCode:
              type: string
              description: This is the area code of the phone number to purchase.
            sipUri:
              type: string
              description: >-
                This is the SIP URI of the phone number. You can SIP INVITE this. The assistant attached to this number
                will answer.


                This is case-insensitive.
            authentication:
              $ref: '#/components/schemas/SipAuthentication'
              description: |-
                This enables authentication for incoming SIP INVITE requests to the `sipUri`.

                If not set, any username/password to the 401 challenge of the SIP INVITE will be accepted.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
          description: VapiPhoneNumber variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - telnyx
              description: 'Discriminator value: telnyx'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxStatus
              description: This is the status of the phone number.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            number:
              type: string
              description: These are the digits of the phone number you own on your Telnyx.
            credentialId:
              type: string
              description: >-
                This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send
                inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
            - number
            - credentialId
          description: TelnyxPhoneNumber variant
      discriminator:
        propertyName: provider
      title: phoneNumbers_create_Response_201
    V2PhoneNumberGetParametersSortOrder:
      type: string
      enum:
        - ASC
        - DESC
      title: V2PhoneNumberGetParametersSortOrder
    ByoPhoneNumber:
      type: object
      properties:
        fallbackDestination:
          $ref: >-
            #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination
          description: |-
            This is the fallback destination an inbound call will be transferred to if:
            1. `assistantId` is not set
            2. `squadId` is not set
            3. and, `assistant-request` message to the `serverUrl` fails

            If this is not set and above conditions are met, the inbound call is hung up with an error message.
        hooks:
          type: array
          items:
            $ref: >-
              #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems
          description: This is the hooks that will be used for incoming calls to this phone number.
        numberE164CheckEnabled:
          type: boolean
          default: true
          description: >-
            This is the flag to toggle the E164 check for the `number` field. This is an advanced property which should
            be used if you know your use case requires it.


            Use cases:

            - `false`: To allow non-E164 numbers like `+001234567890`, `1234`, or `abc`. This is useful for dialing out
            to non-E164 numbers on your SIP trunks.

            - `true` (default): To allow only E164 numbers like `+14155551234`. This is standard for PSTN calls.


            If `false`, the `number` is still required to only contain alphanumeric characters (regex:
            `/^\+?[a-zA-Z0-9]+$/`).


            @default true (E164 check is enabled)
        id:
          type: string
          description: This is the unique identifier for the phone number.
        orgId:
          type: string
          description: This is the unique identifier for the org that this phone number belongs to.
        createdAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the phone number was created.
        updatedAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the phone number was last updated.
        status:
          $ref: >-
            #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberStatus
          description: This is the status of the phone number.
        name:
          type: string
          description: This is the name of the phone number. This is just for your own reference.
        assistantId:
          type: string
          description: >-
            This is the assistant that will be used for incoming calls to this phone number.


            If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your Server
            URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is
            expected.
        workflowId:
          type: string
          description: >-
            This is the workflow that will be used for incoming calls to this phone number.


            If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
            Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that
            is expected.
        squadId:
          type: string
          description: >-
            This is the squad that will be used for incoming calls to this phone number.


            If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
            Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that
            is expected.
        server:
          $ref: '#/components/schemas/Server'
          description: >-
            This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
            ServerMessage schema.


            The order of precedence is:


            1. assistant.server

            2. phoneNumber.server

            3. org.server
        number:
          type: string
          description: This is the number of the customer.
        credentialId:
          type: string
          description: >-
            This is the credential of your own SIP trunk or Carrier (type `byo-sip-trunk`) which can be used to make
            calls to this phone number.


            You can add the SIP trunk or Carrier credential in the Provider Credentials page on the Dashboard to get the
            credentialId.
      required:
        - id
        - orgId
        - createdAt
        - updatedAt
        - credentialId
      title: ByoPhoneNumber
    TwilioPhoneNumber:
      type: object
      properties:
        fallbackDestination:
          $ref: >-
            #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination
          description: |-
            This is the fallback destination an inbound call will be transferred to if:
            1. `assistantId` is not set
            2. `squadId` is not set
            3. and, `assistant-request` message to the `serverUrl` fails

            If this is not set and above conditions are met, the inbound call is hung up with an error message.
        hooks:
          type: array
          items:
            $ref: >-
              #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems
          description: This is the hooks that will be used for incoming calls to this phone number.
        smsEnabled:
          type: boolean
          default: true
          description: |-
            Controls whether Vapi sets the messaging webhook URL on the Twilio number during import.

            If set to `false`, Vapi will not update the Twilio messaging URL, leaving it as is.
            If `true` or omitted (default), Vapi will configure both the voice and messaging URLs.

            @default true
        id:
          type: string
          description: This is the unique identifier for the phone number.
        orgId:
          type: string
          description: This is the unique identifier for the org that this phone number belongs to.
        createdAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the phone number was created.
        updatedAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the phone number was last updated.
        status:
          $ref: '#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioStatus'
          description: This is the status of the phone number.
        twilioAuthToken:
          type: string
          description: This is the Twilio Auth Token for the phone number.
        twilioApiKey:
          type: string
          description: This is the Twilio API Key for the phone number.
        twilioApiSecret:
          type: string
          description: This is the Twilio API Secret for the phone number.
        name:
          type: string
          description: This is the name of the phone number. This is just for your own reference.
        assistantId:
          type: string
          description: >-
            This is the assistant that will be used for incoming calls to this phone number.


            If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your Server
            URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is
            expected.
        workflowId:
          type: string
          description: >-
            This is the workflow that will be used for incoming calls to this phone number.


            If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
            Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that
            is expected.
        squadId:
          type: string
          description: >-
            This is the squad that will be used for incoming calls to this phone number.


            If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
            Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that
            is expected.
        server:
          $ref: '#/components/schemas/Server'
          description: >-
            This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
            ServerMessage schema.


            The order of precedence is:


            1. assistant.server

            2. phoneNumber.server

            3. org.server
        number:
          type: string
          description: These are the digits of the phone number you own on your Twilio.
        twilioAccountSid:
          type: string
          description: This is the Twilio Account SID for the phone number.
      required:
        - id
        - orgId
        - createdAt
        - updatedAt
        - number
        - twilioAccountSid
      title: TwilioPhoneNumber
    VonagePhoneNumber:
      type: object
      properties:
        fallbackDestination:
          $ref: >-
            #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination
          description: |-
            This is the fallback destination an inbound call will be transferred to if:
            1. `assistantId` is not set
            2. `squadId` is not set
            3. and, `assistant-request` message to the `serverUrl` fails

            If this is not set and above conditions are met, the inbound call is hung up with an error message.
        hooks:
          type: array
          items:
            $ref: >-
              #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems
          description: This is the hooks that will be used for incoming calls to this phone number.
        id:
          type: string
          description: This is the unique identifier for the phone number.
        orgId:
          type: string
          description: This is the unique identifier for the org that this phone number belongs to.
        createdAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the phone number was created.
        updatedAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the phone number was last updated.
        status:
          $ref: '#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageStatus'
          description: This is the status of the phone number.
        name:
          type: string
          description: This is the name of the phone number. This is just for your own reference.
        assistantId:
          type: string
          description: >-
            This is the assistant that will be used for incoming calls to this phone number.


            If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your Server
            URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is
            expected.
        workflowId:
          type: string
          description: >-
            This is the workflow that will be used for incoming calls to this phone number.


            If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
            Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that
            is expected.
        squadId:
          type: string
          description: >-
            This is the squad that will be used for incoming calls to this phone number.


            If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
            Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that
            is expected.
        server:
          $ref: '#/components/schemas/Server'
          description: >-
            This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
            ServerMessage schema.


            The order of precedence is:


            1. assistant.server

            2. phoneNumber.server

            3. org.server
        number:
          type: string
          description: These are the digits of the phone number you own on your Vonage.
        credentialId:
          type: string
          description: >-
            This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send
            inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups.
      required:
        - id
        - orgId
        - createdAt
        - updatedAt
        - number
        - credentialId
      title: VonagePhoneNumber
    VapiPhoneNumber:
      type: object
      properties:
        fallbackDestination:
          $ref: >-
            #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination
          description: |-
            This is the fallback destination an inbound call will be transferred to if:
            1. `assistantId` is not set
            2. `squadId` is not set
            3. and, `assistant-request` message to the `serverUrl` fails

            If this is not set and above conditions are met, the inbound call is hung up with an error message.
        hooks:
          type: array
          items:
            $ref: >-
              #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems
          description: This is the hooks that will be used for incoming calls to this phone number.
        id:
          type: string
          description: This is the unique identifier for the phone number.
        orgId:
          type: string
          description: This is the unique identifier for the org that this phone number belongs to.
        createdAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the phone number was created.
        updatedAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the phone number was last updated.
        status:
          $ref: '#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiStatus'
          description: This is the status of the phone number.
        number:
          type: string
          description: These are the digits of the phone number you purchased from Vapi.
        name:
          type: string
          description: This is the name of the phone number. This is just for your own reference.
        assistantId:
          type: string
          description: >-
            This is the assistant that will be used for incoming calls to this phone number.


            If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your Server
            URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is
            expected.
        workflowId:
          type: string
          description: >-
            This is the workflow that will be used for incoming calls to this phone number.


            If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
            Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that
            is expected.
        squadId:
          type: string
          description: >-
            This is the squad that will be used for incoming calls to this phone number.


            If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
            Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that
            is expected.
        server:
          $ref: '#/components/schemas/Server'
          description: >-
            This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
            ServerMessage schema.


            The order of precedence is:


            1. assistant.server

            2. phoneNumber.server

            3. org.server
        numberDesiredAreaCode:
          type: string
          description: This is the area code of the phone number to purchase.
        sipUri:
          type: string
          description: >-
            This is the SIP URI of the phone number. You can SIP INVITE this. The assistant attached to this number will
            answer.


            This is case-insensitive.
        authentication:
          $ref: '#/components/schemas/SipAuthentication'
          description: |-
            This enables authentication for incoming SIP INVITE requests to the `sipUri`.

            If not set, any username/password to the 401 challenge of the SIP INVITE will be accepted.
      required:
        - id
        - orgId
        - createdAt
        - updatedAt
      title: VapiPhoneNumber
    TelnyxPhoneNumber:
      type: object
      properties:
        fallbackDestination:
          $ref: >-
            #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination
          description: |-
            This is the fallback destination an inbound call will be transferred to if:
            1. `assistantId` is not set
            2. `squadId` is not set
            3. and, `assistant-request` message to the `serverUrl` fails

            If this is not set and above conditions are met, the inbound call is hung up with an error message.
        hooks:
          type: array
          items:
            $ref: >-
              #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems
          description: This is the hooks that will be used for incoming calls to this phone number.
        id:
          type: string
          description: This is the unique identifier for the phone number.
        orgId:
          type: string
          description: This is the unique identifier for the org that this phone number belongs to.
        createdAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the phone number was created.
        updatedAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the phone number was last updated.
        status:
          $ref: '#/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxStatus'
          description: This is the status of the phone number.
        name:
          type: string
          description: This is the name of the phone number. This is just for your own reference.
        assistantId:
          type: string
          description: >-
            This is the assistant that will be used for incoming calls to this phone number.


            If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your Server
            URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that is
            expected.
        workflowId:
          type: string
          description: >-
            This is the workflow that will be used for incoming calls to this phone number.


            If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
            Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that
            is expected.
        squadId:
          type: string
          description: >-
            This is the squad that will be used for incoming calls to this phone number.


            If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
            Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response that
            is expected.
        server:
          $ref: '#/components/schemas/Server'
          description: >-
            This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
            ServerMessage schema.


            The order of precedence is:


            1. assistant.server

            2. phoneNumber.server

            3. org.server
        number:
          type: string
          description: These are the digits of the phone number you own on your Telnyx.
        credentialId:
          type: string
          description: >-
            This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send
            inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups.
      required:
        - id
        - orgId
        - createdAt
        - updatedAt
        - number
        - credentialId
      title: TelnyxPhoneNumber
    PhoneNumberPaginatedResponseResultsItems:
      oneOf:
        - $ref: '#/components/schemas/ByoPhoneNumber'
        - $ref: '#/components/schemas/TwilioPhoneNumber'
        - $ref: '#/components/schemas/VonagePhoneNumber'
        - $ref: '#/components/schemas/VapiPhoneNumber'
        - $ref: '#/components/schemas/TelnyxPhoneNumber'
      title: PhoneNumberPaginatedResponseResultsItems
    PhoneNumberPaginatedResponse:
      type: object
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/PhoneNumberPaginatedResponseResultsItems'
          description: A list of phone numbers, which can be of any provider type.
        metadata:
          $ref: '#/components/schemas/PaginationMeta'
          description: Metadata about the pagination.
      required:
        - results
        - metadata
      title: PhoneNumberPaginatedResponse
    phoneNumbers_get_Response_200:
      oneOf:
        - type: object
          properties:
            provider:
              type: string
              enum:
                - byo-phone-number
              description: 'Discriminator value: byo-phone-number'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            numberE164CheckEnabled:
              type: boolean
              default: true
              description: >-
                This is the flag to toggle the E164 check for the `number` field. This is an advanced property which
                should be used if you know your use case requires it.


                Use cases:

                - `false`: To allow non-E164 numbers like `+001234567890`, `1234`, or `abc`. This is useful for dialing
                out to non-E164 numbers on your SIP trunks.

                - `true` (default): To allow only E164 numbers like `+14155551234`. This is standard for PSTN calls.


                If `false`, the `number` is still required to only contain alphanumeric characters (regex:
                `/^\+?[a-zA-Z0-9]+$/`).


                @default true (E164 check is enabled)
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberStatus
              description: This is the status of the phone number.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            number:
              type: string
              description: This is the number of the customer.
            credentialId:
              type: string
              description: >-
                This is the credential of your own SIP trunk or Carrier (type `byo-sip-trunk`) which can be used to make
                calls to this phone number.


                You can add the SIP trunk or Carrier credential in the Provider Credentials page on the Dashboard to get
                the credentialId.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
            - credentialId
          description: ByoPhoneNumber variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - twilio
              description: 'Discriminator value: twilio'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            smsEnabled:
              type: boolean
              default: true
              description: |-
                Controls whether Vapi sets the messaging webhook URL on the Twilio number during import.

                If set to `false`, Vapi will not update the Twilio messaging URL, leaving it as is.
                If `true` or omitted (default), Vapi will configure both the voice and messaging URLs.

                @default true
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioStatus
              description: This is the status of the phone number.
            twilioAuthToken:
              type: string
              description: This is the Twilio Auth Token for the phone number.
            twilioApiKey:
              type: string
              description: This is the Twilio API Key for the phone number.
            twilioApiSecret:
              type: string
              description: This is the Twilio API Secret for the phone number.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            number:
              type: string
              description: These are the digits of the phone number you own on your Twilio.
            twilioAccountSid:
              type: string
              description: This is the Twilio Account SID for the phone number.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
            - number
            - twilioAccountSid
          description: TwilioPhoneNumber variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - vonage
              description: 'Discriminator value: vonage'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageStatus
              description: This is the status of the phone number.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            number:
              type: string
              description: These are the digits of the phone number you own on your Vonage.
            credentialId:
              type: string
              description: >-
                This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send
                inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
            - number
            - credentialId
          description: VonagePhoneNumber variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - vapi
              description: 'Discriminator value: vapi'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiStatus
              description: This is the status of the phone number.
            number:
              type: string
              description: These are the digits of the phone number you purchased from Vapi.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            numberDesiredAreaCode:
              type: string
              description: This is the area code of the phone number to purchase.
            sipUri:
              type: string
              description: >-
                This is the SIP URI of the phone number. You can SIP INVITE this. The assistant attached to this number
                will answer.


                This is case-insensitive.
            authentication:
              $ref: '#/components/schemas/SipAuthentication'
              description: |-
                This enables authentication for incoming SIP INVITE requests to the `sipUri`.

                If not set, any username/password to the 401 challenge of the SIP INVITE will be accepted.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
          description: VapiPhoneNumber variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - telnyx
              description: 'Discriminator value: telnyx'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxStatus
              description: This is the status of the phone number.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            number:
              type: string
              description: These are the digits of the phone number you own on your Telnyx.
            credentialId:
              type: string
              description: >-
                This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send
                inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
            - number
            - credentialId
          description: TelnyxPhoneNumber variant
      discriminator:
        propertyName: provider
      title: phoneNumbers_get_Response_200
    phoneNumbers_delete_Response_200:
      oneOf:
        - type: object
          properties:
            provider:
              type: string
              enum:
                - byo-phone-number
              description: 'Discriminator value: byo-phone-number'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            numberE164CheckEnabled:
              type: boolean
              default: true
              description: >-
                This is the flag to toggle the E164 check for the `number` field. This is an advanced property which
                should be used if you know your use case requires it.


                Use cases:

                - `false`: To allow non-E164 numbers like `+001234567890`, `1234`, or `abc`. This is useful for dialing
                out to non-E164 numbers on your SIP trunks.

                - `true` (default): To allow only E164 numbers like `+14155551234`. This is standard for PSTN calls.


                If `false`, the `number` is still required to only contain alphanumeric characters (regex:
                `/^\+?[a-zA-Z0-9]+$/`).


                @default true (E164 check is enabled)
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberStatus
              description: This is the status of the phone number.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            number:
              type: string
              description: This is the number of the customer.
            credentialId:
              type: string
              description: >-
                This is the credential of your own SIP trunk or Carrier (type `byo-sip-trunk`) which can be used to make
                calls to this phone number.


                You can add the SIP trunk or Carrier credential in the Provider Credentials page on the Dashboard to get
                the credentialId.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
            - credentialId
          description: ByoPhoneNumber variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - twilio
              description: 'Discriminator value: twilio'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            smsEnabled:
              type: boolean
              default: true
              description: |-
                Controls whether Vapi sets the messaging webhook URL on the Twilio number during import.

                If set to `false`, Vapi will not update the Twilio messaging URL, leaving it as is.
                If `true` or omitted (default), Vapi will configure both the voice and messaging URLs.

                @default true
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioStatus
              description: This is the status of the phone number.
            twilioAuthToken:
              type: string
              description: This is the Twilio Auth Token for the phone number.
            twilioApiKey:
              type: string
              description: This is the Twilio API Key for the phone number.
            twilioApiSecret:
              type: string
              description: This is the Twilio API Secret for the phone number.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            number:
              type: string
              description: These are the digits of the phone number you own on your Twilio.
            twilioAccountSid:
              type: string
              description: This is the Twilio Account SID for the phone number.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
            - number
            - twilioAccountSid
          description: TwilioPhoneNumber variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - vonage
              description: 'Discriminator value: vonage'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageStatus
              description: This is the status of the phone number.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            number:
              type: string
              description: These are the digits of the phone number you own on your Vonage.
            credentialId:
              type: string
              description: >-
                This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send
                inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
            - number
            - credentialId
          description: VonagePhoneNumber variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - vapi
              description: 'Discriminator value: vapi'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiStatus
              description: This is the status of the phone number.
            number:
              type: string
              description: These are the digits of the phone number you purchased from Vapi.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            numberDesiredAreaCode:
              type: string
              description: This is the area code of the phone number to purchase.
            sipUri:
              type: string
              description: >-
                This is the SIP URI of the phone number. You can SIP INVITE this. The assistant attached to this number
                will answer.


                This is case-insensitive.
            authentication:
              $ref: '#/components/schemas/SipAuthentication'
              description: |-
                This enables authentication for incoming SIP INVITE requests to the `sipUri`.

                If not set, any username/password to the 401 challenge of the SIP INVITE will be accepted.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
          description: VapiPhoneNumber variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - telnyx
              description: 'Discriminator value: telnyx'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxStatus
              description: This is the status of the phone number.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            number:
              type: string
              description: These are the digits of the phone number you own on your Telnyx.
            credentialId:
              type: string
              description: >-
                This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send
                inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
            - number
            - credentialId
          description: TelnyxPhoneNumber variant
      discriminator:
        propertyName: provider
      title: phoneNumbers_delete_Response_200
    UpdateByoPhoneNumberDtoFallbackDestination:
      oneOf:
        - $ref: '#/components/schemas/TransferDestinationNumber'
        - $ref: '#/components/schemas/TransferDestinationSip'
      description: |-
        This is the fallback destination an inbound call will be transferred to if:
        1. `assistantId` is not set
        2. `squadId` is not set
        3. and, `assistant-request` message to the `serverUrl` fails

        If this is not set and above conditions are met, the inbound call is hung up with an error message.
      title: UpdateByoPhoneNumberDtoFallbackDestination
    UpdateByoPhoneNumberDtoHooksItems:
      oneOf:
        - $ref: '#/components/schemas/PhoneNumberHookCallRinging'
        - $ref: '#/components/schemas/PhoneNumberHookCallEnding'
      title: UpdateByoPhoneNumberDtoHooksItems
    UpdateTwilioPhoneNumberDtoFallbackDestination:
      oneOf:
        - $ref: '#/components/schemas/TransferDestinationNumber'
        - $ref: '#/components/schemas/TransferDestinationSip'
      description: |-
        This is the fallback destination an inbound call will be transferred to if:
        1. `assistantId` is not set
        2. `squadId` is not set
        3. and, `assistant-request` message to the `serverUrl` fails

        If this is not set and above conditions are met, the inbound call is hung up with an error message.
      title: UpdateTwilioPhoneNumberDtoFallbackDestination
    UpdateTwilioPhoneNumberDtoHooksItems:
      oneOf:
        - $ref: '#/components/schemas/PhoneNumberHookCallRinging'
        - $ref: '#/components/schemas/PhoneNumberHookCallEnding'
      title: UpdateTwilioPhoneNumberDtoHooksItems
    UpdateVonagePhoneNumberDtoFallbackDestination:
      oneOf:
        - $ref: '#/components/schemas/TransferDestinationNumber'
        - $ref: '#/components/schemas/TransferDestinationSip'
      description: |-
        This is the fallback destination an inbound call will be transferred to if:
        1. `assistantId` is not set
        2. `squadId` is not set
        3. and, `assistant-request` message to the `serverUrl` fails

        If this is not set and above conditions are met, the inbound call is hung up with an error message.
      title: UpdateVonagePhoneNumberDtoFallbackDestination
    UpdateVonagePhoneNumberDtoHooksItems:
      oneOf:
        - $ref: '#/components/schemas/PhoneNumberHookCallRinging'
        - $ref: '#/components/schemas/PhoneNumberHookCallEnding'
      title: UpdateVonagePhoneNumberDtoHooksItems
    UpdateVapiPhoneNumberDtoFallbackDestination:
      oneOf:
        - $ref: '#/components/schemas/TransferDestinationNumber'
        - $ref: '#/components/schemas/TransferDestinationSip'
      description: |-
        This is the fallback destination an inbound call will be transferred to if:
        1. `assistantId` is not set
        2. `squadId` is not set
        3. and, `assistant-request` message to the `serverUrl` fails

        If this is not set and above conditions are met, the inbound call is hung up with an error message.
      title: UpdateVapiPhoneNumberDtoFallbackDestination
    UpdateVapiPhoneNumberDtoHooksItems:
      oneOf:
        - $ref: '#/components/schemas/PhoneNumberHookCallRinging'
        - $ref: '#/components/schemas/PhoneNumberHookCallEnding'
      title: UpdateVapiPhoneNumberDtoHooksItems
    UpdateTelnyxPhoneNumberDtoFallbackDestination:
      oneOf:
        - $ref: '#/components/schemas/TransferDestinationNumber'
        - $ref: '#/components/schemas/TransferDestinationSip'
      description: |-
        This is the fallback destination an inbound call will be transferred to if:
        1. `assistantId` is not set
        2. `squadId` is not set
        3. and, `assistant-request` message to the `serverUrl` fails

        If this is not set and above conditions are met, the inbound call is hung up with an error message.
      title: UpdateTelnyxPhoneNumberDtoFallbackDestination
    UpdateTelnyxPhoneNumberDtoHooksItems:
      oneOf:
        - $ref: '#/components/schemas/PhoneNumberHookCallRinging'
        - $ref: '#/components/schemas/PhoneNumberHookCallEnding'
      title: UpdateTelnyxPhoneNumberDtoHooksItems
    phoneNumbers_update_Request:
      oneOf:
        - type: object
          properties:
            provider:
              type: string
              enum:
                - byo-phone-number
              description: 'Discriminator value: byo-phone-number'
            fallbackDestination:
              $ref: '#/components/schemas/UpdateByoPhoneNumberDtoFallbackDestination'
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: '#/components/schemas/UpdateByoPhoneNumberDtoHooksItems'
              description: This is the hooks that will be used for incoming calls to this phone number.
            numberE164CheckEnabled:
              type: boolean
              default: true
              description: >-
                This is the flag to toggle the E164 check for the `number` field. This is an advanced property which
                should be used if you know your use case requires it.


                Use cases:

                - `false`: To allow non-E164 numbers like `+001234567890`, `1234`, or `abc`. This is useful for dialing
                out to non-E164 numbers on your SIP trunks.

                - `true` (default): To allow only E164 numbers like `+14155551234`. This is standard for PSTN calls.


                If `false`, the `number` is still required to only contain alphanumeric characters (regex:
                `/^\+?[a-zA-Z0-9]+$/`).


                @default true (E164 check is enabled)
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            number:
              type: string
              description: This is the number of the customer.
            credentialId:
              type: string
              description: >-
                This is the credential of your own SIP trunk or Carrier (type `byo-sip-trunk`) which can be used to make
                calls to this phone number.


                You can add the SIP trunk or Carrier credential in the Provider Credentials page on the Dashboard to get
                the credentialId.
          required:
            - provider
          description: UpdateByoPhoneNumberDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - twilio
              description: 'Discriminator value: twilio'
            fallbackDestination:
              $ref: '#/components/schemas/UpdateTwilioPhoneNumberDtoFallbackDestination'
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: '#/components/schemas/UpdateTwilioPhoneNumberDtoHooksItems'
              description: This is the hooks that will be used for incoming calls to this phone number.
            smsEnabled:
              type: boolean
              default: true
              description: |-
                Controls whether Vapi sets the messaging webhook URL on the Twilio number during import.

                If set to `false`, Vapi will not update the Twilio messaging URL, leaving it as is.
                If `true` or omitted (default), Vapi will configure both the voice and messaging URLs.

                @default true
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            number:
              type: string
              description: These are the digits of the phone number you own on your Twilio.
            twilioAccountSid:
              type: string
              description: This is the Twilio Account SID for the phone number.
            twilioAuthToken:
              type: string
              description: This is the Twilio Auth Token for the phone number.
            twilioApiKey:
              type: string
              description: This is the Twilio API Key for the phone number.
            twilioApiSecret:
              type: string
              description: This is the Twilio API Secret for the phone number.
          required:
            - provider
          description: UpdateTwilioPhoneNumberDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - vonage
              description: 'Discriminator value: vonage'
            fallbackDestination:
              $ref: '#/components/schemas/UpdateVonagePhoneNumberDtoFallbackDestination'
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: '#/components/schemas/UpdateVonagePhoneNumberDtoHooksItems'
              description: This is the hooks that will be used for incoming calls to this phone number.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            number:
              type: string
              description: These are the digits of the phone number you own on your Vonage.
            credentialId:
              type: string
              description: >-
                This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send
                inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups.
          required:
            - provider
          description: UpdateVonagePhoneNumberDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - vapi
              description: 'Discriminator value: vapi'
            fallbackDestination:
              $ref: '#/components/schemas/UpdateVapiPhoneNumberDtoFallbackDestination'
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: '#/components/schemas/UpdateVapiPhoneNumberDtoHooksItems'
              description: This is the hooks that will be used for incoming calls to this phone number.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            sipUri:
              type: string
              description: >-
                This is the SIP URI of the phone number. You can SIP INVITE this. The assistant attached to this number
                will answer.


                This is case-insensitive.
            authentication:
              $ref: '#/components/schemas/SipAuthentication'
              description: |-
                This enables authentication for incoming SIP INVITE requests to the `sipUri`.

                If not set, any username/password to the 401 challenge of the SIP INVITE will be accepted.
          required:
            - provider
          description: UpdateVapiPhoneNumberDTO variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - telnyx
              description: 'Discriminator value: telnyx'
            fallbackDestination:
              $ref: '#/components/schemas/UpdateTelnyxPhoneNumberDtoFallbackDestination'
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: '#/components/schemas/UpdateTelnyxPhoneNumberDtoHooksItems'
              description: This is the hooks that will be used for incoming calls to this phone number.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            number:
              type: string
              description: These are the digits of the phone number you own on your Telnyx.
            credentialId:
              type: string
              description: >-
                This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send
                inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups.
          required:
            - provider
          description: UpdateTelnyxPhoneNumberDTO variant
      discriminator:
        propertyName: provider
      title: phoneNumbers_update_Request
    phoneNumbers_update_Response_200:
      oneOf:
        - type: object
          properties:
            provider:
              type: string
              enum:
                - byo-phone-number
              description: 'Discriminator value: byo-phone-number'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            numberE164CheckEnabled:
              type: boolean
              default: true
              description: >-
                This is the flag to toggle the E164 check for the `number` field. This is an advanced property which
                should be used if you know your use case requires it.


                Use cases:

                - `false`: To allow non-E164 numbers like `+001234567890`, `1234`, or `abc`. This is useful for dialing
                out to non-E164 numbers on your SIP trunks.

                - `true` (default): To allow only E164 numbers like `+14155551234`. This is standard for PSTN calls.


                If `false`, the `number` is still required to only contain alphanumeric characters (regex:
                `/^\+?[a-zA-Z0-9]+$/`).


                @default true (E164 check is enabled)
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingByoPhoneNumberStatus
              description: This is the status of the phone number.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            number:
              type: string
              description: This is the number of the customer.
            credentialId:
              type: string
              description: >-
                This is the credential of your own SIP trunk or Carrier (type `byo-sip-trunk`) which can be used to make
                calls to this phone number.


                You can add the SIP trunk or Carrier credential in the Provider Credentials page on the Dashboard to get
                the credentialId.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
            - credentialId
          description: ByoPhoneNumber variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - twilio
              description: 'Discriminator value: twilio'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            smsEnabled:
              type: boolean
              default: true
              description: |-
                Controls whether Vapi sets the messaging webhook URL on the Twilio number during import.

                If set to `false`, Vapi will not update the Twilio messaging URL, leaving it as is.
                If `true` or omitted (default), Vapi will configure both the voice and messaging URLs.

                @default true
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTwilioStatus
              description: This is the status of the phone number.
            twilioAuthToken:
              type: string
              description: This is the Twilio Auth Token for the phone number.
            twilioApiKey:
              type: string
              description: This is the Twilio API Key for the phone number.
            twilioApiSecret:
              type: string
              description: This is the Twilio API Secret for the phone number.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            number:
              type: string
              description: These are the digits of the phone number you own on your Twilio.
            twilioAccountSid:
              type: string
              description: This is the Twilio Account SID for the phone number.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
            - number
            - twilioAccountSid
          description: TwilioPhoneNumber variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - vonage
              description: 'Discriminator value: vonage'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVonageStatus
              description: This is the status of the phone number.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            number:
              type: string
              description: These are the digits of the phone number you own on your Vonage.
            credentialId:
              type: string
              description: >-
                This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send
                inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
            - number
            - credentialId
          description: VonagePhoneNumber variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - vapi
              description: 'Discriminator value: vapi'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVapiStatus
              description: This is the status of the phone number.
            number:
              type: string
              description: These are the digits of the phone number you purchased from Vapi.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            numberDesiredAreaCode:
              type: string
              description: This is the area code of the phone number to purchase.
            sipUri:
              type: string
              description: >-
                This is the SIP URI of the phone number. You can SIP INVITE this. The assistant attached to this number
                will answer.


                This is case-insensitive.
            authentication:
              $ref: '#/components/schemas/SipAuthentication'
              description: |-
                This enables authentication for incoming SIP INVITE requests to the `sipUri`.

                If not set, any username/password to the 401 challenge of the SIP INVITE will be accepted.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
          description: VapiPhoneNumber variant
        - type: object
          properties:
            provider:
              type: string
              enum:
                - telnyx
              description: 'Discriminator value: telnyx'
            fallbackDestination:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxFallbackDestination
              description: |-
                This is the fallback destination an inbound call will be transferred to if:
                1. `assistantId` is not set
                2. `squadId` is not set
                3. and, `assistant-request` message to the `serverUrl` fails

                If this is not set and above conditions are met, the inbound call is hung up with an error message.
            hooks:
              type: array
              items:
                $ref: >-
                  #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxHooksItems
              description: This is the hooks that will be used for incoming calls to this phone number.
            id:
              type: string
              description: This is the unique identifier for the phone number.
            orgId:
              type: string
              description: This is the unique identifier for the org that this phone number belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the phone number was last updated.
            status:
              $ref: >-
                #/components/schemas/PhoneNumberIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTelnyxStatus
              description: This is the status of the phone number.
            name:
              type: string
              description: This is the name of the phone number. This is just for your own reference.
            assistantId:
              type: string
              description: >-
                This is the assistant that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId` nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            workflowId:
              type: string
              description: >-
                This is the workflow that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            squadId:
              type: string
              description: >-
                This is the squad that will be used for incoming calls to this phone number.


                If neither `assistantId`, `squadId`, nor `workflowId` is set, `assistant-request` will be sent to your
                Server URL. Check `ServerMessage` and `ServerMessageResponse` for the shape of the message and response
                that is expected.
            server:
              $ref: '#/components/schemas/Server'
              description: >-
                This is where Vapi will send webhooks. You can find all webhooks available along with their shape in
                ServerMessage schema.


                The order of precedence is:


                1. assistant.server

                2. phoneNumber.server

                3. org.server
            number:
              type: string
              description: These are the digits of the phone number you own on your Telnyx.
            credentialId:
              type: string
              description: >-
                This is the credential you added in dashboard.vapi.ai/keys. This is used to configure the number to send
                inbound calls to Vapi, make outbound calls and do live call updates like transfers and hangups.
          required:
            - provider
            - id
            - orgId
            - createdAt
            - updatedAt
            - number
            - credentialId
          description: TelnyxPhoneNumber variant
      discriminator:
        propertyName: provider
      title: phoneNumbers_update_Response_200
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod:
      type: string
      enum:
        - POST
        - GET
        - PUT
        - PATCH
        - DELETE
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingCodeMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingCodeMessagesItems
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems:
      oneOf:
        - $ref: '#/components/schemas/TransferDestinationAssistant'
        - $ref: '#/components/schemas/TransferDestinationNumber'
        - $ref: '#/components/schemas/TransferDestinationSip'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems:
      oneOf:
        - $ref: '#/components/schemas/HandoffDestinationAssistant'
        - $ref: '#/components/schemas/HandoffDestinationDynamic'
        - $ref: '#/components/schemas/HandoffDestinationSquad'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashSubType:
      type: string
      enum:
        - bash_20241022
      description: The sub type of tool.
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashSubType
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashName:
      type: string
      enum:
        - bash
      default: bash
      description: The name of the tool, fixed to 'bash'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashName
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerSubType:
      type: string
      enum:
        - computer_20241022
      description: The sub type of tool.
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerSubType
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerName:
      type: string
      enum:
        - computer
      default: computer
      description: The name of the tool, fixed to 'computer'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerName
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType:
      type: string
      enum:
        - text_editor_20241022
      description: The sub type of tool.
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorName:
      type: string
      enum:
        - str_replace_editor
      default: str_replace_editor
      description: The name of the tool, fixed to 'str_replace_editor'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorName
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: >-
        ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb:
      type: string
      enum:
        - INFO
        - MESSAGE
        - NOTIFY
      description: The SIP method to send.
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody:
      oneOf:
        - type: string
        - $ref: '#/components/schemas/JsonSchema'
      description: >-
        Body to include in the SIP request. Either a literal string body, or a JSON schema describing a structured body
        that the model should populate.
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody
    ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems
    ToolGetResponsesContentApplicationJsonSchemaItems:
      oneOf:
        - type: object
          properties:
            type:
              type: string
              enum:
                - apiRequest
              description: 'Discriminator value: apiRequest'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            method:
              $ref: >-
                #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod
            timeoutSeconds:
              type: number
              format: double
              description: |-
                This is the timeout in seconds for the request. Defaults to 20 seconds.

                @default 20
            credentialId:
              type: string
              description: The credential ID for API request authentication
            encryptedPaths:
              type: array
              items:
                type: string
              description: This is the paths to encrypt in the request body if credentialId and encryptionPlan are defined.
            parameters:
              type: array
              items:
                $ref: '#/components/schemas/ToolParameter'
              description: Static key-value pairs merged into the request body. Values support Liquid templates.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            name:
              type: string
              description: |-
                This is the name of the tool. This will be passed to the model.

                Must be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 40.
            description:
              type: string
              description: This is the description of the tool. This will be passed to the model.
            url:
              type: string
              description: This is where the request will be sent.
            body:
              $ref: '#/components/schemas/JsonSchema'
              description: This is the body of the request.
            headers:
              $ref: '#/components/schemas/JsonSchema'
              description: These are the headers to send with the request.
            backoffPlan:
              $ref: '#/components/schemas/BackoffPlan'
              description: |-
                This is the backoff plan if the request fails. Defaults to undefined (the request will not be retried).

                @default undefined (the request will not be retried)
            variableExtractionPlan:
              $ref: '#/components/schemas/VariableExtractionPlan'
              description: >-
                This is the plan to extract variables from the tool's response. These will be accessible during the call
                and stored in `call.artifact.variableValues` after the call.


                Usage:

                1. Use `aliases` to extract variables from the tool's response body. (Most common case)


                ```json

                {
                  "aliases": [
                    {
                      "key": "customerName",
                      "value": "{{customer.name}}"
                    },
                    {
                      "key": "customerAge",
                      "value": "{{customer.age}}"
                    }
                  ]
                }

                ```


                The tool response body is made available to the liquid template.


                2. Use `aliases` to extract variables from the tool's response body if the response is an array.


                ```json

                {
                  "aliases": [
                    {
                      "key": "customerName",
                      "value": "{{$[0].name}}"
                    },
                    {
                      "key": "customerAge",
                      "value": "{{$[0].age}}"
                    }
                  ]
                }

                ```


                $ is a shorthand for the tool's response body. `$[0]` is the first item in the array. `$[n]` is the nth
                item in the array. Note, $ is available regardless of the response body type (both object and array).


                3. Use `aliases` to extract variables from the tool's response headers.


                ```json

                {
                  "aliases": [
                    {
                      "key": "customerName",
                      "value": "{{tool.response.headers.customer-name}}"
                    },
                    {
                      "key": "customerAge",
                      "value": "{{tool.response.headers.customer-age}}"
                    }
                  ]
                }

                ```


                `tool.response` is made available to the liquid template. Particularly, both `tool.response.headers` and
                `tool.response.body` are available. Note, `tool.response` is available regardless of the response body
                type (both object and array).


                4. Use `schema` to extract a large portion of the tool's response body.


                4.1. If you hit example.com and it returns `{"name": "John", "age": 30}`, then you can specify the
                schema as:


                ```json

                {
                  "schema": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "string"
                      },
                      "age": {
                        "type": "number"
                      }
                    }
                  }
                }

                ```

                These will be extracted as `{{ name }}` and `{{ age }}` respectively. To emphasize, object properties
                are extracted as direct global variables.


                4.2. If you hit example.com and it returns `{"name": {"first": "John", "last": "Doe"}}`, then you can
                specify the schema as:


                ```json

                {
                  "schema": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "object",
                        "properties": {
                          "first": {
                            "type": "string"
                          },
                          "last": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }

                ```


                These will be extracted as `{{ name }}`. And, `{{ name.first }}` and `{{ name.last }}` will be
                accessible.


                4.3. If you hit example.com and it returns `["94123", "94124"]`, then you can specify the schema as:


                ```json

                {
                  "schema": {
                    "type": "array",
                    "title": "zipCodes",
                    "items": {
                      "type": "string"
                    }
                  }
                }

                ```


                This will be extracted as `{{ zipCodes }}`. To access the array items, you can use `{{ zipCodes[0] }}`
                and `{{ zipCodes[1] }}`.


                4.4. If you hit example.com and it returns `[{"name": "John", "age": 30, "zipCodes": ["94123",
                "94124"]}, {"name": "Jane", "age": 25, "zipCodes": ["94125", "94126"]}]`, then you can specify the
                schema as:


                ```json

                {
                  "schema": {
                    "type": "array",
                    "title": "people",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "age": {
                          "type": "number"
                        },
                        "zipCodes": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }

                ```


                This will be extracted as `{{ people }}`. To access the array items, you can use `{{ people[n].name }}`,
                `{{ people[n].age }}`, `{{ people[n].zipCodes }}`, `{{ people[n].zipCodes[0] }}` and `{{
                people[n].zipCodes[1] }}`.


                Note: Both `aliases` and `schema` can be used together.
          required:
            - type
            - method
            - id
            - orgId
            - createdAt
            - updatedAt
            - url
          description: apiRequest variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - code
              description: 'Discriminator value: code'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingCodeMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            async:
              type: boolean
              description: |-
                This determines if the tool is async.

                  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.

                  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.

                  Defaults to synchronous (`false`).
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            code:
              type: string
              description: TypeScript code to execute when the tool is called
            environmentVariables:
              type: array
              items:
                $ref: '#/components/schemas/CodeToolEnvironmentVariable'
              description: Environment variables available in code via `env` object
            timeoutSeconds:
              type: number
              format: double
              description: |-
                This is the timeout in seconds for the code execution. Defaults to 10 seconds.
                Maximum is 30 seconds to prevent abuse.

                @default 10
            credentialId:
              type: string
              description: Credential ID containing the Val Town API key
            variableExtractionPlan:
              $ref: '#/components/schemas/VariableExtractionPlan'
              description: Plan to extract variables from the tool response
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            function:
              $ref: '#/components/schemas/OpenAIFunction'
              description: |-
                This is the function definition of the tool.

                For the Code tool, this defines the name, description, and parameters that the model
                will use to understand when and how to call this tool.
          required:
            - type
            - code
            - id
            - orgId
            - createdAt
            - updatedAt
          description: code variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - dtmf
              description: 'Discriminator value: dtmf'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            sipInfoDtmfEnabled:
              type: boolean
              default: false
              description: >-
                This enables sending DTMF tones via SIP INFO messages instead of RFC 2833 (RTP events). When enabled,
                DTMF digits will be sent using the SIP INFO method, which can be more reliable in some network
                configurations. Only relevant when using the `vapi.sip` transport.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: DtmfTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - endCall
              description: 'Discriminator value: endCall'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: EndCallTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - function
              description: 'Discriminator value: function'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            async:
              type: boolean
              description: |-
                This determines if the tool is async.

                  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.

                  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.

                  Defaults to synchronous (`false`).
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            variableExtractionPlan:
              $ref: '#/components/schemas/VariableExtractionPlan'
              description: Plan to extract variables from the tool response
            parameters:
              type: array
              items:
                $ref: '#/components/schemas/ToolParameter'
              description: Static key-value pairs merged into the request body. Values support Liquid templates.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            function:
              $ref: '#/components/schemas/OpenAIFunction'
              description: This is the function definition of the tool.
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: FunctionTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - transferCall
              description: 'Discriminator value: transferCall'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            destinations:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems
              description: >-
                These are the destinations that the call can be transferred to. If no destinations are provided,
                server.url will be used to get the transfer destination once the tool is called.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: TransferCallTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - handoff
              description: 'Discriminator value: handoff'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            defaultResult:
              type: string
              description: This is the default local tool result message used when no runtime handoff result override is returned.
            destinations:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems
              description: >-
                These are the destinations that the call can be handed off to.


                Usage:

                1. Single destination


                Use `assistantId` to handoff the call to a saved assistant, or `assistantName` to handoff the call to an
                assistant in the same squad.


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123", // or "assistantName": "Assistant123"
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                2. Multiple destinations


                2.1. Multiple Tools, Each With One Destination (OpenAI recommended)


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123",
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        },
                      ],
                    },
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-456",
                          "description": "customer wants to be handed off to assistant-456",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                2.2. One Tool, Multiple Destinations (Anthropic recommended)


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123",
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        },
                        {
                          "type": "assistant",
                          "assistantId": "assistant-456",
                          "description": "customer wants to be handed off to assistant-456",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                3. Dynamic destination


                3.1 To determine the destination dynamically, supply a `dynamic` handoff destination type and a `server`
                object.
                    VAPI will send a handoff-destination-request webhook to the `server.url`.
                    The response from the server will be used as the destination (if valid).

                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "dynamic",
                          "server": {
                            "url": "https://example.com"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                3.2. To pass custom parameters to the server, you can use the `function` object.


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "dynamic",
                          "server": {
                            "url": "https://example.com"
                          },
                        }
                      ],
                      "function": {
                        "name": "handoff",
                        "description": "Call this function when the customer is ready to be handed off to the next assistant",
                        "parameters": {
                          "type": "object",
                          "properties": {
                            "destination": {
                              "type": "string",
                              "description": "Use dynamic when customer is ready to be handed off to the next assistant",
                              "enum": ["dynamic"]
                            },
                            "customerAreaCode": {
                              "type": "number",
                              "description": "Area code of the customer"
                            },
                            "customerIntent": {
                              "type": "string",
                              "enum": ["new-customer", "existing-customer"],
                              "description": "Use new-customer when customer is a new customer, existing-customer when customer is an existing customer"
                            },
                            "customerSentiment": {
                              "type": "string",
                              "enum": ["positive", "negative", "neutral"],
                              "description": "Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral"
                            }
                          }
                        }
                      }
                    }
                  ]
                }

                ```


                The properties `customerAreaCode`, `customerIntent`, and `customerSentiment` will be passed to the
                server in the webhook request body.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            function:
              $ref: '#/components/schemas/OpenAIFunction'
              description: >-
                This is the optional function definition that will be passed to the LLM.

                If this is not defined, we will construct this based on the other properties.


                For example, given the following tools definition:

                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123",
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        },
                        {
                          "type": "assistant",
                          "assistantId": "assistant-456",
                          "description": "customer wants to be handed off to assistant-456",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                We will construct the following function definition:

                ```json

                {
                  "function": {
                    "name": "handoff_to_assistant-123",
                    "description": "
                         Use this function to handoff the call to the next assistant.
                         Only use it when instructions explicitly ask you to use the handoff_to_assistant function.
                         DO NOT call this function unless you are instructed to do so.
                         Here are the destinations you can handoff the call to:
                         1. assistant-123. When: customer wants to be handed off to assistant-123
                         2. assistant-456. When: customer wants to be handed off to assistant-456
                    ",
                    "parameters": {
                      "type": "object",
                      "properties": {
                        "destination": {
                          "type": "string",
                          "description": "Options: assistant-123 (customer wants to be handed off to assistant-123), assistant-456 (customer wants to be handed off to assistant-456)",
                          "enum": ["assistant-123", "assistant-456"]
                        },
                      },
                      "required": ["destination"]
                    }
                  }
                }

                ```


                To override this function, please provide an OpenAI function definition and refer to it in the system
                prompt.

                You may override parts of the function definition (i.e. you may only want to change the function name
                for your prompt).

                If you choose to override the function parameters, it must include `destination` as a required
                parameter, and it must evaluate to either an assistantId, assistantName, or a the string literal
                `dynamic`.


                To pass custom parameters to the server in a dynamic handoff, you can use the function parameters, with
                `dynamic` as the destination.

                ```json

                {
                  "function": {
                    "name": "dynamic_handoff",
                    "description": "
                         Call this function when the customer is ready to be handed off to the next assistant
                    ",
                    "parameters": {
                      "type": "object",
                      "properties": {
                        "destination": {
                          "type": "string",
                          "enum": ["dynamic"]
                        },
                        "customerAreaCode": {
                          "type": "number",
                          "description": "Area code of the customer"
                        },
                        "customerIntent": {
                          "type": "string",
                          "enum": ["new-customer", "existing-customer"],
                          "description": "Use new-customer when customer is a new customer, existing-customer when customer is an existing customer"
                        },
                        "customerSentiment": {
                          "type": "string",
                          "enum": ["positive", "negative", "neutral"],
                          "description": "Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral"
                        }
                      },
                      "required": ["destination", "customerAreaCode", "customerIntent", "customerSentiment"]
                    }
                  }
                }

                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: handoff variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - bash
              description: 'Discriminator value: bash'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            subType:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashSubType'
              description: The sub type of tool.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            name:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashName'
              description: The name of the tool, fixed to 'bash'
          required:
            - type
            - subType
            - id
            - orgId
            - createdAt
            - updatedAt
            - name
          description: BashTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - computer
              description: 'Discriminator value: computer'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            subType:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerSubType'
              description: The sub type of tool.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            name:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerName'
              description: The name of the tool, fixed to 'computer'
            displayWidthPx:
              type: number
              format: double
              description: The display width in pixels
            displayHeightPx:
              type: number
              format: double
              description: The display height in pixels
            displayNumber:
              type: number
              format: double
              description: Optional display number
          required:
            - type
            - subType
            - id
            - orgId
            - createdAt
            - updatedAt
            - name
            - displayWidthPx
            - displayHeightPx
          description: ComputerTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - textEditor
              description: 'Discriminator value: textEditor'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            subType:
              $ref: >-
                #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType
              description: The sub type of tool.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            name:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorName'
              description: The name of the tool, fixed to 'str_replace_editor'
          required:
            - type
            - subType
            - id
            - orgId
            - createdAt
            - updatedAt
            - name
          description: TextEditorTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - query
              description: 'Discriminator value: query'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            knowledgeBases:
              type: array
              items:
                $ref: '#/components/schemas/KnowledgeBase'
              description: The knowledge bases to query
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: QueryTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - google.calendar.event.create
              description: 'Discriminator value: google.calendar.event.create'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoogleCalendarCreateEventTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - google.sheets.row.append
              description: 'Discriminator value: google.sheets.row.append'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoogleSheetsRowAppendTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - google.calendar.availability.check
              description: 'Discriminator value: google.calendar.availability.check'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoogleCalendarCheckAvailabilityTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - slack.message.send
              description: 'Discriminator value: slack.message.send'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: SlackSendMessageTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - sms
              description: 'Discriminator value: sms'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: SmsTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - mcp
              description: 'Discriminator value: mcp'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            toolMessages:
              type: array
              items:
                $ref: '#/components/schemas/McpToolMessages'
              description: >-
                Per-tool message overrides for individual tools loaded from the MCP server. Set messages to an empty
                array to suppress messages for a specific tool. Tools not listed here will use the default messages from
                the parent tool.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            metadata:
              $ref: '#/components/schemas/McpToolMetadata'
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: McpTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.calendar.availability.check
              description: 'Discriminator value: gohighlevel.calendar.availability.check'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoHighLevelCalendarAvailabilityTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.calendar.event.create
              description: 'Discriminator value: gohighlevel.calendar.event.create'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoHighLevelCalendarEventCreateTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.contact.create
              description: 'Discriminator value: gohighlevel.contact.create'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoHighLevelContactCreateTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.contact.get
              description: 'Discriminator value: gohighlevel.contact.get'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoHighLevelContactGetTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - sipRequest
              description: 'Discriminator value: sipRequest'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            verb:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb'
              description: The SIP method to send.
            headers:
              $ref: '#/components/schemas/JsonSchema'
              description: JSON schema for headers the model should populate when sending the SIP request.
            body:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody'
              description: >-
                Body to include in the SIP request. Either a literal string body, or a JSON schema describing a
                structured body that the model should populate.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - verb
            - id
            - orgId
            - createdAt
            - updatedAt
          description: sipRequest variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - voicemail
              description: 'Discriminator value: voicemail'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            beepDetectionEnabled:
              type: boolean
              default: false
              description: >-
                This is the flag that enables beep detection for voicemail detection and applies only for twilio based
                calls.


                @default false
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: voicemail variant
      discriminator:
        propertyName: type
      title: ToolGetResponsesContentApplicationJsonSchemaItems
    tools_create_Request:
      oneOf:
        - type: object
          properties:
            type:
              type: string
              enum:
                - apiRequest
              description: 'Discriminator value: apiRequest'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            method:
              $ref: '#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod'
            timeoutSeconds:
              type: number
              format: double
              description: |-
                This is the timeout in seconds for the request. Defaults to 20 seconds.

                @default 20
            credentialId:
              type: string
              description: The credential ID for API request authentication
            encryptedPaths:
              type: array
              items:
                type: string
              description: This is the paths to encrypt in the request body if credentialId and encryptionPlan are defined.
            parameters:
              type: array
              items:
                $ref: '#/components/schemas/ToolParameter'
              description: Static key-value pairs merged into the request body. Values support Liquid templates.
            name:
              type: string
              description: |-
                This is the name of the tool. This will be passed to the model.

                Must be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 40.
            description:
              type: string
              description: This is the description of the tool. This will be passed to the model.
            url:
              type: string
              description: This is where the request will be sent.
            body:
              $ref: '#/components/schemas/JsonSchema'
              description: This is the body of the request.
            headers:
              $ref: '#/components/schemas/JsonSchema'
              description: These are the headers to send with the request.
            backoffPlan:
              $ref: '#/components/schemas/BackoffPlan'
              description: |-
                This is the backoff plan if the request fails. Defaults to undefined (the request will not be retried).

                @default undefined (the request will not be retried)
            variableExtractionPlan:
              $ref: '#/components/schemas/VariableExtractionPlan'
              description: >-
                This is the plan to extract variables from the tool's response. These will be accessible during the call
                and stored in `call.artifact.variableValues` after the call.


                Usage:

                1. Use `aliases` to extract variables from the tool's response body. (Most common case)


                ```json

                {
                  "aliases": [
                    {
                      "key": "customerName",
                      "value": "{{customer.name}}"
                    },
                    {
                      "key": "customerAge",
                      "value": "{{customer.age}}"
                    }
                  ]
                }

                ```


                The tool response body is made available to the liquid template.


                2. Use `aliases` to extract variables from the tool's response body if the response is an array.


                ```json

                {
                  "aliases": [
                    {
                      "key": "customerName",
                      "value": "{{$[0].name}}"
                    },
                    {
                      "key": "customerAge",
                      "value": "{{$[0].age}}"
                    }
                  ]
                }

                ```


                $ is a shorthand for the tool's response body. `$[0]` is the first item in the array. `$[n]` is the nth
                item in the array. Note, $ is available regardless of the response body type (both object and array).


                3. Use `aliases` to extract variables from the tool's response headers.


                ```json

                {
                  "aliases": [
                    {
                      "key": "customerName",
                      "value": "{{tool.response.headers.customer-name}}"
                    },
                    {
                      "key": "customerAge",
                      "value": "{{tool.response.headers.customer-age}}"
                    }
                  ]
                }

                ```


                `tool.response` is made available to the liquid template. Particularly, both `tool.response.headers` and
                `tool.response.body` are available. Note, `tool.response` is available regardless of the response body
                type (both object and array).


                4. Use `schema` to extract a large portion of the tool's response body.


                4.1. If you hit example.com and it returns `{"name": "John", "age": 30}`, then you can specify the
                schema as:


                ```json

                {
                  "schema": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "string"
                      },
                      "age": {
                        "type": "number"
                      }
                    }
                  }
                }

                ```

                These will be extracted as `{{ name }}` and `{{ age }}` respectively. To emphasize, object properties
                are extracted as direct global variables.


                4.2. If you hit example.com and it returns `{"name": {"first": "John", "last": "Doe"}}`, then you can
                specify the schema as:


                ```json

                {
                  "schema": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "object",
                        "properties": {
                          "first": {
                            "type": "string"
                          },
                          "last": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }

                ```


                These will be extracted as `{{ name }}`. And, `{{ name.first }}` and `{{ name.last }}` will be
                accessible.


                4.3. If you hit example.com and it returns `["94123", "94124"]`, then you can specify the schema as:


                ```json

                {
                  "schema": {
                    "type": "array",
                    "title": "zipCodes",
                    "items": {
                      "type": "string"
                    }
                  }
                }

                ```


                This will be extracted as `{{ zipCodes }}`. To access the array items, you can use `{{ zipCodes[0] }}`
                and `{{ zipCodes[1] }}`.


                4.4. If you hit example.com and it returns `[{"name": "John", "age": 30, "zipCodes": ["94123",
                "94124"]}, {"name": "Jane", "age": 25, "zipCodes": ["94125", "94126"]}]`, then you can specify the
                schema as:


                ```json

                {
                  "schema": {
                    "type": "array",
                    "title": "people",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "age": {
                          "type": "number"
                        },
                        "zipCodes": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }

                ```


                This will be extracted as `{{ people }}`. To access the array items, you can use `{{ people[n].name }}`,
                `{{ people[n].age }}`, `{{ people[n].zipCodes }}`, `{{ people[n].zipCodes[0] }}` and `{{
                people[n].zipCodes[1] }}`.


                Note: Both `aliases` and `schema` can be used together.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - method
            - url
          description: CreateApiRequestToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - dtmf
              description: 'Discriminator value: dtmf'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            sipInfoDtmfEnabled:
              type: boolean
              default: false
              description: >-
                This enables sending DTMF tones via SIP INFO messages instead of RFC 2833 (RTP events). When enabled,
                DTMF digits will be sent using the SIP INFO method, which can be more reliable in some network
                configurations. Only relevant when using the `vapi.sip` transport.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: CreateDtmfToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - endCall
              description: 'Discriminator value: endCall'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: CreateEndCallToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - function
              description: 'Discriminator value: function'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            async:
              type: boolean
              description: |-
                This determines if the tool is async.

                  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.

                  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.

                  Defaults to synchronous (`false`).
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            variableExtractionPlan:
              $ref: '#/components/schemas/VariableExtractionPlan'
              description: Plan to extract variables from the tool response
            parameters:
              type: array
              items:
                $ref: '#/components/schemas/ToolParameter'
              description: Static key-value pairs merged into the request body. Values support Liquid templates.
            function:
              $ref: '#/components/schemas/OpenAIFunction'
              description: This is the function definition of the tool.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: CreateFunctionToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - transferCall
              description: 'Discriminator value: transferCall'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            destinations:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems
              description: >-
                These are the destinations that the call can be transferred to. If no destinations are provided,
                server.url will be used to get the transfer destination once the tool is called.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: CreateTransferCallToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - handoff
              description: 'Discriminator value: handoff'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            defaultResult:
              type: string
              description: This is the default local tool result message used when no runtime handoff result override is returned.
            destinations:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems
              description: >-
                These are the destinations that the call can be handed off to.


                Usage:

                1. Single destination


                Use `assistantId` to handoff the call to a saved assistant, or `assistantName` to handoff the call to an
                assistant in the same squad.


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123", // or "assistantName": "Assistant123"
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                2. Multiple destinations


                2.1. Multiple Tools, Each With One Destination (OpenAI recommended)


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123",
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        },
                      ],
                    },
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-456",
                          "description": "customer wants to be handed off to assistant-456",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                2.2. One Tool, Multiple Destinations (Anthropic recommended)


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123",
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        },
                        {
                          "type": "assistant",
                          "assistantId": "assistant-456",
                          "description": "customer wants to be handed off to assistant-456",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                3. Dynamic destination


                3.1 To determine the destination dynamically, supply a `dynamic` handoff destination type and a `server`
                object.
                    VAPI will send a handoff-destination-request webhook to the `server.url`.
                    The response from the server will be used as the destination (if valid).

                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "dynamic",
                          "server": {
                            "url": "https://example.com"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                3.2. To pass custom parameters to the server, you can use the `function` object.


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "dynamic",
                          "server": {
                            "url": "https://example.com"
                          },
                        }
                      ],
                      "function": {
                        "name": "handoff",
                        "description": "Call this function when the customer is ready to be handed off to the next assistant",
                        "parameters": {
                          "type": "object",
                          "properties": {
                            "destination": {
                              "type": "string",
                              "description": "Use dynamic when customer is ready to be handed off to the next assistant",
                              "enum": ["dynamic"]
                            },
                            "customerAreaCode": {
                              "type": "number",
                              "description": "Area code of the customer"
                            },
                            "customerIntent": {
                              "type": "string",
                              "enum": ["new-customer", "existing-customer"],
                              "description": "Use new-customer when customer is a new customer, existing-customer when customer is an existing customer"
                            },
                            "customerSentiment": {
                              "type": "string",
                              "enum": ["positive", "negative", "neutral"],
                              "description": "Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral"
                            }
                          }
                        }
                      }
                    }
                  ]
                }

                ```


                The properties `customerAreaCode`, `customerIntent`, and `customerSentiment` will be passed to the
                server in the webhook request body.
            function:
              $ref: '#/components/schemas/OpenAIFunction'
              description: >-
                This is the optional function definition that will be passed to the LLM.

                If this is not defined, we will construct this based on the other properties.


                For example, given the following tools definition:

                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123",
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        },
                        {
                          "type": "assistant",
                          "assistantId": "assistant-456",
                          "description": "customer wants to be handed off to assistant-456",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                We will construct the following function definition:

                ```json

                {
                  "function": {
                    "name": "handoff_to_assistant-123",
                    "description": "
                         Use this function to handoff the call to the next assistant.
                         Only use it when instructions explicitly ask you to use the handoff_to_assistant function.
                         DO NOT call this function unless you are instructed to do so.
                         Here are the destinations you can handoff the call to:
                         1. assistant-123. When: customer wants to be handed off to assistant-123
                         2. assistant-456. When: customer wants to be handed off to assistant-456
                    ",
                    "parameters": {
                      "type": "object",
                      "properties": {
                        "destination": {
                          "type": "string",
                          "description": "Options: assistant-123 (customer wants to be handed off to assistant-123), assistant-456 (customer wants to be handed off to assistant-456)",
                          "enum": ["assistant-123", "assistant-456"]
                        },
                      },
                      "required": ["destination"]
                    }
                  }
                }

                ```


                To override this function, please provide an OpenAI function definition and refer to it in the system
                prompt.

                You may override parts of the function definition (i.e. you may only want to change the function name
                for your prompt).

                If you choose to override the function parameters, it must include `destination` as a required
                parameter, and it must evaluate to either an assistantId, assistantName, or a the string literal
                `dynamic`.


                To pass custom parameters to the server in a dynamic handoff, you can use the function parameters, with
                `dynamic` as the destination.

                ```json

                {
                  "function": {
                    "name": "dynamic_handoff",
                    "description": "
                         Call this function when the customer is ready to be handed off to the next assistant
                    ",
                    "parameters": {
                      "type": "object",
                      "properties": {
                        "destination": {
                          "type": "string",
                          "enum": ["dynamic"]
                        },
                        "customerAreaCode": {
                          "type": "number",
                          "description": "Area code of the customer"
                        },
                        "customerIntent": {
                          "type": "string",
                          "enum": ["new-customer", "existing-customer"],
                          "description": "Use new-customer when customer is a new customer, existing-customer when customer is an existing customer"
                        },
                        "customerSentiment": {
                          "type": "string",
                          "enum": ["positive", "negative", "neutral"],
                          "description": "Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral"
                        }
                      },
                      "required": ["destination", "customerAreaCode", "customerIntent", "customerSentiment"]
                    }
                  }
                }

                ```
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: handoff variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - bash
              description: 'Discriminator value: bash'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            subType:
              $ref: '#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashSubType'
              description: The sub type of tool.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            name:
              $ref: '#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBashName'
              description: The name of the tool, fixed to 'bash'
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - subType
            - name
          description: CreateBashToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - computer
              description: 'Discriminator value: computer'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            subType:
              $ref: '#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerSubType'
              description: The sub type of tool.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            name:
              $ref: '#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingComputerName'
              description: The name of the tool, fixed to 'computer'
            displayWidthPx:
              type: number
              format: double
              description: The display width in pixels
            displayHeightPx:
              type: number
              format: double
              description: The display height in pixels
            displayNumber:
              type: number
              format: double
              description: Optional display number
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - subType
            - name
            - displayWidthPx
            - displayHeightPx
          description: CreateComputerToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - textEditor
              description: 'Discriminator value: textEditor'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            subType:
              $ref: >-
                #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType
              description: The sub type of tool.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            name:
              $ref: '#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextEditorName'
              description: The name of the tool, fixed to 'str_replace_editor'
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - subType
            - name
          description: CreateTextEditorToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - query
              description: 'Discriminator value: query'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            knowledgeBases:
              type: array
              items:
                $ref: '#/components/schemas/KnowledgeBase'
              description: The knowledge bases to query
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: CreateQueryToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - google.calendar.event.create
              description: 'Discriminator value: google.calendar.event.create'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: CreateGoogleCalendarCreateEventToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - google.sheets.row.append
              description: 'Discriminator value: google.sheets.row.append'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: CreateGoogleSheetsRowAppendToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - google.calendar.availability.check
              description: 'Discriminator value: google.calendar.availability.check'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: CreateGoogleCalendarCheckAvailabilityToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - slack.message.send
              description: 'Discriminator value: slack.message.send'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: CreateSlackSendMessageToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - sms
              description: 'Discriminator value: sms'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: CreateSmsToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - mcp
              description: 'Discriminator value: mcp'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            toolMessages:
              type: array
              items:
                $ref: '#/components/schemas/McpToolMessages'
              description: >-
                Per-tool message overrides for individual tools loaded from the MCP server. Set messages to an empty
                array to suppress messages for a specific tool. Tools not listed here will use the default messages from
                the parent tool.
            metadata:
              $ref: '#/components/schemas/McpToolMetadata'
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: CreateMcpToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.calendar.availability.check
              description: 'Discriminator value: gohighlevel.calendar.availability.check'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: CreateGoHighLevelCalendarAvailabilityToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.calendar.event.create
              description: 'Discriminator value: gohighlevel.calendar.event.create'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: CreateGoHighLevelCalendarEventCreateToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.contact.create
              description: 'Discriminator value: gohighlevel.contact.create'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: CreateGoHighLevelContactCreateToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.contact.get
              description: 'Discriminator value: gohighlevel.contact.get'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: CreateGoHighLevelContactGetToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - sipRequest
              description: 'Discriminator value: sipRequest'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            verb:
              $ref: '#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb'
              description: The SIP method to send.
            headers:
              $ref: '#/components/schemas/JsonSchema'
              description: JSON schema for headers the model should populate when sending the SIP request.
            body:
              $ref: '#/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody'
              description: >-
                Body to include in the SIP request. Either a literal string body, or a JSON schema describing a
                structured body that the model should populate.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - verb
          description: sipRequest variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - voicemail
              description: 'Discriminator value: voicemail'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            beepDetectionEnabled:
              type: boolean
              default: false
              description: >-
                This is the flag that enables beep detection for voicemail detection and applies only for twilio based
                calls.


                @default false
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: voicemail variant
      discriminator:
        propertyName: type
      title: tools_create_Request
    tools_create_Response_201:
      oneOf:
        - type: object
          properties:
            type:
              type: string
              enum:
                - apiRequest
              description: 'Discriminator value: apiRequest'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            method:
              $ref: >-
                #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod
            timeoutSeconds:
              type: number
              format: double
              description: |-
                This is the timeout in seconds for the request. Defaults to 20 seconds.

                @default 20
            credentialId:
              type: string
              description: The credential ID for API request authentication
            encryptedPaths:
              type: array
              items:
                type: string
              description: This is the paths to encrypt in the request body if credentialId and encryptionPlan are defined.
            parameters:
              type: array
              items:
                $ref: '#/components/schemas/ToolParameter'
              description: Static key-value pairs merged into the request body. Values support Liquid templates.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            name:
              type: string
              description: |-
                This is the name of the tool. This will be passed to the model.

                Must be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 40.
            description:
              type: string
              description: This is the description of the tool. This will be passed to the model.
            url:
              type: string
              description: This is where the request will be sent.
            body:
              $ref: '#/components/schemas/JsonSchema'
              description: This is the body of the request.
            headers:
              $ref: '#/components/schemas/JsonSchema'
              description: These are the headers to send with the request.
            backoffPlan:
              $ref: '#/components/schemas/BackoffPlan'
              description: |-
                This is the backoff plan if the request fails. Defaults to undefined (the request will not be retried).

                @default undefined (the request will not be retried)
            variableExtractionPlan:
              $ref: '#/components/schemas/VariableExtractionPlan'
              description: >-
                This is the plan to extract variables from the tool's response. These will be accessible during the call
                and stored in `call.artifact.variableValues` after the call.


                Usage:

                1. Use `aliases` to extract variables from the tool's response body. (Most common case)


                ```json

                {
                  "aliases": [
                    {
                      "key": "customerName",
                      "value": "{{customer.name}}"
                    },
                    {
                      "key": "customerAge",
                      "value": "{{customer.age}}"
                    }
                  ]
                }

                ```


                The tool response body is made available to the liquid template.


                2. Use `aliases` to extract variables from the tool's response body if the response is an array.


                ```json

                {
                  "aliases": [
                    {
                      "key": "customerName",
                      "value": "{{$[0].name}}"
                    },
                    {
                      "key": "customerAge",
                      "value": "{{$[0].age}}"
                    }
                  ]
                }

                ```


                $ is a shorthand for the tool's response body. `$[0]` is the first item in the array. `$[n]` is the nth
                item in the array. Note, $ is available regardless of the response body type (both object and array).


                3. Use `aliases` to extract variables from the tool's response headers.


                ```json

                {
                  "aliases": [
                    {
                      "key": "customerName",
                      "value": "{{tool.response.headers.customer-name}}"
                    },
                    {
                      "key": "customerAge",
                      "value": "{{tool.response.headers.customer-age}}"
                    }
                  ]
                }

                ```


                `tool.response` is made available to the liquid template. Particularly, both `tool.response.headers` and
                `tool.response.body` are available. Note, `tool.response` is available regardless of the response body
                type (both object and array).


                4. Use `schema` to extract a large portion of the tool's response body.


                4.1. If you hit example.com and it returns `{"name": "John", "age": 30}`, then you can specify the
                schema as:


                ```json

                {
                  "schema": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "string"
                      },
                      "age": {
                        "type": "number"
                      }
                    }
                  }
                }

                ```

                These will be extracted as `{{ name }}` and `{{ age }}` respectively. To emphasize, object properties
                are extracted as direct global variables.


                4.2. If you hit example.com and it returns `{"name": {"first": "John", "last": "Doe"}}`, then you can
                specify the schema as:


                ```json

                {
                  "schema": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "object",
                        "properties": {
                          "first": {
                            "type": "string"
                          },
                          "last": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }

                ```


                These will be extracted as `{{ name }}`. And, `{{ name.first }}` and `{{ name.last }}` will be
                accessible.


                4.3. If you hit example.com and it returns `["94123", "94124"]`, then you can specify the schema as:


                ```json

                {
                  "schema": {
                    "type": "array",
                    "title": "zipCodes",
                    "items": {
                      "type": "string"
                    }
                  }
                }

                ```


                This will be extracted as `{{ zipCodes }}`. To access the array items, you can use `{{ zipCodes[0] }}`
                and `{{ zipCodes[1] }}`.


                4.4. If you hit example.com and it returns `[{"name": "John", "age": 30, "zipCodes": ["94123",
                "94124"]}, {"name": "Jane", "age": 25, "zipCodes": ["94125", "94126"]}]`, then you can specify the
                schema as:


                ```json

                {
                  "schema": {
                    "type": "array",
                    "title": "people",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "age": {
                          "type": "number"
                        },
                        "zipCodes": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }

                ```


                This will be extracted as `{{ people }}`. To access the array items, you can use `{{ people[n].name }}`,
                `{{ people[n].age }}`, `{{ people[n].zipCodes }}`, `{{ people[n].zipCodes[0] }}` and `{{
                people[n].zipCodes[1] }}`.


                Note: Both `aliases` and `schema` can be used together.
          required:
            - type
            - method
            - id
            - orgId
            - createdAt
            - updatedAt
            - url
          description: apiRequest variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - code
              description: 'Discriminator value: code'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingCodeMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            async:
              type: boolean
              description: |-
                This determines if the tool is async.

                  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.

                  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.

                  Defaults to synchronous (`false`).
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            code:
              type: string
              description: TypeScript code to execute when the tool is called
            environmentVariables:
              type: array
              items:
                $ref: '#/components/schemas/CodeToolEnvironmentVariable'
              description: Environment variables available in code via `env` object
            timeoutSeconds:
              type: number
              format: double
              description: |-
                This is the timeout in seconds for the code execution. Defaults to 10 seconds.
                Maximum is 30 seconds to prevent abuse.

                @default 10
            credentialId:
              type: string
              description: Credential ID containing the Val Town API key
            variableExtractionPlan:
              $ref: '#/components/schemas/VariableExtractionPlan'
              description: Plan to extract variables from the tool response
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            function:
              $ref: '#/components/schemas/OpenAIFunction'
              description: |-
                This is the function definition of the tool.

                For the Code tool, this defines the name, description, and parameters that the model
                will use to understand when and how to call this tool.
          required:
            - type
            - code
            - id
            - orgId
            - createdAt
            - updatedAt
          description: code variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - dtmf
              description: 'Discriminator value: dtmf'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            sipInfoDtmfEnabled:
              type: boolean
              default: false
              description: >-
                This enables sending DTMF tones via SIP INFO messages instead of RFC 2833 (RTP events). When enabled,
                DTMF digits will be sent using the SIP INFO method, which can be more reliable in some network
                configurations. Only relevant when using the `vapi.sip` transport.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: DtmfTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - endCall
              description: 'Discriminator value: endCall'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: EndCallTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - function
              description: 'Discriminator value: function'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            async:
              type: boolean
              description: |-
                This determines if the tool is async.

                  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.

                  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.

                  Defaults to synchronous (`false`).
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            variableExtractionPlan:
              $ref: '#/components/schemas/VariableExtractionPlan'
              description: Plan to extract variables from the tool response
            parameters:
              type: array
              items:
                $ref: '#/components/schemas/ToolParameter'
              description: Static key-value pairs merged into the request body. Values support Liquid templates.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            function:
              $ref: '#/components/schemas/OpenAIFunction'
              description: This is the function definition of the tool.
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: FunctionTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - transferCall
              description: 'Discriminator value: transferCall'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            destinations:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems
              description: >-
                These are the destinations that the call can be transferred to. If no destinations are provided,
                server.url will be used to get the transfer destination once the tool is called.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: TransferCallTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - handoff
              description: 'Discriminator value: handoff'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            defaultResult:
              type: string
              description: This is the default local tool result message used when no runtime handoff result override is returned.
            destinations:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems
              description: >-
                These are the destinations that the call can be handed off to.


                Usage:

                1. Single destination


                Use `assistantId` to handoff the call to a saved assistant, or `assistantName` to handoff the call to an
                assistant in the same squad.


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123", // or "assistantName": "Assistant123"
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                2. Multiple destinations


                2.1. Multiple Tools, Each With One Destination (OpenAI recommended)


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123",
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        },
                      ],
                    },
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-456",
                          "description": "customer wants to be handed off to assistant-456",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                2.2. One Tool, Multiple Destinations (Anthropic recommended)


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123",
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        },
                        {
                          "type": "assistant",
                          "assistantId": "assistant-456",
                          "description": "customer wants to be handed off to assistant-456",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                3. Dynamic destination


                3.1 To determine the destination dynamically, supply a `dynamic` handoff destination type and a `server`
                object.
                    VAPI will send a handoff-destination-request webhook to the `server.url`.
                    The response from the server will be used as the destination (if valid).

                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "dynamic",
                          "server": {
                            "url": "https://example.com"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                3.2. To pass custom parameters to the server, you can use the `function` object.


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "dynamic",
                          "server": {
                            "url": "https://example.com"
                          },
                        }
                      ],
                      "function": {
                        "name": "handoff",
                        "description": "Call this function when the customer is ready to be handed off to the next assistant",
                        "parameters": {
                          "type": "object",
                          "properties": {
                            "destination": {
                              "type": "string",
                              "description": "Use dynamic when customer is ready to be handed off to the next assistant",
                              "enum": ["dynamic"]
                            },
                            "customerAreaCode": {
                              "type": "number",
                              "description": "Area code of the customer"
                            },
                            "customerIntent": {
                              "type": "string",
                              "enum": ["new-customer", "existing-customer"],
                              "description": "Use new-customer when customer is a new customer, existing-customer when customer is an existing customer"
                            },
                            "customerSentiment": {
                              "type": "string",
                              "enum": ["positive", "negative", "neutral"],
                              "description": "Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral"
                            }
                          }
                        }
                      }
                    }
                  ]
                }

                ```


                The properties `customerAreaCode`, `customerIntent`, and `customerSentiment` will be passed to the
                server in the webhook request body.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            function:
              $ref: '#/components/schemas/OpenAIFunction'
              description: >-
                This is the optional function definition that will be passed to the LLM.

                If this is not defined, we will construct this based on the other properties.


                For example, given the following tools definition:

                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123",
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        },
                        {
                          "type": "assistant",
                          "assistantId": "assistant-456",
                          "description": "customer wants to be handed off to assistant-456",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                We will construct the following function definition:

                ```json

                {
                  "function": {
                    "name": "handoff_to_assistant-123",
                    "description": "
                         Use this function to handoff the call to the next assistant.
                         Only use it when instructions explicitly ask you to use the handoff_to_assistant function.
                         DO NOT call this function unless you are instructed to do so.
                         Here are the destinations you can handoff the call to:
                         1. assistant-123. When: customer wants to be handed off to assistant-123
                         2. assistant-456. When: customer wants to be handed off to assistant-456
                    ",
                    "parameters": {
                      "type": "object",
                      "properties": {
                        "destination": {
                          "type": "string",
                          "description": "Options: assistant-123 (customer wants to be handed off to assistant-123), assistant-456 (customer wants to be handed off to assistant-456)",
                          "enum": ["assistant-123", "assistant-456"]
                        },
                      },
                      "required": ["destination"]
                    }
                  }
                }

                ```


                To override this function, please provide an OpenAI function definition and refer to it in the system
                prompt.

                You may override parts of the function definition (i.e. you may only want to change the function name
                for your prompt).

                If you choose to override the function parameters, it must include `destination` as a required
                parameter, and it must evaluate to either an assistantId, assistantName, or a the string literal
                `dynamic`.


                To pass custom parameters to the server in a dynamic handoff, you can use the function parameters, with
                `dynamic` as the destination.

                ```json

                {
                  "function": {
                    "name": "dynamic_handoff",
                    "description": "
                         Call this function when the customer is ready to be handed off to the next assistant
                    ",
                    "parameters": {
                      "type": "object",
                      "properties": {
                        "destination": {
                          "type": "string",
                          "enum": ["dynamic"]
                        },
                        "customerAreaCode": {
                          "type": "number",
                          "description": "Area code of the customer"
                        },
                        "customerIntent": {
                          "type": "string",
                          "enum": ["new-customer", "existing-customer"],
                          "description": "Use new-customer when customer is a new customer, existing-customer when customer is an existing customer"
                        },
                        "customerSentiment": {
                          "type": "string",
                          "enum": ["positive", "negative", "neutral"],
                          "description": "Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral"
                        }
                      },
                      "required": ["destination", "customerAreaCode", "customerIntent", "customerSentiment"]
                    }
                  }
                }

                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: handoff variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - bash
              description: 'Discriminator value: bash'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            subType:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashSubType'
              description: The sub type of tool.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            name:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashName'
              description: The name of the tool, fixed to 'bash'
          required:
            - type
            - subType
            - id
            - orgId
            - createdAt
            - updatedAt
            - name
          description: BashTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - computer
              description: 'Discriminator value: computer'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            subType:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerSubType'
              description: The sub type of tool.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            name:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerName'
              description: The name of the tool, fixed to 'computer'
            displayWidthPx:
              type: number
              format: double
              description: The display width in pixels
            displayHeightPx:
              type: number
              format: double
              description: The display height in pixels
            displayNumber:
              type: number
              format: double
              description: Optional display number
          required:
            - type
            - subType
            - id
            - orgId
            - createdAt
            - updatedAt
            - name
            - displayWidthPx
            - displayHeightPx
          description: ComputerTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - textEditor
              description: 'Discriminator value: textEditor'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            subType:
              $ref: >-
                #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType
              description: The sub type of tool.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            name:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorName'
              description: The name of the tool, fixed to 'str_replace_editor'
          required:
            - type
            - subType
            - id
            - orgId
            - createdAt
            - updatedAt
            - name
          description: TextEditorTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - query
              description: 'Discriminator value: query'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            knowledgeBases:
              type: array
              items:
                $ref: '#/components/schemas/KnowledgeBase'
              description: The knowledge bases to query
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: QueryTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - google.calendar.event.create
              description: 'Discriminator value: google.calendar.event.create'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoogleCalendarCreateEventTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - google.sheets.row.append
              description: 'Discriminator value: google.sheets.row.append'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoogleSheetsRowAppendTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - google.calendar.availability.check
              description: 'Discriminator value: google.calendar.availability.check'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoogleCalendarCheckAvailabilityTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - slack.message.send
              description: 'Discriminator value: slack.message.send'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: SlackSendMessageTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - sms
              description: 'Discriminator value: sms'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: SmsTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - mcp
              description: 'Discriminator value: mcp'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            toolMessages:
              type: array
              items:
                $ref: '#/components/schemas/McpToolMessages'
              description: >-
                Per-tool message overrides for individual tools loaded from the MCP server. Set messages to an empty
                array to suppress messages for a specific tool. Tools not listed here will use the default messages from
                the parent tool.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            metadata:
              $ref: '#/components/schemas/McpToolMetadata'
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: McpTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.calendar.availability.check
              description: 'Discriminator value: gohighlevel.calendar.availability.check'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoHighLevelCalendarAvailabilityTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.calendar.event.create
              description: 'Discriminator value: gohighlevel.calendar.event.create'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoHighLevelCalendarEventCreateTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.contact.create
              description: 'Discriminator value: gohighlevel.contact.create'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoHighLevelContactCreateTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.contact.get
              description: 'Discriminator value: gohighlevel.contact.get'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoHighLevelContactGetTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - sipRequest
              description: 'Discriminator value: sipRequest'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            verb:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb'
              description: The SIP method to send.
            headers:
              $ref: '#/components/schemas/JsonSchema'
              description: JSON schema for headers the model should populate when sending the SIP request.
            body:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody'
              description: >-
                Body to include in the SIP request. Either a literal string body, or a JSON schema describing a
                structured body that the model should populate.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - verb
            - id
            - orgId
            - createdAt
            - updatedAt
          description: sipRequest variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - voicemail
              description: 'Discriminator value: voicemail'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            beepDetectionEnabled:
              type: boolean
              default: false
              description: >-
                This is the flag that enables beep detection for voicemail detection and applies only for twilio based
                calls.


                @default false
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: voicemail variant
      discriminator:
        propertyName: type
      title: tools_create_Response_201
    tools_get_Response_200:
      oneOf:
        - type: object
          properties:
            type:
              type: string
              enum:
                - apiRequest
              description: 'Discriminator value: apiRequest'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            method:
              $ref: >-
                #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod
            timeoutSeconds:
              type: number
              format: double
              description: |-
                This is the timeout in seconds for the request. Defaults to 20 seconds.

                @default 20
            credentialId:
              type: string
              description: The credential ID for API request authentication
            encryptedPaths:
              type: array
              items:
                type: string
              description: This is the paths to encrypt in the request body if credentialId and encryptionPlan are defined.
            parameters:
              type: array
              items:
                $ref: '#/components/schemas/ToolParameter'
              description: Static key-value pairs merged into the request body. Values support Liquid templates.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            name:
              type: string
              description: |-
                This is the name of the tool. This will be passed to the model.

                Must be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 40.
            description:
              type: string
              description: This is the description of the tool. This will be passed to the model.
            url:
              type: string
              description: This is where the request will be sent.
            body:
              $ref: '#/components/schemas/JsonSchema'
              description: This is the body of the request.
            headers:
              $ref: '#/components/schemas/JsonSchema'
              description: These are the headers to send with the request.
            backoffPlan:
              $ref: '#/components/schemas/BackoffPlan'
              description: |-
                This is the backoff plan if the request fails. Defaults to undefined (the request will not be retried).

                @default undefined (the request will not be retried)
            variableExtractionPlan:
              $ref: '#/components/schemas/VariableExtractionPlan'
              description: >-
                This is the plan to extract variables from the tool's response. These will be accessible during the call
                and stored in `call.artifact.variableValues` after the call.


                Usage:

                1. Use `aliases` to extract variables from the tool's response body. (Most common case)


                ```json

                {
                  "aliases": [
                    {
                      "key": "customerName",
                      "value": "{{customer.name}}"
                    },
                    {
                      "key": "customerAge",
                      "value": "{{customer.age}}"
                    }
                  ]
                }

                ```


                The tool response body is made available to the liquid template.


                2. Use `aliases` to extract variables from the tool's response body if the response is an array.


                ```json

                {
                  "aliases": [
                    {
                      "key": "customerName",
                      "value": "{{$[0].name}}"
                    },
                    {
                      "key": "customerAge",
                      "value": "{{$[0].age}}"
                    }
                  ]
                }

                ```


                $ is a shorthand for the tool's response body. `$[0]` is the first item in the array. `$[n]` is the nth
                item in the array. Note, $ is available regardless of the response body type (both object and array).


                3. Use `aliases` to extract variables from the tool's response headers.


                ```json

                {
                  "aliases": [
                    {
                      "key": "customerName",
                      "value": "{{tool.response.headers.customer-name}}"
                    },
                    {
                      "key": "customerAge",
                      "value": "{{tool.response.headers.customer-age}}"
                    }
                  ]
                }

                ```


                `tool.response` is made available to the liquid template. Particularly, both `tool.response.headers` and
                `tool.response.body` are available. Note, `tool.response` is available regardless of the response body
                type (both object and array).


                4. Use `schema` to extract a large portion of the tool's response body.


                4.1. If you hit example.com and it returns `{"name": "John", "age": 30}`, then you can specify the
                schema as:


                ```json

                {
                  "schema": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "string"
                      },
                      "age": {
                        "type": "number"
                      }
                    }
                  }
                }

                ```

                These will be extracted as `{{ name }}` and `{{ age }}` respectively. To emphasize, object properties
                are extracted as direct global variables.


                4.2. If you hit example.com and it returns `{"name": {"first": "John", "last": "Doe"}}`, then you can
                specify the schema as:


                ```json

                {
                  "schema": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "object",
                        "properties": {
                          "first": {
                            "type": "string"
                          },
                          "last": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }

                ```


                These will be extracted as `{{ name }}`. And, `{{ name.first }}` and `{{ name.last }}` will be
                accessible.


                4.3. If you hit example.com and it returns `["94123", "94124"]`, then you can specify the schema as:


                ```json

                {
                  "schema": {
                    "type": "array",
                    "title": "zipCodes",
                    "items": {
                      "type": "string"
                    }
                  }
                }

                ```


                This will be extracted as `{{ zipCodes }}`. To access the array items, you can use `{{ zipCodes[0] }}`
                and `{{ zipCodes[1] }}`.


                4.4. If you hit example.com and it returns `[{"name": "John", "age": 30, "zipCodes": ["94123",
                "94124"]}, {"name": "Jane", "age": 25, "zipCodes": ["94125", "94126"]}]`, then you can specify the
                schema as:


                ```json

                {
                  "schema": {
                    "type": "array",
                    "title": "people",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "age": {
                          "type": "number"
                        },
                        "zipCodes": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }

                ```


                This will be extracted as `{{ people }}`. To access the array items, you can use `{{ people[n].name }}`,
                `{{ people[n].age }}`, `{{ people[n].zipCodes }}`, `{{ people[n].zipCodes[0] }}` and `{{
                people[n].zipCodes[1] }}`.


                Note: Both `aliases` and `schema` can be used together.
          required:
            - type
            - method
            - id
            - orgId
            - createdAt
            - updatedAt
            - url
          description: apiRequest variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - code
              description: 'Discriminator value: code'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingCodeMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            async:
              type: boolean
              description: |-
                This determines if the tool is async.

                  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.

                  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.

                  Defaults to synchronous (`false`).
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            code:
              type: string
              description: TypeScript code to execute when the tool is called
            environmentVariables:
              type: array
              items:
                $ref: '#/components/schemas/CodeToolEnvironmentVariable'
              description: Environment variables available in code via `env` object
            timeoutSeconds:
              type: number
              format: double
              description: |-
                This is the timeout in seconds for the code execution. Defaults to 10 seconds.
                Maximum is 30 seconds to prevent abuse.

                @default 10
            credentialId:
              type: string
              description: Credential ID containing the Val Town API key
            variableExtractionPlan:
              $ref: '#/components/schemas/VariableExtractionPlan'
              description: Plan to extract variables from the tool response
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            function:
              $ref: '#/components/schemas/OpenAIFunction'
              description: |-
                This is the function definition of the tool.

                For the Code tool, this defines the name, description, and parameters that the model
                will use to understand when and how to call this tool.
          required:
            - type
            - code
            - id
            - orgId
            - createdAt
            - updatedAt
          description: code variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - dtmf
              description: 'Discriminator value: dtmf'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            sipInfoDtmfEnabled:
              type: boolean
              default: false
              description: >-
                This enables sending DTMF tones via SIP INFO messages instead of RFC 2833 (RTP events). When enabled,
                DTMF digits will be sent using the SIP INFO method, which can be more reliable in some network
                configurations. Only relevant when using the `vapi.sip` transport.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: DtmfTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - endCall
              description: 'Discriminator value: endCall'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: EndCallTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - function
              description: 'Discriminator value: function'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            async:
              type: boolean
              description: |-
                This determines if the tool is async.

                  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.

                  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.

                  Defaults to synchronous (`false`).
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            variableExtractionPlan:
              $ref: '#/components/schemas/VariableExtractionPlan'
              description: Plan to extract variables from the tool response
            parameters:
              type: array
              items:
                $ref: '#/components/schemas/ToolParameter'
              description: Static key-value pairs merged into the request body. Values support Liquid templates.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            function:
              $ref: '#/components/schemas/OpenAIFunction'
              description: This is the function definition of the tool.
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: FunctionTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - transferCall
              description: 'Discriminator value: transferCall'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            destinations:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems
              description: >-
                These are the destinations that the call can be transferred to. If no destinations are provided,
                server.url will be used to get the transfer destination once the tool is called.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: TransferCallTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - handoff
              description: 'Discriminator value: handoff'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            defaultResult:
              type: string
              description: This is the default local tool result message used when no runtime handoff result override is returned.
            destinations:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems
              description: >-
                These are the destinations that the call can be handed off to.


                Usage:

                1. Single destination


                Use `assistantId` to handoff the call to a saved assistant, or `assistantName` to handoff the call to an
                assistant in the same squad.


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123", // or "assistantName": "Assistant123"
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                2. Multiple destinations


                2.1. Multiple Tools, Each With One Destination (OpenAI recommended)


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123",
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        },
                      ],
                    },
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-456",
                          "description": "customer wants to be handed off to assistant-456",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                2.2. One Tool, Multiple Destinations (Anthropic recommended)


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123",
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        },
                        {
                          "type": "assistant",
                          "assistantId": "assistant-456",
                          "description": "customer wants to be handed off to assistant-456",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                3. Dynamic destination


                3.1 To determine the destination dynamically, supply a `dynamic` handoff destination type and a `server`
                object.
                    VAPI will send a handoff-destination-request webhook to the `server.url`.
                    The response from the server will be used as the destination (if valid).

                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "dynamic",
                          "server": {
                            "url": "https://example.com"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                3.2. To pass custom parameters to the server, you can use the `function` object.


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "dynamic",
                          "server": {
                            "url": "https://example.com"
                          },
                        }
                      ],
                      "function": {
                        "name": "handoff",
                        "description": "Call this function when the customer is ready to be handed off to the next assistant",
                        "parameters": {
                          "type": "object",
                          "properties": {
                            "destination": {
                              "type": "string",
                              "description": "Use dynamic when customer is ready to be handed off to the next assistant",
                              "enum": ["dynamic"]
                            },
                            "customerAreaCode": {
                              "type": "number",
                              "description": "Area code of the customer"
                            },
                            "customerIntent": {
                              "type": "string",
                              "enum": ["new-customer", "existing-customer"],
                              "description": "Use new-customer when customer is a new customer, existing-customer when customer is an existing customer"
                            },
                            "customerSentiment": {
                              "type": "string",
                              "enum": ["positive", "negative", "neutral"],
                              "description": "Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral"
                            }
                          }
                        }
                      }
                    }
                  ]
                }

                ```


                The properties `customerAreaCode`, `customerIntent`, and `customerSentiment` will be passed to the
                server in the webhook request body.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            function:
              $ref: '#/components/schemas/OpenAIFunction'
              description: >-
                This is the optional function definition that will be passed to the LLM.

                If this is not defined, we will construct this based on the other properties.


                For example, given the following tools definition:

                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123",
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        },
                        {
                          "type": "assistant",
                          "assistantId": "assistant-456",
                          "description": "customer wants to be handed off to assistant-456",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                We will construct the following function definition:

                ```json

                {
                  "function": {
                    "name": "handoff_to_assistant-123",
                    "description": "
                         Use this function to handoff the call to the next assistant.
                         Only use it when instructions explicitly ask you to use the handoff_to_assistant function.
                         DO NOT call this function unless you are instructed to do so.
                         Here are the destinations you can handoff the call to:
                         1. assistant-123. When: customer wants to be handed off to assistant-123
                         2. assistant-456. When: customer wants to be handed off to assistant-456
                    ",
                    "parameters": {
                      "type": "object",
                      "properties": {
                        "destination": {
                          "type": "string",
                          "description": "Options: assistant-123 (customer wants to be handed off to assistant-123), assistant-456 (customer wants to be handed off to assistant-456)",
                          "enum": ["assistant-123", "assistant-456"]
                        },
                      },
                      "required": ["destination"]
                    }
                  }
                }

                ```


                To override this function, please provide an OpenAI function definition and refer to it in the system
                prompt.

                You may override parts of the function definition (i.e. you may only want to change the function name
                for your prompt).

                If you choose to override the function parameters, it must include `destination` as a required
                parameter, and it must evaluate to either an assistantId, assistantName, or a the string literal
                `dynamic`.


                To pass custom parameters to the server in a dynamic handoff, you can use the function parameters, with
                `dynamic` as the destination.

                ```json

                {
                  "function": {
                    "name": "dynamic_handoff",
                    "description": "
                         Call this function when the customer is ready to be handed off to the next assistant
                    ",
                    "parameters": {
                      "type": "object",
                      "properties": {
                        "destination": {
                          "type": "string",
                          "enum": ["dynamic"]
                        },
                        "customerAreaCode": {
                          "type": "number",
                          "description": "Area code of the customer"
                        },
                        "customerIntent": {
                          "type": "string",
                          "enum": ["new-customer", "existing-customer"],
                          "description": "Use new-customer when customer is a new customer, existing-customer when customer is an existing customer"
                        },
                        "customerSentiment": {
                          "type": "string",
                          "enum": ["positive", "negative", "neutral"],
                          "description": "Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral"
                        }
                      },
                      "required": ["destination", "customerAreaCode", "customerIntent", "customerSentiment"]
                    }
                  }
                }

                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: handoff variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - bash
              description: 'Discriminator value: bash'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            subType:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashSubType'
              description: The sub type of tool.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            name:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashName'
              description: The name of the tool, fixed to 'bash'
          required:
            - type
            - subType
            - id
            - orgId
            - createdAt
            - updatedAt
            - name
          description: BashTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - computer
              description: 'Discriminator value: computer'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            subType:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerSubType'
              description: The sub type of tool.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            name:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerName'
              description: The name of the tool, fixed to 'computer'
            displayWidthPx:
              type: number
              format: double
              description: The display width in pixels
            displayHeightPx:
              type: number
              format: double
              description: The display height in pixels
            displayNumber:
              type: number
              format: double
              description: Optional display number
          required:
            - type
            - subType
            - id
            - orgId
            - createdAt
            - updatedAt
            - name
            - displayWidthPx
            - displayHeightPx
          description: ComputerTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - textEditor
              description: 'Discriminator value: textEditor'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            subType:
              $ref: >-
                #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType
              description: The sub type of tool.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            name:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorName'
              description: The name of the tool, fixed to 'str_replace_editor'
          required:
            - type
            - subType
            - id
            - orgId
            - createdAt
            - updatedAt
            - name
          description: TextEditorTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - query
              description: 'Discriminator value: query'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            knowledgeBases:
              type: array
              items:
                $ref: '#/components/schemas/KnowledgeBase'
              description: The knowledge bases to query
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: QueryTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - google.calendar.event.create
              description: 'Discriminator value: google.calendar.event.create'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoogleCalendarCreateEventTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - google.sheets.row.append
              description: 'Discriminator value: google.sheets.row.append'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoogleSheetsRowAppendTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - google.calendar.availability.check
              description: 'Discriminator value: google.calendar.availability.check'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoogleCalendarCheckAvailabilityTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - slack.message.send
              description: 'Discriminator value: slack.message.send'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: SlackSendMessageTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - sms
              description: 'Discriminator value: sms'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: SmsTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - mcp
              description: 'Discriminator value: mcp'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            toolMessages:
              type: array
              items:
                $ref: '#/components/schemas/McpToolMessages'
              description: >-
                Per-tool message overrides for individual tools loaded from the MCP server. Set messages to an empty
                array to suppress messages for a specific tool. Tools not listed here will use the default messages from
                the parent tool.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            metadata:
              $ref: '#/components/schemas/McpToolMetadata'
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: McpTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.calendar.availability.check
              description: 'Discriminator value: gohighlevel.calendar.availability.check'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoHighLevelCalendarAvailabilityTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.calendar.event.create
              description: 'Discriminator value: gohighlevel.calendar.event.create'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoHighLevelCalendarEventCreateTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.contact.create
              description: 'Discriminator value: gohighlevel.contact.create'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoHighLevelContactCreateTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.contact.get
              description: 'Discriminator value: gohighlevel.contact.get'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoHighLevelContactGetTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - sipRequest
              description: 'Discriminator value: sipRequest'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            verb:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb'
              description: The SIP method to send.
            headers:
              $ref: '#/components/schemas/JsonSchema'
              description: JSON schema for headers the model should populate when sending the SIP request.
            body:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody'
              description: >-
                Body to include in the SIP request. Either a literal string body, or a JSON schema describing a
                structured body that the model should populate.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - verb
            - id
            - orgId
            - createdAt
            - updatedAt
          description: sipRequest variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - voicemail
              description: 'Discriminator value: voicemail'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            beepDetectionEnabled:
              type: boolean
              default: false
              description: >-
                This is the flag that enables beep detection for voicemail detection and applies only for twilio based
                calls.


                @default false
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: voicemail variant
      discriminator:
        propertyName: type
      title: tools_get_Response_200
    tools_delete_Response_200:
      oneOf:
        - type: object
          properties:
            type:
              type: string
              enum:
                - apiRequest
              description: 'Discriminator value: apiRequest'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            method:
              $ref: >-
                #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod
            timeoutSeconds:
              type: number
              format: double
              description: |-
                This is the timeout in seconds for the request. Defaults to 20 seconds.

                @default 20
            credentialId:
              type: string
              description: The credential ID for API request authentication
            encryptedPaths:
              type: array
              items:
                type: string
              description: This is the paths to encrypt in the request body if credentialId and encryptionPlan are defined.
            parameters:
              type: array
              items:
                $ref: '#/components/schemas/ToolParameter'
              description: Static key-value pairs merged into the request body. Values support Liquid templates.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            name:
              type: string
              description: |-
                This is the name of the tool. This will be passed to the model.

                Must be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 40.
            description:
              type: string
              description: This is the description of the tool. This will be passed to the model.
            url:
              type: string
              description: This is where the request will be sent.
            body:
              $ref: '#/components/schemas/JsonSchema'
              description: This is the body of the request.
            headers:
              $ref: '#/components/schemas/JsonSchema'
              description: These are the headers to send with the request.
            backoffPlan:
              $ref: '#/components/schemas/BackoffPlan'
              description: |-
                This is the backoff plan if the request fails. Defaults to undefined (the request will not be retried).

                @default undefined (the request will not be retried)
            variableExtractionPlan:
              $ref: '#/components/schemas/VariableExtractionPlan'
              description: >-
                This is the plan to extract variables from the tool's response. These will be accessible during the call
                and stored in `call.artifact.variableValues` after the call.


                Usage:

                1. Use `aliases` to extract variables from the tool's response body. (Most common case)


                ```json

                {
                  "aliases": [
                    {
                      "key": "customerName",
                      "value": "{{customer.name}}"
                    },
                    {
                      "key": "customerAge",
                      "value": "{{customer.age}}"
                    }
                  ]
                }

                ```


                The tool response body is made available to the liquid template.


                2. Use `aliases` to extract variables from the tool's response body if the response is an array.


                ```json

                {
                  "aliases": [
                    {
                      "key": "customerName",
                      "value": "{{$[0].name}}"
                    },
                    {
                      "key": "customerAge",
                      "value": "{{$[0].age}}"
                    }
                  ]
                }

                ```


                $ is a shorthand for the tool's response body. `$[0]` is the first item in the array. `$[n]` is the nth
                item in the array. Note, $ is available regardless of the response body type (both object and array).


                3. Use `aliases` to extract variables from the tool's response headers.


                ```json

                {
                  "aliases": [
                    {
                      "key": "customerName",
                      "value": "{{tool.response.headers.customer-name}}"
                    },
                    {
                      "key": "customerAge",
                      "value": "{{tool.response.headers.customer-age}}"
                    }
                  ]
                }

                ```


                `tool.response` is made available to the liquid template. Particularly, both `tool.response.headers` and
                `tool.response.body` are available. Note, `tool.response` is available regardless of the response body
                type (both object and array).


                4. Use `schema` to extract a large portion of the tool's response body.


                4.1. If you hit example.com and it returns `{"name": "John", "age": 30}`, then you can specify the
                schema as:


                ```json

                {
                  "schema": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "string"
                      },
                      "age": {
                        "type": "number"
                      }
                    }
                  }
                }

                ```

                These will be extracted as `{{ name }}` and `{{ age }}` respectively. To emphasize, object properties
                are extracted as direct global variables.


                4.2. If you hit example.com and it returns `{"name": {"first": "John", "last": "Doe"}}`, then you can
                specify the schema as:


                ```json

                {
                  "schema": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "object",
                        "properties": {
                          "first": {
                            "type": "string"
                          },
                          "last": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }

                ```


                These will be extracted as `{{ name }}`. And, `{{ name.first }}` and `{{ name.last }}` will be
                accessible.


                4.3. If you hit example.com and it returns `["94123", "94124"]`, then you can specify the schema as:


                ```json

                {
                  "schema": {
                    "type": "array",
                    "title": "zipCodes",
                    "items": {
                      "type": "string"
                    }
                  }
                }

                ```


                This will be extracted as `{{ zipCodes }}`. To access the array items, you can use `{{ zipCodes[0] }}`
                and `{{ zipCodes[1] }}`.


                4.4. If you hit example.com and it returns `[{"name": "John", "age": 30, "zipCodes": ["94123",
                "94124"]}, {"name": "Jane", "age": 25, "zipCodes": ["94125", "94126"]}]`, then you can specify the
                schema as:


                ```json

                {
                  "schema": {
                    "type": "array",
                    "title": "people",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "age": {
                          "type": "number"
                        },
                        "zipCodes": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }

                ```


                This will be extracted as `{{ people }}`. To access the array items, you can use `{{ people[n].name }}`,
                `{{ people[n].age }}`, `{{ people[n].zipCodes }}`, `{{ people[n].zipCodes[0] }}` and `{{
                people[n].zipCodes[1] }}`.


                Note: Both `aliases` and `schema` can be used together.
          required:
            - type
            - method
            - id
            - orgId
            - createdAt
            - updatedAt
            - url
          description: apiRequest variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - code
              description: 'Discriminator value: code'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingCodeMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            async:
              type: boolean
              description: |-
                This determines if the tool is async.

                  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.

                  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.

                  Defaults to synchronous (`false`).
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            code:
              type: string
              description: TypeScript code to execute when the tool is called
            environmentVariables:
              type: array
              items:
                $ref: '#/components/schemas/CodeToolEnvironmentVariable'
              description: Environment variables available in code via `env` object
            timeoutSeconds:
              type: number
              format: double
              description: |-
                This is the timeout in seconds for the code execution. Defaults to 10 seconds.
                Maximum is 30 seconds to prevent abuse.

                @default 10
            credentialId:
              type: string
              description: Credential ID containing the Val Town API key
            variableExtractionPlan:
              $ref: '#/components/schemas/VariableExtractionPlan'
              description: Plan to extract variables from the tool response
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            function:
              $ref: '#/components/schemas/OpenAIFunction'
              description: |-
                This is the function definition of the tool.

                For the Code tool, this defines the name, description, and parameters that the model
                will use to understand when and how to call this tool.
          required:
            - type
            - code
            - id
            - orgId
            - createdAt
            - updatedAt
          description: code variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - dtmf
              description: 'Discriminator value: dtmf'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            sipInfoDtmfEnabled:
              type: boolean
              default: false
              description: >-
                This enables sending DTMF tones via SIP INFO messages instead of RFC 2833 (RTP events). When enabled,
                DTMF digits will be sent using the SIP INFO method, which can be more reliable in some network
                configurations. Only relevant when using the `vapi.sip` transport.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: DtmfTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - endCall
              description: 'Discriminator value: endCall'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: EndCallTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - function
              description: 'Discriminator value: function'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            async:
              type: boolean
              description: |-
                This determines if the tool is async.

                  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.

                  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.

                  Defaults to synchronous (`false`).
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            variableExtractionPlan:
              $ref: '#/components/schemas/VariableExtractionPlan'
              description: Plan to extract variables from the tool response
            parameters:
              type: array
              items:
                $ref: '#/components/schemas/ToolParameter'
              description: Static key-value pairs merged into the request body. Values support Liquid templates.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            function:
              $ref: '#/components/schemas/OpenAIFunction'
              description: This is the function definition of the tool.
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: FunctionTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - transferCall
              description: 'Discriminator value: transferCall'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            destinations:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems
              description: >-
                These are the destinations that the call can be transferred to. If no destinations are provided,
                server.url will be used to get the transfer destination once the tool is called.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: TransferCallTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - handoff
              description: 'Discriminator value: handoff'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            defaultResult:
              type: string
              description: This is the default local tool result message used when no runtime handoff result override is returned.
            destinations:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems
              description: >-
                These are the destinations that the call can be handed off to.


                Usage:

                1. Single destination


                Use `assistantId` to handoff the call to a saved assistant, or `assistantName` to handoff the call to an
                assistant in the same squad.


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123", // or "assistantName": "Assistant123"
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                2. Multiple destinations


                2.1. Multiple Tools, Each With One Destination (OpenAI recommended)


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123",
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        },
                      ],
                    },
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-456",
                          "description": "customer wants to be handed off to assistant-456",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                2.2. One Tool, Multiple Destinations (Anthropic recommended)


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123",
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        },
                        {
                          "type": "assistant",
                          "assistantId": "assistant-456",
                          "description": "customer wants to be handed off to assistant-456",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                3. Dynamic destination


                3.1 To determine the destination dynamically, supply a `dynamic` handoff destination type and a `server`
                object.
                    VAPI will send a handoff-destination-request webhook to the `server.url`.
                    The response from the server will be used as the destination (if valid).

                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "dynamic",
                          "server": {
                            "url": "https://example.com"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                3.2. To pass custom parameters to the server, you can use the `function` object.


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "dynamic",
                          "server": {
                            "url": "https://example.com"
                          },
                        }
                      ],
                      "function": {
                        "name": "handoff",
                        "description": "Call this function when the customer is ready to be handed off to the next assistant",
                        "parameters": {
                          "type": "object",
                          "properties": {
                            "destination": {
                              "type": "string",
                              "description": "Use dynamic when customer is ready to be handed off to the next assistant",
                              "enum": ["dynamic"]
                            },
                            "customerAreaCode": {
                              "type": "number",
                              "description": "Area code of the customer"
                            },
                            "customerIntent": {
                              "type": "string",
                              "enum": ["new-customer", "existing-customer"],
                              "description": "Use new-customer when customer is a new customer, existing-customer when customer is an existing customer"
                            },
                            "customerSentiment": {
                              "type": "string",
                              "enum": ["positive", "negative", "neutral"],
                              "description": "Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral"
                            }
                          }
                        }
                      }
                    }
                  ]
                }

                ```


                The properties `customerAreaCode`, `customerIntent`, and `customerSentiment` will be passed to the
                server in the webhook request body.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            function:
              $ref: '#/components/schemas/OpenAIFunction'
              description: >-
                This is the optional function definition that will be passed to the LLM.

                If this is not defined, we will construct this based on the other properties.


                For example, given the following tools definition:

                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123",
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        },
                        {
                          "type": "assistant",
                          "assistantId": "assistant-456",
                          "description": "customer wants to be handed off to assistant-456",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                We will construct the following function definition:

                ```json

                {
                  "function": {
                    "name": "handoff_to_assistant-123",
                    "description": "
                         Use this function to handoff the call to the next assistant.
                         Only use it when instructions explicitly ask you to use the handoff_to_assistant function.
                         DO NOT call this function unless you are instructed to do so.
                         Here are the destinations you can handoff the call to:
                         1. assistant-123. When: customer wants to be handed off to assistant-123
                         2. assistant-456. When: customer wants to be handed off to assistant-456
                    ",
                    "parameters": {
                      "type": "object",
                      "properties": {
                        "destination": {
                          "type": "string",
                          "description": "Options: assistant-123 (customer wants to be handed off to assistant-123), assistant-456 (customer wants to be handed off to assistant-456)",
                          "enum": ["assistant-123", "assistant-456"]
                        },
                      },
                      "required": ["destination"]
                    }
                  }
                }

                ```


                To override this function, please provide an OpenAI function definition and refer to it in the system
                prompt.

                You may override parts of the function definition (i.e. you may only want to change the function name
                for your prompt).

                If you choose to override the function parameters, it must include `destination` as a required
                parameter, and it must evaluate to either an assistantId, assistantName, or a the string literal
                `dynamic`.


                To pass custom parameters to the server in a dynamic handoff, you can use the function parameters, with
                `dynamic` as the destination.

                ```json

                {
                  "function": {
                    "name": "dynamic_handoff",
                    "description": "
                         Call this function when the customer is ready to be handed off to the next assistant
                    ",
                    "parameters": {
                      "type": "object",
                      "properties": {
                        "destination": {
                          "type": "string",
                          "enum": ["dynamic"]
                        },
                        "customerAreaCode": {
                          "type": "number",
                          "description": "Area code of the customer"
                        },
                        "customerIntent": {
                          "type": "string",
                          "enum": ["new-customer", "existing-customer"],
                          "description": "Use new-customer when customer is a new customer, existing-customer when customer is an existing customer"
                        },
                        "customerSentiment": {
                          "type": "string",
                          "enum": ["positive", "negative", "neutral"],
                          "description": "Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral"
                        }
                      },
                      "required": ["destination", "customerAreaCode", "customerIntent", "customerSentiment"]
                    }
                  }
                }

                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: handoff variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - bash
              description: 'Discriminator value: bash'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            subType:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashSubType'
              description: The sub type of tool.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            name:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashName'
              description: The name of the tool, fixed to 'bash'
          required:
            - type
            - subType
            - id
            - orgId
            - createdAt
            - updatedAt
            - name
          description: BashTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - computer
              description: 'Discriminator value: computer'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            subType:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerSubType'
              description: The sub type of tool.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            name:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerName'
              description: The name of the tool, fixed to 'computer'
            displayWidthPx:
              type: number
              format: double
              description: The display width in pixels
            displayHeightPx:
              type: number
              format: double
              description: The display height in pixels
            displayNumber:
              type: number
              format: double
              description: Optional display number
          required:
            - type
            - subType
            - id
            - orgId
            - createdAt
            - updatedAt
            - name
            - displayWidthPx
            - displayHeightPx
          description: ComputerTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - textEditor
              description: 'Discriminator value: textEditor'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            subType:
              $ref: >-
                #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType
              description: The sub type of tool.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            name:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorName'
              description: The name of the tool, fixed to 'str_replace_editor'
          required:
            - type
            - subType
            - id
            - orgId
            - createdAt
            - updatedAt
            - name
          description: TextEditorTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - query
              description: 'Discriminator value: query'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            knowledgeBases:
              type: array
              items:
                $ref: '#/components/schemas/KnowledgeBase'
              description: The knowledge bases to query
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: QueryTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - google.calendar.event.create
              description: 'Discriminator value: google.calendar.event.create'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoogleCalendarCreateEventTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - google.sheets.row.append
              description: 'Discriminator value: google.sheets.row.append'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoogleSheetsRowAppendTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - google.calendar.availability.check
              description: 'Discriminator value: google.calendar.availability.check'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoogleCalendarCheckAvailabilityTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - slack.message.send
              description: 'Discriminator value: slack.message.send'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: SlackSendMessageTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - sms
              description: 'Discriminator value: sms'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: SmsTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - mcp
              description: 'Discriminator value: mcp'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            toolMessages:
              type: array
              items:
                $ref: '#/components/schemas/McpToolMessages'
              description: >-
                Per-tool message overrides for individual tools loaded from the MCP server. Set messages to an empty
                array to suppress messages for a specific tool. Tools not listed here will use the default messages from
                the parent tool.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            metadata:
              $ref: '#/components/schemas/McpToolMetadata'
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: McpTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.calendar.availability.check
              description: 'Discriminator value: gohighlevel.calendar.availability.check'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoHighLevelCalendarAvailabilityTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.calendar.event.create
              description: 'Discriminator value: gohighlevel.calendar.event.create'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoHighLevelCalendarEventCreateTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.contact.create
              description: 'Discriminator value: gohighlevel.contact.create'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoHighLevelContactCreateTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.contact.get
              description: 'Discriminator value: gohighlevel.contact.get'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoHighLevelContactGetTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - sipRequest
              description: 'Discriminator value: sipRequest'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            verb:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb'
              description: The SIP method to send.
            headers:
              $ref: '#/components/schemas/JsonSchema'
              description: JSON schema for headers the model should populate when sending the SIP request.
            body:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody'
              description: >-
                Body to include in the SIP request. Either a literal string body, or a JSON schema describing a
                structured body that the model should populate.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - verb
            - id
            - orgId
            - createdAt
            - updatedAt
          description: sipRequest variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - voicemail
              description: 'Discriminator value: voicemail'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            beepDetectionEnabled:
              type: boolean
              default: false
              description: >-
                This is the flag that enables beep detection for voicemail detection and applies only for twilio based
                calls.


                @default false
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: voicemail variant
      discriminator:
        propertyName: type
      title: tools_delete_Response_200
    UpdateApiRequestToolDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: UpdateApiRequestToolDtoMessagesItems
    UpdateApiRequestToolDtoMethod:
      type: string
      enum:
        - POST
        - GET
        - PUT
        - PATCH
        - DELETE
      title: UpdateApiRequestToolDtoMethod
    UpdateDtmfToolDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: UpdateDtmfToolDtoMessagesItems
    UpdateEndCallToolDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: UpdateEndCallToolDtoMessagesItems
    UpdateFunctionToolDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: UpdateFunctionToolDtoMessagesItems
    UpdateTransferCallToolDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: UpdateTransferCallToolDtoMessagesItems
    UpdateTransferCallToolDtoDestinationsItems:
      oneOf:
        - $ref: '#/components/schemas/TransferDestinationAssistant'
        - $ref: '#/components/schemas/TransferDestinationNumber'
        - $ref: '#/components/schemas/TransferDestinationSip'
      title: UpdateTransferCallToolDtoDestinationsItems
    UpdateHandoffToolDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: UpdateHandoffToolDtoMessagesItems
    UpdateHandoffToolDtoDestinationsItems:
      oneOf:
        - $ref: '#/components/schemas/HandoffDestinationAssistant'
        - $ref: '#/components/schemas/HandoffDestinationDynamic'
        - $ref: '#/components/schemas/HandoffDestinationSquad'
      title: UpdateHandoffToolDtoDestinationsItems
    UpdateBashToolDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: UpdateBashToolDtoMessagesItems
    UpdateBashToolDtoSubType:
      type: string
      enum:
        - bash_20241022
      description: The sub type of tool.
      title: UpdateBashToolDtoSubType
    UpdateBashToolDtoName:
      type: string
      enum:
        - bash
      default: bash
      description: The name of the tool, fixed to 'bash'
      title: UpdateBashToolDtoName
    UpdateComputerToolDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: UpdateComputerToolDtoMessagesItems
    UpdateComputerToolDtoSubType:
      type: string
      enum:
        - computer_20241022
      description: The sub type of tool.
      title: UpdateComputerToolDtoSubType
    UpdateComputerToolDtoName:
      type: string
      enum:
        - computer
      default: computer
      description: The name of the tool, fixed to 'computer'
      title: UpdateComputerToolDtoName
    UpdateTextEditorToolDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: UpdateTextEditorToolDtoMessagesItems
    UpdateTextEditorToolDtoSubType:
      type: string
      enum:
        - text_editor_20241022
      description: The sub type of tool.
      title: UpdateTextEditorToolDtoSubType
    UpdateTextEditorToolDtoName:
      type: string
      enum:
        - str_replace_editor
      default: str_replace_editor
      description: The name of the tool, fixed to 'str_replace_editor'
      title: UpdateTextEditorToolDtoName
    UpdateQueryToolDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: UpdateQueryToolDtoMessagesItems
    UpdateGoogleCalendarCreateEventToolDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: UpdateGoogleCalendarCreateEventToolDtoMessagesItems
    UpdateGoogleSheetsRowAppendToolDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: UpdateGoogleSheetsRowAppendToolDtoMessagesItems
    UpdateGoogleCalendarCheckAvailabilityToolDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: UpdateGoogleCalendarCheckAvailabilityToolDtoMessagesItems
    UpdateSlackSendMessageToolDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: UpdateSlackSendMessageToolDtoMessagesItems
    UpdateSmsToolDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: UpdateSmsToolDtoMessagesItems
    UpdateMcpToolDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: UpdateMcpToolDtoMessagesItems
    UpdateGoHighLevelCalendarAvailabilityToolDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: UpdateGoHighLevelCalendarAvailabilityToolDtoMessagesItems
    UpdateGoHighLevelCalendarEventCreateToolDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: UpdateGoHighLevelCalendarEventCreateToolDtoMessagesItems
    UpdateGoHighLevelContactCreateToolDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: UpdateGoHighLevelContactCreateToolDtoMessagesItems
    UpdateGoHighLevelContactGetToolDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: UpdateGoHighLevelContactGetToolDtoMessagesItems
    UpdateSipRequestToolDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: UpdateSipRequestToolDtoMessagesItems
    UpdateSipRequestToolDtoVerb:
      type: string
      enum:
        - INFO
        - MESSAGE
        - NOTIFY
      description: The SIP method to send.
      title: UpdateSipRequestToolDtoVerb
    UpdateSipRequestToolDtoBody:
      oneOf:
        - type: string
        - $ref: '#/components/schemas/JsonSchema'
      description: >-
        Body to include in the SIP request. Either a literal string body, or a JSON schema describing a structured body
        that the model should populate.
      title: UpdateSipRequestToolDtoBody
    UpdateVoicemailToolDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ToolMessageStart'
        - $ref: '#/components/schemas/ToolMessageComplete'
        - $ref: '#/components/schemas/ToolMessageFailed'
        - $ref: '#/components/schemas/ToolMessageDelayed'
      title: UpdateVoicemailToolDtoMessagesItems
    tools_update_Request:
      oneOf:
        - type: object
          properties:
            type:
              type: string
              enum:
                - apiRequest
              description: 'Discriminator value: apiRequest'
            messages:
              type: array
              items:
                $ref: '#/components/schemas/UpdateApiRequestToolDtoMessagesItems'
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            method:
              $ref: '#/components/schemas/UpdateApiRequestToolDtoMethod'
            timeoutSeconds:
              type: number
              format: double
              description: |-
                This is the timeout in seconds for the request. Defaults to 20 seconds.

                @default 20
            credentialId:
              type: string
              description: The credential ID for API request authentication
            encryptedPaths:
              type: array
              items:
                type: string
              description: This is the paths to encrypt in the request body if credentialId and encryptionPlan are defined.
            parameters:
              type: array
              items:
                $ref: '#/components/schemas/ToolParameter'
              description: Static key-value pairs merged into the request body. Values support Liquid templates.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            name:
              type: string
              description: |-
                This is the name of the tool. This will be passed to the model.

                Must be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 40.
            description:
              type: string
              description: This is the description of the tool. This will be passed to the model.
            url:
              type: string
              description: This is where the request will be sent.
            body:
              $ref: '#/components/schemas/JsonSchema'
              description: This is the body of the request.
            headers:
              $ref: '#/components/schemas/JsonSchema'
              description: These are the headers to send with the request.
            backoffPlan:
              $ref: '#/components/schemas/BackoffPlan'
              description: |-
                This is the backoff plan if the request fails. Defaults to undefined (the request will not be retried).

                @default undefined (the request will not be retried)
            variableExtractionPlan:
              $ref: '#/components/schemas/VariableExtractionPlan'
              description: >-
                This is the plan to extract variables from the tool's response. These will be accessible during the call
                and stored in `call.artifact.variableValues` after the call.


                Usage:

                1. Use `aliases` to extract variables from the tool's response body. (Most common case)


                ```json

                {
                  "aliases": [
                    {
                      "key": "customerName",
                      "value": "{{customer.name}}"
                    },
                    {
                      "key": "customerAge",
                      "value": "{{customer.age}}"
                    }
                  ]
                }

                ```


                The tool response body is made available to the liquid template.


                2. Use `aliases` to extract variables from the tool's response body if the response is an array.


                ```json

                {
                  "aliases": [
                    {
                      "key": "customerName",
                      "value": "{{$[0].name}}"
                    },
                    {
                      "key": "customerAge",
                      "value": "{{$[0].age}}"
                    }
                  ]
                }

                ```


                $ is a shorthand for the tool's response body. `$[0]` is the first item in the array. `$[n]` is the nth
                item in the array. Note, $ is available regardless of the response body type (both object and array).


                3. Use `aliases` to extract variables from the tool's response headers.


                ```json

                {
                  "aliases": [
                    {
                      "key": "customerName",
                      "value": "{{tool.response.headers.customer-name}}"
                    },
                    {
                      "key": "customerAge",
                      "value": "{{tool.response.headers.customer-age}}"
                    }
                  ]
                }

                ```


                `tool.response` is made available to the liquid template. Particularly, both `tool.response.headers` and
                `tool.response.body` are available. Note, `tool.response` is available regardless of the response body
                type (both object and array).


                4. Use `schema` to extract a large portion of the tool's response body.


                4.1. If you hit example.com and it returns `{"name": "John", "age": 30}`, then you can specify the
                schema as:


                ```json

                {
                  "schema": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "string"
                      },
                      "age": {
                        "type": "number"
                      }
                    }
                  }
                }

                ```

                These will be extracted as `{{ name }}` and `{{ age }}` respectively. To emphasize, object properties
                are extracted as direct global variables.


                4.2. If you hit example.com and it returns `{"name": {"first": "John", "last": "Doe"}}`, then you can
                specify the schema as:


                ```json

                {
                  "schema": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "object",
                        "properties": {
                          "first": {
                            "type": "string"
                          },
                          "last": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }

                ```


                These will be extracted as `{{ name }}`. And, `{{ name.first }}` and `{{ name.last }}` will be
                accessible.


                4.3. If you hit example.com and it returns `["94123", "94124"]`, then you can specify the schema as:


                ```json

                {
                  "schema": {
                    "type": "array",
                    "title": "zipCodes",
                    "items": {
                      "type": "string"
                    }
                  }
                }

                ```


                This will be extracted as `{{ zipCodes }}`. To access the array items, you can use `{{ zipCodes[0] }}`
                and `{{ zipCodes[1] }}`.


                4.4. If you hit example.com and it returns `[{"name": "John", "age": 30, "zipCodes": ["94123",
                "94124"]}, {"name": "Jane", "age": 25, "zipCodes": ["94125", "94126"]}]`, then you can specify the
                schema as:


                ```json

                {
                  "schema": {
                    "type": "array",
                    "title": "people",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "age": {
                          "type": "number"
                        },
                        "zipCodes": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }

                ```


                This will be extracted as `{{ people }}`. To access the array items, you can use `{{ people[n].name }}`,
                `{{ people[n].age }}`, `{{ people[n].zipCodes }}`, `{{ people[n].zipCodes[0] }}` and `{{
                people[n].zipCodes[1] }}`.


                Note: Both `aliases` and `schema` can be used together.
          required:
            - type
          description: apiRequest variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - dtmf
              description: 'Discriminator value: dtmf'
            messages:
              type: array
              items:
                $ref: '#/components/schemas/UpdateDtmfToolDtoMessagesItems'
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            sipInfoDtmfEnabled:
              type: boolean
              default: false
              description: >-
                This enables sending DTMF tones via SIP INFO messages instead of RFC 2833 (RTP events). When enabled,
                DTMF digits will be sent using the SIP INFO method, which can be more reliable in some network
                configurations. Only relevant when using the `vapi.sip` transport.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: UpdateDtmfToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - endCall
              description: 'Discriminator value: endCall'
            messages:
              type: array
              items:
                $ref: '#/components/schemas/UpdateEndCallToolDtoMessagesItems'
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: UpdateEndCallToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - function
              description: 'Discriminator value: function'
            messages:
              type: array
              items:
                $ref: '#/components/schemas/UpdateFunctionToolDtoMessagesItems'
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            async:
              type: boolean
              description: |-
                This determines if the tool is async.

                  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.

                  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.

                  Defaults to synchronous (`false`).
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            variableExtractionPlan:
              $ref: '#/components/schemas/VariableExtractionPlan'
              description: Plan to extract variables from the tool response
            parameters:
              type: array
              items:
                $ref: '#/components/schemas/ToolParameter'
              description: Static key-value pairs merged into the request body. Values support Liquid templates.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            function:
              $ref: '#/components/schemas/OpenAIFunction'
              description: This is the function definition of the tool.
          required:
            - type
          description: UpdateFunctionToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - transferCall
              description: 'Discriminator value: transferCall'
            messages:
              type: array
              items:
                $ref: '#/components/schemas/UpdateTransferCallToolDtoMessagesItems'
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            destinations:
              type: array
              items:
                $ref: '#/components/schemas/UpdateTransferCallToolDtoDestinationsItems'
              description: >-
                These are the destinations that the call can be transferred to. If no destinations are provided,
                server.url will be used to get the transfer destination once the tool is called.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: UpdateTransferCallToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - handoff
              description: 'Discriminator value: handoff'
            messages:
              type: array
              items:
                $ref: '#/components/schemas/UpdateHandoffToolDtoMessagesItems'
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            defaultResult:
              type: string
              description: This is the default local tool result message used when no runtime handoff result override is returned.
            destinations:
              type: array
              items:
                $ref: '#/components/schemas/UpdateHandoffToolDtoDestinationsItems'
              description: >-
                These are the destinations that the call can be handed off to.


                Usage:

                1. Single destination


                Use `assistantId` to handoff the call to a saved assistant, or `assistantName` to handoff the call to an
                assistant in the same squad.


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123", // or "assistantName": "Assistant123"
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                2. Multiple destinations


                2.1. Multiple Tools, Each With One Destination (OpenAI recommended)


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123",
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        },
                      ],
                    },
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-456",
                          "description": "customer wants to be handed off to assistant-456",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                2.2. One Tool, Multiple Destinations (Anthropic recommended)


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123",
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        },
                        {
                          "type": "assistant",
                          "assistantId": "assistant-456",
                          "description": "customer wants to be handed off to assistant-456",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                3. Dynamic destination


                3.1 To determine the destination dynamically, supply a `dynamic` handoff destination type and a `server`
                object.
                    VAPI will send a handoff-destination-request webhook to the `server.url`.
                    The response from the server will be used as the destination (if valid).

                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "dynamic",
                          "server": {
                            "url": "https://example.com"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                3.2. To pass custom parameters to the server, you can use the `function` object.


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "dynamic",
                          "server": {
                            "url": "https://example.com"
                          },
                        }
                      ],
                      "function": {
                        "name": "handoff",
                        "description": "Call this function when the customer is ready to be handed off to the next assistant",
                        "parameters": {
                          "type": "object",
                          "properties": {
                            "destination": {
                              "type": "string",
                              "description": "Use dynamic when customer is ready to be handed off to the next assistant",
                              "enum": ["dynamic"]
                            },
                            "customerAreaCode": {
                              "type": "number",
                              "description": "Area code of the customer"
                            },
                            "customerIntent": {
                              "type": "string",
                              "enum": ["new-customer", "existing-customer"],
                              "description": "Use new-customer when customer is a new customer, existing-customer when customer is an existing customer"
                            },
                            "customerSentiment": {
                              "type": "string",
                              "enum": ["positive", "negative", "neutral"],
                              "description": "Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral"
                            }
                          }
                        }
                      }
                    }
                  ]
                }

                ```


                The properties `customerAreaCode`, `customerIntent`, and `customerSentiment` will be passed to the
                server in the webhook request body.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            function:
              $ref: '#/components/schemas/OpenAIFunction'
              description: >-
                This is the optional function definition that will be passed to the LLM.

                If this is not defined, we will construct this based on the other properties.


                For example, given the following tools definition:

                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123",
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        },
                        {
                          "type": "assistant",
                          "assistantId": "assistant-456",
                          "description": "customer wants to be handed off to assistant-456",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                We will construct the following function definition:

                ```json

                {
                  "function": {
                    "name": "handoff_to_assistant-123",
                    "description": "
                         Use this function to handoff the call to the next assistant.
                         Only use it when instructions explicitly ask you to use the handoff_to_assistant function.
                         DO NOT call this function unless you are instructed to do so.
                         Here are the destinations you can handoff the call to:
                         1. assistant-123. When: customer wants to be handed off to assistant-123
                         2. assistant-456. When: customer wants to be handed off to assistant-456
                    ",
                    "parameters": {
                      "type": "object",
                      "properties": {
                        "destination": {
                          "type": "string",
                          "description": "Options: assistant-123 (customer wants to be handed off to assistant-123), assistant-456 (customer wants to be handed off to assistant-456)",
                          "enum": ["assistant-123", "assistant-456"]
                        },
                      },
                      "required": ["destination"]
                    }
                  }
                }

                ```


                To override this function, please provide an OpenAI function definition and refer to it in the system
                prompt.

                You may override parts of the function definition (i.e. you may only want to change the function name
                for your prompt).

                If you choose to override the function parameters, it must include `destination` as a required
                parameter, and it must evaluate to either an assistantId, assistantName, or a the string literal
                `dynamic`.


                To pass custom parameters to the server in a dynamic handoff, you can use the function parameters, with
                `dynamic` as the destination.

                ```json

                {
                  "function": {
                    "name": "dynamic_handoff",
                    "description": "
                         Call this function when the customer is ready to be handed off to the next assistant
                    ",
                    "parameters": {
                      "type": "object",
                      "properties": {
                        "destination": {
                          "type": "string",
                          "enum": ["dynamic"]
                        },
                        "customerAreaCode": {
                          "type": "number",
                          "description": "Area code of the customer"
                        },
                        "customerIntent": {
                          "type": "string",
                          "enum": ["new-customer", "existing-customer"],
                          "description": "Use new-customer when customer is a new customer, existing-customer when customer is an existing customer"
                        },
                        "customerSentiment": {
                          "type": "string",
                          "enum": ["positive", "negative", "neutral"],
                          "description": "Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral"
                        }
                      },
                      "required": ["destination", "customerAreaCode", "customerIntent", "customerSentiment"]
                    }
                  }
                }

                ```
          required:
            - type
          description: handoff variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - bash
              description: 'Discriminator value: bash'
            messages:
              type: array
              items:
                $ref: '#/components/schemas/UpdateBashToolDtoMessagesItems'
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            subType:
              $ref: '#/components/schemas/UpdateBashToolDtoSubType'
              description: The sub type of tool.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            name:
              $ref: '#/components/schemas/UpdateBashToolDtoName'
              description: The name of the tool, fixed to 'bash'
          required:
            - type
          description: UpdateBashToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - computer
              description: 'Discriminator value: computer'
            messages:
              type: array
              items:
                $ref: '#/components/schemas/UpdateComputerToolDtoMessagesItems'
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            subType:
              $ref: '#/components/schemas/UpdateComputerToolDtoSubType'
              description: The sub type of tool.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            name:
              $ref: '#/components/schemas/UpdateComputerToolDtoName'
              description: The name of the tool, fixed to 'computer'
            displayWidthPx:
              type: number
              format: double
              description: The display width in pixels
            displayHeightPx:
              type: number
              format: double
              description: The display height in pixels
            displayNumber:
              type: number
              format: double
              description: Optional display number
          required:
            - type
          description: UpdateComputerToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - textEditor
              description: 'Discriminator value: textEditor'
            messages:
              type: array
              items:
                $ref: '#/components/schemas/UpdateTextEditorToolDtoMessagesItems'
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            subType:
              $ref: '#/components/schemas/UpdateTextEditorToolDtoSubType'
              description: The sub type of tool.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            name:
              $ref: '#/components/schemas/UpdateTextEditorToolDtoName'
              description: The name of the tool, fixed to 'str_replace_editor'
          required:
            - type
          description: UpdateTextEditorToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - query
              description: 'Discriminator value: query'
            messages:
              type: array
              items:
                $ref: '#/components/schemas/UpdateQueryToolDtoMessagesItems'
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            knowledgeBases:
              type: array
              items:
                $ref: '#/components/schemas/KnowledgeBase'
              description: The knowledge bases to query
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: UpdateQueryToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - google.calendar.event.create
              description: 'Discriminator value: google.calendar.event.create'
            messages:
              type: array
              items:
                $ref: '#/components/schemas/UpdateGoogleCalendarCreateEventToolDtoMessagesItems'
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: UpdateGoogleCalendarCreateEventToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - google.sheets.row.append
              description: 'Discriminator value: google.sheets.row.append'
            messages:
              type: array
              items:
                $ref: '#/components/schemas/UpdateGoogleSheetsRowAppendToolDtoMessagesItems'
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: UpdateGoogleSheetsRowAppendToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - google.calendar.availability.check
              description: 'Discriminator value: google.calendar.availability.check'
            messages:
              type: array
              items:
                $ref: '#/components/schemas/UpdateGoogleCalendarCheckAvailabilityToolDtoMessagesItems'
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: UpdateGoogleCalendarCheckAvailabilityToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - slack.message.send
              description: 'Discriminator value: slack.message.send'
            messages:
              type: array
              items:
                $ref: '#/components/schemas/UpdateSlackSendMessageToolDtoMessagesItems'
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: UpdateSlackSendMessageToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - sms
              description: 'Discriminator value: sms'
            messages:
              type: array
              items:
                $ref: '#/components/schemas/UpdateSmsToolDtoMessagesItems'
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: UpdateSmsToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - mcp
              description: 'Discriminator value: mcp'
            messages:
              type: array
              items:
                $ref: '#/components/schemas/UpdateMcpToolDtoMessagesItems'
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            toolMessages:
              type: array
              items:
                $ref: '#/components/schemas/McpToolMessages'
              description: >-
                Per-tool message overrides for individual tools loaded from the MCP server. Set messages to an empty
                array to suppress messages for a specific tool. Tools not listed here will use the default messages from
                the parent tool.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            metadata:
              $ref: '#/components/schemas/McpToolMetadata'
          required:
            - type
          description: UpdateMcpToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.calendar.availability.check
              description: 'Discriminator value: gohighlevel.calendar.availability.check'
            messages:
              type: array
              items:
                $ref: '#/components/schemas/UpdateGoHighLevelCalendarAvailabilityToolDtoMessagesItems'
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: UpdateGoHighLevelCalendarAvailabilityToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.calendar.event.create
              description: 'Discriminator value: gohighlevel.calendar.event.create'
            messages:
              type: array
              items:
                $ref: '#/components/schemas/UpdateGoHighLevelCalendarEventCreateToolDtoMessagesItems'
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: UpdateGoHighLevelCalendarEventCreateToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.contact.create
              description: 'Discriminator value: gohighlevel.contact.create'
            messages:
              type: array
              items:
                $ref: '#/components/schemas/UpdateGoHighLevelContactCreateToolDtoMessagesItems'
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: UpdateGoHighLevelContactCreateToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.contact.get
              description: 'Discriminator value: gohighlevel.contact.get'
            messages:
              type: array
              items:
                $ref: '#/components/schemas/UpdateGoHighLevelContactGetToolDtoMessagesItems'
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: UpdateGoHighLevelContactGetToolDTO variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - sipRequest
              description: 'Discriminator value: sipRequest'
            messages:
              type: array
              items:
                $ref: '#/components/schemas/UpdateSipRequestToolDtoMessagesItems'
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            verb:
              $ref: '#/components/schemas/UpdateSipRequestToolDtoVerb'
              description: The SIP method to send.
            headers:
              $ref: '#/components/schemas/JsonSchema'
              description: JSON schema for headers the model should populate when sending the SIP request.
            body:
              $ref: '#/components/schemas/UpdateSipRequestToolDtoBody'
              description: >-
                Body to include in the SIP request. Either a literal string body, or a JSON schema describing a
                structured body that the model should populate.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: sipRequest variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - voicemail
              description: 'Discriminator value: voicemail'
            messages:
              type: array
              items:
                $ref: '#/components/schemas/UpdateVoicemailToolDtoMessagesItems'
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            beepDetectionEnabled:
              type: boolean
              default: false
              description: >-
                This is the flag that enables beep detection for voicemail detection and applies only for twilio based
                calls.


                @default false
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
          description: voicemail variant
      discriminator:
        propertyName: type
      title: tools_update_Request
    tools_update_Response_200:
      oneOf:
        - type: object
          properties:
            type:
              type: string
              enum:
                - apiRequest
              description: 'Discriminator value: apiRequest'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            method:
              $ref: >-
                #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingApiRequestMethod
            timeoutSeconds:
              type: number
              format: double
              description: |-
                This is the timeout in seconds for the request. Defaults to 20 seconds.

                @default 20
            credentialId:
              type: string
              description: The credential ID for API request authentication
            encryptedPaths:
              type: array
              items:
                type: string
              description: This is the paths to encrypt in the request body if credentialId and encryptionPlan are defined.
            parameters:
              type: array
              items:
                $ref: '#/components/schemas/ToolParameter'
              description: Static key-value pairs merged into the request body. Values support Liquid templates.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            name:
              type: string
              description: |-
                This is the name of the tool. This will be passed to the model.

                Must be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 40.
            description:
              type: string
              description: This is the description of the tool. This will be passed to the model.
            url:
              type: string
              description: This is where the request will be sent.
            body:
              $ref: '#/components/schemas/JsonSchema'
              description: This is the body of the request.
            headers:
              $ref: '#/components/schemas/JsonSchema'
              description: These are the headers to send with the request.
            backoffPlan:
              $ref: '#/components/schemas/BackoffPlan'
              description: |-
                This is the backoff plan if the request fails. Defaults to undefined (the request will not be retried).

                @default undefined (the request will not be retried)
            variableExtractionPlan:
              $ref: '#/components/schemas/VariableExtractionPlan'
              description: >-
                This is the plan to extract variables from the tool's response. These will be accessible during the call
                and stored in `call.artifact.variableValues` after the call.


                Usage:

                1. Use `aliases` to extract variables from the tool's response body. (Most common case)


                ```json

                {
                  "aliases": [
                    {
                      "key": "customerName",
                      "value": "{{customer.name}}"
                    },
                    {
                      "key": "customerAge",
                      "value": "{{customer.age}}"
                    }
                  ]
                }

                ```


                The tool response body is made available to the liquid template.


                2. Use `aliases` to extract variables from the tool's response body if the response is an array.


                ```json

                {
                  "aliases": [
                    {
                      "key": "customerName",
                      "value": "{{$[0].name}}"
                    },
                    {
                      "key": "customerAge",
                      "value": "{{$[0].age}}"
                    }
                  ]
                }

                ```


                $ is a shorthand for the tool's response body. `$[0]` is the first item in the array. `$[n]` is the nth
                item in the array. Note, $ is available regardless of the response body type (both object and array).


                3. Use `aliases` to extract variables from the tool's response headers.


                ```json

                {
                  "aliases": [
                    {
                      "key": "customerName",
                      "value": "{{tool.response.headers.customer-name}}"
                    },
                    {
                      "key": "customerAge",
                      "value": "{{tool.response.headers.customer-age}}"
                    }
                  ]
                }

                ```


                `tool.response` is made available to the liquid template. Particularly, both `tool.response.headers` and
                `tool.response.body` are available. Note, `tool.response` is available regardless of the response body
                type (both object and array).


                4. Use `schema` to extract a large portion of the tool's response body.


                4.1. If you hit example.com and it returns `{"name": "John", "age": 30}`, then you can specify the
                schema as:


                ```json

                {
                  "schema": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "string"
                      },
                      "age": {
                        "type": "number"
                      }
                    }
                  }
                }

                ```

                These will be extracted as `{{ name }}` and `{{ age }}` respectively. To emphasize, object properties
                are extracted as direct global variables.


                4.2. If you hit example.com and it returns `{"name": {"first": "John", "last": "Doe"}}`, then you can
                specify the schema as:


                ```json

                {
                  "schema": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "object",
                        "properties": {
                          "first": {
                            "type": "string"
                          },
                          "last": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }

                ```


                These will be extracted as `{{ name }}`. And, `{{ name.first }}` and `{{ name.last }}` will be
                accessible.


                4.3. If you hit example.com and it returns `["94123", "94124"]`, then you can specify the schema as:


                ```json

                {
                  "schema": {
                    "type": "array",
                    "title": "zipCodes",
                    "items": {
                      "type": "string"
                    }
                  }
                }

                ```


                This will be extracted as `{{ zipCodes }}`. To access the array items, you can use `{{ zipCodes[0] }}`
                and `{{ zipCodes[1] }}`.


                4.4. If you hit example.com and it returns `[{"name": "John", "age": 30, "zipCodes": ["94123",
                "94124"]}, {"name": "Jane", "age": 25, "zipCodes": ["94125", "94126"]}]`, then you can specify the
                schema as:


                ```json

                {
                  "schema": {
                    "type": "array",
                    "title": "people",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "age": {
                          "type": "number"
                        },
                        "zipCodes": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }

                ```


                This will be extracted as `{{ people }}`. To access the array items, you can use `{{ people[n].name }}`,
                `{{ people[n].age }}`, `{{ people[n].zipCodes }}`, `{{ people[n].zipCodes[0] }}` and `{{
                people[n].zipCodes[1] }}`.


                Note: Both `aliases` and `schema` can be used together.
          required:
            - type
            - method
            - id
            - orgId
            - createdAt
            - updatedAt
            - url
          description: apiRequest variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - code
              description: 'Discriminator value: code'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingCodeMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            async:
              type: boolean
              description: |-
                This determines if the tool is async.

                  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.

                  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.

                  Defaults to synchronous (`false`).
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            code:
              type: string
              description: TypeScript code to execute when the tool is called
            environmentVariables:
              type: array
              items:
                $ref: '#/components/schemas/CodeToolEnvironmentVariable'
              description: Environment variables available in code via `env` object
            timeoutSeconds:
              type: number
              format: double
              description: |-
                This is the timeout in seconds for the code execution. Defaults to 10 seconds.
                Maximum is 30 seconds to prevent abuse.

                @default 10
            credentialId:
              type: string
              description: Credential ID containing the Val Town API key
            variableExtractionPlan:
              $ref: '#/components/schemas/VariableExtractionPlan'
              description: Plan to extract variables from the tool response
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            function:
              $ref: '#/components/schemas/OpenAIFunction'
              description: |-
                This is the function definition of the tool.

                For the Code tool, this defines the name, description, and parameters that the model
                will use to understand when and how to call this tool.
          required:
            - type
            - code
            - id
            - orgId
            - createdAt
            - updatedAt
          description: code variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - dtmf
              description: 'Discriminator value: dtmf'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingDtmfMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            sipInfoDtmfEnabled:
              type: boolean
              default: false
              description: >-
                This enables sending DTMF tones via SIP INFO messages instead of RFC 2833 (RTP events). When enabled,
                DTMF digits will be sent using the SIP INFO method, which can be more reliable in some network
                configurations. Only relevant when using the `vapi.sip` transport.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: DtmfTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - endCall
              description: 'Discriminator value: endCall'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingEndCallMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: EndCallTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - function
              description: 'Discriminator value: function'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingFunctionMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            async:
              type: boolean
              description: |-
                This determines if the tool is async.

                  If async, the assistant will move forward without waiting for your server to respond. This is useful if you just want to trigger something on your server.

                  If sync, the assistant will wait for your server to respond. This is useful if want assistant to respond with the result from your server.

                  Defaults to synchronous (`false`).
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            variableExtractionPlan:
              $ref: '#/components/schemas/VariableExtractionPlan'
              description: Plan to extract variables from the tool response
            parameters:
              type: array
              items:
                $ref: '#/components/schemas/ToolParameter'
              description: Static key-value pairs merged into the request body. Values support Liquid templates.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            function:
              $ref: '#/components/schemas/OpenAIFunction'
              description: This is the function definition of the tool.
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: FunctionTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - transferCall
              description: 'Discriminator value: transferCall'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            destinations:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTransferCallDestinationsItems
              description: >-
                These are the destinations that the call can be transferred to. If no destinations are provided,
                server.url will be used to get the transfer destination once the tool is called.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: TransferCallTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - handoff
              description: 'Discriminator value: handoff'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            defaultResult:
              type: string
              description: This is the default local tool result message used when no runtime handoff result override is returned.
            destinations:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingHandoffDestinationsItems
              description: >-
                These are the destinations that the call can be handed off to.


                Usage:

                1. Single destination


                Use `assistantId` to handoff the call to a saved assistant, or `assistantName` to handoff the call to an
                assistant in the same squad.


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123", // or "assistantName": "Assistant123"
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                2. Multiple destinations


                2.1. Multiple Tools, Each With One Destination (OpenAI recommended)


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123",
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        },
                      ],
                    },
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-456",
                          "description": "customer wants to be handed off to assistant-456",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                2.2. One Tool, Multiple Destinations (Anthropic recommended)


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123",
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        },
                        {
                          "type": "assistant",
                          "assistantId": "assistant-456",
                          "description": "customer wants to be handed off to assistant-456",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                3. Dynamic destination


                3.1 To determine the destination dynamically, supply a `dynamic` handoff destination type and a `server`
                object.
                    VAPI will send a handoff-destination-request webhook to the `server.url`.
                    The response from the server will be used as the destination (if valid).

                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "dynamic",
                          "server": {
                            "url": "https://example.com"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                3.2. To pass custom parameters to the server, you can use the `function` object.


                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "dynamic",
                          "server": {
                            "url": "https://example.com"
                          },
                        }
                      ],
                      "function": {
                        "name": "handoff",
                        "description": "Call this function when the customer is ready to be handed off to the next assistant",
                        "parameters": {
                          "type": "object",
                          "properties": {
                            "destination": {
                              "type": "string",
                              "description": "Use dynamic when customer is ready to be handed off to the next assistant",
                              "enum": ["dynamic"]
                            },
                            "customerAreaCode": {
                              "type": "number",
                              "description": "Area code of the customer"
                            },
                            "customerIntent": {
                              "type": "string",
                              "enum": ["new-customer", "existing-customer"],
                              "description": "Use new-customer when customer is a new customer, existing-customer when customer is an existing customer"
                            },
                            "customerSentiment": {
                              "type": "string",
                              "enum": ["positive", "negative", "neutral"],
                              "description": "Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral"
                            }
                          }
                        }
                      }
                    }
                  ]
                }

                ```


                The properties `customerAreaCode`, `customerIntent`, and `customerSentiment` will be passed to the
                server in the webhook request body.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            function:
              $ref: '#/components/schemas/OpenAIFunction'
              description: >-
                This is the optional function definition that will be passed to the LLM.

                If this is not defined, we will construct this based on the other properties.


                For example, given the following tools definition:

                ```json

                {
                  "tools": [
                    {
                      "type": "handoff",
                      "destinations": [
                        {
                          "type": "assistant",
                          "assistantId": "assistant-123",
                          "description": "customer wants to be handed off to assistant-123",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        },
                        {
                          "type": "assistant",
                          "assistantId": "assistant-456",
                          "description": "customer wants to be handed off to assistant-456",
                          "contextEngineeringPlan": {
                            "type": "all"
                          }
                        }
                      ],
                    }
                  ]
                }

                ```


                We will construct the following function definition:

                ```json

                {
                  "function": {
                    "name": "handoff_to_assistant-123",
                    "description": "
                         Use this function to handoff the call to the next assistant.
                         Only use it when instructions explicitly ask you to use the handoff_to_assistant function.
                         DO NOT call this function unless you are instructed to do so.
                         Here are the destinations you can handoff the call to:
                         1. assistant-123. When: customer wants to be handed off to assistant-123
                         2. assistant-456. When: customer wants to be handed off to assistant-456
                    ",
                    "parameters": {
                      "type": "object",
                      "properties": {
                        "destination": {
                          "type": "string",
                          "description": "Options: assistant-123 (customer wants to be handed off to assistant-123), assistant-456 (customer wants to be handed off to assistant-456)",
                          "enum": ["assistant-123", "assistant-456"]
                        },
                      },
                      "required": ["destination"]
                    }
                  }
                }

                ```


                To override this function, please provide an OpenAI function definition and refer to it in the system
                prompt.

                You may override parts of the function definition (i.e. you may only want to change the function name
                for your prompt).

                If you choose to override the function parameters, it must include `destination` as a required
                parameter, and it must evaluate to either an assistantId, assistantName, or a the string literal
                `dynamic`.


                To pass custom parameters to the server in a dynamic handoff, you can use the function parameters, with
                `dynamic` as the destination.

                ```json

                {
                  "function": {
                    "name": "dynamic_handoff",
                    "description": "
                         Call this function when the customer is ready to be handed off to the next assistant
                    ",
                    "parameters": {
                      "type": "object",
                      "properties": {
                        "destination": {
                          "type": "string",
                          "enum": ["dynamic"]
                        },
                        "customerAreaCode": {
                          "type": "number",
                          "description": "Area code of the customer"
                        },
                        "customerIntent": {
                          "type": "string",
                          "enum": ["new-customer", "existing-customer"],
                          "description": "Use new-customer when customer is a new customer, existing-customer when customer is an existing customer"
                        },
                        "customerSentiment": {
                          "type": "string",
                          "enum": ["positive", "negative", "neutral"],
                          "description": "Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral"
                        }
                      },
                      "required": ["destination", "customerAreaCode", "customerIntent", "customerSentiment"]
                    }
                  }
                }

                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: handoff variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - bash
              description: 'Discriminator value: bash'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            subType:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashSubType'
              description: The sub type of tool.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            name:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBashName'
              description: The name of the tool, fixed to 'bash'
          required:
            - type
            - subType
            - id
            - orgId
            - createdAt
            - updatedAt
            - name
          description: BashTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - computer
              description: 'Discriminator value: computer'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            subType:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerSubType'
              description: The sub type of tool.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            name:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingComputerName'
              description: The name of the tool, fixed to 'computer'
            displayWidthPx:
              type: number
              format: double
              description: The display width in pixels
            displayHeightPx:
              type: number
              format: double
              description: The display height in pixels
            displayNumber:
              type: number
              format: double
              description: Optional display number
          required:
            - type
            - subType
            - id
            - orgId
            - createdAt
            - updatedAt
            - name
            - displayWidthPx
            - displayHeightPx
          description: ComputerTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - textEditor
              description: 'Discriminator value: textEditor'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            subType:
              $ref: >-
                #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorSubType
              description: The sub type of tool.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            name:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextEditorName'
              description: The name of the tool, fixed to 'str_replace_editor'
          required:
            - type
            - subType
            - id
            - orgId
            - createdAt
            - updatedAt
            - name
          description: TextEditorTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - query
              description: 'Discriminator value: query'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingQueryMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            knowledgeBases:
              type: array
              items:
                $ref: '#/components/schemas/KnowledgeBase'
              description: The knowledge bases to query
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: QueryTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - google.calendar.event.create
              description: 'Discriminator value: google.calendar.event.create'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarEventCreateMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoogleCalendarCreateEventTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - google.sheets.row.append
              description: 'Discriminator value: google.sheets.row.append'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleSheetsRowAppendMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoogleSheetsRowAppendTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - google.calendar.availability.check
              description: 'Discriminator value: google.calendar.availability.check'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGoogleCalendarAvailabilityCheckMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoogleCalendarCheckAvailabilityTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - slack.message.send
              description: 'Discriminator value: slack.message.send'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSlackMessageSendMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: SlackSendMessageTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - sms
              description: 'Discriminator value: sms'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSmsMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: SmsTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - mcp
              description: 'Discriminator value: mcp'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingMcpMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            server:
              $ref: '#/components/schemas/Server'
              description: |2-

                  This is the server where a `tool-calls` webhook will be sent.

                  Notes:
                  - Webhook is sent to this server when a tool call is made.
                  - Webhook contains the call, assistant, and phone number objects.
                  - Webhook contains the variables set on the assistant.
                  - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.
                  - Webhook expects a response with tool call result.
            toolMessages:
              type: array
              items:
                $ref: '#/components/schemas/McpToolMessages'
              description: >-
                Per-tool message overrides for individual tools loaded from the MCP server. Set messages to an empty
                array to suppress messages for a specific tool. Tools not listed here will use the default messages from
                the parent tool.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
            metadata:
              $ref: '#/components/schemas/McpToolMetadata'
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: McpTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.calendar.availability.check
              description: 'Discriminator value: gohighlevel.calendar.availability.check'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarAvailabilityCheckMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoHighLevelCalendarAvailabilityTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.calendar.event.create
              description: 'Discriminator value: gohighlevel.calendar.event.create'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelCalendarEventCreateMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoHighLevelCalendarEventCreateTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.contact.create
              description: 'Discriminator value: gohighlevel.contact.create'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactCreateMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoHighLevelContactCreateTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - gohighlevel.contact.get
              description: 'Discriminator value: gohighlevel.contact.get'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingGohighlevelContactGetMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: GoHighLevelContactGetTool variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - sipRequest
              description: 'Discriminator value: sipRequest'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            verb:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestVerb'
              description: The SIP method to send.
            headers:
              $ref: '#/components/schemas/JsonSchema'
              description: JSON schema for headers the model should populate when sending the SIP request.
            body:
              $ref: '#/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingSipRequestBody'
              description: >-
                Body to include in the SIP request. Either a literal string body, or a JSON schema describing a
                structured body that the model should populate.
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - verb
            - id
            - orgId
            - createdAt
            - updatedAt
          description: sipRequest variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - voicemail
              description: 'Discriminator value: voicemail'
            messages:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ToolIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingVoicemailMessagesItems
              description: >-
                These are the messages that will be spoken to the user as the tool is running.


                For some tools, this is auto-filled based on special fields like `tool.destinations`. For others like
                the function tool, these can be custom configured.
            beepDetectionEnabled:
              type: boolean
              default: false
              description: >-
                This is the flag that enables beep detection for voicemail detection and applies only for twilio based
                calls.


                @default false
            id:
              type: string
              description: This is the unique identifier for the tool.
            orgId:
              type: string
              description: This is the unique identifier for the organization that this tool belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the tool was last updated.
            rejectionPlan:
              $ref: '#/components/schemas/ToolRejectionPlan'
              description: |-
                This is the plan to reject a tool call based on the conversation state.

                // Example 1: Reject endCall if user didn't say goodbye
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b',
                    target: { position: -1, role: 'user' },
                    negate: true  // Reject if pattern does NOT match
                  }]
                }
                ```

                // Example 2: Reject transfer if user is actually asking a question
                ```json
                {
                  conditions: [{
                    type: 'regex',
                    regex: '\\?',
                    target: { position: -1, role: 'user' }
                  }]
                }
                ```

                // Example 3: Reject transfer if user didn't mention transfer recently
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 5 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' %}
                {% assign mentioned = false %}
                {% for msg in userMessages %}
                  {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}
                    {% assign mentioned = true %}
                    {% break %}
                  {% endif %}
                {% endfor %}
                {% if mentioned %}
                  false
                {% else %}
                  true
                {% endif %}`
                  }]
                }
                ```

                // Example 4: Reject endCall if the bot is looping and trying to exit
                ```json
                {
                  conditions: [{
                    type: 'liquid',
                    liquid: `{% assign recentMessages = messages | last: 6 %}
                {% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}
                {% if userMessages.size < 3 %}
                  false
                {% else %}
                  {% assign msg1 = userMessages[0].content | downcase %}
                  {% assign msg2 = userMessages[1].content | downcase %}
                  {% assign msg3 = userMessages[2].content | downcase %}
                  {% comment %} Check for repetitive messages {% endcomment %}
                  {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}
                    true
                  {% comment %} Check for common loop phrases {% endcomment %}
                  {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}
                    true
                  {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}
                    true
                  {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}
                    true
                  {% else %}
                    false
                  {% endif %}
                {% endif %}`
                  }]
                }
                ```
          required:
            - type
            - id
            - orgId
            - createdAt
            - updatedAt
          description: voicemail variant
      discriminator:
        propertyName: type
      title: tools_update_Response_200
    FileObject:
      type: string
      enum:
        - file
      title: FileObject
    FileStatus:
      type: string
      enum:
        - processing
        - done
        - failed
      title: FileStatus
    FileMetadata:
      type: object
      properties: {}
      title: FileMetadata
    File:
      type: object
      properties:
        object:
          $ref: '#/components/schemas/FileObject'
        status:
          $ref: '#/components/schemas/FileStatus'
        name:
          type: string
          description: This is the name of the file. This is just for your own reference.
        originalName:
          type: string
        bytes:
          type: number
          format: double
        purpose:
          type: string
        mimetype:
          type: string
        key:
          type: string
        path:
          type: string
        bucket:
          type: string
        url:
          type: string
        parsedTextUrl:
          type: string
        parsedTextBytes:
          type: number
          format: double
        metadata:
          $ref: '#/components/schemas/FileMetadata'
        id:
          type: string
          description: This is the unique identifier for the file.
        orgId:
          type: string
          description: This is the unique identifier for the org that this file belongs to.
        createdAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the file was created.
        updatedAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the file was last updated.
      required:
        - id
        - orgId
        - createdAt
        - updatedAt
      title: File
    UpdateFileDTO:
      type: object
      properties:
        name:
          type: string
          description: This is the name of the file. This is just for your own reference.
      title: UpdateFileDTO
    StructuredOutputGetParametersSortOrder:
      type: string
      enum:
        - ASC
        - DESC
      title: StructuredOutputGetParametersSortOrder
    StructuredOutputType:
      type: string
      enum:
        - ai
        - regex
      description: |-
        This is the type of structured output.

        - 'ai': Uses an LLM to extract structured data from the conversation (default).
        - 'regex': Uses a regex pattern to extract data from the transcript without an LLM.
      title: StructuredOutputType
    StructuredOutputModel:
      oneOf:
        - $ref: '#/components/schemas/WorkflowOpenAIModel'
        - $ref: '#/components/schemas/WorkflowAnthropicModel'
        - $ref: '#/components/schemas/WorkflowAnthropicBedrockModel'
        - $ref: '#/components/schemas/WorkflowGoogleModel'
        - $ref: '#/components/schemas/WorkflowCustomModel'
      description: >-
        This is the model that will be used to extract the structured output.


        To provide your own custom system and user prompts for structured output extraction, populate the messages array
        with your system and user messages. You can specify liquid templating in your system and user messages.

        Between the system or user messages, you must reference either 'transcript' or 'messages' with the `{{}}` syntax
        to access the conversation history.

        Between the system or user messages, you must reference a variation of the structured output with the `{{}}`
        syntax to access the structured output definition.

        i.e.:

        `{{structuredOutput}}`

        `{{structuredOutput.name}}`

        `{{structuredOutput.description}}`

        `{{structuredOutput.schema}}`


        If model is not specified, GPT-4.1 will be used by default for extraction, utilizing default system and user
        prompts.

        If messages or required fields are not specified, the default system and user prompts will be used.
      title: StructuredOutputModel
    StructuredOutput:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/StructuredOutputType'
          description: |-
            This is the type of structured output.

            - 'ai': Uses an LLM to extract structured data from the conversation (default).
            - 'regex': Uses a regex pattern to extract data from the transcript without an LLM.
        regex:
          type: string
          description: |-
            This is the regex pattern to match against the transcript.

            Only used when type is 'regex'. Supports both raw patterns (e.g. '\d+') and
            regex literal format (e.g. '/\d+/gi'). Uses RE2 syntax for safety.

            The result depends on the schema type:
            - boolean: true if the pattern matches, false otherwise
            - string: the first match or first capture group
            - number/integer: the first match parsed as a number
            - array: all matches
        model:
          $ref: '#/components/schemas/StructuredOutputModel'
          description: >-
            This is the model that will be used to extract the structured output.


            To provide your own custom system and user prompts for structured output extraction, populate the messages
            array with your system and user messages. You can specify liquid templating in your system and user
            messages.

            Between the system or user messages, you must reference either 'transcript' or 'messages' with the `{{}}`
            syntax to access the conversation history.

            Between the system or user messages, you must reference a variation of the structured output with the `{{}}`
            syntax to access the structured output definition.

            i.e.:

            `{{structuredOutput}}`

            `{{structuredOutput.name}}`

            `{{structuredOutput.description}}`

            `{{structuredOutput.schema}}`


            If model is not specified, GPT-4.1 will be used by default for extraction, utilizing default system and user
            prompts.

            If messages or required fields are not specified, the default system and user prompts will be used.
        compliancePlan:
          $ref: '#/components/schemas/ComplianceOverride'
          description: Compliance configuration for this output. Only enable overrides if no sensitive data will be stored.
        id:
          type: string
          description: This is the unique identifier for the structured output.
        orgId:
          type: string
          description: This is the unique identifier for the org that this structured output belongs to.
        createdAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the structured output was created.
        updatedAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the structured output was last updated.
        name:
          type: string
          description: This is the name of the structured output.
        description:
          type: string
          description: |-
            This is the description of what the structured output extracts.

            Use this to provide context about what data will be extracted and how it will be used.
        assistantIds:
          type: array
          items:
            type: string
          description: >-
            These are the assistant IDs that this structured output is linked to.


            When linked to assistants, this structured output will be available for extraction during those assistant's
            calls.
        workflowIds:
          type: array
          items:
            type: string
          description: >-
            These are the workflow IDs that this structured output is linked to.


            When linked to workflows, this structured output will be available for extraction during those workflow's
            execution.
        schema:
          $ref: '#/components/schemas/JsonSchema'
          description: >-
            This is the JSON Schema definition for the structured output.


            Defines the structure and validation rules for the data that will be extracted. Supports all JSON Schema
            features including:

            - Objects and nested properties

            - Arrays and array validation

            - String, number, boolean, and null types

            - Enums and const values

            - Validation constraints (min/max, patterns, etc.)

            - Composition with allOf, anyOf, oneOf
      required:
        - id
        - orgId
        - createdAt
        - updatedAt
        - name
        - schema
      title: StructuredOutput
    StructuredOutputPaginatedResponse:
      type: object
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/StructuredOutput'
        metadata:
          $ref: '#/components/schemas/PaginationMeta'
      required:
        - results
        - metadata
      title: StructuredOutputPaginatedResponse
    UpdateStructuredOutputDtoType:
      type: string
      enum:
        - ai
        - regex
      description: |-
        This is the type of structured output.

        - 'ai': Uses an LLM to extract structured data from the conversation (default).
        - 'regex': Uses a regex pattern to extract data from the transcript without an LLM.
      title: UpdateStructuredOutputDtoType
    UpdateStructuredOutputDtoModel:
      oneOf:
        - $ref: '#/components/schemas/WorkflowOpenAIModel'
        - $ref: '#/components/schemas/WorkflowAnthropicModel'
        - $ref: '#/components/schemas/WorkflowAnthropicBedrockModel'
        - $ref: '#/components/schemas/WorkflowGoogleModel'
        - $ref: '#/components/schemas/WorkflowCustomModel'
      description: >-
        This is the model that will be used to extract the structured output.


        To provide your own custom system and user prompts for structured output extraction, populate the messages array
        with your system and user messages. You can specify liquid templating in your system and user messages.

        Between the system or user messages, you must reference either 'transcript' or 'messages' with the `{{}}` syntax
        to access the conversation history.

        Between the system or user messages, you must reference a variation of the structured output with the `{{}}`
        syntax to access the structured output definition.

        i.e.:

        `{{structuredOutput}}`

        `{{structuredOutput.name}}`

        `{{structuredOutput.description}}`

        `{{structuredOutput.schema}}`


        If model is not specified, GPT-4.1 will be used by default for extraction, utilizing default system and user
        prompts.

        If messages or required fields are not specified, the default system and user prompts will be used.
      title: UpdateStructuredOutputDtoModel
    UpdateStructuredOutputDTO:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/UpdateStructuredOutputDtoType'
          description: |-
            This is the type of structured output.

            - 'ai': Uses an LLM to extract structured data from the conversation (default).
            - 'regex': Uses a regex pattern to extract data from the transcript without an LLM.
        regex:
          type: string
          description: |-
            This is the regex pattern to match against the transcript.

            Only used when type is 'regex'. Supports both raw patterns (e.g. '\d+') and
            regex literal format (e.g. '/\d+/gi'). Uses RE2 syntax for safety.

            The result depends on the schema type:
            - boolean: true if the pattern matches, false otherwise
            - string: the first match or first capture group
            - number/integer: the first match parsed as a number
            - array: all matches
        model:
          $ref: '#/components/schemas/UpdateStructuredOutputDtoModel'
          description: >-
            This is the model that will be used to extract the structured output.


            To provide your own custom system and user prompts for structured output extraction, populate the messages
            array with your system and user messages. You can specify liquid templating in your system and user
            messages.

            Between the system or user messages, you must reference either 'transcript' or 'messages' with the `{{}}`
            syntax to access the conversation history.

            Between the system or user messages, you must reference a variation of the structured output with the `{{}}`
            syntax to access the structured output definition.

            i.e.:

            `{{structuredOutput}}`

            `{{structuredOutput.name}}`

            `{{structuredOutput.description}}`

            `{{structuredOutput.schema}}`


            If model is not specified, GPT-4.1 will be used by default for extraction, utilizing default system and user
            prompts.

            If messages or required fields are not specified, the default system and user prompts will be used.
        compliancePlan:
          $ref: '#/components/schemas/ComplianceOverride'
          description: Compliance configuration for this output. Only enable overrides if no sensitive data will be stored.
        name:
          type: string
          description: This is the name of the structured output.
        description:
          type: string
          description: |-
            This is the description of what the structured output extracts.

            Use this to provide context about what data will be extracted and how it will be used.
        assistantIds:
          type: array
          items:
            type: string
          description: >-
            These are the assistant IDs that this structured output is linked to.


            When linked to assistants, this structured output will be available for extraction during those assistant's
            calls.
        workflowIds:
          type: array
          items:
            type: string
          description: >-
            These are the workflow IDs that this structured output is linked to.


            When linked to workflows, this structured output will be available for extraction during those workflow's
            execution.
        schema:
          $ref: '#/components/schemas/JsonSchema'
          description: >-
            This is the JSON Schema definition for the structured output.


            Defines the structure and validation rules for the data that will be extracted. Supports all JSON Schema
            features including:

            - Objects and nested properties

            - Arrays and array validation

            - String, number, boolean, and null types

            - Enums and const values

            - Validation constraints (min/max, patterns, etc.)

            - Composition with allOf, anyOf, oneOf
      title: UpdateStructuredOutputDTO
    StructuredOutputRunDTO:
      type: object
      properties:
        previewEnabled:
          type: boolean
          default: false
          description: >-
            This is the preview flag for the re-run. If true, the re-run will be executed and the response will be
            returned immediately and the call artifact will NOT be updated.

            If false (default), the re-run will be executed and the response will be updated in the call artifact.
        structuredOutputId:
          type: string
          description: >-
            This is the ID of the structured output that will be run. This must be provided unless a transient
            structured output is provided.

            When the re-run is executed, only the value of this structured output will be replaced with the new value,
            or added if not present.
        structuredOutput:
          $ref: '#/components/schemas/CreateStructuredOutputDTO'
          description: >-
            This is the transient structured output that will be run. This must be provided if a structured output ID is
            not provided.

            When the re-run is executed, the structured output value will be added to the existing artifact.
        callIds:
          type: array
          items:
            type: string
          description: >-
            This is the array of callIds that will be updated with the new structured output value. If preview is true,
            this array must be provided and contain exactly 1 callId.

            If preview is false, up to 100 callIds may be provided.
      required:
        - callIds
      title: StructuredOutputRunDTO
    ReportingInsightGetParametersSortOrder:
      type: string
      enum:
        - ASC
        - DESC
      title: ReportingInsightGetParametersSortOrder
    InsightType:
      type: string
      enum:
        - bar
        - line
        - pie
        - text
      description: This is the type of the Insight.
      title: InsightType
    Insight:
      type: object
      properties:
        name:
          type: string
          description: This is the name of the Insight.
        type:
          $ref: '#/components/schemas/InsightType'
          description: This is the type of the Insight.
        id:
          type: string
          description: This is the unique identifier for the Insight.
        orgId:
          type: string
          description: This is the unique identifier for the org that this Insight belongs to.
        createdAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the Insight was created.
        updatedAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the Insight was last updated.
      required:
        - type
        - id
        - orgId
        - createdAt
        - updatedAt
      title: Insight
    InsightPaginatedResponse:
      type: object
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/Insight'
        metadata:
          $ref: '#/components/schemas/PaginationMeta'
      required:
        - results
        - metadata
      title: InsightPaginatedResponse
    InsightFormula:
      type: object
      properties:
        name:
          type: string
          description: |-
            This is the name of the formula.
            It will be used to label the formula in the insight board on the UI.
        formula:
          type: string
          description: >-
            This is the formula to calculate the insight from the queries.

            The formula needs to be a valid mathematical expression.

            The formula must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}}
            which will be substituted with the query result.

            Any MathJS formula is allowed - https://mathjs.org/docs/expressions/syntax.html


            Common valid math operations are +, -, *, /, %
      required:
        - formula
      title: InsightFormula
    BarInsightMetadata:
      type: object
      properties:
        xAxisLabel:
          type: string
        yAxisLabel:
          type: string
        yAxisMin:
          type: number
          format: double
        yAxisMax:
          type: number
          format: double
        name:
          type: string
      title: BarInsightMetadata
    InsightTimeRangeWithStepStep:
      type: string
      enum:
        - minute
        - hour
        - day
        - week
        - month
        - quarter
        - year
      description: |-
        This is the group by step for aggregation.

        If not provided, defaults to group by day.
      title: InsightTimeRangeWithStepStep
    InsightTimeRangeWithStepStart:
      type: object
      properties: {}
      description: |-
        This is the start date for the time range.

        Should be a valid ISO 8601 date-time string or relative time string.
        If not provided, defaults to the 7 days ago.

        Relative time strings of the format "-{number}{unit}" are allowed.

        Valid units are:
        - d: days
        - h: hours
        - w: weeks
        - m: months
        - y: years
      title: InsightTimeRangeWithStepStart
    InsightTimeRangeWithStepEnd:
      type: object
      properties: {}
      description: |-
        This is the end date for the time range.

        Should be a valid ISO 8601 date-time string or relative time string.
        If not provided, defaults to now.

        Relative time strings of the format "-{number}{unit}" are allowed.

        Valid units are:
        - d: days
        - h: hours
        - w: weeks
        - m: months
        - y: years
      title: InsightTimeRangeWithStepEnd
    InsightTimeRangeWithStep:
      type: object
      properties:
        step:
          $ref: '#/components/schemas/InsightTimeRangeWithStepStep'
          description: |-
            This is the group by step for aggregation.

            If not provided, defaults to group by day.
        start:
          $ref: '#/components/schemas/InsightTimeRangeWithStepStart'
          description: |-
            This is the start date for the time range.

            Should be a valid ISO 8601 date-time string or relative time string.
            If not provided, defaults to the 7 days ago.

            Relative time strings of the format "-{number}{unit}" are allowed.

            Valid units are:
            - d: days
            - h: hours
            - w: weeks
            - m: months
            - y: years
        end:
          $ref: '#/components/schemas/InsightTimeRangeWithStepEnd'
          description: |-
            This is the end date for the time range.

            Should be a valid ISO 8601 date-time string or relative time string.
            If not provided, defaults to now.

            Relative time strings of the format "-{number}{unit}" are allowed.

            Valid units are:
            - d: days
            - h: hours
            - w: weeks
            - m: months
            - y: years
        timezone:
          type: string
          description: |-
            This is the timezone you want to set for the query.

            If not provided, defaults to UTC.
      title: InsightTimeRangeWithStep
    ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy:
      type: string
      enum:
        - assistantId
        - workflowId
        - squadId
        - phoneNumberId
        - type
        - endedReason
        - customerNumber
        - campaignId
        - artifact.structuredOutputs[OutputID]
      description: |-
        This is the group by column for the insight when table is `call`.
        These are the columns to group the results by.
        All results are grouped by the time range step by default.
      title: ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy
    JsonQueryOnCallTableWithStringTypeColumnType:
      type: string
      enum:
        - vapiql-json
      description: This is the type of query. Only allowed type is "vapiql-json".
      title: JsonQueryOnCallTableWithStringTypeColumnType
    JsonQueryOnCallTableWithStringTypeColumnTable:
      type: string
      enum:
        - call
      description: This is the table that will be queried.
      title: JsonQueryOnCallTableWithStringTypeColumnTable
    FilterStringTypeColumnOnCallTableColumn:
      type: string
      enum:
        - assistantId
        - workflowId
        - squadId
        - phoneNumberId
        - type
        - customerNumber
        - status
        - endedReason
        - forwardedPhoneNumber
        - campaignId
      description: |-
        This is the column in the call table that will be filtered on.
        String Type columns are columns where the rows store data as a string.
        Must be a valid column for the selected table.
      title: FilterStringTypeColumnOnCallTableColumn
    FilterStringTypeColumnOnCallTableOperator:
      type: string
      enum:
        - '='
        - '!='
        - contains
        - not_contains
      description: |-
        This is the operator to use for the filter.
        For string type columns, the operator must be "=", "!=", "contains", "not contains"
      title: FilterStringTypeColumnOnCallTableOperator
    FilterStringTypeColumnOnCallTable:
      type: object
      properties:
        column:
          $ref: '#/components/schemas/FilterStringTypeColumnOnCallTableColumn'
          description: |-
            This is the column in the call table that will be filtered on.
            String Type columns are columns where the rows store data as a string.
            Must be a valid column for the selected table.
        operator:
          $ref: '#/components/schemas/FilterStringTypeColumnOnCallTableOperator'
          description: |-
            This is the operator to use for the filter.
            For string type columns, the operator must be "=", "!=", "contains", "not contains"
        value:
          type: string
          description: This is the value to filter on.
      required:
        - column
        - operator
        - value
      title: FilterStringTypeColumnOnCallTable
    FilterStringArrayTypeColumnOnCallTableColumn:
      type: string
      enum:
        - assistantId
        - workflowId
        - squadId
        - phoneNumberId
        - type
        - customerNumber
        - status
        - endedReason
        - forwardedPhoneNumber
        - campaignId
      description: >-
        This is the column in the call table that will be filtered on.

        String Array Type columns are the same as String Type columns, but provides the ability to filter on multiple
        values provided as an array.

        Must be a valid column for the selected table.
      title: FilterStringArrayTypeColumnOnCallTableColumn
    FilterStringArrayTypeColumnOnCallTableOperator:
      type: string
      enum:
        - in
        - not_in
        - is_empty
        - is_not_empty
      description: |-
        This is the operator to use for the filter.
        The operator must be `in` or `not_in`.
      title: FilterStringArrayTypeColumnOnCallTableOperator
    FilterStringArrayTypeColumnOnCallTable:
      type: object
      properties:
        column:
          $ref: '#/components/schemas/FilterStringArrayTypeColumnOnCallTableColumn'
          description: >-
            This is the column in the call table that will be filtered on.

            String Array Type columns are the same as String Type columns, but provides the ability to filter on
            multiple values provided as an array.

            Must be a valid column for the selected table.
        operator:
          $ref: '#/components/schemas/FilterStringArrayTypeColumnOnCallTableOperator'
          description: |-
            This is the operator to use for the filter.
            The operator must be `in` or `not_in`.
        value:
          type: array
          items:
            type: string
          description: These are the values to filter on.
      required:
        - column
        - operator
        - value
      title: FilterStringArrayTypeColumnOnCallTable
    FilterNumberTypeColumnOnCallTableColumn:
      type: string
      enum:
        - duration
        - cost
        - averageModelLatency
        - averageVoiceLatency
        - averageTranscriberLatency
        - averageTurnLatency
        - averageEndpointingLatency
      description: |-
        This is the column in the call table that will be filtered on.
        Number Type columns are columns where the rows store data as a number.
        Must be a valid column for the selected table.
      title: FilterNumberTypeColumnOnCallTableColumn
    FilterNumberTypeColumnOnCallTableOperator:
      type: string
      enum:
        - '='
        - '!='
        - '>'
        - <
        - '>='
        - <=
      description: |-
        This is the operator to use for the filter.
        For number type columns, the operator must be "=", ">", "<", ">=", "<="
      title: FilterNumberTypeColumnOnCallTableOperator
    FilterNumberTypeColumnOnCallTable:
      type: object
      properties:
        column:
          $ref: '#/components/schemas/FilterNumberTypeColumnOnCallTableColumn'
          description: |-
            This is the column in the call table that will be filtered on.
            Number Type columns are columns where the rows store data as a number.
            Must be a valid column for the selected table.
        operator:
          $ref: '#/components/schemas/FilterNumberTypeColumnOnCallTableOperator'
          description: |-
            This is the operator to use for the filter.
            For number type columns, the operator must be "=", ">", "<", ">=", "<="
        value:
          type: number
          format: double
          description: This is the value to filter on.
      required:
        - column
        - operator
        - value
      title: FilterNumberTypeColumnOnCallTable
    FilterNumberArrayTypeColumnOnCallTableColumn:
      type: string
      enum:
        - duration
        - cost
        - averageModelLatency
        - averageVoiceLatency
        - averageTranscriberLatency
        - averageTurnLatency
        - averageEndpointingLatency
      description: >-
        This is the column in the call table that will be filtered on.

        Number Array Type columns are the same as Number Type columns, but provides the ability to filter on multiple
        values provided as an array.

        Must be a valid column for the selected table.
      title: FilterNumberArrayTypeColumnOnCallTableColumn
    FilterNumberArrayTypeColumnOnCallTableOperator:
      type: string
      enum:
        - in
        - not_in
        - is_empty
        - is_not_empty
      description: |-
        This is the operator to use for the filter.
        The operator must be `in` or `not_in`.
      title: FilterNumberArrayTypeColumnOnCallTableOperator
    FilterNumberArrayTypeColumnOnCallTable:
      type: object
      properties:
        column:
          $ref: '#/components/schemas/FilterNumberArrayTypeColumnOnCallTableColumn'
          description: >-
            This is the column in the call table that will be filtered on.

            Number Array Type columns are the same as Number Type columns, but provides the ability to filter on
            multiple values provided as an array.

            Must be a valid column for the selected table.
        operator:
          $ref: '#/components/schemas/FilterNumberArrayTypeColumnOnCallTableOperator'
          description: |-
            This is the operator to use for the filter.
            The operator must be `in` or `not_in`.
        value:
          type: array
          items:
            type: number
            format: double
          description: This is the value to filter on.
      required:
        - column
        - operator
        - value
      title: FilterNumberArrayTypeColumnOnCallTable
    FilterDateTypeColumnOnCallTableColumn:
      type: string
      enum:
        - startedAt
        - endedAt
      description: |-
        This is the column in the call table that will be filtered on.
        Date Type columns are columns where the rows store data as a date.
        Must be a valid column for the selected table.
      title: FilterDateTypeColumnOnCallTableColumn
    FilterDateTypeColumnOnCallTableOperator:
      type: string
      enum:
        - '='
        - '!='
        - '>'
        - <
        - '>='
        - <=
      description: |-
        This is the operator to use for the filter.
        For date type columns, the operator must be "=", ">", "<", ">=", "<="
      title: FilterDateTypeColumnOnCallTableOperator
    FilterDateTypeColumnOnCallTable:
      type: object
      properties:
        column:
          $ref: '#/components/schemas/FilterDateTypeColumnOnCallTableColumn'
          description: |-
            This is the column in the call table that will be filtered on.
            Date Type columns are columns where the rows store data as a date.
            Must be a valid column for the selected table.
        operator:
          $ref: '#/components/schemas/FilterDateTypeColumnOnCallTableOperator'
          description: |-
            This is the operator to use for the filter.
            For date type columns, the operator must be "=", ">", "<", ">=", "<="
        value:
          type: string
          description: |-
            This is the value to filter on.
            Must be a valid ISO 8601 date-time string.
      required:
        - column
        - operator
        - value
      title: FilterDateTypeColumnOnCallTable
    FilterStructuredOutputColumnOnCallTableColumn:
      type: string
      enum:
        - artifact.structuredOutputs[OutputID]
      description: |-
        This is the column in the call table that will be filtered on.
        Structured Output Type columns are only to filter on artifact.structuredOutputs[OutputID] column.
      title: FilterStructuredOutputColumnOnCallTableColumn
    FilterStructuredOutputColumnOnCallTableOperator:
      type: string
      enum:
        - '='
        - '!='
        - '>'
        - <
        - '>='
        - <=
        - in
        - not_in
        - contains
        - not_contains
        - is_empty
        - is_not_empty
      description: |-
        This is the operator to use for the filter.
        The operator depends on the value type of the structured output.
        If the structured output is a string or boolean, the operator must be "=", "!="
        If the structured output is a number, the operator must be "=", ">", "<", ">=", "<="
        If the structured output is an array, the operator must be "in" or "not_in"
      title: FilterStructuredOutputColumnOnCallTableOperator
    FilterStructuredOutputColumnOnCallTableValue:
      type: object
      properties: {}
      description: |-
        This is the value to filter on.
        The value type depends on the structured output type being filtered.
      title: FilterStructuredOutputColumnOnCallTableValue
    FilterStructuredOutputColumnOnCallTable:
      type: object
      properties:
        column:
          $ref: '#/components/schemas/FilterStructuredOutputColumnOnCallTableColumn'
          description: |-
            This is the column in the call table that will be filtered on.
            Structured Output Type columns are only to filter on artifact.structuredOutputs[OutputID] column.
        operator:
          $ref: '#/components/schemas/FilterStructuredOutputColumnOnCallTableOperator'
          description: |-
            This is the operator to use for the filter.
            The operator depends on the value type of the structured output.
            If the structured output is a string or boolean, the operator must be "=", "!="
            If the structured output is a number, the operator must be "=", ">", "<", ">=", "<="
            If the structured output is an array, the operator must be "in" or "not_in"
        value:
          $ref: '#/components/schemas/FilterStructuredOutputColumnOnCallTableValue'
          description: |-
            This is the value to filter on.
            The value type depends on the structured output type being filtered.
      required:
        - column
        - operator
        - value
      title: FilterStructuredOutputColumnOnCallTable
    JsonQueryOnCallTableWithStringTypeColumnFiltersItems:
      oneOf:
        - $ref: '#/components/schemas/FilterStringTypeColumnOnCallTable'
        - $ref: '#/components/schemas/FilterStringArrayTypeColumnOnCallTable'
        - $ref: '#/components/schemas/FilterNumberTypeColumnOnCallTable'
        - $ref: '#/components/schemas/FilterNumberArrayTypeColumnOnCallTable'
        - $ref: '#/components/schemas/FilterDateTypeColumnOnCallTable'
        - $ref: '#/components/schemas/FilterStructuredOutputColumnOnCallTable'
      title: JsonQueryOnCallTableWithStringTypeColumnFiltersItems
    JsonQueryOnCallTableWithStringTypeColumnColumn:
      type: string
      enum:
        - id
        - artifact.structuredOutputs[OutputID]
      description: |-
        This is the column that will be queried in the selected table.
        Available columns depend on the selected table.
        String Type columns are columns where the rows store String data
      title: JsonQueryOnCallTableWithStringTypeColumnColumn
    JsonQueryOnCallTableWithStringTypeColumnOperation:
      type: string
      enum:
        - count
      description: |-
        This is the aggregation operation to perform on the column.
        When the column is a string type, the operation must be "count".
      title: JsonQueryOnCallTableWithStringTypeColumnOperation
    JSONQueryOnCallTableWithStringTypeColumn:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/JsonQueryOnCallTableWithStringTypeColumnType'
          description: This is the type of query. Only allowed type is "vapiql-json".
        table:
          $ref: '#/components/schemas/JsonQueryOnCallTableWithStringTypeColumnTable'
          description: This is the table that will be queried.
        filters:
          type: array
          items:
            $ref: '#/components/schemas/JsonQueryOnCallTableWithStringTypeColumnFiltersItems'
          description: |-
            This is the filters to apply to the insight.
            The discriminator automatically selects the correct filter type based on column and operator.
        column:
          $ref: '#/components/schemas/JsonQueryOnCallTableWithStringTypeColumnColumn'
          description: |-
            This is the column that will be queried in the selected table.
            Available columns depend on the selected table.
            String Type columns are columns where the rows store String data
        operation:
          $ref: '#/components/schemas/JsonQueryOnCallTableWithStringTypeColumnOperation'
          description: |-
            This is the aggregation operation to perform on the column.
            When the column is a string type, the operation must be "count".
        name:
          type: string
          description: |-
            This is the name of the query.
            It will be used to label the query in the insight board on the UI.
      required:
        - type
        - table
        - column
        - operation
      title: JSONQueryOnCallTableWithStringTypeColumn
    JsonQueryOnCallTableWithNumberTypeColumnType:
      type: string
      enum:
        - vapiql-json
      description: This is the type of query. Only allowed type is "vapiql-json".
      title: JsonQueryOnCallTableWithNumberTypeColumnType
    JsonQueryOnCallTableWithNumberTypeColumnTable:
      type: string
      enum:
        - call
      description: This is the table that will be queried.
      title: JsonQueryOnCallTableWithNumberTypeColumnTable
    JsonQueryOnCallTableWithNumberTypeColumnFiltersItems:
      oneOf:
        - $ref: '#/components/schemas/FilterStringTypeColumnOnCallTable'
        - $ref: '#/components/schemas/FilterStringArrayTypeColumnOnCallTable'
        - $ref: '#/components/schemas/FilterNumberTypeColumnOnCallTable'
        - $ref: '#/components/schemas/FilterNumberArrayTypeColumnOnCallTable'
        - $ref: '#/components/schemas/FilterDateTypeColumnOnCallTable'
        - $ref: '#/components/schemas/FilterStructuredOutputColumnOnCallTable'
      title: JsonQueryOnCallTableWithNumberTypeColumnFiltersItems
    JsonQueryOnCallTableWithNumberTypeColumnColumn:
      type: string
      enum:
        - cost
        - duration
        - averageModelLatency
        - averageVoiceLatency
        - averageTranscriberLatency
        - averageTurnLatency
        - averageEndpointingLatency
        - artifact.structuredOutputs[OutputID]
      description: |-
        This is the column that will be queried in the selected table.
        Available columns depend on the selected table.
        Number Type columns are columns where the rows store Number data
      title: JsonQueryOnCallTableWithNumberTypeColumnColumn
    JsonQueryOnCallTableWithNumberTypeColumnOperation:
      type: string
      enum:
        - average
        - sum
        - min
        - max
      description: |-
        This is the aggregation operation to perform on the column.
        When the column is a number type, the operation must be one of the following:
        - average
        - sum
        - min
        - max
      title: JsonQueryOnCallTableWithNumberTypeColumnOperation
    JSONQueryOnCallTableWithNumberTypeColumn:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/JsonQueryOnCallTableWithNumberTypeColumnType'
          description: This is the type of query. Only allowed type is "vapiql-json".
        table:
          $ref: '#/components/schemas/JsonQueryOnCallTableWithNumberTypeColumnTable'
          description: This is the table that will be queried.
        filters:
          type: array
          items:
            $ref: '#/components/schemas/JsonQueryOnCallTableWithNumberTypeColumnFiltersItems'
          description: |-
            This is the filters to apply to the insight.
            The discriminator automatically selects the correct filter type based on column and operator.
        column:
          $ref: '#/components/schemas/JsonQueryOnCallTableWithNumberTypeColumnColumn'
          description: |-
            This is the column that will be queried in the selected table.
            Available columns depend on the selected table.
            Number Type columns are columns where the rows store Number data
        operation:
          $ref: '#/components/schemas/JsonQueryOnCallTableWithNumberTypeColumnOperation'
          description: |-
            This is the aggregation operation to perform on the column.
            When the column is a number type, the operation must be one of the following:
            - average
            - sum
            - min
            - max
        name:
          type: string
          description: |-
            This is the name of the query.
            It will be used to label the query in the insight board on the UI.
      required:
        - type
        - table
        - column
        - operation
      title: JSONQueryOnCallTableWithNumberTypeColumn
    JsonQueryOnCallTableWithStructuredOutputColumnType:
      type: string
      enum:
        - vapiql-json
      description: This is the type of query. Only allowed type is "vapiql-json".
      title: JsonQueryOnCallTableWithStructuredOutputColumnType
    JsonQueryOnCallTableWithStructuredOutputColumnTable:
      type: string
      enum:
        - call
      description: This is the table that will be queried.
      title: JsonQueryOnCallTableWithStructuredOutputColumnTable
    JsonQueryOnCallTableWithStructuredOutputColumnFiltersItems:
      oneOf:
        - $ref: '#/components/schemas/FilterStringTypeColumnOnCallTable'
        - $ref: '#/components/schemas/FilterStringArrayTypeColumnOnCallTable'
        - $ref: '#/components/schemas/FilterNumberTypeColumnOnCallTable'
        - $ref: '#/components/schemas/FilterNumberArrayTypeColumnOnCallTable'
        - $ref: '#/components/schemas/FilterDateTypeColumnOnCallTable'
        - $ref: '#/components/schemas/FilterStructuredOutputColumnOnCallTable'
      title: JsonQueryOnCallTableWithStructuredOutputColumnFiltersItems
    JsonQueryOnCallTableWithStructuredOutputColumnColumn:
      type: string
      enum:
        - artifact.structuredOutputs[OutputID]
      description: |-
        This is the column that will be queried in the call table.
        Structured Output Type columns are only to query on artifact.structuredOutputs[OutputID] column.
      title: JsonQueryOnCallTableWithStructuredOutputColumnColumn
    JsonQueryOnCallTableWithStructuredOutputColumnOperation:
      type: string
      enum:
        - average
        - count
        - sum
        - min
        - max
      description: |-
        This is the aggregation operation to perform on the column.
        When the column is a structured output type, the operation depends on the value of the structured output.
        If the structured output is a string or boolean, the operation must be "count".
        If the structured output is a number, the operation can be "average", "sum", "min", or "max".
      title: JsonQueryOnCallTableWithStructuredOutputColumnOperation
    JSONQueryOnCallTableWithStructuredOutputColumn:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/JsonQueryOnCallTableWithStructuredOutputColumnType'
          description: This is the type of query. Only allowed type is "vapiql-json".
        table:
          $ref: '#/components/schemas/JsonQueryOnCallTableWithStructuredOutputColumnTable'
          description: This is the table that will be queried.
        filters:
          type: array
          items:
            $ref: '#/components/schemas/JsonQueryOnCallTableWithStructuredOutputColumnFiltersItems'
          description: |-
            This is the filters to apply to the insight.
            The discriminator automatically selects the correct filter type based on column and operator.
        column:
          $ref: '#/components/schemas/JsonQueryOnCallTableWithStructuredOutputColumnColumn'
          description: |-
            This is the column that will be queried in the call table.
            Structured Output Type columns are only to query on artifact.structuredOutputs[OutputID] column.
        operation:
          $ref: '#/components/schemas/JsonQueryOnCallTableWithStructuredOutputColumnOperation'
          description: |-
            This is the aggregation operation to perform on the column.
            When the column is a structured output type, the operation depends on the value of the structured output.
            If the structured output is a string or boolean, the operation must be "count".
            If the structured output is a number, the operation can be "average", "sum", "min", or "max".
        name:
          type: string
          description: |-
            This is the name of the query.
            It will be used to label the query in the insight board on the UI.
      required:
        - type
        - table
        - column
        - operation
      title: JSONQueryOnCallTableWithStructuredOutputColumn
    JsonQueryOnEventsTableType:
      type: string
      enum:
        - vapiql-json
      description: This is the type of query. Only allowed type is "vapiql-json".
      title: JsonQueryOnEventsTableType
    JsonQueryOnEventsTableTable:
      type: string
      enum:
        - events
      description: |-
        This is the table that will be queried.
        Must be "events" for event-based insights.
      title: JsonQueryOnEventsTableTable
    JsonQueryOnEventsTableOn:
      type: string
      enum:
        - call.started
        - call.ended
        - call.inProgress
        - call.queued
        - call.transportConnected
        - call.transportDisconnected
        - call.transportReconnected
        - call.transferInitiated
        - call.transferCompleted
        - call.transferFailed
        - call.transferCancelled
        - call.handoffInitiated
        - call.handoffCompleted
        - call.handoffFailed
        - call.assistantSwapped
        - call.assistantStarted
        - call.customerJoined
        - call.customerLeft
        - call.controlReceived
        - call.listenStarted
        - call.recordingStarted
        - call.recordingPaused
        - call.recordingResumed
        - call.voicemailDetected
        - call.voicemailNotDetected
        - call.dtmfReceived
        - call.dtmfSent
        - call.amdDetected
        - call.hookTriggered
        - call.hookSucceeded
        - call.hookFailed
        - call.statusReceived
        - call.silenceTimeout
        - call.microphoneTimeout
        - call.maxDurationReached
        - assistant.voice.requestStarted
        - assistant.voice.requestSucceeded
        - assistant.voice.requestFailed
        - assistant.voice.connectionOpened
        - assistant.voice.connectionClosed
        - assistant.voice.firstAudioReceived
        - assistant.voice.audioChunkReceived
        - assistant.voice.generationSucceeded
        - assistant.voice.generationFailed
        - assistant.voice.textPushed
        - assistant.voice.reconnecting
        - assistant.voice.cleanup
        - assistant.voice.clearing
        - assistant.voice.voiceSwitched
        - assistant.model.requestStarted
        - assistant.model.requestSucceeded
        - assistant.model.requestFailed
        - assistant.model.requestAttemptStarted
        - assistant.model.requestAttemptSucceeded
        - assistant.model.requestAttemptFailed
        - assistant.model.connectionOpened
        - assistant.model.connectionClosed
        - assistant.model.firstTokenReceived
        - assistant.model.tokenReceived
        - assistant.model.responseSucceeded
        - assistant.model.responseFailed
        - assistant.model.toolCallsReceived
        - assistant.model.reconnecting
        - assistant.model.cleanup
        - assistant.model.clearing
        - assistant.tool.started
        - assistant.tool.completed
        - assistant.tool.failed
        - assistant.tool.delayedMessageSent
        - assistant.tool.timeout
        - assistant.tool.asyncCallbackReceived
        - assistant.transcriber.requestStarted
        - assistant.transcriber.requestSucceeded
        - assistant.transcriber.requestFailed
        - assistant.transcriber.connectionOpened
        - assistant.transcriber.connectionClosed
        - assistant.transcriber.partialTranscript
        - assistant.transcriber.finalTranscript
        - assistant.transcriber.keepAlive
        - assistant.transcriber.reconnecting
        - assistant.transcriber.cleanup
        - assistant.transcriber.clearing
        - assistant.transcriber.transcriptIgnored
        - assistant.transcriber.languageSwitched
        - assistant.analysis.structuredOutputGenerated
        - pipeline.turnStarted
        - pipeline.cleared
        - pipeline.botSpeechStarted
        - pipeline.botSpeechStopped
        - pipeline.userSpeechStarted
        - pipeline.userSpeechStopped
        - pipeline.endpointingTriggered
        - pipeline.firstMessageStarted
        - pipeline.firstMessageCompleted
      description: The event type to query
      title: JsonQueryOnEventsTableOn
    JsonQueryOnEventsTableOperation:
      type: string
      enum:
        - count
        - percentage
      description: |-
        This is the operation to perform on matching events.
        - "count": Returns the raw count of matching events
        - "percentage": Returns (count of matching events / total calls) * 100
      title: JsonQueryOnEventsTableOperation
    EventsTableStringConditionOperator:
      type: string
      enum:
        - '='
        - '!='
        - contains
        - notContains
      description: String comparison operator
      title: EventsTableStringConditionOperator
    EventsTableStringCondition:
      type: object
      properties:
        column:
          type: string
          description: The string field name from the event data
        operator:
          $ref: '#/components/schemas/EventsTableStringConditionOperator'
          description: String comparison operator
        value:
          type: string
          description: The string value to compare
      required:
        - column
        - operator
        - value
      title: EventsTableStringCondition
    EventsTableNumberConditionOperator:
      type: string
      enum:
        - '='
        - '!='
        - '>'
        - '>='
        - <
        - <=
      description: Number comparison operator
      title: EventsTableNumberConditionOperator
    EventsTableNumberCondition:
      type: object
      properties:
        column:
          type: string
          description: The number field name from the event data
        operator:
          $ref: '#/components/schemas/EventsTableNumberConditionOperator'
          description: Number comparison operator
        value:
          type: number
          format: double
          description: The number value to compare
      required:
        - column
        - operator
        - value
      title: EventsTableNumberCondition
    EventsTableBooleanConditionOperator:
      type: string
      enum:
        - '='
      description: Boolean comparison operator
      title: EventsTableBooleanConditionOperator
    EventsTableBooleanCondition:
      type: object
      properties:
        column:
          type: string
          description: The boolean field name from the event data
        operator:
          $ref: '#/components/schemas/EventsTableBooleanConditionOperator'
          description: Boolean comparison operator
        value:
          type: boolean
          description: The boolean value to compare
      required:
        - column
        - operator
        - value
      title: EventsTableBooleanCondition
    JsonQueryOnEventsTableFiltersItems:
      oneOf:
        - $ref: '#/components/schemas/EventsTableStringCondition'
        - $ref: '#/components/schemas/EventsTableNumberCondition'
        - $ref: '#/components/schemas/EventsTableBooleanCondition'
      title: JsonQueryOnEventsTableFiltersItems
    JSONQueryOnEventsTable:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/JsonQueryOnEventsTableType'
          description: This is the type of query. Only allowed type is "vapiql-json".
        table:
          $ref: '#/components/schemas/JsonQueryOnEventsTableTable'
          description: |-
            This is the table that will be queried.
            Must be "events" for event-based insights.
        'on':
          $ref: '#/components/schemas/JsonQueryOnEventsTableOn'
          description: The event type to query
        operation:
          $ref: '#/components/schemas/JsonQueryOnEventsTableOperation'
          description: |-
            This is the operation to perform on matching events.
            - "count": Returns the raw count of matching events
            - "percentage": Returns (count of matching events / total calls) * 100
        filters:
          type: array
          items:
            $ref: '#/components/schemas/JsonQueryOnEventsTableFiltersItems'
          description: |-
            These are the filters to apply to the events query.
            Each filter filters on a field specific to the event type.
        name:
          type: string
          description: |-
            This is the name of the query.
            It will be used to label the query in the insight board on the UI.
      required:
        - type
        - table
        - 'on'
        - operation
      title: JSONQueryOnEventsTable
    ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems:
      oneOf:
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn'
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn'
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn'
        - $ref: '#/components/schemas/JSONQueryOnEventsTable'
      title: ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems
    InsightTimeRangeStart:
      type: object
      properties: {}
      description: |-
        This is the start date for the time range.

        Should be a valid ISO 8601 date-time string or relative time string.
        If not provided, defaults to the 7 days ago.

        Relative time strings of the format "-{number}{unit}" are allowed.

        Valid units are:
        - d: days
        - h: hours
        - w: weeks
        - m: months
        - y: years
      title: InsightTimeRangeStart
    InsightTimeRangeEnd:
      type: object
      properties: {}
      description: |-
        This is the end date for the time range.

        Should be a valid ISO 8601 date-time string or relative time string.
        If not provided, defaults to now.

        Relative time strings of the format "-{number}{unit}" are allowed.

        Valid units are:
        - d: days
        - h: hours
        - w: weeks
        - m: months
        - y: years
      title: InsightTimeRangeEnd
    InsightTimeRange:
      type: object
      properties:
        start:
          $ref: '#/components/schemas/InsightTimeRangeStart'
          description: |-
            This is the start date for the time range.

            Should be a valid ISO 8601 date-time string or relative time string.
            If not provided, defaults to the 7 days ago.

            Relative time strings of the format "-{number}{unit}" are allowed.

            Valid units are:
            - d: days
            - h: hours
            - w: weeks
            - m: months
            - y: years
        end:
          $ref: '#/components/schemas/InsightTimeRangeEnd'
          description: |-
            This is the end date for the time range.

            Should be a valid ISO 8601 date-time string or relative time string.
            If not provided, defaults to now.

            Relative time strings of the format "-{number}{unit}" are allowed.

            Valid units are:
            - d: days
            - h: hours
            - w: weeks
            - m: months
            - y: years
        timezone:
          type: string
          description: |-
            This is the timezone you want to set for the query.

            If not provided, defaults to UTC.
      title: InsightTimeRange
    ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy:
      type: string
      enum:
        - assistantId
        - workflowId
        - squadId
        - phoneNumberId
        - type
        - endedReason
        - customerNumber
        - campaignId
        - artifact.structuredOutputs[OutputID]
      description: |-
        This is the group by column for the insight when table is `call`.
        These are the columns to group the results by.
        All results are grouped by the time range step by default.
      title: ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy
    ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems:
      oneOf:
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn'
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn'
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn'
      title: ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems
    LineInsightMetadata:
      type: object
      properties:
        xAxisLabel:
          type: string
        yAxisLabel:
          type: string
        yAxisMin:
          type: number
          format: double
        yAxisMax:
          type: number
          format: double
        name:
          type: string
      title: LineInsightMetadata
    ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy:
      type: string
      enum:
        - assistantId
        - workflowId
        - squadId
        - phoneNumberId
        - type
        - endedReason
        - customerNumber
        - campaignId
        - artifact.structuredOutputs[OutputID]
      description: |-
        This is the group by column for the insight when table is `call`.
        These are the columns to group the results by.
        All results are grouped by the time range step by default.
      title: ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy
    ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems:
      oneOf:
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn'
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn'
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn'
      title: ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems
    ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextFormula:
      type: object
      properties: {}
      description: >-
        Formulas are mathematical expressions applied on the data returned by the queries to transform them before being
        used to create the insight.

        The formulas needs to be a valid mathematical expression, supported by MathJS -
        https://mathjs.org/docs/expressions/syntax.html

        A formula is created by using the query names as the variable.

        The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}}
        which will be substituted with the query result.

        For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula
        like this:

        ```

        {{['Query 1']}} / {{['Query 2']}} * 100

        ```


        ```

        ({{[Query 1]}} * 10) + {{[Query 2]}}

        ```

        This will take the


        You can also use the query names as the variable in the formula.
      title: ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextFormula
    ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems:
      oneOf:
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn'
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn'
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn'
      title: ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems
    Insight_InsightController_create_Request:
      oneOf:
        - type: object
          properties:
            type:
              type: string
              enum:
                - bar
              description: 'Discriminator value: bar'
            name:
              type: string
              description: This is the name of the Insight.
            formulas:
              type: array
              items:
                $ref: '#/components/schemas/InsightFormula'
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            metadata:
              $ref: '#/components/schemas/BarInsightMetadata'
              description: This is the metadata for the insight.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRangeWithStep'
            groupBy:
              $ref: >-
                #/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy
              description: |-
                This is the group by column for the insight when table is `call`.
                These are the columns to group the results by.
                All results are grouped by the time range step by default.
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems
              description: These are the queries to run to generate the insight.
          required:
            - type
            - queries
          description: bar variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - pie
              description: 'Discriminator value: pie'
            name:
              type: string
              description: This is the name of the Insight.
            formulas:
              type: array
              items:
                $ref: '#/components/schemas/InsightFormula'
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRange'
            groupBy:
              $ref: >-
                #/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy
              description: |-
                This is the group by column for the insight when table is `call`.
                These are the columns to group the results by.
                All results are grouped by the time range step by default.
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems
              description: These are the queries to run to generate the insight.
          required:
            - type
            - queries
          description: pie variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - line
              description: 'Discriminator value: line'
            name:
              type: string
              description: This is the name of the Insight.
            formulas:
              type: array
              items:
                $ref: '#/components/schemas/InsightFormula'
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            metadata:
              $ref: '#/components/schemas/LineInsightMetadata'
              description: This is the metadata for the insight.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRangeWithStep'
            groupBy:
              $ref: >-
                #/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy
              description: |-
                This is the group by column for the insight when table is `call`.
                These are the columns to group the results by.
                All results are grouped by the time range step by default.
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems
              description: These are the queries to run to generate the insight.
          required:
            - type
            - queries
          description: line variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - text
              description: 'Discriminator value: text'
            name:
              type: string
              description: This is the name of the Insight.
            formula:
              $ref: >-
                #/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextFormula
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRange'
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems
              description: |-
                These are the queries to run to generate the insight.
                For Text Insights, we only allow a single query, or require a formula if multiple queries are provided
          required:
            - type
            - queries
          description: text variant
      discriminator:
        propertyName: type
      title: Insight_InsightController_create_Request
    ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy:
      type: string
      enum:
        - assistantId
        - workflowId
        - squadId
        - phoneNumberId
        - type
        - endedReason
        - customerNumber
        - campaignId
        - artifact.structuredOutputs[OutputID]
      description: |-
        This is the group by column for the insight when table is `call`.
        These are the columns to group the results by.
        All results are grouped by the time range step by default.
      title: ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy
    ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems:
      oneOf:
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn'
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn'
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn'
        - $ref: '#/components/schemas/JSONQueryOnEventsTable'
      title: ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems
    ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy:
      type: string
      enum:
        - assistantId
        - workflowId
        - squadId
        - phoneNumberId
        - type
        - endedReason
        - customerNumber
        - campaignId
        - artifact.structuredOutputs[OutputID]
      description: |-
        This is the group by column for the insight when table is `call`.
        These are the columns to group the results by.
        All results are grouped by the time range step by default.
      title: ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy
    ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems:
      oneOf:
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn'
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn'
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn'
      title: ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems
    ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy:
      type: string
      enum:
        - assistantId
        - workflowId
        - squadId
        - phoneNumberId
        - type
        - endedReason
        - customerNumber
        - campaignId
        - artifact.structuredOutputs[OutputID]
      description: |-
        This is the group by column for the insight when table is `call`.
        These are the columns to group the results by.
        All results are grouped by the time range step by default.
      title: ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy
    ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems:
      oneOf:
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn'
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn'
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn'
      title: ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems
    ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextFormula:
      type: object
      properties: {}
      description: >-
        Formulas are mathematical expressions applied on the data returned by the queries to transform them before being
        used to create the insight.

        The formulas needs to be a valid mathematical expression, supported by MathJS -
        https://mathjs.org/docs/expressions/syntax.html

        A formula is created by using the query names as the variable.

        The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}}
        which will be substituted with the query result.

        For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula
        like this:

        ```

        {{['Query 1']}} / {{['Query 2']}} * 100

        ```


        ```

        ({{[Query 1]}} * 10) + {{[Query 2]}}

        ```

        This will take the


        You can also use the query names as the variable in the formula.
      title: ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextFormula
    ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems:
      oneOf:
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn'
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn'
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn'
      title: ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems
    Insight_InsightController_create_Response_201:
      oneOf:
        - type: object
          properties:
            type:
              type: string
              enum:
                - bar
              description: 'Discriminator value: bar'
            name:
              type: string
              description: This is the name of the Insight.
            formulas:
              type: array
              items:
                $ref: '#/components/schemas/InsightFormula'
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            metadata:
              $ref: '#/components/schemas/BarInsightMetadata'
              description: This is the metadata for the insight.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRangeWithStep'
            groupBy:
              $ref: >-
                #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy
              description: |-
                This is the group by column for the insight when table is `call`.
                These are the columns to group the results by.
                All results are grouped by the time range step by default.
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems
              description: These are the queries to run to generate the insight.
            id:
              type: string
              description: This is the unique identifier for the Insight.
            orgId:
              type: string
              description: This is the unique identifier for the org that this Insight belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was last updated.
          required:
            - type
            - queries
            - id
            - orgId
            - createdAt
            - updatedAt
          description: bar variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - pie
              description: 'Discriminator value: pie'
            name:
              type: string
              description: This is the name of the Insight.
            formulas:
              type: array
              items:
                $ref: '#/components/schemas/InsightFormula'
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRange'
            groupBy:
              $ref: >-
                #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy
              description: |-
                This is the group by column for the insight when table is `call`.
                These are the columns to group the results by.
                All results are grouped by the time range step by default.
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems
              description: These are the queries to run to generate the insight.
            id:
              type: string
              description: This is the unique identifier for the Insight.
            orgId:
              type: string
              description: This is the unique identifier for the org that this Insight belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was last updated.
          required:
            - type
            - queries
            - id
            - orgId
            - createdAt
            - updatedAt
          description: pie variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - line
              description: 'Discriminator value: line'
            name:
              type: string
              description: This is the name of the Insight.
            formulas:
              type: array
              items:
                $ref: '#/components/schemas/InsightFormula'
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            metadata:
              $ref: '#/components/schemas/LineInsightMetadata'
              description: This is the metadata for the insight.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRangeWithStep'
            groupBy:
              $ref: >-
                #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy
              description: |-
                This is the group by column for the insight when table is `call`.
                These are the columns to group the results by.
                All results are grouped by the time range step by default.
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems
              description: These are the queries to run to generate the insight.
            id:
              type: string
              description: This is the unique identifier for the Insight.
            orgId:
              type: string
              description: This is the unique identifier for the org that this Insight belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was last updated.
          required:
            - type
            - queries
            - id
            - orgId
            - createdAt
            - updatedAt
          description: line variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - text
              description: 'Discriminator value: text'
            name:
              type: string
              description: This is the name of the Insight.
            formula:
              $ref: >-
                #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextFormula
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRange'
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems
              description: |-
                These are the queries to run to generate the insight.
                For Text Insights, we only allow a single query, or require a formula if multiple queries are provided
            id:
              type: string
              description: This is the unique identifier for the Insight.
            orgId:
              type: string
              description: This is the unique identifier for the org that this Insight belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was last updated.
          required:
            - type
            - queries
            - id
            - orgId
            - createdAt
            - updatedAt
          description: text variant
      discriminator:
        propertyName: type
      title: Insight_InsightController_create_Response_201
    Insight_InsightController_findOne_Response_200:
      oneOf:
        - type: object
          properties:
            type:
              type: string
              enum:
                - bar
              description: 'Discriminator value: bar'
            name:
              type: string
              description: This is the name of the Insight.
            formulas:
              type: array
              items:
                $ref: '#/components/schemas/InsightFormula'
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            metadata:
              $ref: '#/components/schemas/BarInsightMetadata'
              description: This is the metadata for the insight.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRangeWithStep'
            groupBy:
              $ref: >-
                #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy
              description: |-
                This is the group by column for the insight when table is `call`.
                These are the columns to group the results by.
                All results are grouped by the time range step by default.
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems
              description: These are the queries to run to generate the insight.
            id:
              type: string
              description: This is the unique identifier for the Insight.
            orgId:
              type: string
              description: This is the unique identifier for the org that this Insight belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was last updated.
          required:
            - type
            - queries
            - id
            - orgId
            - createdAt
            - updatedAt
          description: bar variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - pie
              description: 'Discriminator value: pie'
            name:
              type: string
              description: This is the name of the Insight.
            formulas:
              type: array
              items:
                $ref: '#/components/schemas/InsightFormula'
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRange'
            groupBy:
              $ref: >-
                #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy
              description: |-
                This is the group by column for the insight when table is `call`.
                These are the columns to group the results by.
                All results are grouped by the time range step by default.
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems
              description: These are the queries to run to generate the insight.
            id:
              type: string
              description: This is the unique identifier for the Insight.
            orgId:
              type: string
              description: This is the unique identifier for the org that this Insight belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was last updated.
          required:
            - type
            - queries
            - id
            - orgId
            - createdAt
            - updatedAt
          description: pie variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - line
              description: 'Discriminator value: line'
            name:
              type: string
              description: This is the name of the Insight.
            formulas:
              type: array
              items:
                $ref: '#/components/schemas/InsightFormula'
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            metadata:
              $ref: '#/components/schemas/LineInsightMetadata'
              description: This is the metadata for the insight.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRangeWithStep'
            groupBy:
              $ref: >-
                #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy
              description: |-
                This is the group by column for the insight when table is `call`.
                These are the columns to group the results by.
                All results are grouped by the time range step by default.
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems
              description: These are the queries to run to generate the insight.
            id:
              type: string
              description: This is the unique identifier for the Insight.
            orgId:
              type: string
              description: This is the unique identifier for the org that this Insight belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was last updated.
          required:
            - type
            - queries
            - id
            - orgId
            - createdAt
            - updatedAt
          description: line variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - text
              description: 'Discriminator value: text'
            name:
              type: string
              description: This is the name of the Insight.
            formula:
              $ref: >-
                #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextFormula
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRange'
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems
              description: |-
                These are the queries to run to generate the insight.
                For Text Insights, we only allow a single query, or require a formula if multiple queries are provided
            id:
              type: string
              description: This is the unique identifier for the Insight.
            orgId:
              type: string
              description: This is the unique identifier for the org that this Insight belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was last updated.
          required:
            - type
            - queries
            - id
            - orgId
            - createdAt
            - updatedAt
          description: text variant
      discriminator:
        propertyName: type
      title: Insight_InsightController_findOne_Response_200
    Insight_InsightController_remove_Response_200:
      oneOf:
        - type: object
          properties:
            type:
              type: string
              enum:
                - bar
              description: 'Discriminator value: bar'
            name:
              type: string
              description: This is the name of the Insight.
            formulas:
              type: array
              items:
                $ref: '#/components/schemas/InsightFormula'
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            metadata:
              $ref: '#/components/schemas/BarInsightMetadata'
              description: This is the metadata for the insight.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRangeWithStep'
            groupBy:
              $ref: >-
                #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy
              description: |-
                This is the group by column for the insight when table is `call`.
                These are the columns to group the results by.
                All results are grouped by the time range step by default.
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems
              description: These are the queries to run to generate the insight.
            id:
              type: string
              description: This is the unique identifier for the Insight.
            orgId:
              type: string
              description: This is the unique identifier for the org that this Insight belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was last updated.
          required:
            - type
            - queries
            - id
            - orgId
            - createdAt
            - updatedAt
          description: bar variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - pie
              description: 'Discriminator value: pie'
            name:
              type: string
              description: This is the name of the Insight.
            formulas:
              type: array
              items:
                $ref: '#/components/schemas/InsightFormula'
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRange'
            groupBy:
              $ref: >-
                #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy
              description: |-
                This is the group by column for the insight when table is `call`.
                These are the columns to group the results by.
                All results are grouped by the time range step by default.
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems
              description: These are the queries to run to generate the insight.
            id:
              type: string
              description: This is the unique identifier for the Insight.
            orgId:
              type: string
              description: This is the unique identifier for the org that this Insight belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was last updated.
          required:
            - type
            - queries
            - id
            - orgId
            - createdAt
            - updatedAt
          description: pie variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - line
              description: 'Discriminator value: line'
            name:
              type: string
              description: This is the name of the Insight.
            formulas:
              type: array
              items:
                $ref: '#/components/schemas/InsightFormula'
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            metadata:
              $ref: '#/components/schemas/LineInsightMetadata'
              description: This is the metadata for the insight.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRangeWithStep'
            groupBy:
              $ref: >-
                #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy
              description: |-
                This is the group by column for the insight when table is `call`.
                These are the columns to group the results by.
                All results are grouped by the time range step by default.
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems
              description: These are the queries to run to generate the insight.
            id:
              type: string
              description: This is the unique identifier for the Insight.
            orgId:
              type: string
              description: This is the unique identifier for the org that this Insight belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was last updated.
          required:
            - type
            - queries
            - id
            - orgId
            - createdAt
            - updatedAt
          description: line variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - text
              description: 'Discriminator value: text'
            name:
              type: string
              description: This is the name of the Insight.
            formula:
              $ref: >-
                #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextFormula
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRange'
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems
              description: |-
                These are the queries to run to generate the insight.
                For Text Insights, we only allow a single query, or require a formula if multiple queries are provided
            id:
              type: string
              description: This is the unique identifier for the Insight.
            orgId:
              type: string
              description: This is the unique identifier for the org that this Insight belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was last updated.
          required:
            - type
            - queries
            - id
            - orgId
            - createdAt
            - updatedAt
          description: text variant
      discriminator:
        propertyName: type
      title: Insight_InsightController_remove_Response_200
    ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy:
      type: string
      enum:
        - assistantId
        - workflowId
        - squadId
        - phoneNumberId
        - type
        - endedReason
        - customerNumber
        - campaignId
        - artifact.structuredOutputs[OutputID]
      description: |-
        This is the group by column for the insight when table is `call`.
        These are the columns to group the results by.
        All results are grouped by the time range step by default.
      title: ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy
    ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems:
      oneOf:
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn'
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn'
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn'
        - $ref: '#/components/schemas/JSONQueryOnEventsTable'
      title: ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems
    ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy:
      type: string
      enum:
        - assistantId
        - workflowId
        - squadId
        - phoneNumberId
        - type
        - endedReason
        - customerNumber
        - campaignId
        - artifact.structuredOutputs[OutputID]
      description: |-
        This is the group by column for the insight when table is `call`.
        These are the columns to group the results by.
        All results are grouped by the time range step by default.
      title: ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy
    ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems:
      oneOf:
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn'
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn'
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn'
      title: ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems
    ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy:
      type: string
      enum:
        - assistantId
        - workflowId
        - squadId
        - phoneNumberId
        - type
        - endedReason
        - customerNumber
        - campaignId
        - artifact.structuredOutputs[OutputID]
      description: |-
        This is the group by column for the insight when table is `call`.
        These are the columns to group the results by.
        All results are grouped by the time range step by default.
      title: ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy
    ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems:
      oneOf:
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn'
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn'
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn'
      title: ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems
    ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextFormula:
      type: object
      properties: {}
      description: >-
        Formulas are mathematical expressions applied on the data returned by the queries to transform them before being
        used to create the insight.

        The formulas needs to be a valid mathematical expression, supported by MathJS -
        https://mathjs.org/docs/expressions/syntax.html

        A formula is created by using the query names as the variable.

        The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query name']}}
        which will be substituted with the query result.

        For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula
        like this:

        ```

        {{['Query 1']}} / {{['Query 2']}} * 100

        ```


        ```

        ({{[Query 1]}} * 10) + {{[Query 2]}}

        ```

        This will take the


        You can also use the query names as the variable in the formula.
      title: ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextFormula
    ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems:
      oneOf:
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn'
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn'
        - $ref: '#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn'
      title: ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems
    Insight_InsightController_update_Request:
      oneOf:
        - type: object
          properties:
            type:
              type: string
              enum:
                - bar
              description: 'Discriminator value: bar'
            name:
              type: string
              description: This is the name of the Insight.
            formulas:
              type: array
              items:
                $ref: '#/components/schemas/InsightFormula'
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            metadata:
              $ref: '#/components/schemas/BarInsightMetadata'
              description: This is the metadata for the insight.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRangeWithStep'
            groupBy:
              $ref: >-
                #/components/schemas/ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy
              description: |-
                This is the group by column for the insight when table is `call`.
                These are the columns to group the results by.
                All results are grouped by the time range step by default.
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems
              description: These are the queries to run to generate the insight.
          required:
            - type
          description: bar variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - pie
              description: 'Discriminator value: pie'
            name:
              type: string
              description: This is the name of the Insight.
            formulas:
              type: array
              items:
                $ref: '#/components/schemas/InsightFormula'
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRange'
            groupBy:
              $ref: >-
                #/components/schemas/ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy
              description: |-
                This is the group by column for the insight when table is `call`.
                These are the columns to group the results by.
                All results are grouped by the time range step by default.
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems
              description: These are the queries to run to generate the insight.
          required:
            - type
          description: pie variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - line
              description: 'Discriminator value: line'
            name:
              type: string
              description: This is the name of the Insight.
            formulas:
              type: array
              items:
                $ref: '#/components/schemas/InsightFormula'
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            metadata:
              $ref: '#/components/schemas/LineInsightMetadata'
              description: This is the metadata for the insight.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRangeWithStep'
            groupBy:
              $ref: >-
                #/components/schemas/ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy
              description: |-
                This is the group by column for the insight when table is `call`.
                These are the columns to group the results by.
                All results are grouped by the time range step by default.
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems
              description: These are the queries to run to generate the insight.
          required:
            - type
          description: line variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - text
              description: 'Discriminator value: text'
            name:
              type: string
              description: This is the name of the Insight.
            formula:
              $ref: >-
                #/components/schemas/ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextFormula
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRange'
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightIdPatchRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems
              description: |-
                These are the queries to run to generate the insight.
                For Text Insights, we only allow a single query, or require a formula if multiple queries are provided
          required:
            - type
          description: text variant
      discriminator:
        propertyName: type
      title: Insight_InsightController_update_Request
    Insight_InsightController_update_Response_200:
      oneOf:
        - type: object
          properties:
            type:
              type: string
              enum:
                - bar
              description: 'Discriminator value: bar'
            name:
              type: string
              description: This is the name of the Insight.
            formulas:
              type: array
              items:
                $ref: '#/components/schemas/InsightFormula'
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            metadata:
              $ref: '#/components/schemas/BarInsightMetadata'
              description: This is the metadata for the insight.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRangeWithStep'
            groupBy:
              $ref: >-
                #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy
              description: |-
                This is the group by column for the insight when table is `call`.
                These are the columns to group the results by.
                All results are grouped by the time range step by default.
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems
              description: These are the queries to run to generate the insight.
            id:
              type: string
              description: This is the unique identifier for the Insight.
            orgId:
              type: string
              description: This is the unique identifier for the org that this Insight belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was last updated.
          required:
            - type
            - queries
            - id
            - orgId
            - createdAt
            - updatedAt
          description: bar variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - pie
              description: 'Discriminator value: pie'
            name:
              type: string
              description: This is the name of the Insight.
            formulas:
              type: array
              items:
                $ref: '#/components/schemas/InsightFormula'
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRange'
            groupBy:
              $ref: >-
                #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy
              description: |-
                This is the group by column for the insight when table is `call`.
                These are the columns to group the results by.
                All results are grouped by the time range step by default.
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems
              description: These are the queries to run to generate the insight.
            id:
              type: string
              description: This is the unique identifier for the Insight.
            orgId:
              type: string
              description: This is the unique identifier for the org that this Insight belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was last updated.
          required:
            - type
            - queries
            - id
            - orgId
            - createdAt
            - updatedAt
          description: pie variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - line
              description: 'Discriminator value: line'
            name:
              type: string
              description: This is the name of the Insight.
            formulas:
              type: array
              items:
                $ref: '#/components/schemas/InsightFormula'
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            metadata:
              $ref: '#/components/schemas/LineInsightMetadata'
              description: This is the metadata for the insight.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRangeWithStep'
            groupBy:
              $ref: >-
                #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy
              description: |-
                This is the group by column for the insight when table is `call`.
                These are the columns to group the results by.
                All results are grouped by the time range step by default.
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems
              description: These are the queries to run to generate the insight.
            id:
              type: string
              description: This is the unique identifier for the Insight.
            orgId:
              type: string
              description: This is the unique identifier for the org that this Insight belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was last updated.
          required:
            - type
            - queries
            - id
            - orgId
            - createdAt
            - updatedAt
          description: line variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - text
              description: 'Discriminator value: text'
            name:
              type: string
              description: This is the name of the Insight.
            formula:
              $ref: >-
                #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextFormula
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRange'
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightIdPatchResponsesContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems
              description: |-
                These are the queries to run to generate the insight.
                For Text Insights, we only allow a single query, or require a formula if multiple queries are provided
            id:
              type: string
              description: This is the unique identifier for the Insight.
            orgId:
              type: string
              description: This is the unique identifier for the org that this Insight belongs to.
            createdAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was created.
            updatedAt:
              type: string
              format: date-time
              description: This is the ISO 8601 date-time string of when the Insight was last updated.
          required:
            - type
            - queries
            - id
            - orgId
            - createdAt
            - updatedAt
          description: text variant
      discriminator:
        propertyName: type
      title: Insight_InsightController_update_Response_200
    InsightRunFormatPlanFormat:
      type: string
      enum:
        - raw
        - recharts
      description: |-
        This is the format of the data to return.
        If not provided, defaults to "raw".
        Raw provides the data as fetched from the database, with formulas evaluated.
        Recharts provides the data in a format that can is ready to be used by recharts.js to render charts.
      title: InsightRunFormatPlanFormat
    InsightRunFormatPlan:
      type: object
      properties:
        format:
          $ref: '#/components/schemas/InsightRunFormatPlanFormat'
          description: |-
            This is the format of the data to return.
            If not provided, defaults to "raw".
            Raw provides the data as fetched from the database, with formulas evaluated.
            Recharts provides the data in a format that can is ready to be used by recharts.js to render charts.
      title: InsightRunFormatPlan
    InsightRunDTO:
      type: object
      properties:
        formatPlan:
          $ref: '#/components/schemas/InsightRunFormatPlan'
        timeRangeOverride:
          $ref: '#/components/schemas/InsightTimeRangeWithStep'
          description: |-
            This is the optional time range override for the insight.
            If provided, overrides every field in the insight's timeRange.
            If this is provided with missing fields, defaults will be used, not the insight's timeRange.
            start default - "-7d"
            end default - "now"
            step default - "day"
            For Pie and Text Insights, step will be ignored even if provided.
      title: InsightRunDTO
    InsightRunResponse:
      type: object
      properties:
        id:
          type: string
        insightId:
          type: string
        orgId:
          type: string
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
      required:
        - id
        - insightId
        - orgId
        - createdAt
        - updatedAt
      title: InsightRunResponse
    Insight_InsightController_preview_Request:
      oneOf:
        - type: object
          properties:
            type:
              type: string
              enum:
                - bar
              description: 'Discriminator value: bar'
            name:
              type: string
              description: This is the name of the Insight.
            formulas:
              type: array
              items:
                $ref: '#/components/schemas/InsightFormula'
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            metadata:
              $ref: '#/components/schemas/BarInsightMetadata'
              description: This is the metadata for the insight.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRangeWithStep'
            groupBy:
              $ref: >-
                #/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarGroupBy
              description: |-
                This is the group by column for the insight when table is `call`.
                These are the columns to group the results by.
                All results are grouped by the time range step by default.
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingBarQueriesItems
              description: These are the queries to run to generate the insight.
          required:
            - type
            - queries
          description: bar variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - pie
              description: 'Discriminator value: pie'
            name:
              type: string
              description: This is the name of the Insight.
            formulas:
              type: array
              items:
                $ref: '#/components/schemas/InsightFormula'
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRange'
            groupBy:
              $ref: >-
                #/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieGroupBy
              description: |-
                This is the group by column for the insight when table is `call`.
                These are the columns to group the results by.
                All results are grouped by the time range step by default.
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingPieQueriesItems
              description: These are the queries to run to generate the insight.
          required:
            - type
            - queries
          description: pie variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - line
              description: 'Discriminator value: line'
            name:
              type: string
              description: This is the name of the Insight.
            formulas:
              type: array
              items:
                $ref: '#/components/schemas/InsightFormula'
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            metadata:
              $ref: '#/components/schemas/LineInsightMetadata'
              description: This is the metadata for the insight.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRangeWithStep'
            groupBy:
              $ref: >-
                #/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineGroupBy
              description: |-
                This is the group by column for the insight when table is `call`.
                These are the columns to group the results by.
                All results are grouped by the time range step by default.
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingLineQueriesItems
              description: These are the queries to run to generate the insight.
          required:
            - type
            - queries
          description: line variant
        - type: object
          properties:
            type:
              type: string
              enum:
                - text
              description: 'Discriminator value: text'
            name:
              type: string
              description: This is the name of the Insight.
            formula:
              $ref: >-
                #/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextFormula
              description: >-
                Formulas are mathematical expressions applied on the data returned by the queries to transform them
                before being used to create the insight.

                The formulas needs to be a valid mathematical expression, supported by MathJS -
                https://mathjs.org/docs/expressions/syntax.html

                A formula is created by using the query names as the variable.

                The formulas must contain at least one query name in the LiquidJS format {{query_name}} or {{['query
                name']}} which will be substituted with the query result.

                For example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a
                formula like this:

                ```

                {{['Query 1']}} / {{['Query 2']}} * 100

                ```


                ```

                ({{[Query 1]}} * 10) + {{[Query 2]}}

                ```

                This will take the


                You can also use the query names as the variable in the formula.
            timeRange:
              $ref: '#/components/schemas/InsightTimeRange'
            queries:
              type: array
              items:
                $ref: >-
                  #/components/schemas/ReportingInsightPreviewPostRequestBodyContentApplicationJsonSchemaDiscriminatorMappingTextQueriesItems
              description: |-
                These are the queries to run to generate the insight.
                For Text Insights, we only allow a single query, or require a formula if multiple queries are provided
          required:
            - type
            - queries
          description: text variant
      discriminator:
        propertyName: type
      title: Insight_InsightController_preview_Request
    EvalGetParametersSortOrder:
      type: string
      enum:
        - ASC
        - DESC
      title: EvalGetParametersSortOrder
    ChatEvalAssistantMessageMockRole:
      type: string
      enum:
        - assistant
      default: assistant
      description: |-
        This is the role of the message author.
        For a mock assistant message, the role is always 'assistant'
        @default 'assistant'
      title: ChatEvalAssistantMessageMockRole
    ChatEvalAssistantMessageMockToolCallArguments:
      type: object
      properties: {}
      description: This is the arguments that will be passed to the tool call.
      title: ChatEvalAssistantMessageMockToolCallArguments
    ChatEvalAssistantMessageMockToolCall:
      type: object
      properties:
        name:
          type: string
          description: |-
            This is the name of the tool that will be called.
            It should be one of the tools created in the organization.
        arguments:
          $ref: '#/components/schemas/ChatEvalAssistantMessageMockToolCallArguments'
          description: This is the arguments that will be passed to the tool call.
      required:
        - name
      title: ChatEvalAssistantMessageMockToolCall
    ChatEvalAssistantMessageMock:
      type: object
      properties:
        role:
          $ref: '#/components/schemas/ChatEvalAssistantMessageMockRole'
          description: |-
            This is the role of the message author.
            For a mock assistant message, the role is always 'assistant'
            @default 'assistant'
        content:
          type: string
          description: |-
            This is the content of the assistant message.
            This is the message that the assistant would have sent.
        toolCalls:
          type: array
          items:
            $ref: '#/components/schemas/ChatEvalAssistantMessageMockToolCall'
          description: This is the tool calls that will be made by the assistant.
      required:
        - role
      title: ChatEvalAssistantMessageMock
    ChatEvalSystemMessageMockRole:
      type: string
      enum:
        - system
      default: system
      description: |-
        This is the role of the message author.
        For a mock system message, the role is always 'system'
        @default 'system'
      title: ChatEvalSystemMessageMockRole
    ChatEvalSystemMessageMock:
      type: object
      properties:
        role:
          $ref: '#/components/schemas/ChatEvalSystemMessageMockRole'
          description: |-
            This is the role of the message author.
            For a mock system message, the role is always 'system'
            @default 'system'
        content:
          type: string
          description: >-
            This is the content of the system message that would have been added in the middle of the conversation.

            Do not include the assistant prompt as a part of this message. It will automatically be fetched during
            runtime.
      required:
        - role
        - content
      title: ChatEvalSystemMessageMock
    ChatEvalToolResponseMessageMockRole:
      type: string
      enum:
        - tool
      default: tool
      description: |-
        This is the role of the message author.
        For a mock tool response message, the role is always 'tool'
        @default 'tool'
      title: ChatEvalToolResponseMessageMockRole
    ChatEvalToolResponseMessageMock:
      type: object
      properties:
        role:
          $ref: '#/components/schemas/ChatEvalToolResponseMessageMockRole'
          description: |-
            This is the role of the message author.
            For a mock tool response message, the role is always 'tool'
            @default 'tool'
        content:
          type: string
          description: This is the content of the tool response message. JSON Objects should be stringified.
      required:
        - role
        - content
      title: ChatEvalToolResponseMessageMock
    ChatEvalToolResponseMessageEvaluationRole:
      type: string
      enum:
        - tool
      default: tool
      description: |-
        This is the role of the message author.
        For a tool response message evaluation, the role is always 'tool'
        @default 'tool'
      title: ChatEvalToolResponseMessageEvaluationRole
    EvalOpenAiModelProvider:
      type: string
      enum:
        - openai
      description: This is the provider of the model (`openai`).
      title: EvalOpenAiModelProvider
    EvalOpenAiModelModel:
      type: string
      enum:
        - gpt-5.4
        - gpt-5.4-mini
        - gpt-5.4-nano
        - gpt-5.2
        - gpt-5.2-chat-latest
        - gpt-5.1
        - gpt-5.1-chat-latest
        - gpt-5
        - gpt-5-chat-latest
        - gpt-5-mini
        - gpt-5-nano
        - gpt-4.1-2025-04-14
        - gpt-4.1-mini-2025-04-14
        - gpt-4.1-nano-2025-04-14
        - gpt-4.1
        - gpt-4.1-mini
        - gpt-4.1-nano
        - chatgpt-4o-latest
        - o3
        - o3-mini
        - o4-mini
        - o1-mini
        - o1-mini-2024-09-12
        - gpt-4o-mini-2024-07-18
        - gpt-4o-mini
        - gpt-4o
        - gpt-4o-2024-05-13
        - gpt-4o-2024-08-06
        - gpt-4o-2024-11-20
        - gpt-4-turbo
        - gpt-4-turbo-2024-04-09
        - gpt-4-turbo-preview
        - gpt-4-0125-preview
        - gpt-4-1106-preview
        - gpt-4
        - gpt-4-0613
        - gpt-3.5-turbo
        - gpt-3.5-turbo-0125
        - gpt-3.5-turbo-1106
        - gpt-3.5-turbo-16k
        - gpt-3.5-turbo-0613
        - gpt-4.1-2025-04-14:westus
        - gpt-4.1-2025-04-14:eastus2
        - gpt-4.1-2025-04-14:eastus
        - gpt-4.1-2025-04-14:westus3
        - gpt-4.1-2025-04-14:northcentralus
        - gpt-4.1-2025-04-14:southcentralus
        - gpt-4.1-2025-04-14:westeurope
        - gpt-4.1-2025-04-14:germanywestcentral
        - gpt-4.1-2025-04-14:polandcentral
        - gpt-4.1-2025-04-14:spaincentral
        - gpt-4.1-mini-2025-04-14:westus
        - gpt-4.1-mini-2025-04-14:eastus2
        - gpt-4.1-mini-2025-04-14:eastus
        - gpt-4.1-mini-2025-04-14:westus3
        - gpt-4.1-mini-2025-04-14:northcentralus
        - gpt-4.1-mini-2025-04-14:southcentralus
        - gpt-4.1-mini-2025-04-14:westeurope
        - gpt-4.1-mini-2025-04-14:germanywestcentral
        - gpt-4.1-mini-2025-04-14:polandcentral
        - gpt-4.1-mini-2025-04-14:spaincentral
        - gpt-4.1-nano-2025-04-14:westus
        - gpt-4.1-nano-2025-04-14:eastus2
        - gpt-4.1-nano-2025-04-14:westus3
        - gpt-4.1-nano-2025-04-14:northcentralus
        - gpt-4.1-nano-2025-04-14:southcentralus
        - gpt-4o-2024-11-20:swedencentral
        - gpt-4o-2024-11-20:westus
        - gpt-4o-2024-11-20:eastus2
        - gpt-4o-2024-11-20:eastus
        - gpt-4o-2024-11-20:westus3
        - gpt-4o-2024-11-20:southcentralus
        - gpt-4o-2024-11-20:westeurope
        - gpt-4o-2024-11-20:germanywestcentral
        - gpt-4o-2024-11-20:polandcentral
        - gpt-4o-2024-11-20:spaincentral
        - gpt-4o-2024-08-06:westus
        - gpt-4o-2024-08-06:westus3
        - gpt-4o-2024-08-06:eastus
        - gpt-4o-2024-08-06:eastus2
        - gpt-4o-2024-08-06:northcentralus
        - gpt-4o-2024-08-06:southcentralus
        - gpt-4o-mini-2024-07-18:westus
        - gpt-4o-mini-2024-07-18:westus3
        - gpt-4o-mini-2024-07-18:eastus
        - gpt-4o-mini-2024-07-18:eastus2
        - gpt-4o-mini-2024-07-18:northcentralus
        - gpt-4o-mini-2024-07-18:southcentralus
        - gpt-4o-2024-05-13:eastus2
        - gpt-4o-2024-05-13:eastus
        - gpt-4o-2024-05-13:northcentralus
        - gpt-4o-2024-05-13:southcentralus
        - gpt-4o-2024-05-13:westus3
        - gpt-4o-2024-05-13:westus
        - gpt-4-turbo-2024-04-09:eastus2
        - gpt-4-0125-preview:eastus
        - gpt-4-0125-preview:northcentralus
        - gpt-4-0125-preview:southcentralus
        - gpt-4-1106-preview:australiaeast
        - gpt-4-1106-preview:canadaeast
        - gpt-4-1106-preview:france
        - gpt-4-1106-preview:india
        - gpt-4-1106-preview:norway
        - gpt-4-1106-preview:swedencentral
        - gpt-4-1106-preview:uk
        - gpt-4-1106-preview:westus
        - gpt-4-1106-preview:westus3
        - gpt-4-0613:canadaeast
        - gpt-3.5-turbo-0125:canadaeast
        - gpt-3.5-turbo-0125:northcentralus
        - gpt-3.5-turbo-0125:southcentralus
        - gpt-3.5-turbo-1106:canadaeast
        - gpt-3.5-turbo-1106:westus
      description: >-
        This is the OpenAI model that will be used.


        When using Vapi OpenAI or your own Azure Credentials, you have the option to specify the region for the selected
        model. This shouldn't be specified unless you have a specific reason to do so. Vapi will automatically find the
        fastest region that make sense.

        This is helpful when you are required to comply with Data Residency rules. Learn more about Azure regions here
        https://azure.microsoft.com/en-us/explore/global-infrastructure/data-residency/.
      title: EvalOpenAiModelModel
    EvalOpenAiModelMessagesItems:
      type: object
      properties: {}
      title: EvalOpenAiModelMessagesItems
    EvalOpenAIModel:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/EvalOpenAiModelProvider'
          description: This is the provider of the model (`openai`).
        model:
          $ref: '#/components/schemas/EvalOpenAiModelModel'
          description: >-
            This is the OpenAI model that will be used.


            When using Vapi OpenAI or your own Azure Credentials, you have the option to specify the region for the
            selected model. This shouldn't be specified unless you have a specific reason to do so. Vapi will
            automatically find the fastest region that make sense.

            This is helpful when you are required to comply with Data Residency rules. Learn more about Azure regions
            here https://azure.microsoft.com/en-us/explore/global-infrastructure/data-residency/.
        temperature:
          type: number
          format: double
          description: >-
            This is the temperature of the model. For LLM-as-a-judge, it's recommended to set it between 0 - 0.3 to
            avoid hallucinations and ensure the model judges the output correctly based on the instructions.
        maxTokens:
          type: number
          format: double
          description: >-
            This is the max tokens of the model.

            If your Judge instructions return `true` or `false` takes only 1 token (as per the OpenAI Tokenizer), and
            therefore is recommended to set it to a low number to force the model to return a short response.
        messages:
          type: array
          items:
            $ref: '#/components/schemas/EvalOpenAiModelMessagesItems'
          description: >-
            These are the messages which will instruct the AI Judge on how to evaluate the assistant message.

            The LLM-Judge must respond with "pass" or "fail" to indicate if the assistant message passes the eval.


            To access the messages in the mock conversation, use the LiquidJS variable `{{messages}}`.

            The assistant message to be evaluated will be passed as the last message in the `messages` array and can be
            accessed using `{{messages[-1]}}`.


            It is recommended to use the system message to instruct the LLM how to evaluate the assistant message, and
            then use the first user message to pass the assistant message to be evaluated.
      required:
        - provider
        - model
        - messages
      title: EvalOpenAIModel
    EvalAnthropicModelProvider:
      type: string
      enum:
        - anthropic
      description: This is the provider of the model (`anthropic`).
      title: EvalAnthropicModelProvider
    EvalAnthropicModelModel:
      type: string
      enum:
        - claude-3-opus-20240229
        - claude-3-sonnet-20240229
        - claude-3-haiku-20240307
        - claude-3-5-sonnet-20240620
        - claude-3-5-sonnet-20241022
        - claude-3-5-haiku-20241022
        - claude-3-7-sonnet-20250219
        - claude-opus-4-20250514
        - claude-opus-4-5-20251101
        - claude-opus-4-6
        - claude-sonnet-4-20250514
        - claude-sonnet-4-5-20250929
        - claude-sonnet-4-6
        - claude-haiku-4-5-20251001
      description: This is the specific model that will be used.
      title: EvalAnthropicModelModel
    EvalAnthropicModelMessagesItems:
      type: object
      properties: {}
      title: EvalAnthropicModelMessagesItems
    EvalAnthropicModel:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/EvalAnthropicModelProvider'
          description: This is the provider of the model (`anthropic`).
        model:
          $ref: '#/components/schemas/EvalAnthropicModelModel'
          description: This is the specific model that will be used.
        thinking:
          $ref: '#/components/schemas/AnthropicThinkingConfig'
          description: |-
            This is the optional configuration for Anthropic's thinking feature.

            - If provided, `maxTokens` must be greater than `thinking.budgetTokens`.
        temperature:
          type: number
          format: double
          description: >-
            This is the temperature of the model. For LLM-as-a-judge, it's recommended to set it between 0 - 0.3 to
            avoid hallucinations and ensure the model judges the output correctly based on the instructions.
        maxTokens:
          type: number
          format: double
          description: >-
            This is the max tokens of the model.

            If your Judge instructions return `true` or `false` takes only 1 token (as per the OpenAI Tokenizer), and
            therefore is recommended to set it to a low number to force the model to return a short response.
        messages:
          type: array
          items:
            $ref: '#/components/schemas/EvalAnthropicModelMessagesItems'
          description: >-
            These are the messages which will instruct the AI Judge on how to evaluate the assistant message.

            The LLM-Judge must respond with "pass" or "fail" to indicate if the assistant message passes the eval.


            To access the messages in the mock conversation, use the LiquidJS variable `{{messages}}`.

            The assistant message to be evaluated will be passed as the last message in the `messages` array and can be
            accessed using `{{messages[-1]}}`.


            It is recommended to use the system message to instruct the LLM how to evaluate the assistant message, and
            then use the first user message to pass the assistant message to be evaluated.
      required:
        - provider
        - model
        - messages
      title: EvalAnthropicModel
    EvalGoogleModelProvider:
      type: string
      enum:
        - google
      description: This is the provider of the model (`google`).
      title: EvalGoogleModelProvider
    EvalGoogleModelModel:
      type: string
      enum:
        - gemini-3-flash-preview
        - gemini-2.5-pro
        - gemini-2.5-flash
        - gemini-2.5-flash-lite
        - gemini-2.0-flash-thinking-exp
        - gemini-2.0-pro-exp-02-05
        - gemini-2.0-flash
        - gemini-2.0-flash-lite
        - gemini-2.0-flash-exp
        - gemini-2.0-flash-realtime-exp
        - gemini-1.5-flash
        - gemini-1.5-flash-002
        - gemini-1.5-pro
        - gemini-1.5-pro-002
        - gemini-1.0-pro
      description: This is the name of the model. Ex. gpt-4o
      title: EvalGoogleModelModel
    EvalGoogleModelMessagesItems:
      type: object
      properties: {}
      title: EvalGoogleModelMessagesItems
    EvalGoogleModel:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/EvalGoogleModelProvider'
          description: This is the provider of the model (`google`).
        model:
          $ref: '#/components/schemas/EvalGoogleModelModel'
          description: This is the name of the model. Ex. gpt-4o
        temperature:
          type: number
          format: double
          description: >-
            This is the temperature of the model. For LLM-as-a-judge, it's recommended to set it between 0 - 0.3 to
            avoid hallucinations and ensure the model judges the output correctly based on the instructions.
        maxTokens:
          type: number
          format: double
          description: >-
            This is the max tokens of the model.

            If your Judge instructions return `true` or `false` takes only 1 token (as per the OpenAI Tokenizer), and
            therefore is recommended to set it to a low number to force the model to return a short response.
        messages:
          type: array
          items:
            $ref: '#/components/schemas/EvalGoogleModelMessagesItems'
          description: >-
            These are the messages which will instruct the AI Judge on how to evaluate the assistant message.

            The LLM-Judge must respond with "pass" or "fail" to indicate if the assistant message passes the eval.


            To access the messages in the mock conversation, use the LiquidJS variable `{{messages}}`.

            The assistant message to be evaluated will be passed as the last message in the `messages` array and can be
            accessed using `{{messages[-1]}}`.


            It is recommended to use the system message to instruct the LLM how to evaluate the assistant message, and
            then use the first user message to pass the assistant message to be evaluated.
      required:
        - provider
        - model
        - messages
      title: EvalGoogleModel
    EvalCustomModelProvider:
      type: string
      enum:
        - custom-llm
      description: This is the provider of the model (`custom-llm`).
      title: EvalCustomModelProvider
    EvalCustomModelHeaders:
      type: object
      properties: {}
      description: These are the headers we'll use for the OpenAI client's `headers`.
      title: EvalCustomModelHeaders
    EvalCustomModelMessagesItems:
      type: object
      properties: {}
      title: EvalCustomModelMessagesItems
    EvalCustomModel:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/EvalCustomModelProvider'
          description: This is the provider of the model (`custom-llm`).
        url:
          type: string
          description: These is the URL we'll use for the OpenAI client's `baseURL`. Ex. https://openrouter.ai/api/v1
        headers:
          $ref: '#/components/schemas/EvalCustomModelHeaders'
          description: These are the headers we'll use for the OpenAI client's `headers`.
        timeoutSeconds:
          type: number
          format: double
          description: >-
            This sets the timeout for the connection to the custom provider without needing to stream any tokens back.
            Default is 20 seconds.
        model:
          type: string
          description: This is the name of the model. Ex. gpt-4o
        temperature:
          type: number
          format: double
          description: >-
            This is the temperature of the model. For LLM-as-a-judge, it's recommended to set it between 0 - 0.3 to
            avoid hallucinations and ensure the model judges the output correctly based on the instructions.
        maxTokens:
          type: number
          format: double
          description: >-
            This is the max tokens of the model.

            If your Judge instructions return `true` or `false` takes only 1 token (as per the OpenAI Tokenizer), and
            therefore is recommended to set it to a low number to force the model to return a short response.
        messages:
          type: array
          items:
            $ref: '#/components/schemas/EvalCustomModelMessagesItems'
          description: >-
            These are the messages which will instruct the AI Judge on how to evaluate the assistant message.

            The LLM-Judge must respond with "pass" or "fail" to indicate if the assistant message passes the eval.


            To access the messages in the mock conversation, use the LiquidJS variable `{{messages}}`.

            The assistant message to be evaluated will be passed as the last message in the `messages` array and can be
            accessed using `{{messages[-1]}}`.


            It is recommended to use the system message to instruct the LLM how to evaluate the assistant message, and
            then use the first user message to pass the assistant message to be evaluated.
      required:
        - provider
        - url
        - model
        - messages
      title: EvalCustomModel
    AssistantMessageJudgePlanAiModel:
      oneOf:
        - $ref: '#/components/schemas/EvalOpenAIModel'
        - $ref: '#/components/schemas/EvalAnthropicModel'
        - $ref: '#/components/schemas/EvalGoogleModel'
        - $ref: '#/components/schemas/EvalCustomModel'
      description: >-
        This is the model to use for the LLM-as-a-judge.

        If not provided, will default to the assistant's model.


        The instructions on how to evaluate the model output with this LLM-Judge must be passed as a system message in
        the messages array of the model.


        The Mock conversation can be passed to the LLM-Judge to evaluate using the prompt {{messages}} and will be
        evaluated as a LiquidJS Variable. To access and judge only the last message, use {{messages[-1]}}


        The LLM-Judge must respond with "pass" or "fail" and only those two responses are allowed.
      title: AssistantMessageJudgePlanAiModel
    AssistantMessageJudgePlanAiType:
      type: string
      enum:
        - ai
      description: |-
        This is the type of the judge plan.
        Use 'ai' to evaluate the assistant message content using LLM-as-a-judge.
        @default 'ai'
      title: AssistantMessageJudgePlanAiType
    AssistantMessageJudgePlanAI:
      type: object
      properties:
        model:
          $ref: '#/components/schemas/AssistantMessageJudgePlanAiModel'
          description: >-
            This is the model to use for the LLM-as-a-judge.

            If not provided, will default to the assistant's model.


            The instructions on how to evaluate the model output with this LLM-Judge must be passed as a system message
            in the messages array of the model.


            The Mock conversation can be passed to the LLM-Judge to evaluate using the prompt {{messages}} and will be
            evaluated as a LiquidJS Variable. To access and judge only the last message, use {{messages[-1]}}


            The LLM-Judge must respond with "pass" or "fail" and only those two responses are allowed.
        type:
          $ref: '#/components/schemas/AssistantMessageJudgePlanAiType'
          description: |-
            This is the type of the judge plan.
            Use 'ai' to evaluate the assistant message content using LLM-as-a-judge.
            @default 'ai'
        autoIncludeMessageHistory:
          type: boolean
          description: >-
            This is the flag to enable automatically adding the liquid variable {{messages}} to the model's messages
            array

            This is only applicable if the user has not provided any messages in the model's messages array

            @default true
      required:
        - model
        - type
      title: AssistantMessageJudgePlanAI
    ChatEvalToolResponseMessageEvaluation:
      type: object
      properties:
        role:
          $ref: '#/components/schemas/ChatEvalToolResponseMessageEvaluationRole'
          description: |-
            This is the role of the message author.
            For a tool response message evaluation, the role is always 'tool'
            @default 'tool'
        judgePlan:
          $ref: '#/components/schemas/AssistantMessageJudgePlanAI'
          description: >-
            This is the judge plan that instructs how to evaluate the tool response message.

            The tool response message can be evaluated with an LLM-as-judge by defining the evaluation criteria in a
            prompt.
      required:
        - role
        - judgePlan
      title: ChatEvalToolResponseMessageEvaluation
    ChatEvalUserMessageMockRole:
      type: string
      enum:
        - user
      default: user
      description: |-
        This is the role of the message author.
        For a mock user message, the role is always 'user'
        @default 'user'
      title: ChatEvalUserMessageMockRole
    ChatEvalUserMessageMock:
      type: object
      properties:
        role:
          $ref: '#/components/schemas/ChatEvalUserMessageMockRole'
          description: |-
            This is the role of the message author.
            For a mock user message, the role is always 'user'
            @default 'user'
        content:
          type: string
          description: |-
            This is the content of the user message.
            This is the message that the user would have sent.
      required:
        - role
        - content
      title: ChatEvalUserMessageMock
    ChatEvalAssistantMessageEvaluationRole:
      type: string
      enum:
        - assistant
      default: assistant
      description: |-
        This is the role of the message author.
        For an assistant message evaluation, the role is always 'assistant'
        @default 'assistant'
      title: ChatEvalAssistantMessageEvaluationRole
    AssistantMessageJudgePlanExactType:
      type: string
      enum:
        - exact
      description: |-
        This is the type of the judge plan.
        Use 'exact' for an exact match on the content and tool calls - without using LLM-as-a-judge.
        @default 'exact'
      title: AssistantMessageJudgePlanExactType
    AssistantMessageJudgePlanExact:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/AssistantMessageJudgePlanExactType'
          description: |-
            This is the type of the judge plan.
            Use 'exact' for an exact match on the content and tool calls - without using LLM-as-a-judge.
            @default 'exact'
        content:
          type: string
          description: >-
            This is what that will be used to evaluate the model's message content.

            If you provide a string, the assistant message content will be evaluated against it as an exact match,
            case-insensitive.
        toolCalls:
          type: array
          items:
            $ref: '#/components/schemas/ChatEvalAssistantMessageMockToolCall'
          description: >-
            This is the tool calls that will be used to evaluate the model's message content.

            The tool name must be a valid tool that the assistant is allowed to call.


            For the Query tool, the arguments for the tool call are in the format - {knowledgeBaseNames: ['kb_name',
            'kb_name_2']}


            For the DTMF tool, the arguments for the tool call are in the format - {dtmf: "1234*"}


            For the Handoff tool, the arguments for the tool call are in the format - {destination: "assistant_id"}


            For the Transfer Call tool, the arguments for the tool call are in the format - {destination:
            "phone_number_or_assistant_id"}


            For all other tools, they are called without arguments or with user-defined arguments
      required:
        - type
        - content
      title: AssistantMessageJudgePlanExact
    AssistantMessageJudgePlanRegexType:
      type: string
      enum:
        - regex
      description: |-
        This is the type of the judge plan.
        Use 'regex' for a regex match on the content and tool calls - without using LLM-as-a-judge.
        @default 'regex'
      title: AssistantMessageJudgePlanRegexType
    AssistantMessageJudgePlanRegex:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/AssistantMessageJudgePlanRegexType'
          description: |-
            This is the type of the judge plan.
            Use 'regex' for a regex match on the content and tool calls - without using LLM-as-a-judge.
            @default 'regex'
        content:
          type: string
          description: |-
            This is what that will be used to evaluate the model's message content.
            The content will be evaluated against the regex pattern provided in the Judge Plan content field.
            Evaluation is considered successful if the regex pattern matches any part of the assistant message content.
        toolCalls:
          type: array
          items:
            $ref: '#/components/schemas/ChatEvalAssistantMessageMockToolCall'
          description: >-
            This is the tool calls that will be used to evaluate the model's message content.

            The tool name must be a valid tool that the assistant is allowed to call.

            The values to the arguments for the tool call should be a Regular Expression.

            Evaluation is considered successful if the regex pattern matches any part of each tool call argument.


            For the Query tool, the arguments for the tool call are in the format - {knowledgeBaseNames: ['kb_name',
            'kb_name_2']}


            For the DTMF tool, the arguments for the tool call are in the format - {dtmf: "1234*"}


            For the Handoff tool, the arguments for the tool call are in the format - {destination: "assistant_id"}


            For the Transfer Call tool, the arguments for the tool call are in the format - {destination:
            "phone_number_or_assistant_id"}


            For all other tools, they are called without arguments or with user-defined arguments
      required:
        - type
        - content
      title: AssistantMessageJudgePlanRegex
    ChatEvalAssistantMessageEvaluationJudgePlan:
      oneOf:
        - $ref: '#/components/schemas/AssistantMessageJudgePlanExact'
        - $ref: '#/components/schemas/AssistantMessageJudgePlanRegex'
        - $ref: '#/components/schemas/AssistantMessageJudgePlanAI'
      description: >-
        This is the judge plan that instructs how to evaluate the assistant message.

        The assistant message can be evaluated against fixed content (exact match or RegEx) or with an LLM-as-judge by
        defining the evaluation criteria in a prompt.
      title: ChatEvalAssistantMessageEvaluationJudgePlan
    AssistantMessageEvaluationContinuePlan:
      type: object
      properties:
        exitOnFailureEnabled:
          type: boolean
          description: |-
            This is whether the evaluation should exit if the assistant message evaluates to false.
            By default, it is false and the evaluation will continue.
            @default false
        contentOverride:
          type: string
          description: >-
            This is the content that will be used in the conversation for this assistant turn moving forward if
            provided.

            It will override the content received from the model.
        toolCallsOverride:
          type: array
          items:
            $ref: '#/components/schemas/ChatEvalAssistantMessageMockToolCall'
          description: >-
            This is the tool calls that will be used in the conversation for this assistant turn moving forward if
            provided.

            It will override the tool calls received from the model.
      title: AssistantMessageEvaluationContinuePlan
    ChatEvalAssistantMessageEvaluation:
      type: object
      properties:
        role:
          $ref: '#/components/schemas/ChatEvalAssistantMessageEvaluationRole'
          description: |-
            This is the role of the message author.
            For an assistant message evaluation, the role is always 'assistant'
            @default 'assistant'
        judgePlan:
          $ref: '#/components/schemas/ChatEvalAssistantMessageEvaluationJudgePlan'
          description: >-
            This is the judge plan that instructs how to evaluate the assistant message.

            The assistant message can be evaluated against fixed content (exact match or RegEx) or with an LLM-as-judge
            by defining the evaluation criteria in a prompt.
        continuePlan:
          $ref: '#/components/schemas/AssistantMessageEvaluationContinuePlan'
          description: >-
            This is the plan for how the overall evaluation will proceed after the assistant message is evaluated.

            This lets you configure whether to stop the evaluation if this message fails, and whether to override any
            content for future turns
      required:
        - role
        - judgePlan
      title: ChatEvalAssistantMessageEvaluation
    EvalMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ChatEvalAssistantMessageMock'
        - $ref: '#/components/schemas/ChatEvalSystemMessageMock'
        - $ref: '#/components/schemas/ChatEvalToolResponseMessageMock'
        - $ref: '#/components/schemas/ChatEvalToolResponseMessageEvaluation'
        - $ref: '#/components/schemas/ChatEvalUserMessageMock'
        - $ref: '#/components/schemas/ChatEvalAssistantMessageEvaluation'
      title: EvalMessagesItems
    EvalType:
      type: string
      enum:
        - chat.mockConversation
      description: |-
        This is the type of the eval.
        Currently it is fixed to `chat.mockConversation`.
      title: EvalType
    Eval:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/EvalMessagesItems'
          description: >-
            This is the mock conversation that will be used to evaluate the flow of the conversation.


            Mock Messages are used to simulate the flow of the conversation


            Evaluation Messages are used as checkpoints in the flow where the model's response to previous conversation
            needs to be evaluated to check the content and tool calls
        id:
          type: string
        orgId:
          type: string
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        name:
          type: string
          description: |-
            This is the name of the eval.
            It helps identify what the eval is checking for.
        description:
          type: string
          description: >-
            This is the description of the eval.

            This helps describe the eval and its purpose in detail. It will not be used to evaluate the flow of the
            conversation.
        type:
          $ref: '#/components/schemas/EvalType'
          description: |-
            This is the type of the eval.
            Currently it is fixed to `chat.mockConversation`.
      required:
        - messages
        - id
        - orgId
        - createdAt
        - updatedAt
        - type
      title: Eval
    EvalPaginatedResponse:
      type: object
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/Eval'
        metadata:
          $ref: '#/components/schemas/PaginationMeta'
      required:
        - results
        - metadata
      title: EvalPaginatedResponse
    CreateEvalDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ChatEvalAssistantMessageMock'
        - $ref: '#/components/schemas/ChatEvalSystemMessageMock'
        - $ref: '#/components/schemas/ChatEvalToolResponseMessageMock'
        - $ref: '#/components/schemas/ChatEvalToolResponseMessageEvaluation'
        - $ref: '#/components/schemas/ChatEvalUserMessageMock'
        - $ref: '#/components/schemas/ChatEvalAssistantMessageEvaluation'
      title: CreateEvalDtoMessagesItems
    CreateEvalDtoType:
      type: string
      enum:
        - chat.mockConversation
      description: |-
        This is the type of the eval.
        Currently it is fixed to `chat.mockConversation`.
      title: CreateEvalDtoType
    CreateEvalDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/CreateEvalDtoMessagesItems'
          description: >-
            This is the mock conversation that will be used to evaluate the flow of the conversation.


            Mock Messages are used to simulate the flow of the conversation


            Evaluation Messages are used as checkpoints in the flow where the model's response to previous conversation
            needs to be evaluated to check the content and tool calls
        name:
          type: string
          description: |-
            This is the name of the eval.
            It helps identify what the eval is checking for.
        description:
          type: string
          description: >-
            This is the description of the eval.

            This helps describe the eval and its purpose in detail. It will not be used to evaluate the flow of the
            conversation.
        type:
          $ref: '#/components/schemas/CreateEvalDtoType'
          description: |-
            This is the type of the eval.
            Currently it is fixed to `chat.mockConversation`.
      required:
        - messages
        - type
      title: CreateEvalDTO
    UpdateEvalDtoMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ChatEvalAssistantMessageMock'
        - $ref: '#/components/schemas/ChatEvalSystemMessageMock'
        - $ref: '#/components/schemas/ChatEvalToolResponseMessageMock'
        - $ref: '#/components/schemas/ChatEvalToolResponseMessageEvaluation'
        - $ref: '#/components/schemas/ChatEvalUserMessageMock'
        - $ref: '#/components/schemas/ChatEvalAssistantMessageEvaluation'
      title: UpdateEvalDtoMessagesItems
    UpdateEvalDtoType:
      type: string
      enum:
        - chat.mockConversation
      description: |-
        This is the type of the eval.
        Currently it is fixed to `chat.mockConversation`.
      title: UpdateEvalDtoType
    UpdateEvalDTO:
      type: object
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/UpdateEvalDtoMessagesItems'
          description: >-
            This is the mock conversation that will be used to evaluate the flow of the conversation.


            Mock Messages are used to simulate the flow of the conversation


            Evaluation Messages are used as checkpoints in the flow where the model's response to previous conversation
            needs to be evaluated to check the content and tool calls
        name:
          type: string
          description: |-
            This is the name of the eval.
            It helps identify what the eval is checking for.
        description:
          type: string
          description: >-
            This is the description of the eval.

            This helps describe the eval and its purpose in detail. It will not be used to evaluate the flow of the
            conversation.
        type:
          $ref: '#/components/schemas/UpdateEvalDtoType'
          description: |-
            This is the type of the eval.
            Currently it is fixed to `chat.mockConversation`.
      title: UpdateEvalDTO
    EvalRunStatus:
      type: string
      enum:
        - running
        - ended
        - queued
      description: |-
        This is the status of the eval run. When an eval run is created, the status is 'running'.
        When the eval run is completed, the status is 'ended'.
      title: EvalRunStatus
    EvalRunEndedReason:
      type: string
      enum:
        - mockConversation.done
        - error
        - timeout
        - cancelled
        - aborted
      description: |-
        This is the reason for the eval run to end.
        When the eval run is completed normally i.e end of mock conversation, the status is 'mockConversation.done'.
        When the eval fails due to an error like Chat error or incorrect configuration, the status is 'error'.
        When the eval runs for too long, due to model issues or tool call issues, the status is 'timeout'.
        When the eval run is cancelled by the user, the status is 'cancelled'.
        When the eval run is cancelled by Vapi for any reason, the status is 'aborted'.
      title: EvalRunEndedReason
    EvalRunTargetAssistantType:
      type: string
      enum:
        - assistant
      description: |-
        This is the type of the target.
        Currently it is fixed to `assistant`.
      title: EvalRunTargetAssistantType
    EvalRunTargetAssistant:
      type: object
      properties:
        assistant:
          $ref: '#/components/schemas/CreateAssistantDTO'
          description: This is the transient assistant that will be run against the eval
        assistantOverrides:
          $ref: '#/components/schemas/AssistantOverrides'
          description: This is the overrides that will be applied to the assistant.
        type:
          $ref: '#/components/schemas/EvalRunTargetAssistantType'
          description: |-
            This is the type of the target.
            Currently it is fixed to `assistant`.
        assistantId:
          type: string
          description: This is the id of the assistant that will be run against the eval
      required:
        - type
      title: EvalRunTargetAssistant
    EvalRunTargetSquadType:
      type: string
      enum:
        - squad
      description: |-
        This is the type of the target.
        Currently it is fixed to `squad`.
      title: EvalRunTargetSquadType
    EvalRunTargetSquad:
      type: object
      properties:
        squad:
          $ref: '#/components/schemas/CreateSquadDTO'
          description: This is the transient squad that will be run against the eval
        assistantOverrides:
          $ref: '#/components/schemas/AssistantOverrides'
          description: This is the overrides that will be applied to the assistants.
        type:
          $ref: '#/components/schemas/EvalRunTargetSquadType'
          description: |-
            This is the type of the target.
            Currently it is fixed to `squad`.
        squadId:
          type: string
          description: This is the id of the squad that will be run against the eval
      required:
        - type
      title: EvalRunTargetSquad
    EvalRunTarget:
      oneOf:
        - $ref: '#/components/schemas/EvalRunTargetAssistant'
        - $ref: '#/components/schemas/EvalRunTargetSquad'
      description: This is the target that will be run against the eval
      title: EvalRunTarget
    EvalRunResultStatus:
      type: string
      enum:
        - pass
        - fail
      description: |-
        This is the status of the eval run result.
        The status is only 'pass' or 'fail' for an eval run result.
        Currently, An eval is considered `pass` only if all the Assistant Judge messages are evaluated to pass.
      title: EvalRunResultStatus
    EvalRunResultMessagesItems:
      oneOf:
        - $ref: '#/components/schemas/ChatEvalUserMessageMock'
        - $ref: '#/components/schemas/ChatEvalSystemMessageMock'
        - $ref: '#/components/schemas/ChatEvalToolResponseMessageMock'
        - $ref: '#/components/schemas/ChatEvalAssistantMessageMock'
      title: EvalRunResultMessagesItems
    EvalRunResult:
      type: object
      properties:
        status:
          $ref: '#/components/schemas/EvalRunResultStatus'
          description: |-
            This is the status of the eval run result.
            The status is only 'pass' or 'fail' for an eval run result.
            Currently, An eval is considered `pass` only if all the Assistant Judge messages are evaluated to pass.
        messages:
          type: array
          items:
            $ref: '#/components/schemas/EvalRunResultMessagesItems'
          description: |-
            This is the messages of the eval run result.
            It contains the user/system messages
        startedAt:
          type: string
          format: date-time
          description: This is the start time of the eval run result.
        endedAt:
          type: string
          format: date-time
          description: This is the end time of the eval run result.
      required:
        - status
        - messages
        - startedAt
        - endedAt
      title: EvalRunResult
    EvalRunCostsItems:
      type: object
      properties: {}
      title: EvalRunCostsItems
    EvalRunType:
      type: string
      enum:
        - eval
      description: |-
        This is the type of the run.
        Currently it is fixed to `eval`.
      title: EvalRunType
    EvalRun:
      type: object
      properties:
        status:
          $ref: '#/components/schemas/EvalRunStatus'
          description: |-
            This is the status of the eval run. When an eval run is created, the status is 'running'.
            When the eval run is completed, the status is 'ended'.
        endedReason:
          $ref: '#/components/schemas/EvalRunEndedReason'
          description: |-
            This is the reason for the eval run to end.
            When the eval run is completed normally i.e end of mock conversation, the status is 'mockConversation.done'.
            When the eval fails due to an error like Chat error or incorrect configuration, the status is 'error'.
            When the eval runs for too long, due to model issues or tool call issues, the status is 'timeout'.
            When the eval run is cancelled by the user, the status is 'cancelled'.
            When the eval run is cancelled by Vapi for any reason, the status is 'aborted'.
        eval:
          $ref: '#/components/schemas/CreateEvalDTO'
          description: This is the transient eval that will be run
        target:
          $ref: '#/components/schemas/EvalRunTarget'
          description: This is the target that will be run against the eval
        id:
          type: string
        orgId:
          type: string
        createdAt:
          type: string
          format: date-time
        startedAt:
          type: string
          format: date-time
        endedAt:
          type: string
          format: date-time
        endedMessage:
          type: string
          description: This is the ended message when the eval run ended for any reason apart from mockConversation.done
        results:
          type: array
          items:
            $ref: '#/components/schemas/EvalRunResult'
          description: >-
            This is the results of the eval or suite run.

            The array will have a single item for an eval run, and multiple items each corresponding to the an eval in a
            suite run in the same order as the evals in the suite.
        cost:
          type: number
          format: double
          description: This is the cost of the eval or suite run in USD.
        costs:
          type: array
          items:
            $ref: '#/components/schemas/EvalRunCostsItems'
          description: This is the break up of costs of the eval or suite run.
        type:
          $ref: '#/components/schemas/EvalRunType'
          description: |-
            This is the type of the run.
            Currently it is fixed to `eval`.
        evalId:
          type: string
          description: This is the id of the eval that will be run.
      required:
        - status
        - endedReason
        - target
        - id
        - orgId
        - createdAt
        - startedAt
        - endedAt
        - results
        - cost
        - costs
        - type
      title: EvalRun
    EvalRunGetParametersSortOrder:
      type: string
      enum:
        - ASC
        - DESC
      title: EvalRunGetParametersSortOrder
    EvalRunPaginatedResponse:
      type: object
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/EvalRun'
        metadata:
          $ref: '#/components/schemas/PaginationMeta'
      required:
        - results
        - metadata
      title: EvalRunPaginatedResponse
    CreateEvalRunDtoTarget:
      oneOf:
        - $ref: '#/components/schemas/EvalRunTargetAssistant'
        - $ref: '#/components/schemas/EvalRunTargetSquad'
      description: This is the target that will be run against the eval
      title: CreateEvalRunDtoTarget
    CreateEvalRunDtoType:
      type: string
      enum:
        - eval
      description: |-
        This is the type of the run.
        Currently it is fixed to `eval`.
      title: CreateEvalRunDtoType
    CreateEvalRunDTO:
      type: object
      properties:
        eval:
          $ref: '#/components/schemas/CreateEvalDTO'
          description: This is the transient eval that will be run
        target:
          $ref: '#/components/schemas/CreateEvalRunDtoTarget'
          description: This is the target that will be run against the eval
        type:
          $ref: '#/components/schemas/CreateEvalRunDtoType'
          description: |-
            This is the type of the run.
            Currently it is fixed to `eval`.
        evalId:
          type: string
          description: This is the id of the eval that will be run.
      required:
        - target
        - type
      title: CreateEvalRunDTO
    Eval_EvalController_run_Response_200:
      type: object
      properties: {}
      description: Empty response body
      title: Eval_EvalController_run_Response_200
    Scorecard:
      type: object
      properties:
        id:
          type: string
          description: This is the unique identifier for the scorecard.
        orgId:
          type: string
          description: This is the unique identifier for the org that this scorecard belongs to.
        createdAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the scorecard was created.
        updatedAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the scorecard was last updated.
        name:
          type: string
          description: This is the name of the scorecard. It is only for user reference and will not be used for any evaluation.
        description:
          type: string
          description: >-
            This is the description of the scorecard. It is only for user reference and will not be used for any
            evaluation.
        metrics:
          type: array
          items:
            $ref: '#/components/schemas/ScorecardMetric'
          description: |-
            These are the metrics that will be used to evaluate the scorecard.
            Each metric will have a set of conditions and points that will be used to generate the score.
        assistantIds:
          type: array
          items:
            type: string
          description: |-
            These are the assistant IDs that this scorecard is linked to.
            When linked to assistants, this scorecard will be available for evaluation during those assistants' calls.
      required:
        - id
        - orgId
        - createdAt
        - updatedAt
        - metrics
      title: Scorecard
    UpdateScorecardDTO:
      type: object
      properties:
        name:
          type: string
          description: This is the name of the scorecard. It is only for user reference and will not be used for any evaluation.
        description:
          type: string
          description: >-
            This is the description of the scorecard. It is only for user reference and will not be used for any
            evaluation.
        metrics:
          type: array
          items:
            $ref: '#/components/schemas/ScorecardMetric'
          description: |-
            These are the metrics that will be used to evaluate the scorecard.
            Each metric will have a set of conditions and points that will be used to generate the score.
        assistantIds:
          type: array
          items:
            type: string
          description: |-
            These are the assistant IDs that this scorecard is linked to.
            When linked to assistants, this scorecard will be available for evaluation during those assistants' calls.
      title: UpdateScorecardDTO
    ObservabilityScorecardGetParametersSortOrder:
      type: string
      enum:
        - ASC
        - DESC
      title: ObservabilityScorecardGetParametersSortOrder
    ScorecardPaginatedResponse:
      type: object
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/Scorecard'
        metadata:
          $ref: '#/components/schemas/PaginationMeta'
      required:
        - results
        - metadata
      title: ScorecardPaginatedResponse
    ProviderProviderResourceNameGetParametersProvider:
      type: string
      enum:
        - cartesia
        - 11labs
      title: ProviderProviderResourceNameGetParametersProvider
    ProviderProviderResourceNameGetParametersResourceName:
      type: string
      enum:
        - pronunciation-dictionary
      title: ProviderProviderResourceNameGetParametersResourceName
    ProviderProviderResourceNameGetParametersSortOrder:
      type: string
      enum:
        - ASC
        - DESC
      title: ProviderProviderResourceNameGetParametersSortOrder
    ProviderResourceProvider:
      type: string
      enum:
        - cartesia
        - 11labs
      description: This is the provider that manages this resource.
      title: ProviderResourceProvider
    ProviderResourceResourceName:
      type: string
      enum:
        - pronunciation-dictionary
      description: This is the name/type of the resource.
      title: ProviderResourceResourceName
    ProviderResourceResource:
      type: object
      properties: {}
      description: This is the full resource data from the provider's API.
      title: ProviderResourceResource
    ProviderResource:
      type: object
      properties:
        id:
          type: string
          description: This is the unique identifier for the provider resource.
        orgId:
          type: string
          description: This is the unique identifier for the org that this provider resource belongs to.
        createdAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the provider resource was created.
        updatedAt:
          type: string
          format: date-time
          description: This is the ISO 8601 date-time string of when the provider resource was last updated.
        provider:
          $ref: '#/components/schemas/ProviderResourceProvider'
          description: This is the provider that manages this resource.
        resourceName:
          $ref: '#/components/schemas/ProviderResourceResourceName'
          description: This is the name/type of the resource.
        resourceId:
          type: string
          description: This is the provider-specific identifier for the resource.
        resource:
          $ref: '#/components/schemas/ProviderResourceResource'
          description: This is the full resource data from the provider's API.
      required:
        - id
        - orgId
        - createdAt
        - updatedAt
        - provider
        - resourceName
        - resourceId
        - resource
      title: ProviderResource
    ProviderResourcePaginatedResponse:
      type: object
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/ProviderResource'
        metadata:
          $ref: '#/components/schemas/PaginationMeta'
      required:
        - results
        - metadata
      title: ProviderResourcePaginatedResponse
    ProviderProviderResourceNamePostParametersProvider:
      type: string
      enum:
        - cartesia
        - 11labs
      title: ProviderProviderResourceNamePostParametersProvider
    ProviderProviderResourceNamePostParametersResourceName:
      type: string
      enum:
        - pronunciation-dictionary
      title: ProviderProviderResourceNamePostParametersResourceName
    ProviderProviderResourceNameIdGetParametersProvider:
      type: string
      enum:
        - cartesia
        - 11labs
      title: ProviderProviderResourceNameIdGetParametersProvider
    ProviderProviderResourceNameIdGetParametersResourceName:
      type: string
      enum:
        - pronunciation-dictionary
      title: ProviderProviderResourceNameIdGetParametersResourceName
    ProviderProviderResourceNameIdDeleteParametersProvider:
      type: string
      enum:
        - cartesia
        - 11labs
      title: ProviderProviderResourceNameIdDeleteParametersProvider
    ProviderProviderResourceNameIdDeleteParametersResourceName:
      type: string
      enum:
        - pronunciation-dictionary
      title: ProviderProviderResourceNameIdDeleteParametersResourceName
    ProviderProviderResourceNameIdPatchParametersProvider:
      type: string
      enum:
        - cartesia
        - 11labs
      title: ProviderProviderResourceNameIdPatchParametersProvider
    ProviderProviderResourceNameIdPatchParametersResourceName:
      type: string
      enum:
        - pronunciation-dictionary
      title: ProviderProviderResourceNameIdPatchParametersResourceName
    AnalyticsQueryTable:
      type: string
      enum:
        - call
        - subscription
      description: This is the table you want to query.
      title: AnalyticsQueryTable
    AnalyticsQueryGroupBy:
      type: string
      enum:
        - type
        - assistantId
        - endedReason
        - analysis.successEvaluation
        - status
      description: This is the list of columns you want to group by.
      title: AnalyticsQueryGroupBy
    VariableValueGroupBy:
      type: object
      properties:
        key:
          type: string
          description: This is the key of the variable value to group by.
      required:
        - key
      title: VariableValueGroupBy
    TimeRangeStep:
      type: string
      enum:
        - second
        - minute
        - hour
        - day
        - week
        - month
        - quarter
        - year
        - decade
        - century
        - millennium
      description: |-
        This is the time step for aggregations.

        If not provided, defaults to returning for the entire time range.
      title: TimeRangeStep
    TimeRange:
      type: object
      properties:
        step:
          $ref: '#/components/schemas/TimeRangeStep'
          description: |-
            This is the time step for aggregations.

            If not provided, defaults to returning for the entire time range.
        start:
          type: string
          format: date-time
          description: |-
            This is the start date for the time range.

            If not provided, defaults to the 7 days ago.
        end:
          type: string
          format: date-time
          description: |-
            This is the end date for the time range.

            If not provided, defaults to now.
        timezone:
          type: string
          description: |-
            This is the timezone you want to set for the query.

            If not provided, defaults to UTC.
      title: TimeRange
    AnalyticsOperationOperation:
      type: string
      enum:
        - sum
        - avg
        - count
        - min
        - max
        - history
      description: This is the aggregation operation you want to perform.
      title: AnalyticsOperationOperation
    AnalyticsOperationColumn:
      type: string
      enum:
        - id
        - cost
        - costBreakdown.llm
        - costBreakdown.stt
        - costBreakdown.tts
        - costBreakdown.vapi
        - costBreakdown.transport
        - costBreakdown.analysisBreakdown.summary
        - costBreakdown.transcriber
        - costBreakdown.ttsCharacters
        - costBreakdown.llmPromptTokens
        - costBreakdown.llmCompletionTokens
        - costBreakdown.llmCachedPromptTokens
        - duration
        - concurrency
        - minutesUsed
      description: This is the columns you want to perform the aggregation operation on.
      title: AnalyticsOperationColumn
    AnalyticsOperation:
      type: object
      properties:
        operation:
          $ref: '#/components/schemas/AnalyticsOperationOperation'
          description: This is the aggregation operation you want to perform.
        column:
          $ref: '#/components/schemas/AnalyticsOperationColumn'
          description: This is the columns you want to perform the aggregation operation on.
        alias:
          type: string
          description: This is the alias for column name returned. Defaults to `${operation}${column}`.
      required:
        - operation
        - column
      title: AnalyticsOperation
    AnalyticsQuery:
      type: object
      properties:
        table:
          $ref: '#/components/schemas/AnalyticsQueryTable'
          description: This is the table you want to query.
        groupBy:
          $ref: '#/components/schemas/AnalyticsQueryGroupBy'
          description: This is the list of columns you want to group by.
        groupByVariableValue:
          type: array
          items:
            $ref: '#/components/schemas/VariableValueGroupBy'
          description: This is the list of variable value keys you want to group by.
        name:
          type: string
          description: This is the name of the query. This will be used to identify the query in the response.
        timeRange:
          $ref: '#/components/schemas/TimeRange'
          description: This is the time range for the query.
        operations:
          type: array
          items:
            $ref: '#/components/schemas/AnalyticsOperation'
          description: This is the list of operations you want to perform.
      required:
        - table
        - name
        - operations
      title: AnalyticsQuery
    AnalyticsQueryDTO:
      type: object
      properties:
        queries:
          type: array
          items:
            $ref: '#/components/schemas/AnalyticsQuery'
          description: This is the list of metric queries you want to perform.
      required:
        - queries
      title: AnalyticsQueryDTO
    AnalyticsQueryResultResultItems:
      type: object
      properties: {}
      title: AnalyticsQueryResultResultItems
    AnalyticsQueryResult:
      type: object
      properties:
        name:
          type: string
          description: This is the unique key for the query.
        timeRange:
          $ref: '#/components/schemas/TimeRange'
          description: This is the time range for the query.
        result:
          type: array
          items:
            $ref: '#/components/schemas/AnalyticsQueryResultResultItems'
          description: |-
            This is the result of the query, a list of unique groups with result of their aggregations.

            Example:
            "result": [
              { "date": "2023-01-01", "assistantId": "123", "endedReason": "customer-ended-call", "sumDuration": 120, "avgCost": 10.5 },
              { "date": "2023-01-02", "assistantId": "123", "endedReason": "customer-did-not-give-microphone-permission", "sumDuration": 0, "avgCost": 0 },
              // Additional results
            ]
      required:
        - name
        - timeRange
        - result
      title: AnalyticsQueryResult
  securitySchemes:
    bearer:
      type: http
      scheme: bearer
      description: Retrieve your API Key from [Dashboard](dashboard.vapi.ai).
