diff --git a/fern/apis/api/openapi.json b/fern/apis/api/openapi.json
index d4453b1cf..0ac5e50e7 100644
--- a/fern/apis/api/openapi.json
+++ b/fern/apis/api/openapi.json
@@ -167,7 +167,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -201,7 +203,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -245,7 +249,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -260,6 +266,16 @@
}
}
}
+ },
+ "409": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AssistantPinnedConflictResponseDTO"
+ }
+ }
+ }
}
},
"tags": [
@@ -438,7 +454,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -472,7 +490,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -516,7 +536,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -743,7 +765,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -777,7 +801,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -849,6 +875,286 @@
]
}
},
+ "/call/{id}/mono-recording": {
+ "get": {
+ "operationId": "CallArtifactController_monoRecordingDownload",
+ "summary": "Download Call Mono Recording",
+ "parameters": [
+ {
+ "name": "id",
+ "required": true,
+ "in": "path",
+ "description": "Call ID",
+ "schema": {
+ "format": "uuid",
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": ""
+ },
+ "302": {
+ "description": "Redirect to a short-lived presigned URL for the recording."
+ },
+ "401": {
+ "description": "Unauthorized — missing or invalid API token."
+ },
+ "404": {
+ "description": "Artifact not found."
+ }
+ },
+ "tags": [
+ "Calls"
+ ],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ }
+ },
+ "/call/{id}/stereo-recording": {
+ "get": {
+ "operationId": "CallArtifactController_stereoRecordingDownload",
+ "summary": "Download Call Stereo Recording",
+ "parameters": [
+ {
+ "name": "id",
+ "required": true,
+ "in": "path",
+ "description": "Call ID",
+ "schema": {
+ "format": "uuid",
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": ""
+ },
+ "302": {
+ "description": "Redirect to a short-lived presigned URL for the recording."
+ },
+ "401": {
+ "description": "Unauthorized — missing or invalid API token."
+ },
+ "404": {
+ "description": "Artifact not found."
+ }
+ },
+ "tags": [
+ "Calls"
+ ],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ }
+ },
+ "/call/{id}/video-recording": {
+ "get": {
+ "operationId": "CallArtifactController_videoRecordingDownload",
+ "summary": "Download Call Video Recording",
+ "parameters": [
+ {
+ "name": "id",
+ "required": true,
+ "in": "path",
+ "description": "Call ID",
+ "schema": {
+ "format": "uuid",
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": ""
+ },
+ "302": {
+ "description": "Redirect to a short-lived presigned URL for the video."
+ },
+ "401": {
+ "description": "Unauthorized — missing or invalid API token."
+ },
+ "404": {
+ "description": "Artifact not found."
+ }
+ },
+ "tags": [
+ "Calls"
+ ],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ }
+ },
+ "/call/{id}/customer-recording": {
+ "get": {
+ "operationId": "CallArtifactController_customerRecordingDownload",
+ "summary": "Download Call Customer Recording",
+ "parameters": [
+ {
+ "name": "id",
+ "required": true,
+ "in": "path",
+ "description": "Call ID",
+ "schema": {
+ "format": "uuid",
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": ""
+ },
+ "302": {
+ "description": "Redirect to a short-lived presigned URL for the recording."
+ },
+ "401": {
+ "description": "Unauthorized — missing or invalid API token."
+ },
+ "404": {
+ "description": "Artifact not found."
+ }
+ },
+ "tags": [
+ "Calls"
+ ],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ }
+ },
+ "/call/{id}/assistant-recording": {
+ "get": {
+ "operationId": "CallArtifactController_assistantRecordingDownload",
+ "summary": "Download Call Assistant Recording",
+ "parameters": [
+ {
+ "name": "id",
+ "required": true,
+ "in": "path",
+ "description": "Call ID",
+ "schema": {
+ "format": "uuid",
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": ""
+ },
+ "302": {
+ "description": "Redirect to a short-lived presigned URL for the recording."
+ },
+ "401": {
+ "description": "Unauthorized — missing or invalid API token."
+ },
+ "404": {
+ "description": "Artifact not found."
+ }
+ },
+ "tags": [
+ "Calls"
+ ],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ }
+ },
+ "/call/{id}/pcap": {
+ "get": {
+ "operationId": "CallArtifactController_pcapDownload",
+ "summary": "Download Call Packet Capture (pcap)",
+ "parameters": [
+ {
+ "name": "id",
+ "required": true,
+ "in": "path",
+ "description": "Call ID",
+ "schema": {
+ "format": "uuid",
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": ""
+ },
+ "302": {
+ "description": "Redirect to a short-lived presigned URL for the pcap file."
+ },
+ "401": {
+ "description": "Unauthorized — missing or invalid API token."
+ },
+ "404": {
+ "description": "Artifact not found."
+ }
+ },
+ "tags": [
+ "Calls"
+ ],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ }
+ },
+ "/call/{id}/call-logs": {
+ "get": {
+ "operationId": "CallArtifactController_callLogsDownload",
+ "summary": "Download Call Logs",
+ "parameters": [
+ {
+ "name": "id",
+ "required": true,
+ "in": "path",
+ "description": "Call ID",
+ "schema": {
+ "format": "uuid",
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": ""
+ },
+ "302": {
+ "description": "Redirect to a short-lived presigned URL for the log file."
+ },
+ "401": {
+ "description": "Unauthorized — missing or invalid API token."
+ },
+ "404": {
+ "description": "Artifact not found."
+ }
+ },
+ "tags": [
+ "Calls"
+ ],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ }
+ },
"/chat": {
"get": {
"operationId": "ChatController_listChats",
@@ -932,6 +1238,20 @@
"type": "string"
}
},
+ {
+ "name": "sortBy",
+ "required": false,
+ "in": "query",
+ "description": "This is the column to sort by. Defaults to 'createdAt'.",
+ "schema": {
+ "enum": [
+ "createdAt",
+ "duration",
+ "cost"
+ ],
+ "type": "string"
+ }
+ },
{
"name": "limit",
"required": false,
@@ -1288,7 +1608,9 @@
"enum": [
"scheduled",
"in-progress",
- "ended"
+ "ended",
+ "cancelled",
+ "archived"
],
"type": "string"
}
@@ -1316,6 +1638,20 @@
"type": "string"
}
},
+ {
+ "name": "sortBy",
+ "required": false,
+ "in": "query",
+ "description": "This is the column to sort by. Defaults to 'createdAt'.",
+ "schema": {
+ "enum": [
+ "createdAt",
+ "duration",
+ "cost"
+ ],
+ "type": "string"
+ }
+ },
{
"name": "limit",
"required": false,
@@ -1430,22 +1766,23 @@
]
}
},
- "/campaign/{id}": {
- "get": {
- "operationId": "CampaignController_findOne",
- "summary": "Get Campaign",
- "parameters": [
- {
- "name": "id",
- "required": true,
- "in": "path",
- "schema": {
- "type": "string"
+ "/v2/campaign": {
+ "post": {
+ "operationId": "CampaignController_createV2",
+ "summary": "Create Campaign V2",
+ "parameters": [],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/CreateCampaignDTO"
+ }
}
}
- ],
+ },
"responses": {
- "200": {
+ "201": {
"description": "",
"content": {
"application/json": {
@@ -1465,36 +1802,169 @@
}
]
},
- "patch": {
- "operationId": "CampaignController_update",
- "summary": "Update Campaign",
+ "get": {
+ "operationId": "CampaignController_findAllV2",
+ "summary": "List Campaigns V2",
"parameters": [
{
"name": "id",
- "required": true,
- "in": "path",
+ "required": false,
+ "in": "query",
"schema": {
"type": "string"
}
- }
- ],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/UpdateCampaignDTO"
- }
+ },
+ {
+ "name": "status",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "enum": [
+ "scheduled",
+ "in-progress",
+ "ended",
+ "cancelled",
+ "archived"
+ ],
+ "type": "string"
+ }
+ },
+ {
+ "name": "page",
+ "required": false,
+ "in": "query",
+ "description": "This is the page number to return. Defaults to 1.",
+ "schema": {
+ "minimum": 1,
+ "type": "number"
+ }
+ },
+ {
+ "name": "sortOrder",
+ "required": false,
+ "in": "query",
+ "description": "This is the sort order for pagination. Defaults to 'DESC'.",
+ "schema": {
+ "enum": [
+ "ASC",
+ "DESC"
+ ],
+ "type": "string"
+ }
+ },
+ {
+ "name": "sortBy",
+ "required": false,
+ "in": "query",
+ "description": "This is the column to sort by. Defaults to 'createdAt'.",
+ "schema": {
+ "enum": [
+ "createdAt",
+ "duration",
+ "cost"
+ ],
+ "type": "string"
+ }
+ },
+ {
+ "name": "limit",
+ "required": false,
+ "in": "query",
+ "description": "This is the maximum number of items to return. Defaults to 100.",
+ "schema": {
+ "minimum": 0,
+ "maximum": 1000,
+ "type": "number"
+ }
+ },
+ {
+ "name": "createdAtGt",
+ "required": false,
+ "in": "query",
+ "description": "This will return items where the createdAt is greater than the specified value.",
+ "schema": {
+ "format": "date-time",
+ "type": "string"
+ }
+ },
+ {
+ "name": "createdAtLt",
+ "required": false,
+ "in": "query",
+ "description": "This will return items where the createdAt is less than the specified value.",
+ "schema": {
+ "format": "date-time",
+ "type": "string"
+ }
+ },
+ {
+ "name": "createdAtGe",
+ "required": false,
+ "in": "query",
+ "description": "This will return items where the createdAt is greater than or equal to the specified value.",
+ "schema": {
+ "format": "date-time",
+ "type": "string"
+ }
+ },
+ {
+ "name": "createdAtLe",
+ "required": false,
+ "in": "query",
+ "description": "This will return items where the createdAt is less than or equal to the specified value.",
+ "schema": {
+ "format": "date-time",
+ "type": "string"
+ }
+ },
+ {
+ "name": "updatedAtGt",
+ "required": false,
+ "in": "query",
+ "description": "This will return items where the updatedAt is greater than the specified value.",
+ "schema": {
+ "format": "date-time",
+ "type": "string"
+ }
+ },
+ {
+ "name": "updatedAtLt",
+ "required": false,
+ "in": "query",
+ "description": "This will return items where the updatedAt is less than the specified value.",
+ "schema": {
+ "format": "date-time",
+ "type": "string"
+ }
+ },
+ {
+ "name": "updatedAtGe",
+ "required": false,
+ "in": "query",
+ "description": "This will return items where the updatedAt is greater than or equal to the specified value.",
+ "schema": {
+ "format": "date-time",
+ "type": "string"
+ }
+ },
+ {
+ "name": "updatedAtLe",
+ "required": false,
+ "in": "query",
+ "description": "This will return items where the updatedAt is less than or equal to the specified value.",
+ "schema": {
+ "format": "date-time",
+ "type": "string"
}
}
- },
+ ],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
- "$ref": "#/components/schemas/Campaign"
+ "$ref": "#/components/schemas/CampaignPaginatedResponse"
}
}
}
@@ -1508,16 +1978,222 @@
"bearer": []
}
]
- },
- "delete": {
- "operationId": "CampaignController_remove",
- "summary": "Delete Campaign",
+ }
+ },
+ "/v2/campaign/{id}": {
+ "get": {
+ "operationId": "CampaignController_findOneV2",
+ "summary": "Get Campaign V2",
"parameters": [
{
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Campaign"
+ }
+ }
+ }
+ }
+ },
+ "tags": [
+ "Campaigns"
+ ],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ },
+ "patch": {
+ "operationId": "CampaignController_updateV2",
+ "summary": "Update Campaign",
+ "parameters": [
+ {
+ "name": "id",
+ "required": true,
+ "in": "path",
+ "description": "The unique identifier for the resource.",
+ "schema": {
+ "format": "uuid",
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/UpdateCampaignDTO"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Campaign"
+ }
+ }
+ }
+ }
+ },
+ "tags": [
+ "Campaigns"
+ ],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ },
+ "delete": {
+ "operationId": "CampaignController_removeV2",
+ "summary": "Delete Campaign",
+ "parameters": [
+ {
+ "name": "id",
+ "required": true,
+ "in": "path",
+ "description": "The unique identifier for the resource.",
+ "schema": {
+ "format": "uuid",
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Campaign"
+ }
+ }
+ }
+ }
+ },
+ "tags": [
+ "Campaigns"
+ ],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ }
+ },
+ "/campaign/{id}": {
+ "get": {
+ "operationId": "CampaignController_findOne",
+ "summary": "Get Campaign",
+ "parameters": [
+ {
+ "name": "id",
+ "required": true,
+ "in": "path",
+ "description": "The unique identifier for the resource.",
+ "schema": {
+ "format": "uuid",
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Campaign"
+ }
+ }
+ }
+ }
+ },
+ "tags": [
+ "Campaigns"
+ ],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ },
+ "patch": {
+ "operationId": "CampaignController_update",
+ "summary": "Update Campaign",
+ "parameters": [
+ {
+ "name": "id",
+ "required": true,
+ "in": "path",
+ "description": "The unique identifier for the resource.",
+ "schema": {
+ "format": "uuid",
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/UpdateCampaignDTO"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Campaign"
+ }
+ }
+ }
+ }
+ },
+ "tags": [
+ "Campaigns"
+ ],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ },
+ "delete": {
+ "operationId": "CampaignController_remove",
+ "summary": "Delete Campaign",
+ "parameters": [
+ {
+ "name": "id",
+ "required": true,
+ "in": "path",
+ "description": "The unique identifier for the resource.",
+ "schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -1672,6 +2348,18 @@
"in": "query",
"schema": {}
},
+ {
+ "name": "squadOverrides",
+ "required": false,
+ "description": "These are the overrides applied when the call targets a `squadId`. Mirrors\nthe call-level `squadOverrides` — use this instead of `assistantOverrides`\nwhen the campaign or call is squad-based.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/AssistantOverrides"
+ }
+ ],
+ "in": "query",
+ "schema": {}
+ },
{
"required": false,
"description": "This is the number of the customer.",
@@ -1776,6 +2464,20 @@
"type": "string"
}
},
+ {
+ "name": "sortBy",
+ "required": false,
+ "in": "query",
+ "description": "This is the column to sort by. Defaults to 'createdAt'.",
+ "schema": {
+ "enum": [
+ "createdAt",
+ "duration",
+ "cost"
+ ],
+ "type": "string"
+ }
+ },
{
"name": "limit",
"required": false,
@@ -1899,7 +2601,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -1933,7 +2637,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -1977,7 +2683,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -2294,6 +3002,20 @@
"type": "string"
}
},
+ {
+ "name": "sortBy",
+ "required": false,
+ "in": "query",
+ "description": "This is the column to sort by. Defaults to 'createdAt'.",
+ "schema": {
+ "enum": [
+ "createdAt",
+ "duration",
+ "cost"
+ ],
+ "type": "string"
+ }
+ },
{
"name": "limit",
"required": false,
@@ -2417,7 +3139,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -2483,7 +3207,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -2590,7 +3316,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -3185,7 +3913,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -3344,7 +4074,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -3633,7 +4365,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -3773,6 +4507,16 @@
}
}
}
+ },
+ "409": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ToolPinnedConflictResponseDTO"
+ }
+ }
+ }
}
},
"tags": [
@@ -3827,7 +4571,16 @@
"get": {
"operationId": "FileController_findAll",
"summary": "List Files",
- "parameters": [],
+ "parameters": [
+ {
+ "name": "purpose",
+ "required": true,
+ "in": "query",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
"responses": {
"200": {
"description": "",
@@ -3862,7 +4615,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -3896,7 +4651,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -3940,7 +4697,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -4013,6 +4772,20 @@
"type": "string"
}
},
+ {
+ "name": "sortBy",
+ "required": false,
+ "in": "query",
+ "description": "This is the column to sort by. Defaults to 'createdAt'.",
+ "schema": {
+ "enum": [
+ "createdAt",
+ "duration",
+ "cost"
+ ],
+ "type": "string"
+ }
+ },
{
"name": "limit",
"required": false,
@@ -4171,7 +4944,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -4205,7 +4980,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
},
@@ -4257,7 +5034,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -4450,6 +5229,20 @@
"type": "string"
}
},
+ {
+ "name": "sortBy",
+ "required": false,
+ "in": "query",
+ "description": "This is the column to sort by. Defaults to 'createdAt'.",
+ "schema": {
+ "enum": [
+ "createdAt",
+ "duration",
+ "cost"
+ ],
+ "type": "string"
+ }
+ },
{
"name": "limit",
"required": false,
@@ -4573,7 +5366,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -4665,7 +5460,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -4721,7 +5518,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -4779,7 +5578,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -4970,6 +5771,20 @@
"type": "string"
}
},
+ {
+ "name": "sortBy",
+ "required": false,
+ "in": "query",
+ "description": "This is the column to sort by. Defaults to 'createdAt'.",
+ "schema": {
+ "enum": [
+ "createdAt",
+ "duration",
+ "cost"
+ ],
+ "type": "string"
+ }
+ },
{
"name": "limit",
"required": false,
@@ -5093,7 +5908,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -5137,7 +5954,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -5171,7 +5990,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -5207,7 +6028,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -5241,7 +6064,9 @@
"name": "id",
"required": true,
"in": "path",
+ "description": "The unique identifier for the resource.",
"schema": {
+ "format": "uuid",
"type": "string"
}
}
@@ -5343,265 +6168,293 @@
}
},
{
- "name": "limit",
- "required": false,
- "in": "query",
- "description": "This is the maximum number of items to return. Defaults to 100.",
- "schema": {
- "minimum": 0,
- "maximum": 1000,
- "type": "number"
- }
- },
- {
- "name": "createdAtGt",
- "required": false,
- "in": "query",
- "description": "This will return items where the createdAt is greater than the specified value.",
- "schema": {
- "format": "date-time",
- "type": "string"
- }
- },
- {
- "name": "createdAtLt",
- "required": false,
- "in": "query",
- "description": "This will return items where the createdAt is less than the specified value.",
- "schema": {
- "format": "date-time",
- "type": "string"
- }
- },
- {
- "name": "createdAtGe",
+ "name": "sortBy",
"required": false,
"in": "query",
- "description": "This will return items where the createdAt is greater than or equal to the specified value.",
- "schema": {
- "format": "date-time",
- "type": "string"
- }
- },
- {
- "name": "createdAtLe",
- "required": false,
- "in": "query",
- "description": "This will return items where the createdAt is less than or equal to the specified value.",
- "schema": {
- "format": "date-time",
- "type": "string"
- }
- },
- {
- "name": "updatedAtGt",
- "required": false,
- "in": "query",
- "description": "This will return items where the updatedAt is greater than the specified value.",
- "schema": {
- "format": "date-time",
- "type": "string"
- }
- },
- {
- "name": "updatedAtLt",
- "required": false,
- "in": "query",
- "description": "This will return items where the updatedAt is less than the specified value.",
- "schema": {
- "format": "date-time",
- "type": "string"
- }
- },
- {
- "name": "updatedAtGe",
- "required": false,
- "in": "query",
- "description": "This will return items where the updatedAt is greater than or equal to the specified value.",
- "schema": {
- "format": "date-time",
- "type": "string"
- }
- },
- {
- "name": "updatedAtLe",
- "required": false,
- "in": "query",
- "description": "This will return items where the updatedAt is less than or equal to the specified value.",
- "schema": {
- "format": "date-time",
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/EvalRunPaginatedResponse"
- }
- }
- }
- }
- },
- "tags": [
- "Eval"
- ],
- "security": [
- {
- "bearer": []
- }
- ]
- }
- },
- "/observability/scorecard/{id}": {
- "get": {
- "operationId": "ScorecardController_get",
- "summary": "Get Scorecard",
- "parameters": [
- {
- "name": "id",
- "required": true,
- "in": "path",
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/Scorecard"
- }
- }
- }
- }
- },
- "tags": [
- "Observability/Scorecard"
- ],
- "security": [
- {
- "bearer": []
- }
- ]
- },
- "patch": {
- "operationId": "ScorecardController_update",
- "summary": "Update Scorecard",
- "parameters": [
- {
- "name": "id",
- "required": true,
- "in": "path",
- "schema": {
- "type": "string"
- }
- }
- ],
- "requestBody": {
- "required": true,
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/UpdateScorecardDTO"
- }
- }
- }
- },
- "responses": {
- "200": {
- "description": "",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/Scorecard"
- }
- }
- }
- }
- },
- "tags": [
- "Observability/Scorecard"
- ],
- "security": [
- {
- "bearer": []
- }
- ]
- },
- "delete": {
- "operationId": "ScorecardController_remove",
- "summary": "Delete Scorecard",
- "parameters": [
- {
- "name": "id",
- "required": true,
- "in": "path",
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/Scorecard"
- }
- }
- }
- }
- },
- "tags": [
- "Observability/Scorecard"
- ],
- "security": [
- {
- "bearer": []
- }
- ]
- }
- },
- "/observability/scorecard": {
- "get": {
- "operationId": "ScorecardController_getPaginated",
- "summary": "List Scorecards",
- "parameters": [
- {
- "name": "id",
- "required": false,
- "in": "query",
- "schema": {
- "type": "string"
- }
- },
- {
- "name": "page",
- "required": false,
- "in": "query",
- "description": "This is the page number to return. Defaults to 1.",
- "schema": {
- "minimum": 1,
- "type": "number"
- }
- },
- {
- "name": "sortOrder",
- "required": false,
- "in": "query",
- "description": "This is the sort order for pagination. Defaults to 'DESC'.",
+ "description": "This is the column to sort by. Defaults to 'createdAt'.",
"schema": {
"enum": [
- "ASC",
- "DESC"
+ "createdAt",
+ "duration",
+ "cost"
+ ],
+ "type": "string"
+ }
+ },
+ {
+ "name": "limit",
+ "required": false,
+ "in": "query",
+ "description": "This is the maximum number of items to return. Defaults to 100.",
+ "schema": {
+ "minimum": 0,
+ "maximum": 1000,
+ "type": "number"
+ }
+ },
+ {
+ "name": "createdAtGt",
+ "required": false,
+ "in": "query",
+ "description": "This will return items where the createdAt is greater than the specified value.",
+ "schema": {
+ "format": "date-time",
+ "type": "string"
+ }
+ },
+ {
+ "name": "createdAtLt",
+ "required": false,
+ "in": "query",
+ "description": "This will return items where the createdAt is less than the specified value.",
+ "schema": {
+ "format": "date-time",
+ "type": "string"
+ }
+ },
+ {
+ "name": "createdAtGe",
+ "required": false,
+ "in": "query",
+ "description": "This will return items where the createdAt is greater than or equal to the specified value.",
+ "schema": {
+ "format": "date-time",
+ "type": "string"
+ }
+ },
+ {
+ "name": "createdAtLe",
+ "required": false,
+ "in": "query",
+ "description": "This will return items where the createdAt is less than or equal to the specified value.",
+ "schema": {
+ "format": "date-time",
+ "type": "string"
+ }
+ },
+ {
+ "name": "updatedAtGt",
+ "required": false,
+ "in": "query",
+ "description": "This will return items where the updatedAt is greater than the specified value.",
+ "schema": {
+ "format": "date-time",
+ "type": "string"
+ }
+ },
+ {
+ "name": "updatedAtLt",
+ "required": false,
+ "in": "query",
+ "description": "This will return items where the updatedAt is less than the specified value.",
+ "schema": {
+ "format": "date-time",
+ "type": "string"
+ }
+ },
+ {
+ "name": "updatedAtGe",
+ "required": false,
+ "in": "query",
+ "description": "This will return items where the updatedAt is greater than or equal to the specified value.",
+ "schema": {
+ "format": "date-time",
+ "type": "string"
+ }
+ },
+ {
+ "name": "updatedAtLe",
+ "required": false,
+ "in": "query",
+ "description": "This will return items where the updatedAt is less than or equal to the specified value.",
+ "schema": {
+ "format": "date-time",
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/EvalRunPaginatedResponse"
+ }
+ }
+ }
+ }
+ },
+ "tags": [
+ "Eval"
+ ],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ }
+ },
+ "/observability/scorecard/{id}": {
+ "get": {
+ "operationId": "ScorecardController_get",
+ "summary": "Get Scorecard",
+ "parameters": [
+ {
+ "name": "id",
+ "required": true,
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Scorecard"
+ }
+ }
+ }
+ }
+ },
+ "tags": [
+ "Observability/Scorecard"
+ ],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ },
+ "patch": {
+ "operationId": "ScorecardController_update",
+ "summary": "Update Scorecard",
+ "parameters": [
+ {
+ "name": "id",
+ "required": true,
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/UpdateScorecardDTO"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Scorecard"
+ }
+ }
+ }
+ }
+ },
+ "tags": [
+ "Observability/Scorecard"
+ ],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ },
+ "delete": {
+ "operationId": "ScorecardController_remove",
+ "summary": "Delete Scorecard",
+ "parameters": [
+ {
+ "name": "id",
+ "required": true,
+ "in": "path",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Scorecard"
+ }
+ }
+ }
+ }
+ },
+ "tags": [
+ "Observability/Scorecard"
+ ],
+ "security": [
+ {
+ "bearer": []
+ }
+ ]
+ }
+ },
+ "/observability/scorecard": {
+ "get": {
+ "operationId": "ScorecardController_getPaginated",
+ "summary": "List Scorecards",
+ "parameters": [
+ {
+ "name": "id",
+ "required": false,
+ "in": "query",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "page",
+ "required": false,
+ "in": "query",
+ "description": "This is the page number to return. Defaults to 1.",
+ "schema": {
+ "minimum": 1,
+ "type": "number"
+ }
+ },
+ {
+ "name": "sortOrder",
+ "required": false,
+ "in": "query",
+ "description": "This is the sort order for pagination. Defaults to 'DESC'.",
+ "schema": {
+ "enum": [
+ "ASC",
+ "DESC"
+ ],
+ "type": "string"
+ }
+ },
+ {
+ "name": "sortBy",
+ "required": false,
+ "in": "query",
+ "description": "This is the column to sort by. Defaults to 'createdAt'.",
+ "schema": {
+ "enum": [
+ "createdAt",
+ "duration",
+ "cost"
],
"type": "string"
}
@@ -5883,6 +6736,20 @@
"type": "string"
}
},
+ {
+ "name": "sortBy",
+ "required": false,
+ "in": "query",
+ "description": "This is the column to sort by. Defaults to 'createdAt'.",
+ "schema": {
+ "enum": [
+ "createdAt",
+ "duration",
+ "cost"
+ ],
+ "type": "string"
+ }
+ },
{
"name": "limit",
"required": false,
@@ -6308,14 +7175,15 @@
{
"$ref": "#/components/schemas/FallbackSonioxTranscriber",
"title": "Soniox"
+ },
+ {
+ "$ref": "#/components/schemas/FallbackXaiTranscriber",
+ "title": "xAI"
}
]
}
}
- },
- "required": [
- "transcribers"
- ]
+ }
},
"AssemblyAITranscriber": {
"type": "object",
@@ -6631,7 +7499,8 @@
"model": {
"type": "string",
"enum": [
- "ink-whisper"
+ "ink-whisper",
+ "ink-2"
]
},
"language": {
@@ -7008,7 +7877,8 @@
"base-voicemail",
"base-video",
"whisper",
- "flux-general-en"
+ "flux-general-en",
+ "flux-general-multi"
]
},
{
@@ -7023,8 +7893,11 @@
"ar",
"az",
"ba",
+ "be",
"bg",
+ "bn",
"br",
+ "bs",
"ca",
"cs",
"da",
@@ -7054,6 +7927,7 @@
"he",
"hi",
"hi-Latn",
+ "hr",
"hu",
"id",
"is",
@@ -7067,6 +7941,7 @@
"lt",
"lv",
"mk",
+ "mr",
"ms",
"multi",
"nl",
@@ -7088,8 +7963,10 @@
"sv-SE",
"ta",
"taq",
+ "te",
"th",
"th-TH",
+ "tl",
"tr",
"tt",
"uk",
@@ -7125,6 +8002,29 @@
"description": "If set to true, Deepgram will replace profanity in transcripts with surrounding asterisks, e.g. \"f***\".\n\n@default false",
"example": false
},
+ "redaction": {
+ "type": "array",
+ "description": "Enables redaction of sensitive information from transcripts.\n\nOptions include:\n- \"pci\": Redacts credit card numbers, expiration dates, and CVV.\n- \"pii\": Redacts personally identifiable information (names, locations, identifying numbers, etc.).\n- \"phi\": Redacts protected health information (medical conditions, drugs, injuries, etc.).\n- \"numbers\": Redacts numerical and identifying entities (dates, account numbers, SSNs, etc.).\n\nMultiple values can be provided to redact different categories simultaneously.\nRedacted content is replaced with entity labels like [CREDIT_CARD_1], [SSN_1], etc.\n\nSee https://developers.deepgram.com/docs/redaction for details.",
+ "enum": [
+ "pci",
+ "pii",
+ "phi",
+ "numbers"
+ ],
+ "example": [
+ "pci",
+ "phi"
+ ],
+ "items": {
+ "type": "string",
+ "enum": [
+ "pci",
+ "pii",
+ "phi",
+ "numbers"
+ ]
+ }
+ },
"confidenceThreshold": {
"type": "number",
"description": "Transcripts below this confidence threshold will be discarded.\n\n@default 0.4",
@@ -7132,13 +8032,6 @@
"maximum": 1,
"example": 0.4
},
- "eagerEotThreshold": {
- "type": "number",
- "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.",
- "minimum": 0,
- "maximum": 1,
- "example": 0.3
- },
"eotThreshold": {
"type": "number",
"description": "End-of-turn confidence required to finish a turn. Only used with Flux models.\n\n@default 0.7",
@@ -7153,6 +8046,17 @@
"maximum": 10000,
"example": 5000
},
+ "languages": {
+ "description": "Language hints to bias Flux Multilingual (`flux-general-multi`) toward specific languages.\nProvide BCP-47 language codes (e.g. \"en\", \"es\", \"fr\"). Multiple hints can be given for\nmultilingual or code-switching scenarios. Omit for auto-detection. Only used with `flux-general-multi`.",
+ "example": [
+ "en",
+ "es"
+ ],
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
"keywords": {
"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.",
"type": "array",
@@ -7201,6 +8105,7 @@
"description": "This is the model that will be used for the transcription.",
"oneOf": [
{
+ "type": "string",
"enum": [
"scribe_v1",
"scribe_v2",
@@ -7484,6 +8389,7 @@
"description": "This is the Gladia model that will be used. Default is 'fast'",
"oneOf": [
{
+ "type": "string",
"enum": [
"fast",
"accurate",
@@ -7611,109 +8517,112 @@
]
},
"languages": {
- "type": "string",
+ "type": "array",
"description": "Defines the languages to use for the transcription. Required when languageBehaviour is 'manual'.",
- "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"
- ]
+ "items": {
+ "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"
+ ]
+ }
},
"transcriptionHint": {
"type": "string",
@@ -7792,6 +8701,27 @@
"provider"
]
},
+ "SonioxContextGeneralItem": {
+ "type": "object",
+ "properties": {
+ "key": {
+ "type": "string",
+ "description": "The key describing the type of context (e.g., \"domain\", \"topic\", \"doctor\", \"organization\").",
+ "minLength": 1,
+ "example": "domain"
+ },
+ "value": {
+ "type": "string",
+ "description": "The value for the context key (e.g., \"Healthcare\", \"Diabetes management consultation\").",
+ "minLength": 1,
+ "example": "Healthcare"
+ }
+ },
+ "required": [
+ "key",
+ "value"
+ ]
+ },
"SonioxTranscriber": {
"type": "object",
"properties": {
@@ -7804,7 +8734,8 @@
"model": {
"type": "string",
"enum": [
- "stt-rt-v4"
+ "stt-rt-v4",
+ "stt-rt-v5"
],
"description": "The Soniox model to use for transcription."
},
@@ -7997,11 +8928,205 @@
"zh",
"zu"
],
- "description": "The language for transcription. Uses ISO 639-1 codes. Soniox supports 60+ languages with a single universal model."
+ "description": "Single language for transcription as an ISO 639-1 code (e.g., `en`, `es`). For multi-language hints or to enable Soniox auto-detect, use `languages` instead — when `languages` is set (including to an empty array), this field is ignored when building the Soniox request. Defaults to `en` if neither this nor `languages` is set."
+ },
+ "languages": {
+ "type": "array",
+ "description": "Language hints sent to Soniox as `language_hints`. Provide `[lang1, lang2, ...]` (ISO 639-1 codes) to bias recognition toward specific languages, or provide an explicit empty array `[]` to enable Soniox auto-detect across all 60+ supported languages. When set (including the empty array), this field takes precedence over the singular `language` field. When omitted, falls back to the singular `language` (which defaults to `en` if also unset). Best accuracy is achieved with a single language.",
+ "items": {
+ "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"
+ ]
+ }
},
"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."
+ "description": "When `true`, Soniox strictly restricts transcription to the languages in `languages` (or the singular `language` if `languages` is unset). When `false`, Soniox biases toward those languages but still allows transcription in other languages. Has no effect when no language hints are sent (e.g., `languages: []` for auto-detect). Defaults to `true` (strict mode)."
},
"maxEndpointDelayMs": {
"type": "number",
@@ -8016,6 +9141,23 @@
"type": "string"
}
},
+ "contextGeneral": {
+ "description": "General context key-value pairs that guide the AI model during transcription. Helps adapt vocabulary to the correct domain, improving accuracy. Recommended: 10 or fewer pairs. Maps to Soniox context.general.",
+ "example": [
+ {
+ "key": "domain",
+ "value": "Healthcare"
+ },
+ {
+ "key": "topic",
+ "value": "Diabetes management consultation"
+ }
+ ],
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/SonioxContextGeneralItem"
+ }
+ },
"fallbackPlan": {
"description": "This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider fails.",
"allOf": [
@@ -8381,6 +9523,8 @@
"type": "string",
"description": "This is the model that will be used for the transcription.",
"enum": [
+ "gemini-3.5-flash",
+ "gemini-3.1-flash-lite",
"gemini-3-flash-preview",
"gemini-2.5-pro",
"gemini-2.5-flash",
@@ -8551,309 +9695,86 @@
"model"
]
},
- "FallbackAssemblyAITranscriber": {
+ "XaiTranscriber": {
"type": "object",
"properties": {
"provider": {
"type": "string",
- "description": "This is the transcription provider that will be used.",
- "enum": [
- "assembly-ai"
- ]
- },
- "language": {
- "type": "string",
- "description": "This is the language that will be set for the transcription.",
- "enum": [
- "multi",
- "en"
- ]
- },
- "confidenceThreshold": {
- "type": "number",
- "description": "Transcripts below this confidence threshold will be discarded.\n\n@default 0.4",
- "minimum": 0,
- "maximum": 1,
- "example": 0.4
- },
- "formatTurns": {
- "type": "boolean",
- "description": "This enables formatting of transcripts.\n\n@default true",
- "example": true
- },
- "endOfTurnConfidenceThreshold": {
- "type": "number",
- "description": "This is the end of turn confidence threshold. The minimum confidence that the end of turn is detected.\nNote: Only used if startSpeakingPlan.smartEndpointingPlan is not set.\n@min 0\n@max 1\n@default 0.7",
- "minimum": 0,
- "maximum": 1,
- "example": 0.7
- },
- "minEndOfTurnSilenceWhenConfident": {
- "type": "number",
- "description": "This is the minimum end of turn silence when confident in milliseconds.\nNote: Only used if startSpeakingPlan.smartEndpointingPlan is not set.\n@default 160",
- "minimum": 0,
- "example": 160
- },
- "wordFinalizationMaxWaitTime": {
- "type": "number",
- "deprecated": true,
- "minimum": 0,
- "example": 160
- },
- "maxTurnSilence": {
- "type": "number",
- "description": "This is the maximum turn silence time in milliseconds.\nNote: Only used if startSpeakingPlan.smartEndpointingPlan is not set.\n@default 400",
- "minimum": 0,
- "example": 400
- },
- "vadAssistedEndpointingEnabled": {
- "type": "boolean",
- "description": "Use VAD to assist with endpointing decisions from the transcriber.\nWhen enabled, transcriber endpointing will be buffered if VAD detects the user is still speaking, preventing premature turn-taking.\nWhen disabled, transcriber endpointing will be used immediately regardless of VAD state, allowing for quicker but more aggressive turn-taking.\nNote: Only used if startSpeakingPlan.smartEndpointingPlan is not set.\n\n@default true",
- "example": true
- },
- "speechModel": {
- "type": "string",
- "description": "This is the speech model used for the streaming session.\nNote: Keyterms prompting is not supported with multilingual streaming.\n@default 'universal-streaming-english'",
"enum": [
- "universal-streaming-english",
- "universal-streaming-multilingual"
+ "xai"
]
},
- "realtimeUrl": {
- "type": "string",
- "description": "The WebSocket URL that the transcriber connects to."
- },
- "wordBoost": {
- "description": "Add up to 2500 characters of custom vocabulary.",
- "type": "array",
- "items": {
- "type": "string",
- "maxLength": 2500
- }
- },
- "keytermsPrompt": {
- "description": "Keyterms prompting improves recognition accuracy for specific words and phrases.\nCan include up to 100 keyterms, each up to 50 characters.\nCosts an additional $0.04/hour when enabled.",
- "type": "array",
- "items": {
- "type": "string",
- "maxLength": 50
- }
- },
- "endUtteranceSilenceThreshold": {
- "type": "number",
- "description": "The duration of the end utterance silence threshold in milliseconds."
- },
- "disablePartialTranscripts": {
- "type": "boolean",
- "description": "Disable partial transcripts.\nSet to `true` to not receive partial transcripts. Defaults to `false`."
- }
- },
- "required": [
- "provider"
- ]
- },
- "FallbackAzureSpeechTranscriber": {
- "type": "object",
- "properties": {
- "provider": {
+ "model": {
"type": "string",
- "description": "This is the transcription provider that will be used.",
+ "description": "The xAI speech-to-text model to use. xAI currently exposes a single STT model — placeholder for future model selection.",
"enum": [
- "azure"
+ "default"
]
},
"language": {
"type": "string",
- "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",
+ "description": "Single language for transcription as an ISO 639-1 code (e.g., `en`, `es`). Defaults to `en` if not set. xAI auto-detects when omitted via the API but Vapi defaults to English for deterministic behavior.",
"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"
+ "ar",
+ "cs",
+ "da",
+ "nl",
+ "en",
+ "fil",
+ "fr",
+ "de",
+ "hi",
+ "id",
+ "it",
+ "ja",
+ "ko",
+ "mk",
+ "ms",
+ "fa",
+ "pl",
+ "pt",
+ "ro",
+ "ru",
+ "es",
+ "sv",
+ "th",
+ "tr",
+ "vi"
]
},
- "segmentationStrategy": {
- "type": "string",
- "description": "Controls how phrase boundaries are detected, enabling either simple time/silence heuristics or more advanced semantic segmentation.",
- "enum": [
- "Default",
- "Time",
- "Semantic"
+ "fallbackPlan": {
+ "description": "This is the plan for transcriber provider fallbacks in the event that the primary transcriber provider fails.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/FallbackTranscriberPlan"
+ }
]
- },
- "segmentationSilenceTimeoutMs": {
- "type": "number",
- "description": "Duration of detected silence after which the service finalizes a phrase. Configure to adjust sensitivity to pauses in speech.",
- "minimum": 100,
- "maximum": 5000
- },
- "segmentationMaximumTimeMs": {
- "type": "number",
- "description": "Maximum duration a segment can reach before being cut off when using time-based segmentation.",
- "minimum": 20000,
- "maximum": 70000
}
},
"required": [
"provider"
]
},
- "FallbackCartesiaTranscriber": {
+ "VapiTranscriber": {
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
- "cartesia"
+ "vapi"
]
},
- "model": {
+ "version": {
"type": "string",
+ "description": "This is the version of the Vapi transcriber. Vapi manages the underlying\nmodel and routing. When omitted, the latest version is used.\n\nManaged version params are additive-only and `'latest'` is an auto-update\nchannel — see the param-evolution INVARIANT in `vapiManaged/types.ts`.",
"enum": [
- "ink-whisper"
+ "latest",
+ "1"
]
},
"language": {
"type": "string",
+ "description": "This is the language for transcription as an ISO 639-1 code (e.g. `en`).\nSelecting a language locks transcription to it. For multiple languages,\nuse `languages` instead. When neither `language` nor `languages` is set,\nthe transcriber auto-detects the spoken language.",
"enum": [
"aa",
"ab",
@@ -9041,280 +9962,10 @@
"zh",
"zu"
]
- }
- },
- "required": [
- "provider"
- ]
- },
- "FallbackCustomTranscriber": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "description": "This is the transcription provider that will be used. Use `custom-transcriber` for providers that are not natively supported.",
- "enum": [
- "custom-transcriber"
- ]
- },
- "server": {
- "description": "This is where the transcription request will be sent.\n\nUsage:\n1. Vapi will initiate a websocket connection with `server.url`.\n\n2. Vapi will send an initial text frame with the sample rate. Format:\n```\n {\n \"type\": \"start\",\n \"encoding\": \"linear16\", // 16-bit raw PCM format\n \"container\": \"raw\",\n \"sampleRate\": {{sampleRate}},\n \"channels\": 2 // customer is channel 0, assistant is channel 1\n }\n```\n\n3. Vapi will send the audio data in 16-bit raw PCM format as binary frames.\n\n4. You can read the messages something like this:\n```\nws.on('message', (data, isBinary) => {\n if (isBinary) {\n pcmBuffer = Buffer.concat([pcmBuffer, data]);\n console.log(`Received PCM data, buffer size: ${pcmBuffer.length}`);\n } else {\n console.log('Received message:', JSON.parse(data.toString()));\n }\n});\n```\n\n5. You will respond with transcriptions as you have them. Format:\n```\n {\n \"type\": \"transcriber-response\",\n \"transcription\": \"Hello, world!\",\n \"channel\": \"customer\" | \"assistant\"\n }\n```",
- "allOf": [
- {
- "$ref": "#/components/schemas/Server"
- }
- ]
- }
- },
- "required": [
- "provider",
- "server"
- ]
- },
- "FallbackDeepgramTranscriber": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "description": "This is the transcription provider that will be used.",
- "enum": [
- "deepgram"
- ]
- },
- "model": {
- "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",
- "oneOf": [
- {
- "type": "string",
- "enum": [
- "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",
- "flux-general-en"
- ]
- },
- {
- "type": "string"
- }
- ]
- },
- "language": {
- "type": "string",
- "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",
- "enum": [
- "ar",
- "az",
- "ba",
- "bg",
- "br",
- "ca",
- "cs",
- "da",
- "da-DK",
- "de",
- "de-CH",
- "el",
- "en",
- "en-AU",
- "en-CA",
- "en-GB",
- "en-IE",
- "en-IN",
- "en-NZ",
- "en-US",
- "es",
- "es-419",
- "es-LATAM",
- "et",
- "eu",
- "fa",
- "fi",
- "fr",
- "fr-CA",
- "ha",
- "haw",
- "he",
- "hi",
- "hi-Latn",
- "hu",
- "id",
- "is",
- "it",
- "ja",
- "jw",
- "kn",
- "ko",
- "ko-KR",
- "ln",
- "lt",
- "lv",
- "mk",
- "ms",
- "multi",
- "nl",
- "nl-BE",
- "no",
- "pl",
- "pt",
- "pt-BR",
- "pt-PT",
- "ro",
- "ru",
- "sk",
- "sl",
- "sn",
- "so",
- "sr",
- "su",
- "sv",
- "sv-SE",
- "ta",
- "taq",
- "th",
- "th-TH",
- "tr",
- "tt",
- "uk",
- "ur",
- "vi",
- "yo",
- "zh",
- "zh-CN",
- "zh-HK",
- "zh-Hans",
- "zh-Hant",
- "zh-TW"
- ]
- },
- "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.",
- "example": false
- },
- "mipOptOut": {
- "type": "boolean",
- "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\n\nThis will only be used if you are using your own Deepgram API key.\n\n@default false",
- "example": false,
- "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...\"\n\n@default false",
- "example": false
- },
- "profanityFilter": {
- "type": "boolean",
- "description": "If set to true, Deepgram will replace profanity in transcripts with surrounding asterisks, e.g. \"f***\".\n\n@default false",
- "example": false
- },
- "confidenceThreshold": {
- "type": "number",
- "description": "Transcripts below this confidence threshold will be discarded.\n\n@default 0.4",
- "minimum": 0,
- "maximum": 1,
- "example": 0.4
- },
- "eagerEotThreshold": {
- "type": "number",
- "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.",
- "minimum": 0,
- "maximum": 1,
- "example": 0.3
- },
- "eotThreshold": {
- "type": "number",
- "description": "End-of-turn confidence required to finish a turn. Only used with Flux models.\n\n@default 0.7",
- "minimum": 0.5,
- "maximum": 0.9,
- "example": 0.7
- },
- "eotTimeoutMs": {
- "type": "number",
- "description": "A turn will be finished when this much time has passed after speech, regardless of EOT confidence. Only used with Flux models.\n\n@default 5000",
- "minimum": 500,
- "maximum": 10000,
- "example": 5000
- },
- "keywords": {
- "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.",
- "type": "array",
- "items": {
- "type": "string",
- "pattern": "/^\\p{L}[\\p{L}\\d]*(?::[+-]?\\d+)?$/u"
- }
},
- "keyterm": {
- "description": "Keyterm Prompting allows you improve Keyword Recall Rate (KRR) for important keyterms or phrases up to 90%.",
+ "languages": {
"type": "array",
- "items": {
- "type": "string"
- }
- },
- "endpointing": {
- "type": "number",
- "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.\n\nHere are the most important bits:\n- Defaults to 10. This is recommended for most use cases to optimize for latency.\n- 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.\n- If neither 10 nor 300 work, contact support@vapi.ai and we'll find another solution.\n\n@default 10",
- "minimum": 10,
- "maximum": 500
- }
- },
- "required": [
- "provider"
- ]
- },
- "FallbackElevenLabsTranscriber": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "description": "This is the transcription provider that will be used.",
- "enum": [
- "11labs"
- ]
- },
- "model": {
- "description": "This is the model that will be used for the transcription.",
- "oneOf": [
- {
- "enum": [
- "scribe_v1",
- "scribe_v2",
- "scribe_v2_realtime"
- ]
- }
- ]
- },
- "language": {
- "type": "string",
- "description": "This is the language that will be used for the transcription.",
+ "description": "These are the languages for transcription as ISO 639-1 codes. Set one or\nmore codes to restrict and bias recognition to those languages. An empty\narray `[]` (or omitting both this and `language`) enables auto-detection\nof the spoken language.",
"enum": [
"aa",
"ab",
@@ -9501,399 +10152,519 @@
"za",
"zh",
"zu"
- ]
- },
- "silenceThresholdSeconds": {
- "type": "number",
- "description": "This is the number of seconds of silence before VAD commits (0.3-3.0).",
- "minimum": 0.3,
- "maximum": 3,
- "example": 1.5
- },
- "confidenceThreshold": {
- "type": "number",
- "description": "This is the VAD sensitivity (0.1-0.9, lower indicates more sensitive).",
- "minimum": 0.1,
- "maximum": 0.9,
- "example": 0.4
+ ],
+ "items": {
+ "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"
+ ]
+ }
},
- "minSpeechDurationMs": {
- "type": "number",
- "description": "This is the minimum speech duration for VAD (50-2000ms).",
- "minimum": 50,
- "maximum": 2000,
- "example": 100
+ "keywords": {
+ "description": "These are custom keywords/vocabulary to boost recognition of use-case\nspecific words (company names, product names, jargon).",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
},
- "minSilenceDurationMs": {
- "type": "number",
- "description": "This is the minimum silence duration for VAD (50-2000ms).",
- "minimum": 50,
- "maximum": 2000,
- "example": 100
+ "turnTaking": {
+ "type": "string",
+ "description": "This is the turn-taking mode. `intelligent` uses the underlying model's\nnative end-of-turn detection; `manual` ignores it and waits a fixed\nend-of-turn delay. Defaults to `intelligent`.",
+ "enum": [
+ "intelligent",
+ "manual"
+ ]
}
},
"required": [
"provider"
]
},
- "GladiaVocabularyItemDTO": {
+ "FallbackAssemblyAITranscriber": {
"type": "object",
"properties": {
- "value": {
+ "provider": {
"type": "string",
- "description": "The vocabulary word or phrase"
+ "description": "This is the transcription provider that will be used.",
+ "enum": [
+ "assembly-ai"
+ ]
},
- "pronunciations": {
- "description": "Alternative pronunciations for the vocabulary item",
- "type": "array",
- "items": {
- "type": "string"
- }
+ "language": {
+ "type": "string",
+ "description": "This is the language that will be set for the transcription.",
+ "enum": [
+ "multi",
+ "en"
+ ]
},
- "intensity": {
+ "confidenceThreshold": {
"type": "number",
+ "description": "Transcripts below this confidence threshold will be discarded.\n\n@default 0.4",
"minimum": 0,
"maximum": 1,
- "description": "Intensity for this specific vocabulary item (0.0 to 1.0)"
+ "example": 0.4
},
- "language": {
+ "formatTurns": {
+ "type": "boolean",
+ "description": "This enables formatting of transcripts.\n\n@default true",
+ "example": true
+ },
+ "endOfTurnConfidenceThreshold": {
+ "type": "number",
+ "description": "This is the end of turn confidence threshold. The minimum confidence that the end of turn is detected.\nNote: Only used if startSpeakingPlan.smartEndpointingPlan is not set.\n@min 0\n@max 1\n@default 0.7",
+ "minimum": 0,
+ "maximum": 1,
+ "example": 0.7
+ },
+ "minEndOfTurnSilenceWhenConfident": {
+ "type": "number",
+ "description": "This is the minimum end of turn silence when confident in milliseconds.\nNote: Only used if startSpeakingPlan.smartEndpointingPlan is not set.\n@default 160",
+ "minimum": 0,
+ "example": 160
+ },
+ "wordFinalizationMaxWaitTime": {
+ "type": "number",
+ "deprecated": true,
+ "minimum": 0,
+ "example": 160
+ },
+ "maxTurnSilence": {
+ "type": "number",
+ "description": "This is the maximum turn silence time in milliseconds.\nNote: Only used if startSpeakingPlan.smartEndpointingPlan is not set.\n@default 400",
+ "minimum": 0,
+ "example": 400
+ },
+ "vadAssistedEndpointingEnabled": {
+ "type": "boolean",
+ "description": "Use VAD to assist with endpointing decisions from the transcriber.\nWhen enabled, transcriber endpointing will be buffered if VAD detects the user is still speaking, preventing premature turn-taking.\nWhen disabled, transcriber endpointing will be used immediately regardless of VAD state, allowing for quicker but more aggressive turn-taking.\nNote: Only used if startSpeakingPlan.smartEndpointingPlan is not set.\n\n@default true",
+ "example": true
+ },
+ "speechModel": {
"type": "string",
- "description": "Language code for this vocabulary item (ISO 639-1)"
+ "description": "This is the speech model used for the streaming session.\nNote: Keyterms prompting is not supported with multilingual streaming.\n@default 'universal-streaming-english'",
+ "enum": [
+ "universal-streaming-english",
+ "universal-streaming-multilingual"
+ ]
+ },
+ "realtimeUrl": {
+ "type": "string",
+ "description": "The WebSocket URL that the transcriber connects to."
+ },
+ "wordBoost": {
+ "description": "Add up to 2500 characters of custom vocabulary.",
+ "type": "array",
+ "items": {
+ "type": "string",
+ "maxLength": 2500
+ }
+ },
+ "keytermsPrompt": {
+ "description": "Keyterms prompting improves recognition accuracy for specific words and phrases.\nCan include up to 100 keyterms, each up to 50 characters.\nCosts an additional $0.04/hour when enabled.",
+ "type": "array",
+ "items": {
+ "type": "string",
+ "maxLength": 50
+ }
+ },
+ "endUtteranceSilenceThreshold": {
+ "type": "number",
+ "description": "The duration of the end utterance silence threshold in milliseconds."
+ },
+ "disablePartialTranscripts": {
+ "type": "boolean",
+ "description": "Disable partial transcripts.\nSet to `true` to not receive partial transcripts. Defaults to `false`."
}
},
"required": [
- "value"
+ "provider"
]
},
- "FallbackGladiaTranscriber": {
+ "FallbackAzureSpeechTranscriber": {
"type": "object",
"properties": {
"provider": {
"type": "string",
"description": "This is the transcription provider that will be used.",
"enum": [
- "gladia"
- ]
- },
- "model": {
- "description": "This is the Gladia model that will be used. Default is 'fast'",
- "oneOf": [
- {
- "enum": [
- "fast",
- "accurate",
- "solaria-1"
- ]
- }
- ]
- },
- "languageBehaviour": {
- "description": "Defines how the transcription model detects the audio language. Default value is 'automatic single language'.",
- "oneOf": [
- {
- "type": "string",
- "enum": [
- "manual",
- "automatic single language",
- "automatic multiple languages"
- ]
- }
+ "azure"
]
},
"language": {
"type": "string",
- "description": "Defines the language to use for the transcription. Required when languageBehaviour is 'manual'.",
+ "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",
"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"
+ "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"
]
},
- "languages": {
+ "segmentationStrategy": {
"type": "string",
- "description": "Defines the languages to use for the transcription. Required when languageBehaviour is 'manual'.",
+ "description": "Controls how phrase boundaries are detected, enabling either simple time/silence heuristics or more advanced semantic segmentation.",
"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"
+ "Default",
+ "Time",
+ "Semantic"
]
},
- "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.\n⚠️ 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.",
- "maxLength": 600,
- "example": "custom vocabulary"
- },
- "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.",
- "example": false
- },
- "audioEnhancer": {
- "type": "boolean",
- "description": "If true, audio will be pre-processed to improve accuracy but latency will increase. Default value is false.",
- "example": false
- },
- "confidenceThreshold": {
- "type": "number",
- "description": "Transcripts below this confidence threshold will be discarded.\n\n@default 0.4",
- "minimum": 0,
- "maximum": 1,
- "example": 0.4
- },
- "endpointing": {
+ "segmentationSilenceTimeoutMs": {
"type": "number",
- "minimum": 0.01,
- "maximum": 10,
- "example": 0.05,
- "description": "Endpointing time in seconds - time to wait before considering speech ended"
+ "description": "Duration of detected silence after which the service finalizes a phrase. Configure to adjust sensitivity to pauses in speech.",
+ "minimum": 100,
+ "maximum": 5000
},
- "speechThreshold": {
+ "segmentationMaximumTimeMs": {
"type": "number",
- "minimum": 0,
- "maximum": 1,
- "example": 0.6,
- "description": "Speech threshold - sensitivity configuration for speech detection (0.0 to 1.0)"
- },
- "customVocabularyEnabled": {
- "type": "boolean",
- "example": false,
- "description": "Enable custom vocabulary for improved accuracy"
- },
- "customVocabularyConfig": {
- "description": "Custom vocabulary configuration",
- "allOf": [
- {
- "$ref": "#/components/schemas/GladiaCustomVocabularyConfigDTO"
- }
- ]
- },
- "region": {
- "type": "string",
- "enum": [
- "us-west",
- "eu-west"
- ],
- "description": "Region for processing audio (us-west or eu-west)",
- "example": "us-west"
- },
- "receivePartialTranscripts": {
- "type": "boolean",
- "example": false,
- "description": "Enable partial transcripts for low-latency streaming transcription"
+ "description": "Maximum duration a segment can reach before being cut off when using time-based segmentation.",
+ "minimum": 20000,
+ "maximum": 70000
}
},
"required": [
"provider"
]
},
- "FallbackSonioxTranscriber": {
+ "FallbackCartesiaTranscriber": {
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
- "soniox"
+ "cartesia"
]
},
"model": {
"type": "string",
"enum": [
- "stt-rt-v4"
- ],
- "description": "The Soniox model to use for transcription."
+ "ink-whisper",
+ "ink-2"
+ ]
},
"language": {
"type": "string",
@@ -10083,550 +10854,317 @@
"za",
"zh",
"zu"
- ],
- "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",
- "minimum": 500,
- "maximum": 3000,
- "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": {
- "description": "Custom vocabulary terms to boost recognition accuracy. Useful for brand names, product names, and domain-specific terminology. Maps to Soniox context.terms.",
- "type": "array",
- "items": {
- "type": "string"
- }
+ ]
}
},
"required": [
"provider"
]
},
- "FallbackSpeechmaticsTranscriber": {
+ "FallbackCustomTranscriber": {
"type": "object",
"properties": {
"provider": {
"type": "string",
- "description": "This is the transcription provider that will be used.",
+ "description": "This is the transcription provider that will be used. Use `custom-transcriber` for providers that are not natively supported.",
"enum": [
- "speechmatics"
+ "custom-transcriber"
]
},
- "model": {
+ "server": {
+ "description": "This is where the transcription request will be sent.\n\nUsage:\n1. Vapi will initiate a websocket connection with `server.url`.\n\n2. Vapi will send an initial text frame with the sample rate. Format:\n```\n {\n \"type\": \"start\",\n \"encoding\": \"linear16\", // 16-bit raw PCM format\n \"container\": \"raw\",\n \"sampleRate\": {{sampleRate}},\n \"channels\": 2 // customer is channel 0, assistant is channel 1\n }\n```\n\n3. Vapi will send the audio data in 16-bit raw PCM format as binary frames.\n\n4. You can read the messages something like this:\n```\nws.on('message', (data, isBinary) => {\n if (isBinary) {\n pcmBuffer = Buffer.concat([pcmBuffer, data]);\n console.log(`Received PCM data, buffer size: ${pcmBuffer.length}`);\n } else {\n console.log('Received message:', JSON.parse(data.toString()));\n }\n});\n```\n\n5. You will respond with transcriptions as you have them. Format:\n```\n {\n \"type\": \"transcriber-response\",\n \"transcription\": \"Hello, world!\",\n \"channel\": \"customer\" | \"assistant\"\n }\n```",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Server"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "server"
+ ]
+ },
+ "FallbackDeepgramTranscriber": {
+ "type": "object",
+ "properties": {
+ "provider": {
"type": "string",
- "description": "This is the model that will be used for the transcription.",
+ "description": "This is the transcription provider that will be used.",
"enum": [
- "default"
+ "deepgram"
+ ]
+ },
+ "model": {
+ "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",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "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",
+ "flux-general-en",
+ "flux-general-multi"
+ ]
+ },
+ {
+ "type": "string"
+ }
]
},
"language": {
"type": "string",
+ "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",
"enum": [
- "auto",
"ar",
- "ar_en",
+ "az",
"ba",
- "eu",
"be",
- "bn",
"bg",
- "yue",
+ "bn",
+ "br",
+ "bs",
"ca",
- "hr",
"cs",
"da",
- "nl",
+ "da-DK",
+ "de",
+ "de-CH",
+ "el",
"en",
- "eo",
+ "en-AU",
+ "en-CA",
+ "en-GB",
+ "en-IE",
+ "en-IN",
+ "en-NZ",
+ "en-US",
+ "es",
+ "es-419",
+ "es-LATAM",
"et",
+ "eu",
+ "fa",
"fi",
"fr",
- "gl",
- "de",
- "el",
+ "fr-CA",
+ "ha",
+ "haw",
"he",
"hi",
+ "hi-Latn",
+ "hr",
"hu",
"id",
- "ia",
- "ga",
+ "is",
"it",
"ja",
+ "jw",
+ "kn",
"ko",
- "lv",
+ "ko-KR",
+ "ln",
"lt",
- "ms",
- "en_ms",
- "mt",
- "cmn",
- "cmn_en",
+ "lv",
+ "mk",
"mr",
- "mn",
+ "ms",
+ "multi",
+ "nl",
+ "nl-BE",
"no",
- "fa",
"pl",
"pt",
+ "pt-BR",
+ "pt-PT",
"ro",
"ru",
"sk",
"sl",
- "es",
- "en_es",
- "sw",
+ "sn",
+ "so",
+ "sr",
+ "su",
"sv",
- "tl",
+ "sv-SE",
"ta",
- "en_ta",
+ "taq",
+ "te",
"th",
+ "th-TH",
+ "tl",
"tr",
+ "tt",
"uk",
"ur",
- "ug",
"vi",
- "cy"
+ "yo",
+ "zh",
+ "zh-CN",
+ "zh-HK",
+ "zh-Hans",
+ "zh-Hant",
+ "zh-TW"
]
},
- "operatingPoint": {
- "type": "string",
- "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.\n\n@default 'enhanced'",
- "example": "enhanced",
- "enum": [
- "standard",
- "enhanced"
- ],
- "default": "enhanced"
- },
- "region": {
- "type": "string",
- "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.\n\n@default 'eu'",
- "example": "us",
- "enum": [
- "eu",
- "us"
- ],
- "default": "eu"
+ "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.",
+ "example": false
},
- "enableDiarization": {
+ "mipOptOut": {
"type": "boolean",
- "description": "This enables speaker diarization, which identifies and separates speakers in the transcription. Essential for multi-speaker conversations and conference calls.\n\n@default false",
- "example": true,
+ "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\n\nThis will only be used if you are using your own Deepgram API key.\n\n@default false",
+ "example": false,
"default": false
},
- "maxDelay": {
- "type": "number",
- "description": "This sets the maximum delay in milliseconds for partial transcripts. Balances latency and accuracy.\n\n@default 3000",
- "example": 1500,
- "minimum": 500,
- "maximum": 10000,
- "default": 3000
+ "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...\"\n\n@default false",
+ "example": false
},
- "customVocabulary": {
+ "profanityFilter": {
+ "type": "boolean",
+ "description": "If set to true, Deepgram will replace profanity in transcripts with surrounding asterisks, e.g. \"f***\".\n\n@default false",
+ "example": false
+ },
+ "redaction": {
+ "type": "array",
+ "description": "Enables redaction of sensitive information from transcripts.\n\nOptions include:\n- \"pci\": Redacts credit card numbers, expiration dates, and CVV.\n- \"pii\": Redacts personally identifiable information (names, locations, identifying numbers, etc.).\n- \"phi\": Redacts protected health information (medical conditions, drugs, injuries, etc.).\n- \"numbers\": Redacts numerical and identifying entities (dates, account numbers, SSNs, etc.).\n\nMultiple values can be provided to redact different categories simultaneously.\nRedacted content is replaced with entity labels like [CREDIT_CARD_1], [SSN_1], etc.\n\nSee https://developers.deepgram.com/docs/redaction for details.",
+ "enum": [
+ "pci",
+ "pii",
+ "phi",
+ "numbers"
+ ],
"example": [
- {
- "content": "Speechmatics",
- "soundsLike": [
- "speech mattix"
- ]
- }
+ "pci",
+ "phi"
],
- "type": "array",
"items": {
- "$ref": "#/components/schemas/SpeechmaticsCustomVocabularyItem"
+ "type": "string",
+ "enum": [
+ "pci",
+ "pii",
+ "phi",
+ "numbers"
+ ]
}
},
- "numeralStyle": {
- "type": "string",
- "description": "This controls how numbers, dates, currencies, and other entities are formatted in the transcription output.\n\n@default 'written'",
- "example": "spoken",
- "enum": [
- "written",
- "spoken"
- ],
- "default": "written"
- },
- "endOfTurnSensitivity": {
+ "confidenceThreshold": {
"type": "number",
- "description": "This is the sensitivity level for end-of-turn detection, which determines when a speaker has finished talking. Higher values are more sensitive.\n\n@default 0.5",
- "example": 0.8,
+ "description": "Transcripts below this confidence threshold will be discarded.\n\n@default 0.4",
"minimum": 0,
"maximum": 1,
- "default": 0.5
- },
- "removeDisfluencies": {
- "type": "boolean",
- "description": "This enables removal of disfluencies (um, uh) from the transcript to create cleaner, more professional output.\n\nThis is only supported for the English language transcriber.\n\n@default false",
- "example": true,
- "default": false
+ "example": 0.4
},
- "minimumSpeechDuration": {
+ "eotThreshold": {
"type": "number",
- "description": "This is the minimum duration in seconds for speech segments. Shorter segments will be filtered out. Helps remove noise and improve accuracy.\n\n@default 0.0",
- "example": 0.2,
- "minimum": 0,
- "maximum": 5,
- "default": 0
- }
- },
- "required": [
- "provider",
- "customVocabulary"
- ]
- },
- "FallbackTalkscriberTranscriber": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "description": "This is the transcription provider that will be used.",
- "enum": [
- "talkscriber"
- ]
+ "description": "End-of-turn confidence required to finish a turn. Only used with Flux models.\n\n@default 0.7",
+ "minimum": 0.5,
+ "maximum": 0.9,
+ "example": 0.7
},
- "model": {
- "type": "string",
- "description": "This is the model that will be used for the transcription.",
- "enum": [
- "whisper"
- ]
+ "eotTimeoutMs": {
+ "type": "number",
+ "description": "A turn will be finished when this much time has passed after speech, regardless of EOT confidence. Only used with Flux models.\n\n@default 5000",
+ "minimum": 500,
+ "maximum": 10000,
+ "example": 5000
},
- "language": {
- "type": "string",
- "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",
- "enum": [
+ "languages": {
+ "description": "Language hints to bias Flux Multilingual (`flux-general-multi`) toward specific languages.\nProvide BCP-47 language codes (e.g. \"en\", \"es\", \"fr\"). Multiple hints can be given for\nmultilingual or code-switching scenarios. Omit for auto-detection. Only used with `flux-general-multi`.",
+ "example": [
"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"
- ]
- }
- },
- "required": [
- "provider"
- ]
- },
- "FallbackGoogleTranscriber": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "description": "This is the transcription provider that will be used.",
- "enum": [
- "google"
- ]
+ "es"
+ ],
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
},
- "model": {
- "type": "string",
- "description": "This is the model that will be used for the transcription.",
- "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"
- ]
+ "keywords": {
+ "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.",
+ "type": "array",
+ "items": {
+ "type": "string",
+ "pattern": "/^\\p{L}[\\p{L}\\d]*(?::[+-]?\\d+)?$/u"
+ }
},
- "language": {
- "type": "string",
- "description": "This is the language that will be set for the transcription.",
- "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"
- ]
+ "keyterm": {
+ "description": "Keyterm Prompting allows you improve Keyword Recall Rate (KRR) for important keyterms or phrases up to 90%.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "endpointing": {
+ "type": "number",
+ "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.\n\nHere are the most important bits:\n- Defaults to 10. This is recommended for most use cases to optimize for latency.\n- 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.\n- If neither 10 nor 300 work, contact support@vapi.ai and we'll find another solution.\n\n@default 10",
+ "minimum": 10,
+ "maximum": 500
}
},
"required": [
"provider"
]
},
- "FallbackOpenAITranscriber": {
+ "FallbackElevenLabsTranscriber": {
"type": "object",
"properties": {
"provider": {
"type": "string",
"description": "This is the transcription provider that will be used.",
"enum": [
- "openai"
+ "11labs"
]
},
"model": {
- "type": "string",
"description": "This is the model that will be used for the transcription.",
- "enum": [
- "gpt-4o-transcribe",
- "gpt-4o-mini-transcribe"
- ]
- },
- "language": {
- "type": "string",
- "description": "This is the language that will be set for the transcription.",
- "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"
- ]
- }
- },
- "required": [
- "provider",
- "model"
- ]
- },
- "LangfuseObservabilityPlan": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "langfuse"
- ]
- },
- "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",
- "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",
- "minimum": 1
- },
- "traceName": {
- "type": "string",
- "description": "Custom name for the Langfuse trace. Supports Liquid templates.\n\nAvailable variables:\n- {{ call.id }} - Call UUID\n- {{ call.type }} - 'inboundPhoneCall', 'outboundPhoneCall', 'webCall'\n- {{ assistant.name }} - Assistant name\n- {{ assistant.id }} - Assistant ID\n\nExample: \"{{ assistant.name }} - {{ call.type }}\"\n\nDefaults to call ID if not provided."
- },
- "tags": {
- "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",
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "metadata": {
- "type": "object",
- "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\nBy default it includes the call metadata, assistant metadata, and assistant overrides."
- }
- },
- "required": [
- "provider",
- "tags"
- ]
- },
- "TextContent": {
- "type": "object",
- "properties": {
- "type": {
- "type": "string",
- "enum": [
- "text"
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "scribe_v1",
+ "scribe_v2",
+ "scribe_v2_realtime"
+ ]
+ }
]
},
- "text": {
- "type": "string"
- },
"language": {
"type": "string",
+ "description": "This is the language that will be used for the transcription.",
"enum": [
"aa",
"ab",
@@ -10814,943 +11352,1639 @@
"zh",
"zu"
]
- }
- },
- "required": [
- "type",
- "text",
- "language"
- ]
- },
- "Condition": {
- "type": "object",
- "properties": {
- "operator": {
- "type": "string",
- "description": "This is the operator you want to use to compare the parameter and value.",
- "enum": [
- "eq",
- "neq",
- "gt",
- "gte",
- "lt",
- "lte"
- ]
- },
- "param": {
- "type": "string",
- "description": "This is the name of the parameter that you want to check.",
- "maxLength": 1000
},
- "value": {
- "type": "string",
- "description": "This is the value you want to compare against the parameter.",
- "maxLength": 1000
+ "silenceThresholdSeconds": {
+ "type": "number",
+ "description": "This is the number of seconds of silence before VAD commits (0.3-3.0).",
+ "minimum": 0.3,
+ "maximum": 3,
+ "example": 1.5
+ },
+ "confidenceThreshold": {
+ "type": "number",
+ "description": "This is the VAD sensitivity (0.1-0.9, lower indicates more sensitive).",
+ "minimum": 0.1,
+ "maximum": 0.9,
+ "example": 0.4
+ },
+ "minSpeechDurationMs": {
+ "type": "number",
+ "description": "This is the minimum speech duration for VAD (50-2000ms).",
+ "minimum": 50,
+ "maximum": 2000,
+ "example": 100
+ },
+ "minSilenceDurationMs": {
+ "type": "number",
+ "description": "This is the minimum silence duration for VAD (50-2000ms).",
+ "minimum": 50,
+ "maximum": 2000,
+ "example": 100
}
},
"required": [
- "operator",
- "param",
- "value"
+ "provider"
]
},
- "ToolMessageStart": {
+ "GladiaVocabularyItemDTO": {
"type": "object",
"properties": {
- "contents": {
+ "value": {
+ "type": "string",
+ "description": "The vocabulary word or phrase"
+ },
+ "pronunciations": {
+ "description": "Alternative pronunciations for the vocabulary item",
"type": "array",
- "description": "This is an alternative to the `content` property. It allows to specify variants of the same content, one per language.\n\nUsage:\n- If your assistants are multilingual, you can provide content for each language.\n- 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.\n\nThis will override the `content` property.",
"items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/TextContent",
- "title": "Text"
- }
- ]
+ "type": "string"
}
},
- "type": {
- "type": "string",
- "enum": [
- "request-start"
- ],
- "description": "This message is triggered when the tool call starts.\n\nThis message is never triggered for async tools.\n\nIf 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",
- "description": "This is an optional boolean that if true, the tool call will only trigger after the message is spoken. Default is false.\n\n@default false",
- "example": false,
- "default": false
+ "intensity": {
+ "type": "number",
+ "minimum": 0,
+ "maximum": 1,
+ "description": "Intensity for this specific vocabulary item (0.0 to 1.0)"
},
- "content": {
+ "language": {
"type": "string",
- "description": "This is the content that the assistant says when this message is triggered.",
- "maxLength": 1000
- },
- "conditions": {
- "description": "This is an optional array of conditions that the tool call arguments must meet in order for this message to be triggered.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/Condition"
- }
+ "description": "Language code for this vocabulary item (ISO 639-1)"
}
},
"required": [
- "type"
+ "value"
]
},
- "ToolMessageComplete": {
+ "FallbackGladiaTranscriber": {
"type": "object",
"properties": {
- "contents": {
- "type": "array",
- "description": "This is an alternative to the `content` property. It allows to specify variants of the same content, one per language.\n\nUsage:\n- If your assistants are multilingual, you can provide content for each language.\n- 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.\n\nThis will override the `content` property.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/TextContent",
- "title": "Text"
- }
- ]
- }
- },
- "type": {
+ "provider": {
"type": "string",
- "description": "This message is triggered when the tool call is complete.\n\nThis message is triggered immediately without waiting for your server to respond for async tool calls.\n\nIf this message is not provided, the model will be requested to respond.\n\nIf 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.",
+ "description": "This is the transcription provider that will be used.",
"enum": [
- "request-complete"
+ "gladia"
]
},
- "role": {
- "type": "string",
- "description": "This is optional and defaults to \"assistant\".\n\nWhen role=assistant, `content` is said out loud.\n\nWhen role=system, `content` is passed to the model in a system message. Example:\n system: default one\n assistant:\n user:\n assistant:\n user:\n assistant:\n user:\n assistant: tool called\n tool: your server response\n <--- system prompt as hint\n ---> model generates response which is spoken\nThis is useful when you want to provide a hint to the model about what to say next.",
- "enum": [
- "assistant",
- "system"
+ "model": {
+ "description": "This is the Gladia model that will be used. Default is 'fast'",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "fast",
+ "accurate",
+ "solaria-1"
+ ]
+ }
]
},
- "endCallAfterSpokenEnabled": {
- "type": "boolean",
- "description": "This is an optional boolean that if true, the call will end after the message is spoken. Default is false.\n\nThis is ignored if `role` is set to `system`.\n\n@default false",
- "example": false
+ "languageBehaviour": {
+ "description": "Defines how the transcription model detects the audio language. Default value is 'automatic single language'.",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "manual",
+ "automatic single language",
+ "automatic multiple languages"
+ ]
+ }
+ ]
},
- "content": {
+ "language": {
"type": "string",
- "description": "This is the content that the assistant says when this message is triggered.",
- "maxLength": 1000
+ "description": "Defines the language to use for the transcription. Required when languageBehaviour is 'manual'.",
+ "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"
+ ]
},
- "conditions": {
- "description": "This is an optional array of conditions that the tool call arguments must meet in order for this message to be triggered.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/Condition"
- }
- }
- },
- "required": [
- "type"
- ]
- },
- "ToolMessageFailed": {
- "type": "object",
- "properties": {
- "contents": {
+ "languages": {
"type": "array",
- "description": "This is an alternative to the `content` property. It allows to specify variants of the same content, one per language.\n\nUsage:\n- If your assistants are multilingual, you can provide content for each language.\n- 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.\n\nThis will override the `content` property.",
+ "description": "Defines the languages to use for the transcription. Required when languageBehaviour is 'manual'.",
"items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/TextContent",
- "title": "Text"
- }
+ "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"
]
}
},
- "type": {
+ "transcriptionHint": {
"type": "string",
- "description": "This message is triggered when the tool call fails.\n\nThis message is never triggered for async tool calls.\n\nIf this message is not provided, the model will be requested to respond.\n\nIf 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.",
- "enum": [
- "request-failed"
- ]
+ "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.\n⚠️ 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.",
+ "maxLength": 600,
+ "example": "custom vocabulary"
},
- "endCallAfterSpokenEnabled": {
+ "prosody": {
"type": "boolean",
- "description": "This is an optional boolean that if true, the call will end after the message is spoken. Default is false.\n\n@default false",
+ "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.",
"example": false
},
- "content": {
- "type": "string",
- "description": "This is the content that the assistant says when this message is triggered.",
- "maxLength": 1000
- },
- "conditions": {
- "description": "This is an optional array of conditions that the tool call arguments must meet in order for this message to be triggered.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/Condition"
- }
- }
- },
- "required": [
- "type"
- ]
- },
- "ToolMessageDelayed": {
- "type": "object",
- "properties": {
- "contents": {
- "type": "array",
- "description": "This is an alternative to the `content` property. It allows to specify variants of the same content, one per language.\n\nUsage:\n- If your assistants are multilingual, you can provide content for each language.\n- 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.\n\nThis will override the `content` property.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/TextContent",
- "title": "Text"
- }
- ]
- }
- },
- "type": {
- "type": "string",
- "description": "This message is triggered when the tool call is delayed.\n\nThere are the two things that can trigger this message:\n1. The user talks with the assistant while your server is processing the request. Default is \"Sorry, a few more seconds.\"\n2. The server doesn't respond within `timingMilliseconds`.\n\nThis message is never triggered for async tool calls.",
- "enum": [
- "request-response-delayed"
- ]
+ "audioEnhancer": {
+ "type": "boolean",
+ "description": "If true, audio will be pre-processed to improve accuracy but latency will increase. Default value is false.",
+ "example": false
},
- "timingMilliseconds": {
+ "confidenceThreshold": {
"type": "number",
- "minimum": 100,
- "maximum": 120000,
- "example": 1000,
- "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.",
- "maxLength": 1000
+ "description": "Transcripts below this confidence threshold will be discarded.\n\n@default 0.4",
+ "minimum": 0,
+ "maximum": 1,
+ "example": 0.4
},
- "conditions": {
- "description": "This is an optional array of conditions that the tool call arguments must meet in order for this message to be triggered.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/Condition"
- }
- }
- },
- "required": [
- "type"
- ]
- },
- "MessageTarget": {
- "type": "object",
- "properties": {
- "role": {
- "type": "string",
- "description": "This is the role of the message to target.\n\nIf not specified, will find the position in the message history ignoring role (effectively `any`).",
- "example": "user",
- "enum": [
- "user",
- "assistant"
- ]
+ "endpointing": {
+ "type": "number",
+ "minimum": 0.01,
+ "maximum": 10,
+ "example": 0.05,
+ "description": "Endpointing time in seconds - time to wait before considering speech ended"
},
- "position": {
+ "speechThreshold": {
"type": "number",
- "description": "This is the position of the message to target.\n- Negative numbers: Count from end (-1 = most recent, -2 = second most recent)\n- 0: First/oldest message in history\n- Positive numbers: Specific position (0-indexed from start)\n\n@default -1 (most recent message)",
- "example": -1
- }
- }
- },
- "RegexCondition": {
- "type": "object",
- "properties": {
- "type": {
- "type": "string",
- "description": "This is the type discriminator for regex condition",
- "example": "regex",
- "enum": [
- "regex"
- ]
+ "minimum": 0,
+ "maximum": 1,
+ "example": 0.6,
+ "description": "Speech threshold - sensitivity configuration for speech detection (0.0 to 1.0)"
},
- "regex": {
- "type": "string",
- "description": "This is the regular expression pattern to match against message content.\n\nNote:\n- This works by using the RegExp.test method in Node.JS. Eg. /hello/.test(\"hello there\") will return true.\n\nHot tips:\n- In JavaScript, escape \\ when sending the regex pattern. Eg. \"hello\\sthere\" will be sent over the wire as \"hellosthere\". Send \"hello\\\\sthere\" instead.\n- 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\".\n- Word boundaries \\b are useful for matching whole words: /\\bcat\\b/ matches \"cat\" but not \"cats\" or \"category\".\n- Use inline flags for portability: (?i) for case insensitive, (?m) for multiline",
- "examples": [
- "\\\\b(cancel|stop|wait)\\\\b - Matches whole words",
- "^yes$ - Matches exactly yes (full string match)",
- "(?i)hello - Case insensitive match"
- ]
+ "customVocabularyEnabled": {
+ "type": "boolean",
+ "example": false,
+ "description": "Enable custom vocabulary for improved accuracy"
},
- "target": {
- "description": "This is the target for messages to check against.\nIf not specified, the condition will run on the last message (position: -1).\nIf role is not specified, it will look at the last message regardless of role.\n@default { position: -1 }",
+ "customVocabularyConfig": {
+ "description": "Custom vocabulary configuration",
"allOf": [
{
- "$ref": "#/components/schemas/MessageTarget"
+ "$ref": "#/components/schemas/GladiaCustomVocabularyConfigDTO"
}
]
},
- "negate": {
- "type": "boolean",
- "description": "This is the flag that when true, the condition matches if the pattern does NOT match.\nUseful for ensuring certain words/phrases are absent.\n\n@default false",
- "example": "true - Reject if user hasn\"t said goodbye: { regex: \"\\\\b(bye|goodbye)\\\\b\", negate: true }"
- }
- },
- "required": [
- "type",
- "regex"
- ]
- },
- "LiquidCondition": {
- "type": "object",
- "properties": {
- "type": {
+ "region": {
"type": "string",
- "description": "This is the type discriminator for liquid condition",
- "example": "liquid",
"enum": [
- "liquid"
- ]
+ "us-west",
+ "eu-west"
+ ],
+ "description": "Region for processing audio (us-west or eu-west)",
+ "example": "us-west"
},
- "liquid": {
- "type": "string",
- "description": "This is the Liquid template that must return exactly \"true\" or \"false\" as a string.\nThe template is evaluated and the entire output must be either \"true\" or \"false\" - nothing else.\n\nAvailable variables:\n- `messages`: Array of recent messages in OpenAI chat completions format (ChatCompletionMessageParam[])\n Each message has properties like: role ('user', 'assistant', 'system'), content (string), etc.\n- `now`: Current timestamp in milliseconds (built-in Liquid variable)\n- Any assistant variable values (e.g., `userName`, `accountStatus`)\n\nUseful Liquid filters for messages:\n- `messages | last: 5` - Get the 5 most recent messages\n- `messages | where: 'role', 'user'` - Filter to only user messages\n- `messages | reverse` - Reverse the order of messages",
- "examples": [
- "{% if messages.last.content contains goodbye %}true{% else %}false{% endif %}",
- "{% assign userMessages = messages | where: role, user %}{% if userMessages.size > 3 %}true{% else %}false{% endif %}"
- ]
+ "receivePartialTranscripts": {
+ "type": "boolean",
+ "example": false,
+ "description": "Enable partial transcripts for low-latency streaming transcription"
}
},
"required": [
- "type",
- "liquid"
+ "provider"
]
},
- "GroupCondition": {
+ "FallbackSonioxTranscriber": {
"type": "object",
"properties": {
- "type": {
+ "provider": {
"type": "string",
- "description": "This is the type discriminator for group condition",
- "example": "group",
"enum": [
- "group"
+ "soniox"
]
},
- "operator": {
+ "model": {
"type": "string",
- "description": "This is the logical operator for combining conditions in this group",
- "examples": [
- "AND",
- "OR"
- ],
"enum": [
- "AND",
- "OR"
- ]
- },
- "conditions": {
- "type": "array",
- "description": "This is the list of nested conditions to evaluate.\nSupports recursive nesting of groups for complex logic.",
- "examples": [
- "[{ type: \"regex\", regex: \"(?i)stop\", target: { role: \"user\" } }]",
- "[{ type: \"group\", operator: \"AND\", conditions: [...] }]"
- ],
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/RegexCondition",
- "title": "RegexCondition"
- },
- {
- "$ref": "#/components/schemas/LiquidCondition",
- "title": "LiquidCondition"
- },
- {
- "$ref": "#/components/schemas/GroupCondition",
- "title": "GroupCondition",
- "description": "This is the GroupCondition object but Swagger does not display nested schemas correctly."
- }
- ]
- }
- }
- },
- "required": [
- "type",
- "operator",
- "conditions"
- ]
- },
- "ToolRejectionPlan": {
- "type": "object",
- "properties": {
- "conditions": {
- "type": "array",
- "description": "This is the list of conditions that must be evaluated.\n\nUsage:\n- If all conditions match (AND logic), the tool call is rejected.\n- For OR logic at the top level, use a single 'group' condition with operator: 'OR'.\n\n@default [] - Empty array means tool always executes",
- "examples": [
- "[{ type: \"regex\", regex: \"(?i)\\\\b(cancel|stop)\\\\b\", target: { role: \"user\" } }]",
- "[{ type: \"group\", operator: \"OR\", conditions: [...] }]"
+ "stt-rt-v4",
+ "stt-rt-v5"
],
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/RegexCondition",
- "title": "RegexCondition"
- },
- {
- "$ref": "#/components/schemas/LiquidCondition",
- "title": "LiquidCondition"
- },
- {
- "$ref": "#/components/schemas/GroupCondition",
- "title": "GroupCondition",
- "description": "This is the GroupCondition object but Swagger does not display nested schemas correctly."
- }
- ]
- }
- }
- }
- },
- "CreateDtmfToolDTO": {
- "type": "object",
- "properties": {
- "messages": {
- "type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/ToolMessageStart",
- "title": "ToolMessageStart"
- },
- {
- "$ref": "#/components/schemas/ToolMessageComplete",
- "title": "ToolMessageComplete"
- },
- {
- "$ref": "#/components/schemas/ToolMessageFailed",
- "title": "ToolMessageFailed"
- },
- {
- "$ref": "#/components/schemas/ToolMessageDelayed",
- "title": "ToolMessageDelayed"
- }
- ]
- }
+ "description": "The Soniox model to use for transcription."
},
- "type": {
+ "language": {
"type": "string",
"enum": [
- "dtmf"
+ "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 type of tool. \"dtmf\" for DTMF tool."
+ "description": "Single language for transcription as an ISO 639-1 code (e.g., `en`, `es`). For multi-language hints or to enable Soniox auto-detect, use `languages` instead — when `languages` is set (including to an empty array), this field is ignored when building the Soniox request. Defaults to `en` if neither this nor `languages` is set."
},
- "sipInfoDtmfEnabled": {
+ "languages": {
+ "type": "array",
+ "description": "Language hints sent to Soniox as `language_hints`. Provide `[lang1, lang2, ...]` (ISO 639-1 codes) to bias recognition toward specific languages, or provide an explicit empty array `[]` to enable Soniox auto-detect across all 60+ supported languages. When set (including the empty array), this field takes precedence over the singular `language` field. When omitted, falls back to the singular `language` (which defaults to `en` if also unset). Best accuracy is achieved with a single language.",
+ "items": {
+ "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"
+ ]
+ }
+ },
+ "languageHintsStrict": {
"type": "boolean",
- "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.",
- "default": false
+ "description": "When `true`, Soniox strictly restricts transcription to the languages in `languages` (or the singular `language` if `languages` is unset). When `false`, Soniox biases toward those languages but still allows transcription in other languages. Has no effect when no language hints are sent (e.g., `languages: []` for auto-detect). Defaults to `true` (strict mode)."
},
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
- "allOf": [
+ "maxEndpointDelayMs": {
+ "type": "number",
+ "minimum": 500,
+ "maximum": 3000,
+ "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": {
+ "description": "Custom vocabulary terms to boost recognition accuracy. Useful for brand names, product names, and domain-specific terminology. Maps to Soniox context.terms.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "contextGeneral": {
+ "description": "General context key-value pairs that guide the AI model during transcription. Helps adapt vocabulary to the correct domain, improving accuracy. Recommended: 10 or fewer pairs. Maps to Soniox context.general.",
+ "example": [
{
- "$ref": "#/components/schemas/ToolRejectionPlan"
+ "key": "domain",
+ "value": "Healthcare"
+ },
+ {
+ "key": "topic",
+ "value": "Diabetes management consultation"
}
- ]
+ ],
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/SonioxContextGeneralItem"
+ }
}
},
"required": [
- "type"
+ "provider"
]
},
- "CreateEndCallToolDTO": {
+ "FallbackSpeechmaticsTranscriber": {
"type": "object",
"properties": {
- "messages": {
- "type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/ToolMessageStart",
- "title": "ToolMessageStart"
- },
- {
- "$ref": "#/components/schemas/ToolMessageComplete",
- "title": "ToolMessageComplete"
- },
- {
- "$ref": "#/components/schemas/ToolMessageFailed",
- "title": "ToolMessageFailed"
- },
- {
- "$ref": "#/components/schemas/ToolMessageDelayed",
- "title": "ToolMessageDelayed"
- }
- ]
- }
+ "provider": {
+ "type": "string",
+ "description": "This is the transcription provider that will be used.",
+ "enum": [
+ "speechmatics"
+ ]
},
- "type": {
+ "model": {
+ "type": "string",
+ "description": "This is the model that will be used for the transcription.",
+ "enum": [
+ "default"
+ ]
+ },
+ "language": {
"type": "string",
"enum": [
- "endCall"
+ "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"
+ ]
+ },
+ "operatingPoint": {
+ "type": "string",
+ "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.\n\n@default 'enhanced'",
+ "example": "enhanced",
+ "enum": [
+ "standard",
+ "enhanced"
],
- "description": "The type of tool. \"endCall\" for End Call tool."
+ "default": "enhanced"
},
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
- "allOf": [
+ "region": {
+ "type": "string",
+ "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.\n\n@default 'eu'",
+ "example": "us",
+ "enum": [
+ "eu",
+ "us"
+ ],
+ "default": "eu"
+ },
+ "enableDiarization": {
+ "type": "boolean",
+ "description": "This enables speaker diarization, which identifies and separates speakers in the transcription. Essential for multi-speaker conversations and conference calls.\n\n@default false",
+ "example": true,
+ "default": false
+ },
+ "maxDelay": {
+ "type": "number",
+ "description": "This sets the maximum delay in milliseconds for partial transcripts. Balances latency and accuracy.\n\n@default 3000",
+ "example": 1500,
+ "minimum": 500,
+ "maximum": 10000,
+ "default": 3000
+ },
+ "customVocabulary": {
+ "example": [
{
- "$ref": "#/components/schemas/ToolRejectionPlan"
+ "content": "Speechmatics",
+ "soundsLike": [
+ "speech mattix"
+ ]
}
- ]
- }
- },
- "required": [
- "type"
- ]
- },
- "CreateVoicemailToolDTO": {
- "type": "object",
- "properties": {
- "messages": {
+ ],
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
"items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/ToolMessageStart",
- "title": "ToolMessageStart"
- },
- {
- "$ref": "#/components/schemas/ToolMessageComplete",
- "title": "ToolMessageComplete"
- },
- {
- "$ref": "#/components/schemas/ToolMessageFailed",
- "title": "ToolMessageFailed"
- },
- {
- "$ref": "#/components/schemas/ToolMessageDelayed",
- "title": "ToolMessageDelayed"
- }
- ]
+ "$ref": "#/components/schemas/SpeechmaticsCustomVocabularyItem"
}
},
- "type": {
+ "numeralStyle": {
"type": "string",
- "description": "The type of tool. \"voicemail\" for Voicemail tool.",
+ "description": "This controls how numbers, dates, currencies, and other entities are formatted in the transcription output.\n\n@default 'written'",
+ "example": "spoken",
"enum": [
- "voicemail"
- ]
+ "written",
+ "spoken"
+ ],
+ "default": "written"
},
- "beepDetectionEnabled": {
+ "endOfTurnSensitivity": {
+ "type": "number",
+ "description": "This is the sensitivity level for end-of-turn detection, which determines when a speaker has finished talking. Higher values are more sensitive.\n\n@default 0.5",
+ "example": 0.8,
+ "minimum": 0,
+ "maximum": 1,
+ "default": 0.5
+ },
+ "removeDisfluencies": {
"type": "boolean",
- "description": "This is the flag that enables beep detection for voicemail detection and applies only for twilio based calls.\n\n@default false",
- "default": false,
- "example": false
+ "description": "This enables removal of disfluencies (um, uh) from the transcript to create cleaner, more professional output.\n\nThis is only supported for the English language transcriber.\n\n@default false",
+ "example": true,
+ "default": false
},
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
- "allOf": [
- {
- "$ref": "#/components/schemas/ToolRejectionPlan"
- }
- ]
+ "minimumSpeechDuration": {
+ "type": "number",
+ "description": "This is the minimum duration in seconds for speech segments. Shorter segments will be filtered out. Helps remove noise and improve accuracy.\n\n@default 0.0",
+ "example": 0.2,
+ "minimum": 0,
+ "maximum": 5,
+ "default": 0
}
},
"required": [
- "type"
+ "provider",
+ "customVocabulary"
]
},
- "JsonSchema": {
+ "FallbackTalkscriberTranscriber": {
"type": "object",
"properties": {
- "type": {
+ "provider": {
"type": "string",
- "description": "This is the type of output you'd like.\n\n`string`, `number`, `integer`, `boolean` are the primitive types and should be obvious.\n\n`array` and `object` are more interesting and quite powerful. They allow you to define nested structures.\n\nFor `array`, you can define the schema of the items in the array using the `items` property.\n\nFor `object`, you can define the properties of the object using the `properties` property.",
+ "description": "This is the transcription provider that will be used.",
"enum": [
- "string",
- "number",
- "integer",
- "boolean",
- "array",
- "object"
+ "talkscriber"
]
},
- "items": {
- "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.",
- "allOf": [
- {
- "$ref": "#/components/schemas/JsonSchema"
- }
+ "model": {
+ "type": "string",
+ "description": "This is the model that will be used for the transcription.",
+ "enum": [
+ "whisper"
]
},
- "properties": {
- "type": "object",
- "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.",
- "additionalProperties": {
- "$ref": "#/components/schemas/JsonSchema"
- }
- },
- "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.\n\nOpenAI documentation: https://platform.openai.com/docs/guides/structured-outputs#supported-properties"
- },
- "format": {
+ "language": {
"type": "string",
- "description": "This is the format of the string. To pass a regex, use the `pattern` property instead.\n\nOpenAI documentation: https://platform.openai.com/docs/guides/structured-outputs?api-mode=chat&type-restrictions=string-restrictions",
+ "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",
"enum": [
- "date-time",
- "time",
- "date",
- "duration",
- "email",
- "hostname",
- "ipv4",
- "ipv6",
- "uuid"
+ "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"
]
- },
- "required": {
- "description": "This is a list of properties that are required.\n\nThis only makes sense if the type is \"object\".",
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "enum": {
- "description": "This array specifies the allowed values that can be used to restrict the output of the model.",
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "title": {
- "type": "string",
- "description": "This is the title of the schema."
}
},
"required": [
- "type"
+ "provider"
]
},
- "VariableExtractionAlias": {
+ "FallbackGoogleTranscriber": {
"type": "object",
"properties": {
- "key": {
+ "provider": {
"type": "string",
- "description": "This is the key of the variable.\n\nThis variable will be accessible during the call as `{{key}}` and stored in `call.artifact.variableValues` after the call.\n\nRules:\n- Must start with a letter (a-z, A-Z).\n- Subsequent characters can be letters, numbers, or underscores.\n- Minimum length of 1 and maximum length of 40.",
- "minLength": 1,
- "maxLength": 40,
- "pattern": "/^[a-zA-Z][a-zA-Z0-9_]*$/"
+ "description": "This is the transcription provider that will be used.",
+ "enum": [
+ "google"
+ ]
},
- "value": {
+ "model": {
"type": "string",
- "description": "This is the value of the variable.\n\nThis can reference existing variables, use filters, and perform transformations.\n\nExamples: \"{{name}}\", \"{{customer.email}}\", \"Hello {{name | upcase}}\"",
- "maxLength": 10000
- }
- },
- "required": [
- "key",
- "value"
- ]
- },
- "VariableExtractionPlan": {
- "type": "object",
- "properties": {
- "schema": {
- "description": "This is the schema to extract.\n\nExamples:\n1. To extract object properties, you can use the following schema:\n```json\n{\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"age\": {\n \"type\": \"number\"\n }\n }\n}\n```\n\nThese will be extracted as `{{ name }}` and `{{ age }}` respectively. To emphasize, object properties are extracted as direct global variables.\n\n2. To extract nested properties, you can use the following schema:\n```json\n{\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"object\",\n \"properties\": {\n \"first\": {\n \"type\": \"string\"\n },\n \"last\": {\n \"type\": \"string\"\n }\n }\n }\n }\n}\n```\n\nThese will be extracted as `{{ name }}`. And, `{{ name.first }}` and `{{ name.last }}` will be accessible.\n\n3. To extract array items, you can use the following schema:\n```json\n{\n \"type\": \"array\",\n \"title\": \"zipCodes\",\n \"items\": {\n \"type\": \"string\"\n }\n}\n```\n\nThis will be extracted as `{{ zipCodes }}`. To access the array items, you can use `{{ zipCodes[0] }}` and `{{ zipCodes[1] }}`.\n\n4. To extract array of objects, you can use the following schema:\n\n```json\n{\n \"type\": \"array\",\n \"name\": \"people\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"age\": {\n \"type\": \"number\"\n },\n \"zipCodes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n }\n }\n}\n```\n\nThis 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] }}`.",
- "allOf": [
- {
- "$ref": "#/components/schemas/JsonSchema"
- }
+ "description": "This is the model that will be used for the transcription.",
+ "enum": [
+ "gemini-3.5-flash",
+ "gemini-3.1-flash-lite",
+ "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"
]
},
- "aliases": {
- "description": "These are additional variables to create.\n\nThese will be accessible during the call as `{{key}}` and stored in `call.artifact.variableValues` after the call.\n\nExample:\n```json\n{\n \"aliases\": [\n {\n \"key\": \"customerName\",\n \"value\": \"{{name}}\"\n },\n {\n \"key\": \"fullName\",\n \"value\": \"{{firstName}} {{lastName}}\"\n },\n {\n \"key\": \"greeting\",\n \"value\": \"Hello {{name}}, welcome to {{company}}!\"\n },\n {\n \"key\": \"customerCity\",\n \"value\": \"{{addresses[0].city}}\"\n },\n {\n \"key\": \"something\",\n \"value\": \"{{any liquid}}\"\n }\n ]\n}\n```\n\nThis will create variables `customerName`, `fullName`, `greeting`, `customerCity`, and `something`. To access these variables, you can reference them as `{{customerName}}`, `{{fullName}}`, `{{greeting}}`, `{{customerCity}}`, and `{{something}}`.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/VariableExtractionAlias"
- }
- }
- }
- },
- "ToolParameter": {
- "type": "object",
- "properties": {
- "key": {
+ "language": {
"type": "string",
- "description": "This is the key of the parameter."
- },
- "value": {
- "description": "The value of the parameter. Any JSON type. String values support Liquid templates.",
- "oneOf": [
- {
- "type": "string"
- },
- {
- "type": "number"
- },
- {
- "type": "boolean"
- },
- {
- "type": "object"
- },
- {
- "type": "array"
- }
+ "description": "This is the language that will be set for the transcription.",
+ "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"
]
}
},
"required": [
- "key",
- "value"
+ "provider"
]
},
- "OpenAIFunctionParameters": {
+ "FallbackOpenAITranscriber": {
"type": "object",
"properties": {
- "type": {
+ "provider": {
"type": "string",
- "description": "This must be set to 'object'. It instructs the model to return a JSON object containing the function call properties.",
+ "description": "This is the transcription provider that will be used.",
"enum": [
- "object"
+ "openai"
]
},
- "properties": {
- "type": "object",
- "description": "This provides a description of the properties required by the function.\nJSON Schema can be used to specify expectations for each property.\nRefer to [this doc](https://ajv.js.org/json-schema.html#json-data-type) for a comprehensive guide on JSON Schema.",
- "additionalProperties": {
- "$ref": "#/components/schemas/JsonSchema"
- }
+ "model": {
+ "type": "string",
+ "description": "This is the model that will be used for the transcription.",
+ "enum": [
+ "gpt-4o-transcribe",
+ "gpt-4o-mini-transcribe"
+ ]
},
- "required": {
- "description": "This specifies the properties that are required by the function.",
- "type": "array",
- "items": {
- "type": "string"
- }
+ "language": {
+ "type": "string",
+ "description": "This is the language that will be set for the transcription.",
+ "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"
+ ]
}
},
"required": [
- "type",
- "properties"
+ "provider",
+ "model"
]
},
- "OpenAIFunction": {
+ "FallbackXaiTranscriber": {
"type": "object",
"properties": {
- "strict": {
- "type": "boolean",
- "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/).\n\n@default false",
- "default": false
- },
- "name": {
+ "provider": {
"type": "string",
- "description": "This is the the name of the function to be called.\n\nMust be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 64.",
- "maxLength": 64,
- "pattern": "/^[a-zA-Z0-9_-]{1,64}$/"
+ "enum": [
+ "xai"
+ ]
},
- "description": {
+ "model": {
"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."
+ "description": "The xAI speech-to-text model to use. xAI currently exposes a single STT model — placeholder for future model selection.",
+ "enum": [
+ "default"
+ ]
},
- "parameters": {
- "description": "These are the parameters the functions accepts, described as a JSON Schema object.\n\nSee 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.\n\nOmitting parameters defines a function with an empty parameter list.",
- "allOf": [
- {
- "$ref": "#/components/schemas/OpenAIFunctionParameters"
- }
+ "language": {
+ "type": "string",
+ "description": "Single language for transcription as an ISO 639-1 code (e.g., `en`, `es`). Defaults to `en` if not set. xAI auto-detects when omitted via the API but Vapi defaults to English for deterministic behavior.",
+ "enum": [
+ "ar",
+ "cs",
+ "da",
+ "nl",
+ "en",
+ "fil",
+ "fr",
+ "de",
+ "hi",
+ "id",
+ "it",
+ "ja",
+ "ko",
+ "mk",
+ "ms",
+ "fa",
+ "pl",
+ "pt",
+ "ro",
+ "ru",
+ "es",
+ "sv",
+ "th",
+ "tr",
+ "vi"
]
}
},
"required": [
- "name"
+ "provider"
]
},
- "CreateFunctionToolDTO": {
+ "LangfuseObservabilityPlan": {
"type": "object",
"properties": {
- "messages": {
- "type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/ToolMessageStart",
- "title": "ToolMessageStart"
- },
- {
- "$ref": "#/components/schemas/ToolMessageComplete",
- "title": "ToolMessageComplete"
- },
- {
- "$ref": "#/components/schemas/ToolMessageFailed",
- "title": "ToolMessageFailed"
- },
- {
- "$ref": "#/components/schemas/ToolMessageDelayed",
- "title": "ToolMessageDelayed"
- }
- ]
- }
- },
- "type": {
+ "provider": {
"type": "string",
"enum": [
- "function"
- ],
- "description": "The type of tool. \"function\" for Function tool."
+ "langfuse"
+ ]
},
- "async": {
- "type": "boolean",
- "example": false,
- "description": "This determines if the tool is async.\n\n 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.\n\n 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.\n\n Defaults to synchronous (`false`)."
+ "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"
},
- "server": {
- "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
- "allOf": [
- {
- "$ref": "#/components/schemas/Server"
- }
- ]
+ "promptVersion": {
+ "type": "number",
+ "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",
+ "minimum": 1
},
- "variableExtractionPlan": {
- "description": "Plan to extract variables from the tool response",
- "allOf": [
- {
- "$ref": "#/components/schemas/VariableExtractionPlan"
- }
- ]
+ "traceName": {
+ "type": "string",
+ "description": "Custom name for the Langfuse trace. Supports Liquid templates.\n\nAvailable variables:\n- {{ call.id }} - Call UUID\n- {{ call.type }} - 'inboundPhoneCall', 'outboundPhoneCall', 'webCall'\n- {{ assistant.name }} - Assistant name\n- {{ assistant.id }} - Assistant ID\n\nExample: \"{{ assistant.name }} - {{ call.type }}\"\n\nDefaults to call ID if not provided."
},
- "parameters": {
- "description": "Static key-value pairs merged into the request body. Values support Liquid templates.",
+ "tags": {
+ "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",
"type": "array",
"items": {
- "$ref": "#/components/schemas/ToolParameter"
+ "type": "string"
}
},
- "function": {
- "description": "This is the function definition of the tool.",
- "allOf": [
- {
- "$ref": "#/components/schemas/OpenAIFunction"
- }
- ]
- },
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
- "allOf": [
- {
- "$ref": "#/components/schemas/ToolRejectionPlan"
- }
- ]
+ "metadata": {
+ "type": "object",
+ "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\nBy default it includes the call metadata, assistant metadata, and assistant overrides."
}
},
"required": [
- "type"
+ "provider",
+ "tags"
]
},
- "GhlToolMetadata": {
+ "TextContent": {
"type": "object",
"properties": {
- "workflowId": {
- "type": "string"
- },
- "locationId": {
- "type": "string"
- }
- }
- },
- "CreateGhlToolDTO": {
- "type": "object",
- "properties": {
- "messages": {
- "type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/ToolMessageStart",
- "title": "ToolMessageStart"
- },
- {
- "$ref": "#/components/schemas/ToolMessageComplete",
- "title": "ToolMessageComplete"
- },
- {
- "$ref": "#/components/schemas/ToolMessageFailed",
- "title": "ToolMessageFailed"
- },
- {
- "$ref": "#/components/schemas/ToolMessageDelayed",
- "title": "ToolMessageDelayed"
- }
- ]
- }
- },
"type": {
"type": "string",
"enum": [
- "ghl"
- ],
- "description": "The type of tool. \"ghl\" for GHL tool."
+ "text"
+ ]
},
- "metadata": {
- "$ref": "#/components/schemas/GhlToolMetadata"
+ "text": {
+ "type": "string"
},
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
- "allOf": [
- {
- "$ref": "#/components/schemas/ToolRejectionPlan"
- }
+ "language": {
+ "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"
]
}
},
"required": [
"type",
- "metadata"
+ "text",
+ "language"
]
},
- "MakeToolMetadata": {
+ "Condition": {
"type": "object",
"properties": {
- "scenarioId": {
- "type": "number"
+ "operator": {
+ "type": "string",
+ "description": "This is the operator you want to use to compare the parameter and value.",
+ "enum": [
+ "eq",
+ "neq",
+ "gt",
+ "gte",
+ "lt",
+ "lte"
+ ]
},
- "triggerHookId": {
- "type": "number"
+ "param": {
+ "type": "string",
+ "description": "This is the name of the parameter that you want to check.",
+ "maxLength": 1000
+ },
+ "value": {
+ "type": "string",
+ "description": "This is the value you want to compare against the parameter.",
+ "maxLength": 1000
}
- }
+ },
+ "required": [
+ "operator",
+ "param",
+ "value"
+ ]
},
- "CreateMakeToolDTO": {
+ "ToolMessageStart": {
"type": "object",
"properties": {
- "messages": {
+ "contents": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "This is an alternative to the `content` property. It allows to specify variants of the same content, one per language.\n\nUsage:\n- If your assistants are multilingual, you can provide content for each language.\n- 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.\n\nThis will override the `content` property.",
"items": {
"oneOf": [
{
- "$ref": "#/components/schemas/ToolMessageStart",
- "title": "ToolMessageStart"
- },
- {
- "$ref": "#/components/schemas/ToolMessageComplete",
- "title": "ToolMessageComplete"
- },
- {
- "$ref": "#/components/schemas/ToolMessageFailed",
- "title": "ToolMessageFailed"
- },
- {
- "$ref": "#/components/schemas/ToolMessageDelayed",
- "title": "ToolMessageDelayed"
+ "$ref": "#/components/schemas/TextContent",
+ "title": "Text"
}
]
}
@@ -11758,28 +12992,34 @@
"type": {
"type": "string",
"enum": [
- "make"
+ "request-start"
],
- "description": "The type of tool. \"make\" for Make tool."
+ "description": "This message is triggered when the tool call starts.\n\nThis message is never triggered for async tools.\n\nMultiple request-start messages are variants. One eligible variant is selected each time the tool starts.\n\nIf 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."
},
- "metadata": {
- "$ref": "#/components/schemas/MakeToolMetadata"
+ "blocking": {
+ "type": "boolean",
+ "description": "This is an optional boolean that if true, the tool call will only trigger after the message is spoken. Default is false.\n\n@default false",
+ "example": false,
+ "default": false
},
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
- "allOf": [
- {
- "$ref": "#/components/schemas/ToolRejectionPlan"
- }
- ]
+ "content": {
+ "type": "string",
+ "description": "This is the content that the assistant says when this message is triggered.",
+ "maxLength": 1000
+ },
+ "conditions": {
+ "description": "This is an optional array of conditions that the tool call arguments must meet in order for this message to be triggered.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Condition"
+ }
}
},
"required": [
- "type",
- "metadata"
+ "type"
]
},
- "CustomMessage": {
+ "ToolMessageComplete": {
"type": "object",
"properties": {
"contents": {
@@ -11796,725 +13036,770 @@
},
"type": {
"type": "string",
- "description": "This is a custom message.",
+ "description": "This message is triggered when the tool call is complete.\n\nThis message is triggered immediately without waiting for your server to respond for async tool calls.\n\nIf this message is not provided, the model will be requested to respond.\n\nIf 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.",
"enum": [
- "custom-message"
+ "request-complete"
+ ]
+ },
+ "role": {
+ "type": "string",
+ "description": "This is optional and defaults to \"assistant\".\n\nWhen role=assistant, `content` is said out loud.\n\nWhen role=system, `content` is passed to the model in a system message. Example:\n system: default one\n assistant:\n user:\n assistant:\n user:\n assistant:\n user:\n assistant: tool called\n tool: your server response\n <--- system prompt as hint\n ---> model generates response which is spoken\nThis is useful when you want to provide a hint to the model about what to say next.",
+ "enum": [
+ "assistant",
+ "system"
]
},
+ "endCallAfterSpokenEnabled": {
+ "type": "boolean",
+ "description": "This is an optional boolean that if true, the call will end after the message is spoken. Default is false.\n\nThis is ignored if `role` is set to `system`.\n\n@default false",
+ "example": false
+ },
"content": {
"type": "string",
- "description": "This is the content that the assistant will say when this message is triggered.",
+ "description": "This is the content that the assistant says when this message is triggered.",
"maxLength": 1000
+ },
+ "conditions": {
+ "description": "This is an optional array of conditions that the tool call arguments must meet in order for this message to be triggered.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Condition"
+ }
}
},
"required": [
"type"
]
},
- "TransferDestinationAssistant": {
+ "ToolMessageFailed": {
"type": "object",
"properties": {
- "message": {
- "description": "This is spoken to the customer before connecting them to the destination.\n\nUsage:\n- If this is not provided and transfer tool messages is not provided, default is \"Transferring the call now\".\n- 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.\n\nThis accepts a string or a ToolMessageStart class. Latter is useful if you want to specify multiple messages for different languages through the `contents` field.",
- "oneOf": [
- {
- "type": "string"
- },
- {
- "$ref": "#/components/schemas/CustomMessage"
- }
- ]
+ "contents": {
+ "type": "array",
+ "description": "This is an alternative to the `content` property. It allows to specify variants of the same content, one per language.\n\nUsage:\n- If your assistants are multilingual, you can provide content for each language.\n- 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.\n\nThis will override the `content` property.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/TextContent",
+ "title": "Text"
+ }
+ ]
+ }
},
"type": {
"type": "string",
+ "description": "This message is triggered when the tool call fails.\n\nThis message is never triggered for async tool calls.\n\nIf this message is not provided, the model will be requested to respond.\n\nIf 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.",
"enum": [
- "assistant"
+ "request-failed"
]
},
- "transferMode": {
+ "role": {
"type": "string",
- "description": "This is the mode to use for the transfer. Defaults to `rolling-history`.\n\n- `rolling-history`: This is the default mode. It keeps the entire conversation history and appends the new assistant's system message on transfer.\n\n Example:\n\n Pre-transfer:\n system: assistant1 system message\n assistant: assistant1 first message\n user: hey, good morning\n assistant: how can i help?\n user: i need help with my account\n assistant: (destination.message)\n\n Post-transfer:\n system: assistant1 system message\n assistant: assistant1 first message\n user: hey, good morning\n assistant: how can i help?\n user: i need help with my account\n assistant: (destination.message)\n system: assistant2 system message\n assistant: assistant2 first message (or model generated if firstMessageMode is set to `assistant-speaks-first-with-model-generated-message`)\n\n- `swap-system-message-in-history`: This replaces the original system message with the new assistant's system message on transfer.\n\n Example:\n\n Pre-transfer:\n system: assistant1 system message\n assistant: assistant1 first message\n user: hey, good morning\n assistant: how can i help?\n user: i need help with my account\n assistant: (destination.message)\n\n Post-transfer:\n system: assistant2 system message\n assistant: assistant1 first message\n user: hey, good morning\n assistant: how can i help?\n user: i need help with my account\n assistant: (destination.message)\n assistant: assistant2 first message (or model generated if firstMessageMode is set to `assistant-speaks-first-with-model-generated-message`)\n\n- `delete-history`: This deletes the entire conversation history on transfer.\n\n Example:\n\n Pre-transfer:\n system: assistant1 system message\n assistant: assistant1 first message\n user: hey, good morning\n assistant: how can i help?\n user: i need help with my account\n assistant: (destination.message)\n\n Post-transfer:\n system: assistant2 system message\n assistant: assistant2 first message\n user: Yes, please\n assistant: how can i help?\n user: i need help with my account\n\n- `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.\n\n Example:\n\n Pre-transfer:\n system: assistant1 system message\n assistant: assistant1 first message\n user: hey, good morning\n assistant: how can i help?\n user: i need help with my account\n transfer-tool\n transfer-tool-result\n assistant: (destination.message)\n\n Post-transfer:\n system: assistant2 system message\n assistant: assistant1 first message\n user: hey, good morning\n assistant: how can i help?\n user: i need help with my account\n assistant: (destination.message)\n assistant: assistant2 first message (or model generated if firstMessageMode is set to `assistant-speaks-first-with-model-generated-message`)\n\n@default 'rolling-history'",
+ "description": "This is optional and defaults to \"assistant\".\n\nWhen role=assistant, `content` is said out loud when the tool call fails.\n\nWhen role=system, `content` is passed to the model as a system message\nalong with the failure result, and the model's generated response is\nspoken. Example:\n assistant: tool called\n tool: error from your server\n <--- system prompt as hint\n ---> model generates response which is spoken\nThis is useful when you want the model to generate an error-aware\nresponse instead of speaking a fixed failure message.",
"enum": [
- "rolling-history",
- "swap-system-message-in-history",
- "swap-system-message-in-history-and-remove-transfer-tool-messages",
- "delete-history"
+ "assistant",
+ "system"
]
},
- "assistantName": {
- "type": "string",
- "description": "This is the assistant to transfer the call to."
+ "endCallAfterSpokenEnabled": {
+ "type": "boolean",
+ "description": "This is an optional boolean that if true, the call will end after the message is spoken. Default is false.\n\nThis is ignored if `role` is set to `system`.\n\n@default false",
+ "example": false
},
- "description": {
+ "content": {
"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"
- ]
- },
- "TransferFallbackPlan": {
- "type": "object",
- "properties": {
- "message": {
- "description": "This is the message the assistant will deliver to the customer if the transfer fails.",
- "oneOf": [
- {
- "type": "string"
- },
- {
- "$ref": "#/components/schemas/CustomMessage"
- }
- ]
+ "description": "This is the content that the assistant says when this message is triggered.",
+ "maxLength": 1000
},
- "endCallEnabled": {
- "type": "boolean",
- "description": "This controls what happens after delivering the failure message to the customer.\n- true: End the call after delivering the failure message (default)\n- false: Keep the assistant on the call to continue handling the customer's request\n\n@default true",
- "default": true
+ "conditions": {
+ "description": "This is an optional array of conditions that the tool call arguments must meet in order for this message to be triggered.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Condition"
+ }
}
},
"required": [
- "message"
+ "type"
]
},
- "TransferAssistantModel": {
+ "ToolMessageDelayed": {
"type": "object",
"properties": {
- "provider": {
+ "contents": {
+ "type": "array",
+ "description": "This is an alternative to the `content` property. It allows to specify variants of the same content, one per language.\n\nUsage:\n- If your assistants are multilingual, you can provide content for each language.\n- 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.\n\nThis will override the `content` property.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/TextContent",
+ "title": "Text"
+ }
+ ]
+ }
+ },
+ "type": {
"type": "string",
- "description": "The model provider for the transfer assistant",
+ "description": "This message is triggered when the tool call is delayed. Same timing means variants; different timings mean staged updates.",
"enum": [
- "openai",
- "anthropic",
- "google",
- "custom-llm"
+ "request-response-delayed"
]
},
- "model": {
- "type": "string",
- "description": "The model name - must be compatible with the selected provider",
- "example": "gpt-4o"
+ "timingMilliseconds": {
+ "type": "number",
+ "minimum": 100,
+ "maximum": 120000,
+ "example": 1000,
+ "description": "The number of milliseconds to wait for the server response before saying this delayed message."
},
- "messages": {
- "type": "array",
- "description": "These are the messages used to configure the transfer assistant.\n\n@default: ```\n[\n {\n role: 'system',\n content: 'You are a transfer assistant designed to facilitate call transfers. Your core responsibility is to manage the transfer process efficiently.\\n\\n## Core Responsibility\\n- Facilitate the transfer process by using transferSuccessful or transferCancel tools appropriately\\n\\n## When to Respond\\n- Answer questions about the transfer process or provide summaries when specifically asked by the operator\\n- Respond to direct questions about the current transfer situation\\n\\n## What to Avoid\\n- Do not discuss topics unrelated to the transfer\\n- Do not engage in general conversation\\n- Keep all interactions focused on facilitating the transfer\\n\\n## Transfer Tools\\n- Use transferSuccessful when the transfer should proceed\\n- Use transferCancel when the transfer cannot be completed\\n\\nStay focused on your core responsibility of facilitating transfers.'\n }\n]```\n\n**Default Behavior:** If you don't provide any messages or don't include a system message as the first message, the default system message above will be automatically added.\n\n**Override Default:** To replace the default system message, provide your own system message as the first message in the array.\n\n**Add Context:** You can provide additional messages (user, assistant, etc.) to add context while keeping the default system message, or combine them with your custom system message."
+ "content": {
+ "type": "string",
+ "description": "This is the content that the assistant says when this message is triggered.",
+ "maxLength": 1000
},
- "tools": {
+ "conditions": {
+ "description": "This is an optional array of conditions that the tool call arguments must meet in order for this message to be triggered.",
"type": "array",
- "description": "Tools available to the transfer assistant during warm-transfer-experimental.\n\n**Default Behavior:** The transfer assistant will ALWAYS have both `transferSuccessful` and `transferCancel` tools automatically added, regardless of what you provide here.\n\n**Default Tools:**\n- `transferSuccessful`: \"Call this function to confirm the transfer is successful and connect the customer. Use this when you detect a human has answered and is ready to take the call.\"\n- `transferCancel`: \"Call this function to cancel the transfer when no human answers or transfer should not proceed. Use this when you detect voicemail, busy signal, or no answer.\"\n\n**Customization:** You can override the default tools by providing `transferSuccessful` and/or `transferCancel` tools with custom `function` or `messages` configurations.\n\n**Additional Tools:** You can also provide other tools, but the two transfer tools will always be present and available to the assistant."
+ "items": {
+ "$ref": "#/components/schemas/Condition"
+ }
}
},
"required": [
- "provider",
- "model"
+ "type"
]
},
- "RegexOption": {
+ "MessageTarget": {
"type": "object",
"properties": {
- "type": {
+ "role": {
"type": "string",
- "description": "This is the type of the regex option. Options are:\n- `ignore-case`: Ignores the case of the text being matched. Add\n- `whole-word`: Matches whole words only.\n- `multi-line`: Matches across multiple lines.",
+ "description": "This is the role of the message to target.\n\nIf not specified, will find the position in the message history ignoring role (effectively `any`).",
+ "example": "user",
"enum": [
- "ignore-case",
- "whole-word",
- "multi-line"
+ "user",
+ "assistant"
]
},
- "enabled": {
- "type": "boolean",
- "description": "This is whether to enable the option.\n\n@default false"
+ "position": {
+ "type": "number",
+ "description": "This is the position of the message to target.\n- Negative numbers: Count from end (-1 = most recent, -2 = second most recent)\n- 0: First/oldest message in history\n- Positive numbers: Specific position (0-indexed from start)\n\n@default -1 (most recent message)",
+ "example": -1
}
- },
- "required": [
- "type",
- "enabled"
- ]
+ }
},
- "AssistantCustomEndpointingRule": {
+ "RegexCondition": {
"type": "object",
"properties": {
"type": {
"type": "string",
- "description": "This endpointing rule is based on the last assistant message before customer started speaking.\n\nFlow:\n- Assistant speaks\n- Customer starts speaking\n- Customer transcription comes in\n- This rule is evaluated on the last assistant message\n- If a match is found based on `regex`, the endpointing timeout is set to `timeoutSeconds`\n\nUsage:\n- If you have yes/no questions in your use case like \"are you interested in a loan?\", you can set a shorter timeout.\n- 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.",
+ "description": "This is the type discriminator for regex condition",
+ "example": "regex",
"enum": [
- "assistant"
+ "regex"
]
},
"regex": {
"type": "string",
- "description": "This is the regex pattern to match.\n\nNote:\n- This works by using the `RegExp.test` method in Node.JS. Eg. `/hello/.test(\"hello there\")` will return `true`.\n\nHot tip:\n- In JavaScript, escape `\\` when sending the regex pattern. Eg. `\"hello\\sthere\"` will be sent over the wire as `\"hellosthere\"`. Send `\"hello\\\\sthere\"` instead.\n- `RegExp.test` does substring matching, so `/cat/.test(\"I love cats\")` will return `true`. To do full string matching, send \"^cat$\"."
- },
- "regexOptions": {
- "description": "These are the options for the regex match. Defaults to all disabled.\n\n@default []",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/RegexOption"
- }
+ "description": "This is the regular expression pattern to match against message content.\n\nNote:\n- This works by using the RegExp.test method in Node.JS. Eg. /hello/.test(\"hello there\") will return true.\n\nHot tips:\n- In JavaScript, escape \\ when sending the regex pattern. Eg. \"hello\\sthere\" will be sent over the wire as \"hellosthere\". Send \"hello\\\\sthere\" instead.\n- 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\".\n- Word boundaries \\b are useful for matching whole words: /\\bcat\\b/ matches \"cat\" but not \"cats\" or \"category\".\n- Use inline flags for portability: (?i) for case insensitive, (?m) for multiline",
+ "examples": [
+ "\\\\b(cancel|stop|wait)\\\\b - Matches whole words",
+ "^yes$ - Matches exactly yes (full string match)",
+ "(?i)hello - Case insensitive match"
+ ]
},
- "timeoutSeconds": {
- "type": "number",
- "description": "This is the endpointing timeout in seconds, if the rule is matched.",
- "minimum": 0,
- "maximum": 15
+ "target": {
+ "description": "This is the target for messages to check against.\nIf not specified, the condition will run on the last message (position: -1).\nIf role is not specified, it will look at the last message regardless of role.\n@default { position: -1 }",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/MessageTarget"
+ }
+ ]
+ },
+ "negate": {
+ "type": "boolean",
+ "description": "This is the flag that when true, the condition matches if the pattern does NOT match.\nUseful for ensuring certain words/phrases are absent.\n\n@default false",
+ "example": "true - Reject if user hasn\"t said goodbye: { regex: \"\\\\b(bye|goodbye)\\\\b\", negate: true }"
}
},
"required": [
"type",
- "regex",
- "timeoutSeconds"
+ "regex"
]
},
- "CustomerCustomEndpointingRule": {
+ "LiquidCondition": {
"type": "object",
"properties": {
"type": {
"type": "string",
- "description": "This endpointing rule is based on current customer message as they are speaking.\n\nFlow:\n- Assistant speaks\n- Customer starts speaking\n- Customer transcription comes in\n- This rule is evaluated on the current customer transcription\n- If a match is found based on `regex`, the endpointing timeout is set to `timeoutSeconds`\n\nUsage:\n- If you want to wait longer while customer is speaking numbers, you can set a longer timeout.",
+ "description": "This is the type discriminator for liquid condition",
+ "example": "liquid",
"enum": [
- "customer"
+ "liquid"
]
},
- "regex": {
+ "liquid": {
"type": "string",
- "description": "This is the regex pattern to match.\n\nNote:\n- This works by using the `RegExp.test` method in Node.JS. Eg. `/hello/.test(\"hello there\")` will return `true`.\n\nHot tip:\n- In JavaScript, escape `\\` when sending the regex pattern. Eg. `\"hello\\sthere\"` will be sent over the wire as `\"hellosthere\"`. Send `\"hello\\\\sthere\"` instead.\n- `RegExp.test` does substring matching, so `/cat/.test(\"I love cats\")` will return `true`. To do full string matching, send \"^cat$\"."
- },
- "regexOptions": {
- "description": "These are the options for the regex match. Defaults to all disabled.\n\n@default []",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/RegexOption"
- }
- },
- "timeoutSeconds": {
- "type": "number",
- "description": "This is the endpointing timeout in seconds, if the rule is matched.",
- "minimum": 0,
- "maximum": 15
+ "description": "This is the Liquid template that must return exactly \"true\" or \"false\" as a string.\nThe template is evaluated and the entire output must be either \"true\" or \"false\" - nothing else.\n\nAvailable variables:\n- `messages`: Array of recent messages in OpenAI chat completions format (ChatCompletionMessageParam[])\n Each message has properties like: role ('user', 'assistant', 'system'), content (string), etc.\n- `now`: Current timestamp in milliseconds (built-in Liquid variable)\n- Any assistant variable values (e.g., `userName`, `accountStatus`)\n\nUseful Liquid filters for messages:\n- `messages | last: 5` - Get the 5 most recent messages\n- `messages | where: 'role', 'user'` - Filter to only user messages\n- `messages | reverse` - Reverse the order of messages",
+ "examples": [
+ "{% if messages.last.content contains goodbye %}true{% else %}false{% endif %}",
+ "{% assign userMessages = messages | where: role, user %}{% if userMessages.size > 3 %}true{% else %}false{% endif %}"
+ ]
}
},
"required": [
"type",
- "regex",
- "timeoutSeconds"
+ "liquid"
]
},
- "BothCustomEndpointingRule": {
+ "GroupCondition": {
"type": "object",
"properties": {
"type": {
"type": "string",
- "description": "This endpointing rule is based on both the last assistant message and the current customer message as they are speaking.\n\nFlow:\n- Assistant speaks\n- Customer starts speaking\n- Customer transcription comes in\n- This rule is evaluated on the last assistant message and the current customer transcription\n- If assistant message matches `assistantRegex` AND customer message matches `customerRegex`, the endpointing timeout is set to `timeoutSeconds`\n\nUsage:\n- If you want to wait longer while customer is speaking numbers, you can set a longer timeout.",
+ "description": "This is the type discriminator for group condition",
+ "example": "group",
"enum": [
- "both"
+ "group"
]
},
- "assistantRegex": {
+ "operator": {
"type": "string",
- "description": "This is the regex pattern to match the assistant's message.\n\nNote:\n- This works by using the `RegExp.test` method in Node.JS. Eg. `/hello/.test(\"hello there\")` will return `true`.\n\nHot tip:\n- In JavaScript, escape `\\` when sending the regex pattern. Eg. `\"hello\\sthere\"` will be sent over the wire as `\"hellosthere\"`. Send `\"hello\\\\sthere\"` instead.\n- `RegExp.test` does substring matching, so `/cat/.test(\"I love cats\")` will return `true`. To do full string matching, send \"^cat$\"."
- },
- "assistantRegexOptions": {
- "description": "These are the options for the assistant's message regex match. Defaults to all disabled.\n\n@default []",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/RegexOption"
- }
- },
- "customerRegex": {
- "type": "string"
+ "description": "This is the logical operator for combining conditions in this group",
+ "examples": [
+ "AND",
+ "OR"
+ ],
+ "enum": [
+ "AND",
+ "OR"
+ ]
},
- "customerRegexOptions": {
- "description": "These are the options for the customer's message regex match. Defaults to all disabled.\n\n@default []",
+ "conditions": {
"type": "array",
+ "description": "This is the list of nested conditions to evaluate.\nSupports recursive nesting of groups for complex logic.",
+ "examples": [
+ "[{ type: \"regex\", regex: \"(?i)stop\", target: { role: \"user\" } }]",
+ "[{ type: \"group\", operator: \"AND\", conditions: [...] }]"
+ ],
"items": {
- "$ref": "#/components/schemas/RegexOption"
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/RegexCondition",
+ "title": "RegexCondition"
+ },
+ {
+ "$ref": "#/components/schemas/LiquidCondition",
+ "title": "LiquidCondition"
+ },
+ {
+ "$ref": "#/components/schemas/GroupCondition",
+ "title": "GroupCondition",
+ "description": "This is the GroupCondition object but Swagger does not display nested schemas correctly."
+ }
+ ]
}
- },
- "timeoutSeconds": {
- "type": "number",
- "description": "This is the endpointing timeout in seconds, if the rule is matched.",
- "minimum": 0,
- "maximum": 15
}
},
"required": [
"type",
- "assistantRegex",
- "customerRegex",
- "timeoutSeconds"
+ "operator",
+ "conditions"
]
},
- "VapiSmartEndpointingPlan": {
+ "ToolRejectionPlan": {
"type": "object",
"properties": {
- "provider": {
- "type": "string",
- "description": "This is the provider for the smart endpointing plan.",
- "enum": [
- "vapi",
- "livekit",
- "custom-endpointing-model"
+ "conditions": {
+ "type": "array",
+ "description": "This is the list of conditions that must be evaluated.\n\nUsage:\n- If all conditions match (AND logic), the tool call is rejected.\n- For OR logic at the top level, use a single 'group' condition with operator: 'OR'.\n\n@default [] - Empty array means tool always executes",
+ "examples": [
+ "[{ type: \"regex\", regex: \"(?i)\\\\b(cancel|stop)\\\\b\", target: { role: \"user\" } }]",
+ "[{ type: \"group\", operator: \"OR\", conditions: [...] }]"
],
- "example": "vapi"
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/RegexCondition",
+ "title": "RegexCondition"
+ },
+ {
+ "$ref": "#/components/schemas/LiquidCondition",
+ "title": "LiquidCondition"
+ },
+ {
+ "$ref": "#/components/schemas/GroupCondition",
+ "title": "GroupCondition",
+ "description": "This is the GroupCondition object but Swagger does not display nested schemas correctly."
+ }
+ ]
+ }
}
- },
- "required": [
- "provider"
- ]
+ }
},
- "LivekitSmartEndpointingPlan": {
+ "CreateDtmfToolDTO": {
"type": "object",
"properties": {
- "provider": {
+ "messages": {
+ "type": "array",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
+ }
+ ]
+ }
+ },
+ "type": {
"type": "string",
- "description": "This is the provider for the smart endpointing plan.",
"enum": [
- "vapi",
- "livekit",
- "custom-endpointing-model"
+ "dtmf"
],
- "example": "livekit"
+ "description": "The type of tool. \"dtmf\" for DTMF tool."
},
- "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.\n\nThis 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).\n\nA 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.\n\nUnder the hood, this is parsed into a mathjs expression. Whatever you use to write your expression needs to be valid with respect to mathjs\n\n@default \"20 + 500 * sqrt(x) + 2500 * x^3\"",
- "examples": [
- "70 + 4000 * x",
- "200 + 8000 * x",
- "4000 * (1 - cos(pi * x))"
+ "sipInfoDtmfEnabled": {
+ "type": "boolean",
+ "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.",
+ "default": false
+ },
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ToolRejectionPlan"
+ }
]
}
},
"required": [
- "provider"
+ "type"
]
},
- "CustomEndpointingModelSmartEndpointingPlan": {
+ "CreateEndCallToolDTO": {
"type": "object",
"properties": {
- "provider": {
+ "messages": {
+ "type": "array",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
+ }
+ ]
+ }
+ },
+ "type": {
"type": "string",
- "description": "This is the provider for the smart endpointing plan. Use `custom-endpointing-model` for custom endpointing providers that are not natively supported.",
"enum": [
- "vapi",
- "livekit",
- "custom-endpointing-model"
+ "endCall"
],
- "example": "custom-endpointing-model"
+ "description": "The type of tool. \"endCall\" for End Call tool."
},
- "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`.\n\nRequest Example:\n\nPOST https://{server.url}\nContent-Type: application/json\n\n{\n \"message\": {\n \"type\": \"call.endpointing.request\",\n \"messages\": [\n {\n \"role\": \"user\",\n \"message\": \"Hello, how are you?\",\n \"time\": 1234567890,\n \"secondsFromStart\": 0\n }\n ],\n ...other metadata about the call...\n }\n}\n\nResponse Expected:\n{\n \"timeoutSeconds\": 0.5\n}\n\nThe 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).",
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
"allOf": [
{
- "$ref": "#/components/schemas/Server"
+ "$ref": "#/components/schemas/ToolRejectionPlan"
}
]
}
},
"required": [
- "provider"
+ "type"
]
},
- "TranscriptionEndpointingPlan": {
- "type": "object",
- "properties": {
- "onPunctuationSeconds": {
- "type": "number",
- "description": "The minimum number of seconds to wait after transcription ending with punctuation before sending a request to the model. Defaults to 0.1.\n\nThis setting exists because the transcriber punctuates the transcription when it's more confident that customer has completed a thought.\n\n@default 0.1",
- "minimum": 0,
- "maximum": 3,
- "example": 0.1
- },
- "onNoPunctuationSeconds": {
- "type": "number",
- "description": "The minimum number of seconds to wait after transcription ending without punctuation before sending a request to the model. Defaults to 1.5.\n\nThis 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.\n\n@default 1.5",
- "minimum": 0,
- "maximum": 3,
- "example": 1.5
- },
- "onNumberSeconds": {
- "type": "number",
- "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.\n\nThis 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.\n\n@default 0.5",
- "minimum": 0,
- "maximum": 3,
- "example": 0.5
- }
- }
- },
- "StartSpeakingPlan": {
+ "CreateVoicemailToolDTO": {
"type": "object",
"properties": {
- "waitSeconds": {
- "type": "number",
- "description": "This is how long assistant waits before speaking. Defaults to 0.4.\n\nThis 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.\n\nExample:\n- If model generates tokens and voice generates bytes within 100ms, the pipeline still waits 300ms before outputting speech.\n\nUsage:\n- If the customer is taking long pauses, set this to a higher value.\n- If the assistant is accidentally jumping in too much, set this to a higher value.\n\n@default 0.4",
- "minimum": 0,
- "maximum": 5,
- "example": 0.4
- },
- "smartEndpointingEnabled": {
- "example": false,
- "deprecated": true,
- "oneOf": [
- {
- "type": "boolean"
- },
- {
- "type": "string",
- "enum": [
- "livekit"
- ]
- }
- ]
- },
- "smartEndpointingPlan": {
- "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.\n\nIf this is set, it will override and take precedence over `transcriptionEndpointingPlan`.\nThis plan will still be overridden by any matching `customEndpointingRules`.\n\nIf this is not set, the system will automatically use the transcriber's built-in endpointing capabilities if available.",
- "oneOf": [
- {
- "$ref": "#/components/schemas/VapiSmartEndpointingPlan",
- "title": "Vapi"
- },
- {
- "$ref": "#/components/schemas/LivekitSmartEndpointingPlan",
- "title": "Livekit"
- },
- {
- "$ref": "#/components/schemas/CustomEndpointingModelSmartEndpointingPlan",
- "title": "Custom Endpointing Model"
- }
- ]
- },
- "customEndpointingRules": {
+ "messages": {
"type": "array",
- "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.\n\nUsage:\n- If you have yes/no questions like \"are you interested in a loan?\", you can set a shorter timeout.\n- 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.\n- If you want to wait longer while customer is enumerating a list of numbers, you can set a longer timeout.\n\nThese rules have the highest precedence and will override both `smartEndpointingPlan` and `transcriptionEndpointingPlan` when a rule is matched.\n\nThe rules are evaluated in order and the first one that matches will be used.\n\nOrder of precedence for endpointing:\n1. customEndpointingRules (if any match)\n2. smartEndpointingPlan (if set)\n3. transcriptionEndpointingPlan\n\n@default []",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
- "$ref": "#/components/schemas/AssistantCustomEndpointingRule",
- "title": "Assistant"
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
},
{
- "$ref": "#/components/schemas/CustomerCustomEndpointingRule",
- "title": "Customer"
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
},
{
- "$ref": "#/components/schemas/BothCustomEndpointingRule",
- "title": "Both"
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
}
]
}
},
- "transcriptionEndpointingPlan": {
- "description": "This determines how a customer speech is considered done (endpointing) using the transcription of customer's speech.\n\nOnce an endpoint is triggered, the request is sent to `assistant.model`.\n\nNote: 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.\nThis plan will also be overridden by any matching `customEndpointingRules`.",
+ "type": {
+ "type": "string",
+ "description": "The type of tool. \"voicemail\" for Voicemail tool.",
+ "enum": [
+ "voicemail"
+ ]
+ },
+ "beepDetectionEnabled": {
+ "type": "boolean",
+ "description": "This is the flag that enables beep detection for voicemail detection and applies only for twilio based calls.\n\n@default false",
+ "default": false,
+ "example": false
+ },
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
"allOf": [
{
- "$ref": "#/components/schemas/TranscriptionEndpointingPlan"
+ "$ref": "#/components/schemas/ToolRejectionPlan"
}
]
}
- }
- },
- "SmartDenoisingPlan": {
- "type": "object",
- "properties": {
- "enabled": {
- "type": "boolean",
- "description": "Whether smart denoising using Krisp is enabled.",
- "default": true
- }
- }
+ },
+ "required": [
+ "type"
+ ]
},
- "FourierDenoisingPlan": {
+ "JsonSchema": {
"type": "object",
"properties": {
- "enabled": {
- "type": "boolean",
- "description": "Whether Fourier denoising is enabled. Note that this is experimental and may not work as expected.",
- "default": false
- },
- "mediaDetectionEnabled": {
- "type": "boolean",
- "description": "Whether automatic media detection is enabled. When enabled, the filter will automatically\ndetect consistent background TV/music/radio and switch to more aggressive filtering settings.\nOnly applies when enabled is true.",
- "example": true,
- "default": true
- },
- "staticThreshold": {
- "type": "number",
- "description": "Static threshold in dB used as fallback when no baseline is established.",
- "example": -35,
- "minimum": -80,
- "maximum": 0,
- "default": -35
- },
- "baselineOffsetDb": {
- "type": "number",
- "description": "How far below the rolling baseline to filter audio, in dB.\nLower values (e.g., -10) are more aggressive, higher values (e.g., -20) are more conservative.",
- "example": -15,
- "minimum": -30,
- "maximum": -5,
- "default": -15
- },
- "windowSizeMs": {
- "type": "number",
- "description": "Rolling window size in milliseconds for calculating the audio baseline.\nLarger windows adapt more slowly but are more stable.",
- "example": 3000,
- "minimum": 1000,
- "maximum": 30000,
- "default": 3000
+ "type": {
+ "type": "string",
+ "description": "This is the type of output you'd like.\n\n`string`, `number`, `integer`, `boolean` are the primitive types and should be obvious.\n\n`array` and `object` are more interesting and quite powerful. They allow you to define nested structures.\n\nFor `array`, you can define the schema of the items in the array using the `items` property.\n\nFor `object`, you can define the properties of the object using the `properties` property.",
+ "enum": [
+ "string",
+ "number",
+ "integer",
+ "boolean",
+ "array",
+ "object"
+ ]
},
- "baselinePercentile": {
- "type": "number",
- "description": "Percentile to use for baseline calculation (1-99).\nHigher percentiles (e.g., 85) focus on louder speech, lower percentiles (e.g., 50) include quieter speech.",
- "example": 85,
- "minimum": 1,
- "maximum": 99,
- "default": 85
- }
- }
- },
- "BackgroundSpeechDenoisingPlan": {
- "type": "object",
- "properties": {
- "smartDenoisingPlan": {
- "description": "Whether smart denoising using Krisp is enabled.",
+ "items": {
+ "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.",
"allOf": [
{
- "$ref": "#/components/schemas/SmartDenoisingPlan"
+ "$ref": "#/components/schemas/JsonSchema"
}
]
},
- "fourierDenoisingPlan": {
- "description": "Whether Fourier denoising is enabled. Note that this is experimental and may not work as expected.\n\nThis can be combined with smart denoising, and will be run afterwards.",
- "allOf": [
- {
- "$ref": "#/components/schemas/FourierDenoisingPlan"
- }
+ "properties": {
+ "type": "object",
+ "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.",
+ "additionalProperties": {
+ "$ref": "#/components/schemas/JsonSchema"
+ }
+ },
+ "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.\n\nOpenAI documentation: https://platform.openai.com/docs/guides/structured-outputs#supported-properties"
+ },
+ "format": {
+ "type": "string",
+ "description": "This is the format of the string. To pass a regex, use the `pattern` property instead.\n\nOpenAI documentation: https://platform.openai.com/docs/guides/structured-outputs?api-mode=chat&type-restrictions=string-restrictions",
+ "enum": [
+ "date-time",
+ "time",
+ "date",
+ "duration",
+ "email",
+ "hostname",
+ "ipv4",
+ "ipv6",
+ "uuid"
]
+ },
+ "required": {
+ "description": "This is a list of properties that are required.\n\nThis only makes sense if the type is \"object\".",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "enum": {
+ "description": "This array specifies the allowed values that can be used to restrict the output of the model.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "title": {
+ "type": "string",
+ "description": "This is the title of the schema."
}
- }
+ },
+ "required": [
+ "type"
+ ]
},
- "TransferAssistant": {
+ "VariableExtractionAlias": {
"type": "object",
"properties": {
- "name": {
+ "key": {
"type": "string",
- "description": "Optional name for the transfer assistant",
- "maxLength": 100,
- "default": "transfer-assistant",
- "example": "Sales Transfer Assistant"
- },
- "model": {
- "description": "Model configuration for the transfer assistant",
+ "description": "This is the key of the variable.\n\nThis variable will be accessible during the call as `{{key}}` and stored in `call.artifact.variableValues` after the call.\n\nRules:\n- Must start with a letter (a-z, A-Z).\n- Subsequent characters can be letters, numbers, or underscores.\n- Minimum length of 1 and maximum length of 40.",
+ "minLength": 1,
+ "maxLength": 40,
+ "pattern": "/^[a-zA-Z][a-zA-Z0-9_]*$/"
+ },
+ "value": {
+ "type": "string",
+ "description": "This is the value of the variable.\n\nThis can reference existing variables, use filters, and perform transformations.\n\nExamples: \"{{name}}\", \"{{customer.email}}\", \"Hello {{name | upcase}}\"",
+ "maxLength": 10000
+ }
+ },
+ "required": [
+ "key",
+ "value"
+ ]
+ },
+ "VariableExtractionPlan": {
+ "type": "object",
+ "properties": {
+ "schema": {
+ "description": "This is the schema to extract.\n\nExamples:\n1. To extract object properties, you can use the following schema:\n```json\n{\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"age\": {\n \"type\": \"number\"\n }\n }\n}\n```\n\nThese will be extracted as `{{ name }}` and `{{ age }}` respectively. To emphasize, object properties are extracted as direct global variables.\n\n2. To extract nested properties, you can use the following schema:\n```json\n{\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"object\",\n \"properties\": {\n \"first\": {\n \"type\": \"string\"\n },\n \"last\": {\n \"type\": \"string\"\n }\n }\n }\n }\n}\n```\n\nThese will be extracted as `{{ name }}`. And, `{{ name.first }}` and `{{ name.last }}` will be accessible.\n\n3. To extract array items, you can use the following schema:\n```json\n{\n \"type\": \"array\",\n \"title\": \"zipCodes\",\n \"items\": {\n \"type\": \"string\"\n }\n}\n```\n\nThis will be extracted as `{{ zipCodes }}`. To access the array items, you can use `{{ zipCodes[0] }}` and `{{ zipCodes[1] }}`.\n\n4. To extract array of objects, you can use the following schema:\n\n```json\n{\n \"type\": \"array\",\n \"name\": \"people\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"age\": {\n \"type\": \"number\"\n },\n \"zipCodes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n }\n }\n}\n```\n\nThis 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] }}`.",
"allOf": [
{
- "$ref": "#/components/schemas/TransferAssistantModel"
+ "$ref": "#/components/schemas/JsonSchema"
}
]
},
- "voice": {
- "description": "These are the options for the transfer assistant's voice.",
+ "aliases": {
+ "description": "These are additional variables to create.\n\nThese will be accessible during the call as `{{key}}` and stored in `call.artifact.variableValues` after the call.\n\nExample:\n```json\n{\n \"aliases\": [\n {\n \"key\": \"customerName\",\n \"value\": \"{{name}}\"\n },\n {\n \"key\": \"fullName\",\n \"value\": \"{{firstName}} {{lastName}}\"\n },\n {\n \"key\": \"greeting\",\n \"value\": \"Hello {{name}}, welcome to {{company}}!\"\n },\n {\n \"key\": \"customerCity\",\n \"value\": \"{{addresses[0].city}}\"\n },\n {\n \"key\": \"something\",\n \"value\": \"{{any liquid}}\"\n }\n ]\n}\n```\n\nThis will create variables `customerName`, `fullName`, `greeting`, `customerCity`, and `something`. To access these variables, you can reference them as `{{customerName}}`, `{{fullName}}`, `{{greeting}}`, `{{customerCity}}`, and `{{something}}`.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/VariableExtractionAlias"
+ }
+ }
+ }
+ },
+ "ToolParameter": {
+ "type": "object",
+ "properties": {
+ "key": {
+ "type": "string",
+ "description": "This is the key of the parameter."
+ },
+ "value": {
+ "description": "The value of the parameter. Any JSON type. String values support Liquid templates.",
"oneOf": [
{
- "$ref": "#/components/schemas/AzureVoice",
- "title": "AzureVoice"
- },
- {
- "$ref": "#/components/schemas/CartesiaVoice",
- "title": "CartesiaVoice"
- },
- {
- "$ref": "#/components/schemas/CustomVoice",
- "title": "CustomVoice"
- },
- {
- "$ref": "#/components/schemas/DeepgramVoice",
- "title": "DeepgramVoice"
- },
- {
- "$ref": "#/components/schemas/ElevenLabsVoice",
- "title": "ElevenLabsVoice"
- },
- {
- "$ref": "#/components/schemas/HumeVoice",
- "title": "HumeVoice"
- },
- {
- "$ref": "#/components/schemas/LMNTVoice",
- "title": "LMNTVoice"
- },
- {
- "$ref": "#/components/schemas/NeuphonicVoice",
- "title": "NeuphonicVoice"
- },
- {
- "$ref": "#/components/schemas/OpenAIVoice",
- "title": "OpenAIVoice"
- },
- {
- "$ref": "#/components/schemas/PlayHTVoice",
- "title": "PlayHTVoice"
- },
- {
- "$ref": "#/components/schemas/WellSaidVoice",
- "title": "WellSaidVoice"
- },
- {
- "$ref": "#/components/schemas/RimeAIVoice",
- "title": "RimeAIVoice"
- },
- {
- "$ref": "#/components/schemas/SmallestAIVoice",
- "title": "SmallestAIVoice"
- },
- {
- "$ref": "#/components/schemas/TavusVoice",
- "title": "TavusVoice"
+ "type": "string"
},
{
- "$ref": "#/components/schemas/VapiVoice",
- "title": "VapiVoice"
+ "type": "number"
},
{
- "$ref": "#/components/schemas/SesameVoice",
- "title": "SesameVoice"
+ "type": "boolean"
},
{
- "$ref": "#/components/schemas/InworldVoice",
- "title": "InworldVoice"
+ "type": "object"
},
{
- "$ref": "#/components/schemas/MinimaxVoice",
- "title": "MinimaxVoice"
+ "type": "array"
}
]
+ }
+ },
+ "required": [
+ "key",
+ "value"
+ ]
+ },
+ "OpenAIFunctionParameters": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "This must be set to 'object'. It instructs the model to return a JSON object containing the function call properties.",
+ "enum": [
+ "object"
+ ]
},
- "transcriber": {
- "description": "These are the options for the transfer assistant's transcriber.",
- "oneOf": [
- {
- "$ref": "#/components/schemas/AssemblyAITranscriber",
- "title": "AssemblyAITranscriber"
- },
- {
- "$ref": "#/components/schemas/AzureSpeechTranscriber",
- "title": "AzureSpeechTranscriber"
- },
- {
- "$ref": "#/components/schemas/CustomTranscriber",
- "title": "CustomTranscriber"
- },
- {
- "$ref": "#/components/schemas/DeepgramTranscriber",
- "title": "DeepgramTranscriber"
- },
- {
- "$ref": "#/components/schemas/ElevenLabsTranscriber",
- "title": "ElevenLabsTranscriber"
- },
- {
- "$ref": "#/components/schemas/GladiaTranscriber",
- "title": "GladiaTranscriber"
- },
- {
- "$ref": "#/components/schemas/GoogleTranscriber",
- "title": "GoogleTranscriber"
- },
- {
- "$ref": "#/components/schemas/SpeechmaticsTranscriber",
- "title": "SpeechmaticsTranscriber"
- },
- {
- "$ref": "#/components/schemas/TalkscriberTranscriber",
- "title": "TalkscriberTranscriber"
- },
- {
- "$ref": "#/components/schemas/OpenAITranscriber",
- "title": "OpenAITranscriber"
- },
- {
- "$ref": "#/components/schemas/CartesiaTranscriber",
- "title": "CartesiaTranscriber"
- },
+ "properties": {
+ "type": "object",
+ "description": "This provides a description of the properties required by the function.\nJSON Schema can be used to specify expectations for each property.\nRefer to [this doc](https://ajv.js.org/json-schema.html#json-data-type) for a comprehensive guide on JSON Schema.",
+ "additionalProperties": {
+ "$ref": "#/components/schemas/JsonSchema"
+ }
+ },
+ "required": {
+ "description": "This specifies the properties that are required by the function.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "required": [
+ "type",
+ "properties"
+ ]
+ },
+ "OpenAIFunction": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "This is the the name of the function to be called.\n\nMust be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 64.",
+ "maxLength": 64,
+ "pattern": "/^[a-zA-Z0-9_-]{1,64}$/"
+ },
+ "strict": {
+ "type": "boolean",
+ "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/).\n\n@default false",
+ "default": false
+ },
+ "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": {
+ "description": "These are the parameters the functions accepts, described as a JSON Schema object.\n\nSee 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.\n\nOmitting parameters defines a function with an empty parameter list.",
+ "allOf": [
{
- "$ref": "#/components/schemas/SonioxTranscriber",
- "title": "SonioxTranscriber"
+ "$ref": "#/components/schemas/OpenAIFunctionParameters"
}
]
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "CreateFunctionToolDTO": {
+ "type": "object",
+ "properties": {
+ "messages": {
+ "type": "array",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
+ }
+ ]
+ }
},
- "firstMessage": {
+ "type": {
"type": "string",
- "description": "This is the first message that the transfer assistant will say.\nThis can also be a URL to a custom audio file.\n\nIf unspecified, assistant will wait for user to speak and use the model to respond once they speak.",
- "example": "Hello! I understand you need to be transferred. Let me connect you."
+ "enum": [
+ "function"
+ ],
+ "description": "The type of tool. \"function\" for Function tool."
},
- "backgroundSound": {
- "description": "This is the background sound in the transfer assistant call. Default for phone calls is 'office' and default for web calls is 'off'.\nYou can also provide a custom sound by providing a URL to an audio file.",
- "oneOf": [
- {
- "type": "string",
- "enum": [
- "off",
- "office"
- ],
- "example": "office"
- },
+ "async": {
+ "type": "boolean",
+ "example": false,
+ "description": "This determines if the tool is async.\n\n 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.\n\n 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.\n\n Defaults to synchronous (`false`)."
+ },
+ "server": {
+ "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
+ "allOf": [
{
- "type": "string",
- "format": "uri",
- "example": "https://www.soundjay.com/ambient/sounds/people-in-lounge-1.mp3"
+ "$ref": "#/components/schemas/Server"
}
]
},
- "startSpeakingPlan": {
- "description": "This is the plan for when the transfer assistant should start talking.\n\nYou should configure this if the transfer assistant needs different endpointing behavior than the base assistant.\n\nIf this is not set, the transfer assistant will inherit the start speaking plan from the base assistant.",
+ "variableExtractionPlan": {
+ "description": "Plan to extract variables from the tool response",
"allOf": [
{
- "$ref": "#/components/schemas/StartSpeakingPlan"
+ "$ref": "#/components/schemas/VariableExtractionPlan"
}
]
},
- "firstMessageMode": {
- "type": "string",
- "description": "This is the mode for the first message. Default is 'assistant-speaks-first'.\n\nUse:\n- 'assistant-speaks-first' to have the assistant speak first.\n- 'assistant-waits-for-user' to have the assistant wait for the user to speak first.\n- '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.\n\n@default 'assistant-speaks-first'",
- "enum": [
- "assistant-speaks-first",
- "assistant-speaks-first-with-model-generated-message",
- "assistant-waits-for-user"
- ],
- "example": "assistant-speaks-first"
- },
- "maxDurationSeconds": {
- "type": "number",
- "description": "This is the maximum duration in seconds for the transfer assistant conversation.\nAfter this time, the transfer will be cancelled automatically.\n@default 120",
- "minimum": 10,
- "maximum": 43200,
- "example": 120
+ "parameters": {
+ "description": "Static key-value pairs merged into the request body. Values support Liquid templates.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolParameter"
+ }
},
- "backgroundSpeechDenoisingPlan": {
- "description": "This enables filtering of noise and background speech while the user is talking.\n\nFeatures:\n- Smart denoising using Krisp\n- Fourier denoising\n\nSmart denoising can be combined with or used independently of Fourier denoising.\n\nOrder of precedence:\n- Smart denoising\n- Fourier denoising",
+ "function": {
+ "description": "This is the function definition of the tool.",
"allOf": [
{
- "$ref": "#/components/schemas/BackgroundSpeechDenoisingPlan"
+ "$ref": "#/components/schemas/OpenAIFunction"
}
]
},
- "silenceTimeoutSeconds": {
- "type": "number",
- "description": "This is the number of seconds of silence to wait before ending the call. Defaults to 30.\n\n@default 30",
- "minimum": 10,
- "maximum": 3600
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ToolRejectionPlan"
+ }
+ ]
}
},
"required": [
- "model"
+ "type"
]
},
- "TransferCancelToolUserEditable": {
+ "GhlToolMetadata": {
+ "type": "object",
+ "properties": {
+ "workflowId": {
+ "type": "string"
+ },
+ "locationId": {
+ "type": "string"
+ }
+ }
+ },
+ "CreateGhlToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -12539,9 +13824,12 @@
"type": {
"type": "string",
"enum": [
- "transferCancel"
+ "ghl"
],
- "description": "The type of tool. \"transferCancel\" for Transfer Cancel tool. This tool can only be used during warm-transfer-experimental by the transfer assistant to cancel an ongoing transfer and return the call back to the original assistant when the transfer cannot be completed."
+ "description": "The type of tool. \"ghl\" for GHL tool."
+ },
+ "metadata": {
+ "$ref": "#/components/schemas/GhlToolMetadata"
},
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
@@ -12553,15 +13841,27 @@
}
},
"required": [
- "type"
+ "type",
+ "metadata"
]
},
- "TransferSuccessfulToolUserEditable": {
+ "MakeToolMetadata": {
+ "type": "object",
+ "properties": {
+ "scenarioId": {
+ "type": "number"
+ },
+ "triggerHookId": {
+ "type": "number"
+ }
+ }
+ },
+ "CreateMakeToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -12586,9 +13886,12 @@
"type": {
"type": "string",
"enum": [
- "transferSuccessful"
+ "make"
],
- "description": "The type of tool. \"transferSuccessful\" for Transfer Successful tool. This tool can only be used during warm-transfer-experimental by the transfer assistant to confirm that the transfer should proceed and finalize the handoff to the destination."
+ "description": "The type of tool. \"make\" for Make tool."
+ },
+ "metadata": {
+ "$ref": "#/components/schemas/MakeToolMetadata"
},
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
@@ -12600,50 +13903,47 @@
}
},
"required": [
- "type"
+ "type",
+ "metadata"
]
},
- "SummaryPlan": {
+ "CustomMessage": {
"type": "object",
"properties": {
- "messages": {
- "description": "These are the messages used to generate the summary.\n\n@default: ```\n[\n {\n \"role\": \"system\",\n \"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.\"\n },\n {\n \"role\": \"user\",\n \"content\": \"Here is the transcript:\\n\\n{{transcript}}\\n\\n. Here is the ended reason of the call:\\n\\n{{endedReason}}\\n\\n\"\n }\n]```\n\nYou can customize by providing any messages you want.\n\nHere are the template variables available:\n- {{transcript}}: The transcript of the call from `call.artifact.transcript` \n- {{systemPrompt}}: The system prompt of the call from `assistant.model.messages[type=system].content` \n- {{messages}}: The messages of the call from `assistant.model.messages` \n- {{endedReason}}: The ended reason of the call from `call.endedReason`",
+ "contents": {
"type": "array",
+ "description": "This is an alternative to the `content` property. It allows to specify variants of the same content, one per language.\n\nUsage:\n- If your assistants are multilingual, you can provide content for each language.\n- 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.\n\nThis will override the `content` property.",
"items": {
- "type": "object"
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/TextContent",
+ "title": "Text"
+ }
+ ]
}
},
- "enabled": {
- "type": "boolean",
- "description": "This determines whether a summary is generated and stored in `call.analysis.summary`. Defaults to true.\n\nUsage:\n- If you want to disable the summary, set this to false.\n\n@default true"
+ "type": {
+ "type": "string",
+ "description": "This is a custom message.",
+ "enum": [
+ "custom-message"
+ ]
},
- "timeoutSeconds": {
- "type": "number",
- "description": "This is how long the request is tried before giving up. When request times out, `call.analysis.summary` will be empty.\n\nUsage:\n- 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.\n\n@default 5 seconds",
- "minimum": 1,
- "maximum": 60
+ "content": {
+ "type": "string",
+ "description": "This is the content that the assistant will say when this message is triggered.",
+ "maxLength": 1000
}
- }
+ },
+ "required": [
+ "type"
+ ]
},
- "TransferPlan": {
+ "TransferDestinationAssistant": {
"type": "object",
"properties": {
- "mode": {
- "type": "string",
- "description": "This configures how transfer is executed and the experience of the destination party receiving the call.\n\nUsage:\n- `blind-transfer`: The assistant forwards the call to the destination without any message or summary.\n- `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.\n- `warm-transfer-say-message`: The assistant dials the destination, delivers the `message` to the destination party, connects the customer, and leaves the call.\n- `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.\n- `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.\n- `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.\n- `warm-transfer-twiml`: The assistant dials the destination, executes the twiml instructions on the destination call leg, connects the customer, and leaves the call.\n- `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.\n\n@default 'blind-transfer'",
- "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"
- ]
- },
"message": {
- "description": "This is the message the assistant will deliver to the destination party before connecting the customer.\n\nUsage:\n- 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`.",
+ "description": "This is spoken to the customer before connecting them to the destination.\n\nUsage:\n- If this is not provided and transfer tool messages is not provided, default is \"Transferring the call now\".\n- 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.\n\nThis accepts a string or a ToolMessageStart class. Latter is useful if you want to specify multiple messages for different languages through the `contents` field.",
"oneOf": [
{
"type": "string"
@@ -12653,779 +13953,712 @@
}
]
},
- "timeout": {
- "type": "number",
- "description": "This is the timeout in seconds for the warm-transfer-wait-for-operator-to-speak-first-and-then-say-message/summary\n\n@default 60",
- "minimum": 1,
- "maximum": 600,
- "default": 60
- },
- "sipVerb": {
- "type": "object",
- "description": "This specifies the SIP verb to use while transferring the call.\n- 'refer': Uses SIP REFER to transfer the call (default)\n- 'bye': Ends current call with SIP BYE\n- 'dial': Uses SIP DIAL to transfer the call",
- "default": "refer",
+ "type": {
+ "type": "string",
"enum": [
- "refer",
- "bye",
- "dial"
+ "assistant"
]
},
- "dialTimeout": {
- "type": "number",
- "description": "This sets the timeout for the dial operation in seconds. This is the duration the call will ring before timing out.\n\nOnly applicable when `sipVerb='dial'`. Not applicable for SIP REFER or BYE.\n\n@default 60",
- "minimum": 1,
- "maximum": 600,
- "default": 60
- },
- "holdAudioUrl": {
+ "transferMode": {
"type": "string",
- "description": "This is the URL to an audio file played while the customer is on hold during transfer.\n\nUsage:\n- Used only when `mode` is `warm-transfer-experimental`.\n- Used when transferring calls to play hold audio for the customer.\n- Must be a publicly accessible URL to an audio file.\n- Supported formats: MP3 and WAV.\n- If not provided, the default hold audio will be used."
+ "description": "This is the mode to use for the transfer. Defaults to `rolling-history`.\n\n- `rolling-history`: This is the default mode. It keeps the entire conversation history and appends the new assistant's system message on transfer.\n\n Example:\n\n Pre-transfer:\n system: assistant1 system message\n assistant: assistant1 first message\n user: hey, good morning\n assistant: how can i help?\n user: i need help with my account\n assistant: (destination.message)\n\n Post-transfer:\n system: assistant1 system message\n assistant: assistant1 first message\n user: hey, good morning\n assistant: how can i help?\n user: i need help with my account\n assistant: (destination.message)\n system: assistant2 system message\n assistant: assistant2 first message (or model generated if firstMessageMode is set to `assistant-speaks-first-with-model-generated-message`)\n\n- `swap-system-message-in-history`: This replaces the original system message with the new assistant's system message on transfer.\n\n Example:\n\n Pre-transfer:\n system: assistant1 system message\n assistant: assistant1 first message\n user: hey, good morning\n assistant: how can i help?\n user: i need help with my account\n assistant: (destination.message)\n\n Post-transfer:\n system: assistant2 system message\n assistant: assistant1 first message\n user: hey, good morning\n assistant: how can i help?\n user: i need help with my account\n assistant: (destination.message)\n assistant: assistant2 first message (or model generated if firstMessageMode is set to `assistant-speaks-first-with-model-generated-message`)\n\n- `delete-history`: This deletes the entire conversation history on transfer.\n\n Example:\n\n Pre-transfer:\n system: assistant1 system message\n assistant: assistant1 first message\n user: hey, good morning\n assistant: how can i help?\n user: i need help with my account\n assistant: (destination.message)\n\n Post-transfer:\n system: assistant2 system message\n assistant: assistant2 first message\n user: Yes, please\n assistant: how can i help?\n user: i need help with my account\n\n- `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.\n\n Example:\n\n Pre-transfer:\n system: assistant1 system message\n assistant: assistant1 first message\n user: hey, good morning\n assistant: how can i help?\n user: i need help with my account\n transfer-tool\n transfer-tool-result\n assistant: (destination.message)\n\n Post-transfer:\n system: assistant2 system message\n assistant: assistant1 first message\n user: hey, good morning\n assistant: how can i help?\n user: i need help with my account\n assistant: (destination.message)\n assistant: assistant2 first message (or model generated if firstMessageMode is set to `assistant-speaks-first-with-model-generated-message`)\n\n@default 'rolling-history'",
+ "enum": [
+ "rolling-history",
+ "swap-system-message-in-history",
+ "swap-system-message-in-history-and-remove-transfer-tool-messages",
+ "delete-history"
+ ]
},
- "transferCompleteAudioUrl": {
+ "assistantName": {
"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.\nIt can be used to play a custom sound like 'beep' to notify that the transfer is complete.\n\nUsage:\n- Used only when `mode` is `warm-transfer-experimental`.\n- Used when transferring calls to play hold audio for the destination party.\n- Must be a publicly accessible URL to an audio file.\n- Supported formats: MP3 and WAV."
+ "description": "This is the assistant to transfer the call to."
},
- "contextEngineeringPlan": {
- "description": "This is the plan for manipulating the message context before initiating the warm transfer.\nUsage:\n- Used only when `mode` is `warm-transfer-experimental`.\n- These messages will automatically be added to the transferAssistant's system message.\n- If 'none', we will not add any transcript to the transferAssistant's system message.\n- If you want to provide your own messages, use transferAssistant.model.messages instead.\n\n@default { type: 'all' }",
+ "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"
+ ]
+ },
+ "TransferFallbackPlan": {
+ "type": "object",
+ "properties": {
+ "message": {
+ "description": "This is the message the assistant will deliver to the customer if the transfer fails.",
"oneOf": [
{
- "$ref": "#/components/schemas/ContextEngineeringPlanLastNMessages",
- "title": "Last N Messages"
- },
- {
- "$ref": "#/components/schemas/ContextEngineeringPlanNone",
- "title": "None"
+ "type": "string"
},
{
- "$ref": "#/components/schemas/ContextEngineeringPlanAll",
- "title": "All"
- }
- ]
- },
- "twiml": {
- "type": "string",
- "description": "This is the TwiML instructions to execute on the destination call leg before connecting the customer.\n\nUsage:\n- Used only when `mode` is `warm-transfer-twiml`.\n- Supports only `Play`, `Say`, `Gather`, `Hangup` and `Pause` verbs.\n- Maximum length is 4096 characters.\n\nExample:\n```\nHello, transferring a customer to you.\n\nThey called about billing questions.\n```",
- "maxLength": 4096
- },
- "summaryPlan": {
- "description": "This is the plan for generating a summary of the call to present to the destination party.\n\nUsage:\n- 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`.",
- "allOf": [
- {
- "$ref": "#/components/schemas/SummaryPlan"
+ "$ref": "#/components/schemas/CustomMessage"
}
]
},
- "sipHeadersInReferToEnabled": {
+ "endCallEnabled": {
"type": "boolean",
- "description": "This flag includes the sipHeaders from above in the refer to sip uri as url encoded query params.\n\n@default false"
- },
- "fallbackPlan": {
- "description": "This configures the fallback plan when the transfer fails (destination unreachable, busy, or not human).\n\nUsage:\n- Used only when `mode` is `warm-transfer-experimental`.\n- If not provided when using `warm-transfer-experimental`, a default message will be used.",
- "allOf": [
- {
- "$ref": "#/components/schemas/TransferFallbackPlan"
- }
- ]
+ "description": "This controls what happens after delivering the failure message to the customer.\n- true: End the call after delivering the failure message (default)\n- false: Keep the assistant on the call to continue handling the customer's request\n\n@default true",
+ "default": true
}
},
"required": [
- "mode"
+ "message"
]
},
- "TransferDestinationNumber": {
+ "TransferAssistantModel": {
"type": "object",
"properties": {
- "message": {
- "description": "This is spoken to the customer before connecting them to the destination.\n\nUsage:\n- If this is not provided and transfer tool messages is not provided, default is \"Transferring the call now\".\n- 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.\n\nThis accepts a string or a ToolMessageStart class. Latter is useful if you want to specify multiple messages for different languages through the `contents` field.",
- "oneOf": [
- {
- "type": "string"
- },
- {
- "$ref": "#/components/schemas/CustomMessage"
- }
- ]
- },
- "type": {
+ "provider": {
"type": "string",
+ "description": "The model provider for the transfer assistant",
"enum": [
- "number"
+ "openai",
+ "anthropic",
+ "google",
+ "custom-llm"
]
},
- "numberE164CheckEnabled": {
- "type": "boolean",
- "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.\n\nUse cases:\n- `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.\n- `true` (default): To allow only E164 numbers like `+14155551234`. This is standard for PSTN calls.\n\nIf `false`, the `number` is still required to only contain alphanumeric characters (regex: `/^\\+?[a-zA-Z0-9]+$/`).\n\n@default true (E164 check is enabled)",
- "default": true
- },
- "number": {
- "type": "string",
- "description": "This is the phone number to transfer the call to.",
- "minLength": 3,
- "maxLength": 40
- },
- "extension": {
- "type": "string",
- "description": "This is the extension to dial after transferring the call to the `number`.",
- "minLength": 1,
- "maxLength": 10
- },
- "callerId": {
+ "model": {
"type": "string",
- "description": "This is the caller ID to use when transferring the call to the `number`.\n\nUsage:\n- If not provided, the caller ID will be the number the call is coming **from**.\n Example: a customer with number +14151111111 calls in to and the assistant transfers out to +16470000000. +16470000000 will see +14151111111 as the caller.\n For inbound calls, the caller ID is the customer's number. For outbound calls, the caller ID is the phone number of the assistant.\n- To change this behavior, provide a `callerId`.\n- Set to '{{customer.number}}' to always use the customer's number as the caller ID.\n- Set to '{{phoneNumber.number}}' to always use the phone number of the assistant as the caller ID.\n- 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.\n\nFor Twilio, you can read up more here: https://www.twilio.com/docs/voice/twiml/dial#callerid",
- "maxLength": 40
+ "description": "The model name - must be compatible with the selected provider",
+ "example": "gpt-4o"
},
- "transferPlan": {
- "description": "This configures how transfer is executed and the experience of the destination party receiving the call. Defaults to `blind-transfer`.\n\n@default `transferPlan.mode='blind-transfer'`",
- "allOf": [
- {
- "$ref": "#/components/schemas/TransferPlan"
- }
- ]
+ "messages": {
+ "type": "array",
+ "description": "These are the messages used to configure the transfer assistant.\n\n@default: ```\n[\n {\n role: 'system',\n content: 'You are a transfer assistant designed to facilitate call transfers. Your core responsibility is to manage the transfer process efficiently.\\n\\n## Core Responsibility\\n- Facilitate the transfer process by using transferSuccessful or transferCancel tools appropriately\\n\\n## When to Respond\\n- Answer questions about the transfer process or provide summaries when specifically asked by the operator\\n- Respond to direct questions about the current transfer situation\\n\\n## What to Avoid\\n- Do not discuss topics unrelated to the transfer\\n- Do not engage in general conversation\\n- Keep all interactions focused on facilitating the transfer\\n\\n## Transfer Tools\\n- Use transferSuccessful when the transfer should proceed\\n- Use transferCancel when the transfer cannot be completed\\n\\nStay focused on your core responsibility of facilitating transfers.'\n }\n]```\n\n**Default Behavior:** If you don't provide any messages or don't include a system message as the first message, the default system message above will be automatically added.\n\n**Override Default:** To replace the default system message, provide your own system message as the first message in the array.\n\n**Add Context:** You can provide additional messages (user, assistant, etc.) to add context while keeping the default system message, or combine them with your custom system message."
},
- "description": {
- "type": "string",
- "description": "This is the description of the destination, used by the AI to choose when and how to transfer the call."
+ "tools": {
+ "type": "array",
+ "description": "Tools available to the transfer assistant during warm-transfer-experimental.\n\n**Default Behavior:** The transfer assistant will ALWAYS have both `transferSuccessful` and `transferCancel` tools automatically added, regardless of what you provide here.\n\n**Default Tools:**\n- `transferSuccessful`: \"Call this function to confirm the transfer is successful and connect the customer. Use this when you detect a human has answered and is ready to take the call.\"\n- `transferCancel`: \"Call this function to cancel the transfer when no human answers or transfer should not proceed. Use this when you detect voicemail, busy signal, or no answer.\"\n\n**Customization:** You can override the default tools by providing `transferSuccessful` and/or `transferCancel` tools with custom `function` or `messages` configurations.\n\n**Additional Tools:** You can also provide other tools, but the two transfer tools will always be present and available to the assistant."
}
},
"required": [
- "type",
- "number"
+ "provider",
+ "model"
]
},
- "TransferDestinationSip": {
+ "RegexOption": {
"type": "object",
"properties": {
- "message": {
- "description": "This is spoken to the customer before connecting them to the destination.\n\nUsage:\n- If this is not provided and transfer tool messages is not provided, default is \"Transferring the call now\".\n- 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.\n\nThis accepts a string or a ToolMessageStart class. Latter is useful if you want to specify multiple messages for different languages through the `contents` field.",
- "oneOf": [
- {
- "type": "string"
- },
- {
- "$ref": "#/components/schemas/CustomMessage"
- }
- ]
- },
"type": {
"type": "string",
+ "description": "This is the type of the regex option. Options are:\n- `ignore-case`: Ignores the case of the text being matched. Add\n- `whole-word`: Matches whole words only.\n- `multi-line`: Matches across multiple lines.",
"enum": [
- "sip"
- ]
- },
- "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`.\n\nUsage:\n- If not provided, the caller ID will be determined by the SIP infrastructure.\n- Set to '{{customer.number}}' to always use the customer's number as the caller ID.\n- Set to '{{phoneNumber.number}}' to always use the phone number of the assistant as the caller ID.\n- Set to any E164 number to always use that number as the caller ID.\n\nOnly applicable when `transferPlan.sipVerb='dial'`. Not applicable for SIP REFER.",
- "maxLength": 40
- },
- "transferPlan": {
- "description": "This configures how transfer is executed and the experience of the destination party receiving the call. Defaults to `blind-transfer`.\n\n@default `transferPlan.mode='blind-transfer'`",
- "allOf": [
- {
- "$ref": "#/components/schemas/TransferPlan"
- }
+ "ignore-case",
+ "whole-word",
+ "multi-line"
]
},
- "sipHeaders": {
- "type": "object",
- "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."
+ "enabled": {
+ "type": "boolean",
+ "description": "This is whether to enable the option.\n\n@default false"
}
},
"required": [
"type",
- "sipUri"
+ "enabled"
]
},
- "CreateTransferCallToolDTO": {
+ "AssistantCustomEndpointingRule": {
"type": "object",
"properties": {
- "messages": {
- "type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/ToolMessageStart",
- "title": "ToolMessageStart"
- },
- {
- "$ref": "#/components/schemas/ToolMessageComplete",
- "title": "ToolMessageComplete"
- },
- {
- "$ref": "#/components/schemas/ToolMessageFailed",
- "title": "ToolMessageFailed"
- },
- {
- "$ref": "#/components/schemas/ToolMessageDelayed",
- "title": "ToolMessageDelayed"
- }
- ]
- }
- },
"type": {
"type": "string",
+ "description": "This endpointing rule is based on the last assistant message before customer started speaking.\n\nFlow:\n- Assistant speaks\n- Customer starts speaking\n- Customer transcription comes in\n- This rule is evaluated on the last assistant message\n- If a match is found based on `regex`, the endpointing timeout is set to `timeoutSeconds`\n\nUsage:\n- If you have yes/no questions in your use case like \"are you interested in a loan?\", you can set a shorter timeout.\n- 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.",
"enum": [
- "transferCall"
+ "assistant"
]
},
- "destinations": {
+ "regex": {
+ "type": "string",
+ "description": "This is the regex pattern to match.\n\nNote:\n- This works by using the `RegExp.test` method in Node.JS. Eg. `/hello/.test(\"hello there\")` will return `true`.\n\nHot tip:\n- In JavaScript, escape `\\` when sending the regex pattern. Eg. `\"hello\\sthere\"` will be sent over the wire as `\"hellosthere\"`. Send `\"hello\\\\sthere\"` instead.\n- `RegExp.test` does substring matching, so `/cat/.test(\"I love cats\")` will return `true`. To do full string matching, send \"^cat$\"."
+ },
+ "regexOptions": {
+ "description": "These are the options for the regex match. Defaults to all disabled.\n\n@default []",
"type": "array",
- "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.",
"items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/TransferDestinationAssistant",
- "title": "Assistant"
- },
- {
- "$ref": "#/components/schemas/TransferDestinationNumber",
- "title": "Number"
- },
- {
- "$ref": "#/components/schemas/TransferDestinationSip",
- "title": "Sip"
- }
- ]
+ "$ref": "#/components/schemas/RegexOption"
}
},
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
- "allOf": [
- {
- "$ref": "#/components/schemas/ToolRejectionPlan"
- }
- ]
+ "timeoutSeconds": {
+ "type": "number",
+ "description": "This is the endpointing timeout in seconds, if the rule is matched.",
+ "minimum": 0,
+ "maximum": 15
}
},
"required": [
- "type"
+ "type",
+ "regex",
+ "timeoutSeconds"
]
},
- "ContextEngineeringPlanLastNMessages": {
+ "CustomerCustomEndpointingRule": {
"type": "object",
"properties": {
"type": {
"type": "string",
+ "description": "This endpointing rule is based on current customer message as they are speaking.\n\nFlow:\n- Assistant speaks\n- Customer starts speaking\n- Customer transcription comes in\n- This rule is evaluated on the current customer transcription\n- If a match is found based on `regex`, the endpointing timeout is set to `timeoutSeconds`\n\nUsage:\n- If you want to wait longer while customer is speaking numbers, you can set a longer timeout.",
"enum": [
- "lastNMessages"
+ "customer"
]
},
- "maxMessages": {
+ "regex": {
+ "type": "string",
+ "description": "This is the regex pattern to match.\n\nNote:\n- This works by using the `RegExp.test` method in Node.JS. Eg. `/hello/.test(\"hello there\")` will return `true`.\n\nHot tip:\n- In JavaScript, escape `\\` when sending the regex pattern. Eg. `\"hello\\sthere\"` will be sent over the wire as `\"hellosthere\"`. Send `\"hello\\\\sthere\"` instead.\n- `RegExp.test` does substring matching, so `/cat/.test(\"I love cats\")` will return `true`. To do full string matching, send \"^cat$\"."
+ },
+ "regexOptions": {
+ "description": "These are the options for the regex match. Defaults to all disabled.\n\n@default []",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/RegexOption"
+ }
+ },
+ "timeoutSeconds": {
"type": "number",
- "description": "This is the maximum number of messages to include in the context engineering plan.",
- "minimum": 0
+ "description": "This is the endpointing timeout in seconds, if the rule is matched.",
+ "minimum": 0,
+ "maximum": 15
}
},
"required": [
"type",
- "maxMessages"
+ "regex",
+ "timeoutSeconds"
]
},
- "ContextEngineeringPlanNone": {
+ "BothCustomEndpointingRule": {
"type": "object",
"properties": {
"type": {
"type": "string",
+ "description": "This endpointing rule is based on both the last assistant message and the current customer message as they are speaking.\n\nFlow:\n- Assistant speaks\n- Customer starts speaking\n- Customer transcription comes in\n- This rule is evaluated on the last assistant message and the current customer transcription\n- If assistant message matches `assistantRegex` AND customer message matches `customerRegex`, the endpointing timeout is set to `timeoutSeconds`\n\nUsage:\n- If you want to wait longer while customer is speaking numbers, you can set a longer timeout.",
"enum": [
- "none"
+ "both"
]
+ },
+ "assistantRegex": {
+ "type": "string",
+ "description": "This is the regex pattern to match the assistant's message.\n\nNote:\n- This works by using the `RegExp.test` method in Node.JS. Eg. `/hello/.test(\"hello there\")` will return `true`.\n\nHot tip:\n- In JavaScript, escape `\\` when sending the regex pattern. Eg. `\"hello\\sthere\"` will be sent over the wire as `\"hellosthere\"`. Send `\"hello\\\\sthere\"` instead.\n- `RegExp.test` does substring matching, so `/cat/.test(\"I love cats\")` will return `true`. To do full string matching, send \"^cat$\"."
+ },
+ "assistantRegexOptions": {
+ "description": "These are the options for the assistant's message regex match. Defaults to all disabled.\n\n@default []",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/RegexOption"
+ }
+ },
+ "customerRegex": {
+ "type": "string"
+ },
+ "customerRegexOptions": {
+ "description": "These are the options for the customer's message regex match. Defaults to all disabled.\n\n@default []",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/RegexOption"
+ }
+ },
+ "timeoutSeconds": {
+ "type": "number",
+ "description": "This is the endpointing timeout in seconds, if the rule is matched.",
+ "minimum": 0,
+ "maximum": 15
}
},
"required": [
- "type"
+ "type",
+ "assistantRegex",
+ "customerRegex",
+ "timeoutSeconds"
]
},
- "ContextEngineeringPlanAll": {
+ "VapiSmartEndpointingPlan": {
"type": "object",
"properties": {
- "type": {
+ "provider": {
"type": "string",
+ "description": "This is the provider for the smart endpointing plan.",
"enum": [
- "all"
- ]
+ "vapi",
+ "livekit",
+ "custom-endpointing-model"
+ ],
+ "example": "vapi"
}
},
"required": [
- "type"
+ "provider"
]
},
- "ContextEngineeringPlanUserAndAssistantMessages": {
+ "LivekitSmartEndpointingPlan": {
"type": "object",
"properties": {
- "type": {
+ "provider": {
"type": "string",
+ "description": "This is the provider for the smart endpointing plan.",
"enum": [
- "userAndAssistantMessages"
+ "vapi",
+ "livekit",
+ "custom-endpointing-model"
+ ],
+ "example": "livekit"
+ },
+ "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.\n\nThis 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).\n\nA 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.\n\nUnder the hood, this is parsed into a mathjs expression. Whatever you use to write your expression needs to be valid with respect to mathjs\n\n@default \"20 + 500 * sqrt(x) + 2500 * x^3\"",
+ "examples": [
+ "70 + 4000 * x",
+ "200 + 8000 * x",
+ "4000 * (1 - cos(pi * x))"
]
}
},
"required": [
- "type"
+ "provider"
]
},
- "HandoffDestinationAssistant": {
+ "CustomEndpointingModelSmartEndpointingPlan": {
"type": "object",
"properties": {
- "type": {
+ "provider": {
"type": "string",
+ "description": "This is the provider for the smart endpointing plan. Use `custom-endpointing-model` for custom endpointing providers that are not natively supported.",
"enum": [
- "assistant"
- ]
- },
- "contextEngineeringPlan": {
- "description": "This is the plan for manipulating the message context before handing off the call to the next assistant.",
- "oneOf": [
- {
- "$ref": "#/components/schemas/ContextEngineeringPlanLastNMessages",
- "title": "Last N Messages"
- },
- {
- "$ref": "#/components/schemas/ContextEngineeringPlanNone",
- "title": "None"
- },
- {
- "$ref": "#/components/schemas/ContextEngineeringPlanAll",
- "title": "All"
- },
- {
- "$ref": "#/components/schemas/ContextEngineeringPlanUserAndAssistantMessages",
- "title": "User And Assistant Messages"
- }
- ]
- },
- "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": {
- "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.",
- "allOf": [
- {
- "$ref": "#/components/schemas/CreateAssistantDTO"
- }
- ]
- },
- "variableExtractionPlan": {
- "description": "This is the variable extraction plan for the handoff tool.",
- "allOf": [
- {
- "$ref": "#/components/schemas/VariableExtractionPlan"
- }
- ]
+ "vapi",
+ "livekit",
+ "custom-endpointing-model"
+ ],
+ "example": "custom-endpointing-model"
},
- "assistantOverrides": {
- "description": "These are the assistant overrides to apply to the destination assistant.",
+ "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`.\n\nRequest Example:\n\nPOST https://{server.url}\nContent-Type: application/json\n\n{\n \"message\": {\n \"type\": \"call.endpointing.request\",\n \"messages\": [\n {\n \"role\": \"user\",\n \"message\": \"Hello, how are you?\",\n \"time\": 1234567890,\n \"secondsFromStart\": 0\n }\n ],\n ...other metadata about the call...\n }\n}\n\nResponse Expected:\n{\n \"timeoutSeconds\": 0.5\n}\n\nThe 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).",
"allOf": [
{
- "$ref": "#/components/schemas/AssistantOverrides"
+ "$ref": "#/components/schemas/Server"
}
]
- },
- "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"
+ "provider"
]
},
- "HandoffDestinationDynamic": {
+ "TranscriptionEndpointingPlan": {
"type": "object",
"properties": {
- "type": {
- "type": "string",
- "enum": [
- "dynamic"
- ]
+ "onPunctuationSeconds": {
+ "type": "number",
+ "description": "The minimum number of seconds to wait after transcription ending with punctuation before sending a request to the model. Defaults to 0.1.\n\nThis setting exists because the transcriber punctuates the transcription when it's more confident that customer has completed a thought.\n\n@default 0.1",
+ "minimum": 0,
+ "maximum": 3,
+ "example": 0.1
},
- "server": {
- "description": "This is where Vapi will send the handoff-destination-request webhook in a dynamic handoff.\n\nThe order of precedence is:\n\n1. tool.server.url\n2. assistant.server.url\n3. phoneNumber.server.url\n4. org.server.url",
- "allOf": [
- {
- "$ref": "#/components/schemas/Server"
- }
- ]
+ "onNoPunctuationSeconds": {
+ "type": "number",
+ "description": "The minimum number of seconds to wait after transcription ending without punctuation before sending a request to the model. Defaults to 1.5.\n\nThis 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.\n\n@default 1.5",
+ "minimum": 0,
+ "maximum": 3,
+ "example": 1.5
},
- "description": {
- "type": "string",
- "description": "This is the description of the destination, used by the AI to choose when and how to transfer the call."
+ "onNumberSeconds": {
+ "type": "number",
+ "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.\n\nThis 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.\n\n@default 0.5",
+ "minimum": 0,
+ "maximum": 3,
+ "example": 0.5
}
- },
- "required": [
- "type"
- ]
+ }
},
- "SquadMemberDTO": {
+ "StartSpeakingPlan": {
"type": "object",
"properties": {
- "assistantDestinations": {
+ "waitSeconds": {
+ "type": "number",
+ "description": "This is how long assistant waits before speaking. Defaults to 0.4.\n\nThis 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.\n\nExample:\n- If model generates tokens and voice generates bytes within 100ms, the pipeline still waits 300ms before outputting speech.\n\nUsage:\n- If the customer is taking long pauses, set this to a higher value.\n- If the assistant is accidentally jumping in too much, set this to a higher value.\n\n@default 0.4",
+ "minimum": 0,
+ "maximum": 5,
+ "example": 0.4
+ },
+ "smartEndpointingEnabled": {
+ "example": false,
+ "deprecated": true,
+ "oneOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "string",
+ "enum": [
+ "livekit"
+ ]
+ }
+ ]
+ },
+ "smartEndpointingPlan": {
+ "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.\n\nIf this is set, it will override and take precedence over `transcriptionEndpointingPlan`.\nThis plan will still be overridden by any matching `customEndpointingRules`.\n\nIf this is not set, the system will automatically use the transcriber's built-in endpointing capabilities if available.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/VapiSmartEndpointingPlan",
+ "title": "Vapi"
+ },
+ {
+ "$ref": "#/components/schemas/LivekitSmartEndpointingPlan",
+ "title": "Livekit"
+ },
+ {
+ "$ref": "#/components/schemas/CustomEndpointingModelSmartEndpointingPlan",
+ "title": "Custom Endpointing Model"
+ }
+ ]
+ },
+ "customEndpointingRules": {
"type": "array",
+ "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.\n\nUsage:\n- If you have yes/no questions like \"are you interested in a loan?\", you can set a shorter timeout.\n- 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.\n- If you want to wait longer while customer is enumerating a list of numbers, you can set a longer timeout.\n\nThese rules have the highest precedence and will override both `smartEndpointingPlan` and `transcriptionEndpointingPlan` when a rule is matched.\n\nThe rules are evaluated in order and the first one that matches will be used.\n\nOrder of precedence for endpointing:\n1. customEndpointingRules (if any match)\n2. smartEndpointingPlan (if set)\n3. transcriptionEndpointingPlan\n\n@default []",
"items": {
"oneOf": [
{
- "$ref": "#/components/schemas/TransferDestinationAssistant",
- "title": "Transfer Destination"
+ "$ref": "#/components/schemas/AssistantCustomEndpointingRule",
+ "title": "Assistant"
},
{
- "$ref": "#/components/schemas/HandoffDestinationAssistant",
- "title": "Handoff Destination"
+ "$ref": "#/components/schemas/CustomerCustomEndpointingRule",
+ "title": "Customer"
+ },
+ {
+ "$ref": "#/components/schemas/BothCustomEndpointingRule",
+ "title": "Both"
}
]
}
},
- "assistantId": {
- "type": "string",
- "nullable": true,
- "description": "This is the assistant that will be used for the call. To use a transient assistant, use `assistant` instead."
- },
- "assistant": {
- "description": "This is the assistant that will be used for the call. To use an existing assistant, use `assistantId` instead.",
- "allOf": [
- {
- "$ref": "#/components/schemas/CreateAssistantDTO"
- }
- ]
- },
- "assistantOverrides": {
- "description": "This can be used to override the assistant's settings and provide values for it's template variables.",
+ "transcriptionEndpointingPlan": {
+ "description": "This determines how a customer speech is considered done (endpointing) using the transcription of customer's speech.\n\nOnce an endpoint is triggered, the request is sent to `assistant.model`.\n\nNote: 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.\nThis plan will also be overridden by any matching `customEndpointingRules`.",
"allOf": [
{
- "$ref": "#/components/schemas/AssistantOverrides"
+ "$ref": "#/components/schemas/TranscriptionEndpointingPlan"
}
]
}
}
},
- "CreateSquadDTO": {
+ "SmartDenoisingPlan": {
"type": "object",
"properties": {
- "name": {
- "type": "string",
- "description": "This is the name of the squad."
- },
- "members": {
- "description": "This is the list of assistants that make up the squad.\n\nThe call will start with the first assistant in the list.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/SquadMemberDTO"
- }
- },
- "membersOverrides": {
- "description": "This can be used to override all the assistants' settings and provide values for their template variables.\n\nBoth `membersOverrides` and `members[n].assistantOverrides` can be used together. First, `members[n].assistantOverrides` is applied. Then, `membersOverrides` is applied as a global override.",
- "allOf": [
- {
- "$ref": "#/components/schemas/AssistantOverrides"
- }
- ]
+ "enabled": {
+ "type": "boolean",
+ "description": "Whether smart denoising using Krisp is enabled.",
+ "default": true
}
- },
- "required": [
- "members"
- ]
+ }
},
- "HandoffDestinationSquad": {
+ "FourierDenoisingPlan": {
"type": "object",
"properties": {
- "type": {
- "type": "string",
- "enum": [
- "squad"
- ]
+ "enabled": {
+ "type": "boolean",
+ "description": "Whether Fourier denoising is enabled. Note that this is experimental and may not work as expected.",
+ "default": false
},
- "contextEngineeringPlan": {
- "description": "This is the plan for manipulating the message context before handing off the call to the squad.",
- "oneOf": [
- {
- "$ref": "#/components/schemas/ContextEngineeringPlanLastNMessages",
- "title": "Last N Messages"
- },
- {
- "$ref": "#/components/schemas/ContextEngineeringPlanNone",
- "title": "None"
- },
- {
- "$ref": "#/components/schemas/ContextEngineeringPlanAll",
- "title": "All"
- },
- {
- "$ref": "#/components/schemas/ContextEngineeringPlanUserAndAssistantMessages",
- "title": "User And Assistant Messages"
- }
- ]
+ "mediaDetectionEnabled": {
+ "type": "boolean",
+ "description": "Whether automatic media detection is enabled. When enabled, the filter will automatically\ndetect consistent background TV/music/radio and switch to more aggressive filtering settings.\nOnly applies when enabled is true.",
+ "example": true,
+ "default": true
},
- "squadId": {
- "type": "string",
- "description": "This is the squad id to transfer the call to."
+ "staticThreshold": {
+ "type": "number",
+ "description": "Static threshold in dB used as fallback when no baseline is established.",
+ "example": -35,
+ "minimum": -80,
+ "maximum": 0,
+ "default": -35
},
- "squad": {
- "description": "This is a transient squad to transfer the call to.",
- "allOf": [
- {
- "$ref": "#/components/schemas/CreateSquadDTO"
- }
- ]
+ "baselineOffsetDb": {
+ "type": "number",
+ "description": "How far below the rolling baseline to filter audio, in dB.\nLower values (e.g., -10) are more aggressive, higher values (e.g., -20) are more conservative.",
+ "example": -15,
+ "minimum": -30,
+ "maximum": -5,
+ "default": -15
},
- "entryAssistantName": {
- "type": "string",
- "description": "This is the name of the entry assistant to start with when handing off to the squad.\nIf not provided, the first member of the squad will be used."
+ "windowSizeMs": {
+ "type": "number",
+ "description": "Rolling window size in milliseconds for calculating the audio baseline.\nLarger windows adapt more slowly but are more stable.",
+ "example": 3000,
+ "minimum": 1000,
+ "maximum": 30000,
+ "default": 3000
},
- "variableExtractionPlan": {
- "description": "This is the variable extraction plan for the handoff tool.",
+ "baselinePercentile": {
+ "type": "number",
+ "description": "Percentile to use for baseline calculation (1-99).\nHigher percentiles (e.g., 85) focus on louder speech, lower percentiles (e.g., 50) include quieter speech.",
+ "example": 85,
+ "minimum": 1,
+ "maximum": 99,
+ "default": 85
+ }
+ }
+ },
+ "BackgroundSpeechDenoisingPlan": {
+ "type": "object",
+ "properties": {
+ "smartDenoisingPlan": {
+ "description": "Whether smart denoising using Krisp is enabled.",
"allOf": [
{
- "$ref": "#/components/schemas/VariableExtractionPlan"
+ "$ref": "#/components/schemas/SmartDenoisingPlan"
}
]
},
- "squadOverrides": {
- "description": "These are the overrides to apply to the squad configuration.\nMaps to squad-level membersOverrides.",
+ "fourierDenoisingPlan": {
+ "description": "Whether Fourier denoising is enabled. Note that this is experimental and may not work as expected.\n\nThis can be combined with smart denoising, and will be run afterwards.",
"allOf": [
{
- "$ref": "#/components/schemas/AssistantOverrides"
+ "$ref": "#/components/schemas/FourierDenoisingPlan"
}
]
- },
- "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"
- ]
+ }
},
- "CreateHandoffToolDTO": {
+ "TransferAssistant": {
"type": "object",
"properties": {
- "messages": {
- "type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/ToolMessageStart",
- "title": "ToolMessageStart"
- },
- {
- "$ref": "#/components/schemas/ToolMessageComplete",
- "title": "ToolMessageComplete"
- },
- {
- "$ref": "#/components/schemas/ToolMessageFailed",
- "title": "ToolMessageFailed"
- },
- {
- "$ref": "#/components/schemas/ToolMessageDelayed",
- "title": "ToolMessageDelayed"
- }
- ]
- }
- },
- "type": {
- "type": "string",
- "description": "This is the type of the tool.\nWhen you're using handoff tool, we recommend adding this to your system prompt\n---\n# System context\n\nYou are part of a multi-agent system designed to make agent coordination and execution easy. Agents uses two primary abstraction: **Agents** and **Handoffs**. An agent encompasses instructions and tools and can hand off a conversation to another agent when appropriate. Handoffs are achieved by calling a handoff function, generally named `handoff_to_`. Handoffs between agents are handled seamlessly in the background; do not mention or draw attention to these handoffs in your conversation with the user.\n\n# Agent context\n\n{put your agent system prompt here}\n---",
- "enum": [
- "handoff"
- ]
- },
- "defaultResult": {
+ "name": {
"type": "string",
- "description": "This is the default local tool result message used when no runtime handoff result override is returned."
- },
- "destinations": {
- "type": "array",
- "description": "These are the destinations that the call can be handed off to.\n\nUsage:\n1. Single destination\n\nUse `assistantId` to handoff the call to a saved assistant, or `assistantName` to handoff the call to an assistant in the same squad.\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\", // or \"assistantName\": \"Assistant123\"\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\n2. Multiple destinations\n\n2.1. Multiple Tools, Each With One Destination (OpenAI recommended)\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\",\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n },\n ],\n },\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-456\",\n \"description\": \"customer wants to be handed off to assistant-456\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\n2.2. One Tool, Multiple Destinations (Anthropic recommended)\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\",\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n },\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-456\",\n \"description\": \"customer wants to be handed off to assistant-456\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\n3. Dynamic destination\n\n3.1 To determine the destination dynamically, supply a `dynamic` handoff destination type and a `server` object.\n VAPI will send a handoff-destination-request webhook to the `server.url`.\n The response from the server will be used as the destination (if valid).\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"dynamic\",\n \"server\": {\n \"url\": \"https://example.com\"\n }\n }\n ],\n }\n ]\n}\n```\n\n3.2. To pass custom parameters to the server, you can use the `function` object.\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"dynamic\",\n \"server\": {\n \"url\": \"https://example.com\"\n },\n }\n ],\n \"function\": {\n \"name\": \"handoff\",\n \"description\": \"Call this function when the customer is ready to be handed off to the next assistant\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"destination\": {\n \"type\": \"string\",\n \"description\": \"Use dynamic when customer is ready to be handed off to the next assistant\",\n \"enum\": [\"dynamic\"]\n },\n \"customerAreaCode\": {\n \"type\": \"number\",\n \"description\": \"Area code of the customer\"\n },\n \"customerIntent\": {\n \"type\": \"string\",\n \"enum\": [\"new-customer\", \"existing-customer\"],\n \"description\": \"Use new-customer when customer is a new customer, existing-customer when customer is an existing customer\"\n },\n \"customerSentiment\": {\n \"type\": \"string\",\n \"enum\": [\"positive\", \"negative\", \"neutral\"],\n \"description\": \"Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral\"\n }\n }\n }\n }\n }\n ]\n}\n```\n\nThe properties `customerAreaCode`, `customerIntent`, and `customerSentiment` will be passed to the server in the webhook request body.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/HandoffDestinationAssistant",
- "title": "Assistant"
- },
- {
- "$ref": "#/components/schemas/HandoffDestinationDynamic",
- "title": "Dynamic"
- },
- {
- "$ref": "#/components/schemas/HandoffDestinationSquad",
- "title": "Squad"
- }
- ]
- }
+ "description": "Optional name for the transfer assistant",
+ "maxLength": 100,
+ "default": "transfer-assistant",
+ "example": "Sales Transfer Assistant"
},
- "function": {
- "description": "This is the optional function definition that will be passed to the LLM.\nIf this is not defined, we will construct this based on the other properties.\n\nFor example, given the following tools definition:\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\",\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n },\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-456\",\n \"description\": \"customer wants to be handed off to assistant-456\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\nWe will construct the following function definition:\n```json\n{\n \"function\": {\n \"name\": \"handoff_to_assistant-123\",\n \"description\": \"\n Use this function to handoff the call to the next assistant.\n Only use it when instructions explicitly ask you to use the handoff_to_assistant function.\n DO NOT call this function unless you are instructed to do so.\n Here are the destinations you can handoff the call to:\n 1. assistant-123. When: customer wants to be handed off to assistant-123\n 2. assistant-456. When: customer wants to be handed off to assistant-456\n \",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"destination\": {\n \"type\": \"string\",\n \"description\": \"Options: assistant-123 (customer wants to be handed off to assistant-123), assistant-456 (customer wants to be handed off to assistant-456)\",\n \"enum\": [\"assistant-123\", \"assistant-456\"]\n },\n },\n \"required\": [\"destination\"]\n }\n }\n}\n```\n\nTo override this function, please provide an OpenAI function definition and refer to it in the system prompt.\nYou may override parts of the function definition (i.e. you may only want to change the function name for your prompt).\nIf 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`.\n\nTo pass custom parameters to the server in a dynamic handoff, you can use the function parameters, with `dynamic` as the destination.\n```json\n{\n \"function\": {\n \"name\": \"dynamic_handoff\",\n \"description\": \"\n Call this function when the customer is ready to be handed off to the next assistant\n \",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"destination\": {\n \"type\": \"string\",\n \"enum\": [\"dynamic\"]\n },\n \"customerAreaCode\": {\n \"type\": \"number\",\n \"description\": \"Area code of the customer\"\n },\n \"customerIntent\": {\n \"type\": \"string\",\n \"enum\": [\"new-customer\", \"existing-customer\"],\n \"description\": \"Use new-customer when customer is a new customer, existing-customer when customer is an existing customer\"\n },\n \"customerSentiment\": {\n \"type\": \"string\",\n \"enum\": [\"positive\", \"negative\", \"neutral\"],\n \"description\": \"Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral\"\n }\n },\n \"required\": [\"destination\", \"customerAreaCode\", \"customerIntent\", \"customerSentiment\"]\n }\n }\n}\n```",
+ "model": {
+ "description": "Model configuration for the transfer assistant",
"allOf": [
{
- "$ref": "#/components/schemas/OpenAIFunction"
+ "$ref": "#/components/schemas/TransferAssistantModel"
}
]
},
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
- "allOf": [
+ "voice": {
+ "description": "These are the options for the transfer assistant's voice.",
+ "oneOf": [
{
- "$ref": "#/components/schemas/ToolRejectionPlan"
+ "$ref": "#/components/schemas/AzureVoice",
+ "title": "AzureVoice"
+ },
+ {
+ "$ref": "#/components/schemas/CartesiaVoice",
+ "title": "CartesiaVoice"
+ },
+ {
+ "$ref": "#/components/schemas/CustomVoice",
+ "title": "CustomVoice"
+ },
+ {
+ "$ref": "#/components/schemas/DeepgramVoice",
+ "title": "DeepgramVoice"
+ },
+ {
+ "$ref": "#/components/schemas/ElevenLabsVoice",
+ "title": "ElevenLabsVoice"
+ },
+ {
+ "$ref": "#/components/schemas/HumeVoice",
+ "title": "HumeVoice"
+ },
+ {
+ "$ref": "#/components/schemas/LMNTVoice",
+ "title": "LMNTVoice"
+ },
+ {
+ "$ref": "#/components/schemas/NeuphonicVoice",
+ "title": "NeuphonicVoice"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAIVoice",
+ "title": "OpenAIVoice"
+ },
+ {
+ "$ref": "#/components/schemas/PlayHTVoice",
+ "title": "PlayHTVoice"
+ },
+ {
+ "$ref": "#/components/schemas/WellSaidVoice",
+ "title": "WellSaidVoice"
+ },
+ {
+ "$ref": "#/components/schemas/RimeAIVoice",
+ "title": "RimeAIVoice"
+ },
+ {
+ "$ref": "#/components/schemas/SmallestAIVoice",
+ "title": "SmallestAIVoice"
+ },
+ {
+ "$ref": "#/components/schemas/TavusVoice",
+ "title": "TavusVoice"
+ },
+ {
+ "$ref": "#/components/schemas/VapiVoice",
+ "title": "VapiVoice"
+ },
+ {
+ "$ref": "#/components/schemas/SesameVoice",
+ "title": "SesameVoice"
+ },
+ {
+ "$ref": "#/components/schemas/InworldVoice",
+ "title": "InworldVoice"
+ },
+ {
+ "$ref": "#/components/schemas/MinimaxVoice",
+ "title": "MinimaxVoice"
+ },
+ {
+ "$ref": "#/components/schemas/XaiVoice",
+ "title": "XaiVoice"
+ },
+ {
+ "$ref": "#/components/schemas/MicrosoftVoice",
+ "title": "MicrosoftVoice"
}
]
- }
- },
- "required": [
- "type"
- ]
- },
- "CreateCustomKnowledgeBaseDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "description": "This knowledge base is bring your own knowledge base implementation.",
- "enum": [
- "custom-knowledge-base"
- ]
},
- "server": {
- "description": "This is where the knowledge base request will be sent.\n\nRequest Example:\n\nPOST https://{server.url}\nContent-Type: application/json\n\n{\n \"messsage\": {\n \"type\": \"knowledge-base-request\",\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": \"Why is ocean blue?\"\n }\n ],\n ...other metadata about the call...\n }\n}\n\nResponse Expected:\n```\n{\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"The ocean is blue because water absorbs everything but blue.\",\n }, // YOU CAN RETURN THE EXACT RESPONSE TO SPEAK\n \"documents\": [\n {\n \"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.\",\n \"similarity\": 1\n },\n {\n \"content\": \"Blue light is scattered more by the water molecules than other colors, enhancing the blue appearance of the ocean.\",\n \"similarity\": .5\n }\n ] // OR, YOU CAN RETURN AN ARRAY OF DOCUMENTS THAT WILL BE SENT TO THE MODEL\n}\n```",
- "allOf": [
+ "transcriber": {
+ "description": "These are the options for the transfer assistant's transcriber.",
+ "oneOf": [
{
- "$ref": "#/components/schemas/Server"
+ "$ref": "#/components/schemas/AssemblyAITranscriber",
+ "title": "AssemblyAITranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/AzureSpeechTranscriber",
+ "title": "AzureSpeechTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/CustomTranscriber",
+ "title": "CustomTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/DeepgramTranscriber",
+ "title": "DeepgramTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/ElevenLabsTranscriber",
+ "title": "ElevenLabsTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/GladiaTranscriber",
+ "title": "GladiaTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/GoogleTranscriber",
+ "title": "GoogleTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/SpeechmaticsTranscriber",
+ "title": "SpeechmaticsTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/TalkscriberTranscriber",
+ "title": "TalkscriberTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAITranscriber",
+ "title": "OpenAITranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/CartesiaTranscriber",
+ "title": "CartesiaTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/SonioxTranscriber",
+ "title": "SonioxTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/XaiTranscriber",
+ "title": "XaiTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/VapiTranscriber",
+ "title": "VapiTranscriber"
}
]
- }
- },
- "required": [
- "provider",
- "server"
- ]
- },
- "KnowledgeBase": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string",
- "description": "The name of the knowledge base",
- "example": "My Knowledge Base"
},
- "provider": {
+ "firstMessage": {
"type": "string",
- "description": "The provider of the knowledge base",
- "enum": [
- "google"
- ],
- "example": "google"
+ "description": "This is the first message that the transfer assistant will say.\nThis can also be a URL to a custom audio file.\n\nIf unspecified, assistant will wait for user to speak and use the model to respond once they speak.",
+ "example": "Hello! I understand you need to be transferred. Let me connect you."
},
- "model": {
- "type": "string",
- "description": "The model to use for the knowledge base",
- "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"
+ "backgroundSound": {
+ "description": "This is the background sound in the transfer assistant call. Default for phone calls is 'office' and default for web calls is 'off'.\nYou can also provide a custom sound by providing a URL to an audio file.",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "off",
+ "office"
+ ],
+ "example": "office"
+ },
+ {
+ "type": "string",
+ "format": "uri",
+ "example": "https://www.soundjay.com/ambient/sounds/people-in-lounge-1.mp3"
+ }
]
},
- "description": {
- "type": "string",
- "description": "A description of the knowledge base"
- },
- "fileIds": {
- "description": "The file IDs associated with this knowledge base",
- "type": "array",
- "items": {
- "type": "string"
- }
- }
- },
- "required": [
- "name",
- "provider",
- "description",
- "fileIds"
- ]
- },
- "CreateQueryToolDTO": {
- "type": "object",
- "properties": {
- "messages": {
- "type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/ToolMessageStart",
- "title": "ToolMessageStart"
- },
- {
- "$ref": "#/components/schemas/ToolMessageComplete",
- "title": "ToolMessageComplete"
- },
- {
- "$ref": "#/components/schemas/ToolMessageFailed",
- "title": "ToolMessageFailed"
- },
- {
- "$ref": "#/components/schemas/ToolMessageDelayed",
- "title": "ToolMessageDelayed"
- }
- ]
- }
+ "startSpeakingPlan": {
+ "description": "This is the plan for when the transfer assistant should start talking.\n\nYou should configure this if the transfer assistant needs different endpointing behavior than the base assistant.\n\nIf this is not set, the transfer assistant will inherit the start speaking plan from the base assistant.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/StartSpeakingPlan"
+ }
+ ]
},
- "type": {
+ "firstMessageMode": {
"type": "string",
+ "description": "This is the mode for the first message. Default is 'assistant-speaks-first'.\n\nUse:\n- 'assistant-speaks-first' to have the assistant speak first.\n- 'assistant-waits-for-user' to have the assistant wait for the user to speak first.\n- '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.\n\n@default 'assistant-speaks-first'",
"enum": [
- "query"
+ "assistant-speaks-first",
+ "assistant-speaks-first-with-model-generated-message",
+ "assistant-waits-for-user"
],
- "description": "The type of tool. \"query\" for Query tool."
+ "example": "assistant-speaks-first"
},
- "knowledgeBases": {
- "description": "The knowledge bases to query",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/KnowledgeBase"
- }
+ "maxDurationSeconds": {
+ "type": "number",
+ "description": "This is the maximum duration in seconds for the transfer assistant conversation.\nAfter this time, the transfer will be cancelled automatically.\n@default 120",
+ "minimum": 10,
+ "maximum": 43200,
+ "example": 120
},
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "backgroundSpeechDenoisingPlan": {
+ "description": "This enables filtering of noise and background speech while the user is talking.\n\nFeatures:\n- Smart denoising using Krisp\n- Fourier denoising\n\nSmart denoising can be combined with or used independently of Fourier denoising.\n\nOrder of precedence:\n- Smart denoising\n- Fourier denoising",
"allOf": [
{
- "$ref": "#/components/schemas/ToolRejectionPlan"
+ "$ref": "#/components/schemas/BackgroundSpeechDenoisingPlan"
}
]
+ },
+ "silenceTimeoutSeconds": {
+ "type": "number",
+ "description": "This is the number of seconds of silence to wait before ending the call. Defaults to 30.\n\n@default 30",
+ "minimum": 5,
+ "maximum": 3600
}
},
"required": [
- "type"
+ "model"
]
},
- "CreateGoogleCalendarCreateEventToolDTO": {
+ "TransferCancelToolUserEditable": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -13450,9 +14683,9 @@
"type": {
"type": "string",
"enum": [
- "google.calendar.event.create"
+ "transferCancel"
],
- "description": "The type of tool. \"google.calendar.event.create\" for Google Calendar Create Event tool."
+ "description": "The type of tool. \"transferCancel\" for Transfer Cancel tool. This tool can only be used during warm-transfer-experimental by the transfer assistant to cancel an ongoing transfer and return the call back to the original assistant when the transfer cannot be completed."
},
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
@@ -13467,12 +14700,12 @@
"type"
]
},
- "CreateGoogleSheetsRowAppendToolDTO": {
+ "TransferSuccessfulToolUserEditable": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -13497,9 +14730,9 @@
"type": {
"type": "string",
"enum": [
- "google.sheets.row.append"
+ "transferSuccessful"
],
- "description": "The type of tool. \"google.sheets.row.append\" for Google Sheets Row Append tool."
+ "description": "The type of tool. \"transferSuccessful\" for Transfer Successful tool. This tool can only be used during warm-transfer-experimental by the transfer assistant to confirm that the transfer should proceed and finalize the handoff to the destination."
},
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
@@ -13514,155 +14747,252 @@
"type"
]
},
- "CreateGoogleCalendarCheckAvailabilityToolDTO": {
+ "SummaryPlan": {
"type": "object",
"properties": {
"messages": {
+ "description": "These are the messages used to generate the summary.\n\n@default: ```\n[\n {\n \"role\": \"system\",\n \"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.\"\n },\n {\n \"role\": \"user\",\n \"content\": \"Here is the transcript:\\n\\n{{transcript}}\\n\\n. Here is the ended reason of the call:\\n\\n{{endedReason}}\\n\\n\"\n }\n]```\n\nYou can customize by providing any messages you want.\n\nHere are the template variables available:\n- {{transcript}}: The transcript of the call from `call.artifact.transcript` \n- {{systemPrompt}}: The system prompt of the call from `assistant.model.messages[type=system].content` \n- {{messages}}: The messages of the call from `assistant.model.messages` \n- {{endedReason}}: The ended reason of the call from `call.endedReason`",
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
"items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/ToolMessageStart",
- "title": "ToolMessageStart"
- },
- {
- "$ref": "#/components/schemas/ToolMessageComplete",
- "title": "ToolMessageComplete"
- },
- {
- "$ref": "#/components/schemas/ToolMessageFailed",
- "title": "ToolMessageFailed"
- },
- {
- "$ref": "#/components/schemas/ToolMessageDelayed",
- "title": "ToolMessageDelayed"
- }
- ]
+ "type": "object"
}
},
- "type": {
- "type": "string",
- "enum": [
- "google.calendar.availability.check"
- ],
- "description": "The type of tool. \"google.calendar.availability.check\" for Google Calendar Check Availability tool."
+ "enabled": {
+ "type": "boolean",
+ "description": "This determines whether a summary is generated and stored in `call.analysis.summary`. Defaults to true.\n\nUsage:\n- If you want to disable the summary, set this to false.\n\n@default true"
},
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
- "allOf": [
- {
- "$ref": "#/components/schemas/ToolRejectionPlan"
- }
- ]
+ "timeoutSeconds": {
+ "type": "number",
+ "description": "This is how long the request is tried before giving up. When request times out, `call.analysis.summary` will be empty.\n\nUsage:\n- 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.\n\n@default 5 seconds",
+ "minimum": 1,
+ "maximum": 60
}
- },
- "required": [
- "type"
- ]
+ }
},
- "CreateSlackSendMessageToolDTO": {
+ "TransferPlan": {
"type": "object",
"properties": {
- "messages": {
- "type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/ToolMessageStart",
- "title": "ToolMessageStart"
- },
- {
- "$ref": "#/components/schemas/ToolMessageComplete",
- "title": "ToolMessageComplete"
- },
- {
- "$ref": "#/components/schemas/ToolMessageFailed",
- "title": "ToolMessageFailed"
- },
- {
- "$ref": "#/components/schemas/ToolMessageDelayed",
- "title": "ToolMessageDelayed"
- }
- ]
- }
- },
- "type": {
+ "mode": {
"type": "string",
+ "description": "This configures how transfer is executed and the experience of the destination party receiving the call.\n\nUsage:\n- `blind-transfer`: The assistant forwards the call to the destination without any message or summary.\n- `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.\n- `warm-transfer-say-message`: The assistant dials the destination, delivers the `message` to the destination party, connects the customer, and leaves the call.\n- `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.\n- `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.\n- `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.\n- `warm-transfer-twiml`: The assistant dials the destination, executes the twiml instructions on the destination call leg, connects the customer, and leaves the call.\n- `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.\n\n@default 'blind-transfer'",
"enum": [
- "slack.message.send"
- ],
- "description": "The type of tool. \"slack.message.send\" for Slack Send Message tool."
+ "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"
+ ]
},
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "message": {
+ "description": "This is the message the assistant will deliver to the destination party before connecting the customer.\n\nUsage:\n- 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`.",
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "$ref": "#/components/schemas/CustomMessage"
+ }
+ ]
+ },
+ "timeout": {
+ "type": "number",
+ "description": "This is the timeout in seconds for the warm-transfer-wait-for-operator-to-speak-first-and-then-say-message/summary\n\n@default 60",
+ "minimum": 1,
+ "maximum": 600,
+ "default": 60
+ },
+ "sipVerb": {
+ "type": "object",
+ "description": "This specifies the SIP verb to use while transferring the call.\n- 'refer': Uses SIP REFER to transfer the call (default)\n- 'bye': Ends current call with SIP BYE\n- 'dial': Uses SIP DIAL to transfer the call",
+ "default": "refer",
+ "enum": [
+ "refer",
+ "bye",
+ "dial"
+ ]
+ },
+ "dialTimeout": {
+ "type": "number",
+ "description": "This sets the timeout for the dial operation in seconds. This is the duration the call will ring before timing out.\n\nOnly applicable when `sipVerb='dial'`. Not applicable for SIP REFER or BYE.\n\n@default 60",
+ "minimum": 1,
+ "maximum": 600,
+ "default": 60
+ },
+ "holdAudioUrl": {
+ "type": "string",
+ "description": "This is the URL to an audio file played while the customer is on hold during transfer.\n\nUsage:\n- Used only when `mode` is `warm-transfer-experimental`.\n- Used when transferring calls to play hold audio for the customer.\n- Must be a publicly accessible URL to an audio file.\n- Supported formats: MP3 and WAV.\n- 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.\nIt can be used to play a custom sound like 'beep' to notify that the transfer is complete.\n\nUsage:\n- Used only when `mode` is `warm-transfer-experimental`.\n- Used when transferring calls to play hold audio for the destination party.\n- Must be a publicly accessible URL to an audio file.\n- Supported formats: MP3 and WAV."
+ },
+ "contextEngineeringPlan": {
+ "description": "This is the plan for manipulating the message context before initiating the warm transfer.\nUsage:\n- Used only when `mode` is `warm-transfer-experimental`.\n- These messages will automatically be added to the transferAssistant's system message.\n- If 'none', we will not add any transcript to the transferAssistant's system message.\n- If you want to provide your own messages, use transferAssistant.model.messages instead.\n\n@default { type: 'all' }",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/ContextEngineeringPlanLastNMessages",
+ "title": "Last N Messages"
+ },
+ {
+ "$ref": "#/components/schemas/ContextEngineeringPlanNone",
+ "title": "None"
+ },
+ {
+ "$ref": "#/components/schemas/ContextEngineeringPlanAll",
+ "title": "All"
+ }
+ ]
+ },
+ "twiml": {
+ "type": "string",
+ "description": "This is the TwiML instructions to execute on the destination call leg before connecting the customer.\n\nUsage:\n- Used only when `mode` is `warm-transfer-twiml`.\n- Supports only `Play`, `Say`, `Gather`, `Hangup` and `Pause` verbs.\n- Maximum length is 4096 characters.\n\nExample:\n```\nHello, transferring a customer to you.\n\nThey called about billing questions.\n```",
+ "maxLength": 4096
+ },
+ "summaryPlan": {
+ "description": "This is the plan for generating a summary of the call to present to the destination party.\n\nUsage:\n- 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`.",
"allOf": [
{
- "$ref": "#/components/schemas/ToolRejectionPlan"
+ "$ref": "#/components/schemas/SummaryPlan"
+ }
+ ]
+ },
+ "sipHeadersInReferToEnabled": {
+ "type": "boolean",
+ "description": "This flag includes the sipHeaders from above in the refer to sip uri as url encoded query params.\n\n@default false"
+ },
+ "fallbackPlan": {
+ "description": "This configures the fallback plan when the transfer fails (destination unreachable, busy, or not human).\n\nUsage:\n- Used only when `mode` is `warm-transfer-experimental`.\n- If not provided when using `warm-transfer-experimental`, a default message will be used.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/TransferFallbackPlan"
}
]
}
},
"required": [
- "type"
+ "mode"
]
},
- "McpToolMessages": {
+ "TransferDestinationNumber": {
"type": "object",
"properties": {
- "name": {
+ "message": {
+ "description": "This is spoken to the customer before connecting them to the destination.\n\nUsage:\n- If this is not provided and transfer tool messages is not provided, default is \"Transferring the call now\".\n- 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.\n\nThis accepts a string or a ToolMessageStart class. Latter is useful if you want to specify multiple messages for different languages through the `contents` field.",
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "$ref": "#/components/schemas/CustomMessage"
+ }
+ ]
+ },
+ "type": {
"type": "string",
- "description": "The name of the tool from the MCP server."
+ "enum": [
+ "number"
+ ]
},
- "messages": {
- "type": "array",
- "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.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/ToolMessageStart",
- "title": "ToolMessageStart"
- },
- {
- "$ref": "#/components/schemas/ToolMessageComplete",
- "title": "ToolMessageComplete"
- },
- {
- "$ref": "#/components/schemas/ToolMessageFailed",
- "title": "ToolMessageFailed"
- },
- {
- "$ref": "#/components/schemas/ToolMessageDelayed",
- "title": "ToolMessageDelayed"
- }
- ]
- }
+ "numberE164CheckEnabled": {
+ "type": "boolean",
+ "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.\n\nUse cases:\n- `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.\n- `true` (default): To allow only E164 numbers like `+14155551234`. This is standard for PSTN calls.\n\nIf `false`, the `number` is still required to only contain alphanumeric characters (regex: `/^\\+?[a-zA-Z0-9]+$/`).\n\n@default true (E164 check is enabled)",
+ "default": true
+ },
+ "number": {
+ "type": "string",
+ "description": "This is the phone number to transfer the call to.",
+ "minLength": 3,
+ "maxLength": 40
+ },
+ "extension": {
+ "type": "string",
+ "description": "This is the extension to dial after transferring the call to the `number`.",
+ "minLength": 1,
+ "maxLength": 10
+ },
+ "callerId": {
+ "type": "string",
+ "description": "This is the caller ID to use when transferring the call to the `number`.\n\nUsage:\n- If not provided, the caller ID will be the number the call is coming **from**.\n Example: a customer with number +14151111111 calls in to and the assistant transfers out to +16470000000. +16470000000 will see +14151111111 as the caller.\n For inbound calls, the caller ID is the customer's number. For outbound calls, the caller ID is the phone number of the assistant.\n- To change this behavior, provide a `callerId`.\n- Set to '{{customer.number}}' to always use the customer's number as the caller ID.\n- Set to '{{phoneNumber.number}}' to always use the phone number of the assistant as the caller ID.\n- 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.\n\nFor Twilio, you can read up more here: https://www.twilio.com/docs/voice/twiml/dial#callerid",
+ "maxLength": 40
+ },
+ "transferPlan": {
+ "description": "This configures how transfer is executed and the experience of the destination party receiving the call. Defaults to `blind-transfer`.\n\n@default `transferPlan.mode='blind-transfer'`",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/TransferPlan"
+ }
+ ]
+ },
+ "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": [
- "name"
+ "type",
+ "number"
]
},
- "McpToolMetadata": {
+ "TransferDestinationSip": {
"type": "object",
"properties": {
- "protocol": {
+ "message": {
+ "description": "This is spoken to the customer before connecting them to the destination.\n\nUsage:\n- If this is not provided and transfer tool messages is not provided, default is \"Transferring the call now\".\n- 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.\n\nThis accepts a string or a ToolMessageStart class. Latter is useful if you want to specify multiple messages for different languages through the `contents` field.",
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "$ref": "#/components/schemas/CustomMessage"
+ }
+ ]
+ },
+ "type": {
"type": "string",
"enum": [
- "sse",
- "shttp"
- ],
- "description": "This is the protocol used for MCP communication. Defaults to Streamable HTTP."
+ "sip"
+ ]
+ },
+ "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`.\n\nUsage:\n- If not provided, the caller ID will be determined by the SIP infrastructure.\n- Set to '{{customer.number}}' to always use the customer's number as the caller ID.\n- Set to '{{phoneNumber.number}}' to always use the phone number of the assistant as the caller ID.\n- Set to any E164 number to always use that number as the caller ID.\n\nOnly applicable when `transferPlan.sipVerb='dial'`. Not applicable for SIP REFER.",
+ "maxLength": 40
+ },
+ "transferPlan": {
+ "description": "This configures how transfer is executed and the experience of the destination party receiving the call. Defaults to `blind-transfer`.\n\n@default `transferPlan.mode='blind-transfer'`",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/TransferPlan"
+ }
+ ]
+ },
+ "sipHeaders": {
+ "type": "object",
+ "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"
+ ]
},
- "CreateMcpToolDTO": {
+ "CreateTransferCallToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -13687,28 +15017,29 @@
"type": {
"type": "string",
"enum": [
- "mcp"
- ],
- "description": "The type of tool. \"mcp\" for MCP tool."
- },
- "server": {
- "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
- "allOf": [
- {
- "$ref": "#/components/schemas/Server"
- }
+ "transferCall"
]
},
- "toolMessages": {
- "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.",
+ "destinations": {
"type": "array",
+ "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.",
"items": {
- "$ref": "#/components/schemas/McpToolMessages"
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/TransferDestinationAssistant",
+ "title": "Assistant"
+ },
+ {
+ "$ref": "#/components/schemas/TransferDestinationNumber",
+ "title": "Number"
+ },
+ {
+ "$ref": "#/components/schemas/TransferDestinationSip",
+ "title": "Sip"
+ }
+ ]
}
},
- "metadata": {
- "$ref": "#/components/schemas/McpToolMetadata"
- },
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
"allOf": [
@@ -13722,93 +15053,33 @@
"type"
]
},
- "CreateGoHighLevelCalendarAvailabilityToolDTO": {
+ "ContextEngineeringPlanLastNMessages": {
"type": "object",
"properties": {
- "messages": {
- "type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/ToolMessageStart",
- "title": "ToolMessageStart"
- },
- {
- "$ref": "#/components/schemas/ToolMessageComplete",
- "title": "ToolMessageComplete"
- },
- {
- "$ref": "#/components/schemas/ToolMessageFailed",
- "title": "ToolMessageFailed"
- },
- {
- "$ref": "#/components/schemas/ToolMessageDelayed",
- "title": "ToolMessageDelayed"
- }
- ]
- }
- },
"type": {
"type": "string",
"enum": [
- "gohighlevel.calendar.availability.check"
- ],
- "description": "The type of tool. \"gohighlevel.calendar.availability.check\" for GoHighLevel Calendar Availability Check tool."
- },
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
- "allOf": [
- {
- "$ref": "#/components/schemas/ToolRejectionPlan"
- }
+ "lastNMessages"
]
+ },
+ "maxMessages": {
+ "type": "number",
+ "description": "This is the maximum number of messages to include in the context engineering plan.",
+ "minimum": 0
}
},
"required": [
- "type"
+ "type",
+ "maxMessages"
]
},
- "CreateGoHighLevelCalendarEventCreateToolDTO": {
+ "ContextEngineeringPlanNone": {
"type": "object",
"properties": {
- "messages": {
- "type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/ToolMessageStart",
- "title": "ToolMessageStart"
- },
- {
- "$ref": "#/components/schemas/ToolMessageComplete",
- "title": "ToolMessageComplete"
- },
- {
- "$ref": "#/components/schemas/ToolMessageFailed",
- "title": "ToolMessageFailed"
- },
- {
- "$ref": "#/components/schemas/ToolMessageDelayed",
- "title": "ToolMessageDelayed"
- }
- ]
- }
- },
"type": {
"type": "string",
"enum": [
- "gohighlevel.calendar.event.create"
- ],
- "description": "The type of tool. \"gohighlevel.calendar.event.create\" for GoHighLevel Calendar Event Create tool."
- },
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
- "allOf": [
- {
- "$ref": "#/components/schemas/ToolRejectionPlan"
- }
+ "none"
]
}
},
@@ -13816,46 +15087,13 @@
"type"
]
},
- "CreateGoHighLevelContactCreateToolDTO": {
+ "ContextEngineeringPlanAll": {
"type": "object",
"properties": {
- "messages": {
- "type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/ToolMessageStart",
- "title": "ToolMessageStart"
- },
- {
- "$ref": "#/components/schemas/ToolMessageComplete",
- "title": "ToolMessageComplete"
- },
- {
- "$ref": "#/components/schemas/ToolMessageFailed",
- "title": "ToolMessageFailed"
- },
- {
- "$ref": "#/components/schemas/ToolMessageDelayed",
- "title": "ToolMessageDelayed"
- }
- ]
- }
- },
"type": {
"type": "string",
"enum": [
- "gohighlevel.contact.create"
- ],
- "description": "The type of tool. \"gohighlevel.contact.create\" for GoHighLevel Contact Create tool."
- },
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
- "allOf": [
- {
- "$ref": "#/components/schemas/ToolRejectionPlan"
- }
+ "all"
]
}
},
@@ -13863,46 +15101,13 @@
"type"
]
},
- "CreateGoHighLevelContactGetToolDTO": {
+ "ContextEngineeringPlanUserAndAssistantMessages": {
"type": "object",
"properties": {
- "messages": {
- "type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/ToolMessageStart",
- "title": "ToolMessageStart"
- },
- {
- "$ref": "#/components/schemas/ToolMessageComplete",
- "title": "ToolMessageComplete"
- },
- {
- "$ref": "#/components/schemas/ToolMessageFailed",
- "title": "ToolMessageFailed"
- },
- {
- "$ref": "#/components/schemas/ToolMessageDelayed",
- "title": "ToolMessageDelayed"
- }
- ]
- }
- },
"type": {
"type": "string",
"enum": [
- "gohighlevel.contact.get"
- ],
- "description": "The type of tool. \"gohighlevel.contact.get\" for GoHighLevel Contact Get tool."
- },
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
- "allOf": [
- {
- "$ref": "#/components/schemas/ToolRejectionPlan"
- }
+ "userAndAssistantMessages"
]
}
},
@@ -13910,956 +15115,1017 @@
"type"
]
},
- "OpenAIMessage": {
+ "ContextEngineeringPlanPreviousAssistantMessages": {
"type": "object",
"properties": {
- "content": {
- "type": "string",
- "nullable": true,
- "maxLength": 100000000
- },
- "role": {
+ "type": {
"type": "string",
"enum": [
- "assistant",
- "function",
- "user",
- "system",
- "tool"
+ "previousAssistantMessages"
]
}
},
"required": [
- "content",
- "role"
+ "type"
]
},
- "AnyscaleModel": {
+ "HandoffDestinationAssistant": {
"type": "object",
"properties": {
- "messages": {
- "description": "This is the starting state for the conversation.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/OpenAIMessage"
- }
+ "type": {
+ "type": "string",
+ "enum": [
+ "assistant"
+ ]
},
- "tools": {
- "type": "array",
- "description": "These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/CreateApiRequestToolDTO",
- "title": "ApiRequestTool"
- },
- {
- "$ref": "#/components/schemas/CreateBashToolDTO",
- "title": "BashTool"
- },
- {
- "$ref": "#/components/schemas/CreateCodeToolDTO",
- "title": "CodeTool"
- },
- {
- "$ref": "#/components/schemas/CreateComputerToolDTO",
- "title": "ComputerTool"
- },
- {
- "$ref": "#/components/schemas/CreateDtmfToolDTO",
- "title": "DtmfTool"
- },
- {
- "$ref": "#/components/schemas/CreateEndCallToolDTO",
- "title": "EndCallTool"
- },
- {
- "$ref": "#/components/schemas/CreateFunctionToolDTO",
- "title": "FunctionTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO",
- "title": "GoHighLevelCalendarAvailabilityTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO",
- "title": "GoHighLevelCalendarEventCreateTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelContactCreateToolDTO",
- "title": "GoHighLevelContactCreateTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelContactGetToolDTO",
- "title": "GoHighLevelContactGetTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO",
- "title": "GoogleCalendarCheckAvailabilityTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoogleCalendarCreateEventToolDTO",
- "title": "GoogleCalendarCreateEventTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoogleSheetsRowAppendToolDTO",
- "title": "GoogleSheetsRowAppendTool"
- },
- {
- "$ref": "#/components/schemas/CreateHandoffToolDTO",
- "title": "HandoffTool"
- },
- {
- "$ref": "#/components/schemas/CreateMcpToolDTO",
- "title": "McpTool"
- },
- {
- "$ref": "#/components/schemas/CreateQueryToolDTO",
- "title": "QueryTool"
- },
- {
- "$ref": "#/components/schemas/CreateSlackSendMessageToolDTO",
- "title": "SlackSendMessageTool"
- },
- {
- "$ref": "#/components/schemas/CreateSmsToolDTO",
- "title": "SmsTool"
- },
- {
- "$ref": "#/components/schemas/CreateTextEditorToolDTO",
- "title": "TextEditorTool"
- },
- {
- "$ref": "#/components/schemas/CreateTransferCallToolDTO",
- "title": "TransferCallTool"
- },
- {
- "$ref": "#/components/schemas/CreateSipRequestToolDTO",
- "title": "SipRequestTool"
- },
- {
- "$ref": "#/components/schemas/CreateVoicemailToolDTO",
- "title": "VoicemailTool"
- }
- ]
- }
- },
- "toolIds": {
- "description": "These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together.",
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "knowledgeBase": {
- "description": "These are the options for the knowledge base.",
+ "contextEngineeringPlan": {
+ "description": "This is the plan for manipulating the message context before handing off the call to the next assistant.",
"oneOf": [
{
- "$ref": "#/components/schemas/CreateCustomKnowledgeBaseDTO",
- "title": "Custom"
+ "$ref": "#/components/schemas/ContextEngineeringPlanLastNMessages",
+ "title": "Last N Messages"
+ },
+ {
+ "$ref": "#/components/schemas/ContextEngineeringPlanNone",
+ "title": "None"
+ },
+ {
+ "$ref": "#/components/schemas/ContextEngineeringPlanAll",
+ "title": "All"
+ },
+ {
+ "$ref": "#/components/schemas/ContextEngineeringPlanUserAndAssistantMessages",
+ "title": "User And Assistant Messages"
+ },
+ {
+ "$ref": "#/components/schemas/ContextEngineeringPlanPreviousAssistantMessages",
+ "title": "Previous Assistant Messages"
}
]
},
- "provider": {
+ "assistantName": {
"type": "string",
- "enum": [
- "anyscale"
- ]
+ "description": "This is the assistant to transfer the call to. You must provide either assistantName or assistantId."
},
- "model": {
+ "assistantId": {
"type": "string",
- "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b"
+ "description": "This is the assistant id to transfer the call to. You must provide either assistantName or assistantId."
},
- "temperature": {
- "type": "number",
- "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.",
- "minimum": 0,
- "maximum": 2
+ "assistant": {
+ "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.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/CreateAssistantDTO"
+ }
+ ]
},
- "maxTokens": {
- "type": "number",
- "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.",
- "minimum": 50,
- "maximum": 10000
+ "variableExtractionPlan": {
+ "description": "This is the variable extraction plan for the handoff tool.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/VariableExtractionPlan"
+ }
+ ]
},
- "emotionRecognitionEnabled": {
- "type": "boolean",
- "description": "This determines whether we detect user's emotion while they speak and send it as an additional info to model.\n\nDefault `false` because the model is usually are good at understanding the user's emotion from text.\n\n@default false"
+ "assistantOverrides": {
+ "description": "These are the assistant overrides to apply to the destination assistant.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/AssistantOverrides"
+ }
+ ]
},
- "numFastTurns": {
- "type": "number",
- "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.\n\nDefault is 0.\n\n@default 0",
- "minimum": 0
+ "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": [
- "provider",
- "model"
+ "type"
]
},
- "AnthropicThinkingConfig": {
+ "HandoffDestinationDynamic": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
- "enabled"
+ "dynamic"
]
},
- "budgetTokens": {
- "type": "number",
- "description": "The maximum number of tokens to allocate for thinking.\nMust be between 1024 and 100000 tokens.",
- "minimum": 1024,
- "maximum": 100000
+ "server": {
+ "description": "This is where Vapi will send the handoff-destination-request webhook in a dynamic handoff.\n\nThe order of precedence is:\n\n1. tool.server.url\n2. assistant.server.url\n3. phoneNumber.server.url\n4. org.server.url",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Server"
+ }
+ ]
+ },
+ "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",
- "budgetTokens"
+ "type"
]
},
- "AnthropicModel": {
+ "SquadMemberDTO": {
"type": "object",
"properties": {
- "messages": {
- "description": "This is the starting state for the conversation.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/OpenAIMessage"
- }
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the assistant version (e.g. `v3`) to pin for this squad member. When set, the call uses\nthe snapshot from `assistant_version` (by `(assistantId, version)`) instead of the latest. Valid\nonly with `assistantId`; rejected with inline `assistant`. Omit to follow the latest version."
},
- "tools": {
+ "assistantDestinations": {
"type": "array",
- "description": "These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together.",
"items": {
"oneOf": [
{
- "$ref": "#/components/schemas/CreateApiRequestToolDTO",
- "title": "ApiRequestTool"
- },
- {
- "$ref": "#/components/schemas/CreateBashToolDTO",
- "title": "BashTool"
- },
- {
- "$ref": "#/components/schemas/CreateCodeToolDTO",
- "title": "CodeTool"
- },
- {
- "$ref": "#/components/schemas/CreateComputerToolDTO",
- "title": "ComputerTool"
- },
- {
- "$ref": "#/components/schemas/CreateDtmfToolDTO",
- "title": "DtmfTool"
- },
- {
- "$ref": "#/components/schemas/CreateEndCallToolDTO",
- "title": "EndCallTool"
- },
- {
- "$ref": "#/components/schemas/CreateFunctionToolDTO",
- "title": "FunctionTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO",
- "title": "GoHighLevelCalendarAvailabilityTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO",
- "title": "GoHighLevelCalendarEventCreateTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelContactCreateToolDTO",
- "title": "GoHighLevelContactCreateTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelContactGetToolDTO",
- "title": "GoHighLevelContactGetTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO",
- "title": "GoogleCalendarCheckAvailabilityTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoogleCalendarCreateEventToolDTO",
- "title": "GoogleCalendarCreateEventTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoogleSheetsRowAppendToolDTO",
- "title": "GoogleSheetsRowAppendTool"
- },
- {
- "$ref": "#/components/schemas/CreateHandoffToolDTO",
- "title": "HandoffTool"
- },
- {
- "$ref": "#/components/schemas/CreateMcpToolDTO",
- "title": "McpTool"
- },
- {
- "$ref": "#/components/schemas/CreateQueryToolDTO",
- "title": "QueryTool"
- },
- {
- "$ref": "#/components/schemas/CreateSlackSendMessageToolDTO",
- "title": "SlackSendMessageTool"
- },
- {
- "$ref": "#/components/schemas/CreateSmsToolDTO",
- "title": "SmsTool"
- },
- {
- "$ref": "#/components/schemas/CreateTextEditorToolDTO",
- "title": "TextEditorTool"
- },
- {
- "$ref": "#/components/schemas/CreateTransferCallToolDTO",
- "title": "TransferCallTool"
- },
- {
- "$ref": "#/components/schemas/CreateSipRequestToolDTO",
- "title": "SipRequestTool"
+ "$ref": "#/components/schemas/TransferDestinationAssistant",
+ "title": "Transfer Destination"
},
{
- "$ref": "#/components/schemas/CreateVoicemailToolDTO",
- "title": "VoicemailTool"
+ "$ref": "#/components/schemas/HandoffDestinationAssistant",
+ "title": "Handoff Destination"
}
]
}
},
- "toolIds": {
- "description": "These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together.",
+ "assistantId": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the assistant that will be used for the call. To use a transient assistant, use `assistant` instead."
+ },
+ "assistant": {
+ "description": "This is the assistant that will be used for the call. To use an existing assistant, use `assistantId` instead.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/CreateAssistantDTO"
+ }
+ ]
+ },
+ "assistantOverrides": {
+ "description": "This can be used to override the assistant's settings and provide values for it's template variables.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/AssistantOverrides"
+ }
+ ]
+ }
+ }
+ },
+ "CreateSquadDTO": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "This is the name of the squad."
+ },
+ "members": {
+ "description": "This is the list of assistants that make up the squad.\n\nThe call will start with the first assistant in the list.",
"type": "array",
"items": {
- "type": "string"
+ "$ref": "#/components/schemas/SquadMemberDTO"
}
},
- "knowledgeBase": {
- "description": "These are the options for the knowledge base.",
- "oneOf": [
+ "membersOverrides": {
+ "description": "This can be used to override all the assistants' settings and provide values for their template variables.\n\nBoth `membersOverrides` and `members[n].assistantOverrides` can be used together. First, `members[n].assistantOverrides` is applied. Then, `membersOverrides` is applied as a global override.",
+ "allOf": [
{
- "$ref": "#/components/schemas/CreateCustomKnowledgeBaseDTO",
- "title": "Custom"
+ "$ref": "#/components/schemas/AssistantOverrides"
}
]
- },
- "model": {
+ }
+ },
+ "required": [
+ "members"
+ ]
+ },
+ "HandoffDestinationSquad": {
+ "type": "object",
+ "properties": {
+ "type": {
"type": "string",
- "description": "The specific Anthropic/Claude model that will be used.",
"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"
+ "squad"
]
},
- "provider": {
- "type": "string",
- "description": "The provider identifier for Anthropic.",
- "enum": [
- "anthropic"
+ "contextEngineeringPlan": {
+ "description": "This is the plan for manipulating the message context before handing off the call to the squad.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/ContextEngineeringPlanLastNMessages",
+ "title": "Last N Messages"
+ },
+ {
+ "$ref": "#/components/schemas/ContextEngineeringPlanNone",
+ "title": "None"
+ },
+ {
+ "$ref": "#/components/schemas/ContextEngineeringPlanAll",
+ "title": "All"
+ },
+ {
+ "$ref": "#/components/schemas/ContextEngineeringPlanUserAndAssistantMessages",
+ "title": "User And Assistant Messages"
+ },
+ {
+ "$ref": "#/components/schemas/ContextEngineeringPlanPreviousAssistantMessages",
+ "title": "Previous Assistant Messages"
+ }
]
},
- "thinking": {
- "description": "Optional configuration for Anthropic's thinking feature.\nOnly applicable for claude-3-7-sonnet-20250219 model.\nIf provided, maxTokens must be greater than thinking.budgetTokens.",
+ "squadId": {
+ "type": "string",
+ "description": "This is the squad id to transfer the call to."
+ },
+ "squad": {
+ "description": "This is a transient squad to transfer the call to.",
"allOf": [
{
- "$ref": "#/components/schemas/AnthropicThinkingConfig"
+ "$ref": "#/components/schemas/CreateSquadDTO"
}
]
},
- "temperature": {
- "type": "number",
- "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.",
- "minimum": 0,
- "maximum": 2
+ "entryAssistantName": {
+ "type": "string",
+ "description": "This is the name of the entry assistant to start with when handing off to the squad.\nIf not provided, the first member of the squad will be used."
},
- "maxTokens": {
- "type": "number",
- "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.",
- "minimum": 50,
- "maximum": 10000
+ "variableExtractionPlan": {
+ "description": "This is the variable extraction plan for the handoff tool.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/VariableExtractionPlan"
+ }
+ ]
},
- "emotionRecognitionEnabled": {
- "type": "boolean",
- "description": "This determines whether we detect user's emotion while they speak and send it as an additional info to model.\n\nDefault `false` because the model is usually are good at understanding the user's emotion from text.\n\n@default false"
+ "squadOverrides": {
+ "description": "These are the overrides to apply to the squad configuration.\nMaps to squad-level membersOverrides.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/AssistantOverrides"
+ }
+ ]
},
- "numFastTurns": {
- "type": "number",
- "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.\n\nDefault is 0.\n\n@default 0",
- "minimum": 0
+ "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": [
- "model",
- "provider"
+ "type"
]
},
- "AnthropicBedrockModel": {
+ "CreateHandoffToolDTO": {
"type": "object",
"properties": {
"messages": {
- "description": "This is the starting state for the conversation.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/OpenAIMessage"
- }
- },
- "tools": {
"type": "array",
- "description": "These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
- "$ref": "#/components/schemas/CreateApiRequestToolDTO",
- "title": "ApiRequestTool"
- },
- {
- "$ref": "#/components/schemas/CreateBashToolDTO",
- "title": "BashTool"
- },
- {
- "$ref": "#/components/schemas/CreateCodeToolDTO",
- "title": "CodeTool"
- },
- {
- "$ref": "#/components/schemas/CreateComputerToolDTO",
- "title": "ComputerTool"
- },
- {
- "$ref": "#/components/schemas/CreateDtmfToolDTO",
- "title": "DtmfTool"
- },
- {
- "$ref": "#/components/schemas/CreateEndCallToolDTO",
- "title": "EndCallTool"
- },
- {
- "$ref": "#/components/schemas/CreateFunctionToolDTO",
- "title": "FunctionTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO",
- "title": "GoHighLevelCalendarAvailabilityTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO",
- "title": "GoHighLevelCalendarEventCreateTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelContactCreateToolDTO",
- "title": "GoHighLevelContactCreateTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelContactGetToolDTO",
- "title": "GoHighLevelContactGetTool"
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
},
{
- "$ref": "#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO",
- "title": "GoogleCalendarCheckAvailabilityTool"
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
},
{
- "$ref": "#/components/schemas/CreateGoogleCalendarCreateEventToolDTO",
- "title": "GoogleCalendarCreateEventTool"
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
},
{
- "$ref": "#/components/schemas/CreateGoogleSheetsRowAppendToolDTO",
- "title": "GoogleSheetsRowAppendTool"
- },
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
+ }
+ ]
+ }
+ },
+ "type": {
+ "type": "string",
+ "description": "This is the type of the tool.\nWhen you're using handoff tool, we recommend adding this to your system prompt\n---\n# System context\n\nYou are part of a multi-agent system designed to make agent coordination and execution easy. Agents uses two primary abstraction: **Agents** and **Handoffs**. An agent encompasses instructions and tools and can hand off a conversation to another agent when appropriate. Handoffs are achieved by calling a handoff function, generally named `handoff_to_`. Handoffs between agents are handled seamlessly in the background; do not mention or draw attention to these handoffs in your conversation with the user.\n\n# Agent context\n\n{put your agent system prompt here}\n---",
+ "enum": [
+ "handoff"
+ ]
+ },
+ "defaultResult": {
+ "type": "string",
+ "description": "This is the default local tool result message used when no runtime handoff result override is returned."
+ },
+ "destinations": {
+ "type": "array",
+ "description": "These are the destinations that the call can be handed off to.\n\nUsage:\n1. Single destination\n\nUse `assistantId` to handoff the call to a saved assistant, or `assistantName` to handoff the call to an assistant in the same squad.\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\", // or \"assistantName\": \"Assistant123\"\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\n2. Multiple destinations\n\n2.1. Multiple Tools, Each With One Destination (OpenAI recommended)\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\",\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n },\n ],\n },\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-456\",\n \"description\": \"customer wants to be handed off to assistant-456\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\n2.2. One Tool, Multiple Destinations (Anthropic recommended)\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\",\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n },\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-456\",\n \"description\": \"customer wants to be handed off to assistant-456\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\n3. Dynamic destination\n\n3.1 To determine the destination dynamically, supply a `dynamic` handoff destination type and a `server` object.\n VAPI will send a handoff-destination-request webhook to the `server.url`.\n The response from the server will be used as the destination (if valid).\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"dynamic\",\n \"server\": {\n \"url\": \"https://example.com\"\n }\n }\n ],\n }\n ]\n}\n```\n\n3.2. To pass custom parameters to the server, you can use the `function` object.\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"dynamic\",\n \"server\": {\n \"url\": \"https://example.com\"\n },\n }\n ],\n \"function\": {\n \"name\": \"handoff\",\n \"description\": \"Call this function when the customer is ready to be handed off to the next assistant\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"destination\": {\n \"type\": \"string\",\n \"description\": \"Use dynamic when customer is ready to be handed off to the next assistant\",\n \"enum\": [\"dynamic\"]\n },\n \"customerAreaCode\": {\n \"type\": \"number\",\n \"description\": \"Area code of the customer\"\n },\n \"customerIntent\": {\n \"type\": \"string\",\n \"enum\": [\"new-customer\", \"existing-customer\"],\n \"description\": \"Use new-customer when customer is a new customer, existing-customer when customer is an existing customer\"\n },\n \"customerSentiment\": {\n \"type\": \"string\",\n \"enum\": [\"positive\", \"negative\", \"neutral\"],\n \"description\": \"Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral\"\n }\n }\n }\n }\n }\n ]\n}\n```\n\nThe properties `customerAreaCode`, `customerIntent`, and `customerSentiment` will be passed to the server in the webhook request body.",
+ "items": {
+ "oneOf": [
{
- "$ref": "#/components/schemas/CreateHandoffToolDTO",
- "title": "HandoffTool"
+ "$ref": "#/components/schemas/HandoffDestinationAssistant",
+ "title": "Assistant"
},
{
- "$ref": "#/components/schemas/CreateMcpToolDTO",
- "title": "McpTool"
+ "$ref": "#/components/schemas/HandoffDestinationDynamic",
+ "title": "Dynamic"
},
{
- "$ref": "#/components/schemas/CreateQueryToolDTO",
- "title": "QueryTool"
- },
- {
- "$ref": "#/components/schemas/CreateSlackSendMessageToolDTO",
- "title": "SlackSendMessageTool"
- },
- {
- "$ref": "#/components/schemas/CreateSmsToolDTO",
- "title": "SmsTool"
- },
- {
- "$ref": "#/components/schemas/CreateTextEditorToolDTO",
- "title": "TextEditorTool"
- },
- {
- "$ref": "#/components/schemas/CreateTransferCallToolDTO",
- "title": "TransferCallTool"
- },
- {
- "$ref": "#/components/schemas/CreateSipRequestToolDTO",
- "title": "SipRequestTool"
- },
- {
- "$ref": "#/components/schemas/CreateVoicemailToolDTO",
- "title": "VoicemailTool"
+ "$ref": "#/components/schemas/HandoffDestinationSquad",
+ "title": "Squad"
}
]
}
},
- "toolIds": {
- "description": "These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together.",
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "knowledgeBase": {
- "description": "These are the options for the knowledge base.",
- "oneOf": [
+ "function": {
+ "description": "This is the optional function definition that will be passed to the LLM.\nIf this is not defined, we will construct this based on the other properties.\n\nFor example, given the following tools definition:\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\",\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n },\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-456\",\n \"description\": \"customer wants to be handed off to assistant-456\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\nWe will construct the following function definition:\n```json\n{\n \"function\": {\n \"name\": \"handoff_to_assistant-123\",\n \"description\": \"\n Use this function to handoff the call to the next assistant.\n Only use it when instructions explicitly ask you to use the handoff_to_assistant function.\n DO NOT call this function unless you are instructed to do so.\n Here are the destinations you can handoff the call to:\n 1. assistant-123. When: customer wants to be handed off to assistant-123\n 2. assistant-456. When: customer wants to be handed off to assistant-456\n \",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"destination\": {\n \"type\": \"string\",\n \"description\": \"Options: assistant-123 (customer wants to be handed off to assistant-123), assistant-456 (customer wants to be handed off to assistant-456)\",\n \"enum\": [\"assistant-123\", \"assistant-456\"]\n },\n },\n \"required\": [\"destination\"]\n }\n }\n}\n```\n\nTo override this function, please provide an OpenAI function definition and refer to it in the system prompt.\nYou may override parts of the function definition (i.e. you may only want to change the function name for your prompt).\nIf 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`.\n\nTo pass custom parameters to the server in a dynamic handoff, you can use the function parameters, with `dynamic` as the destination.\n```json\n{\n \"function\": {\n \"name\": \"dynamic_handoff\",\n \"description\": \"\n Call this function when the customer is ready to be handed off to the next assistant\n \",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"destination\": {\n \"type\": \"string\",\n \"enum\": [\"dynamic\"]\n },\n \"customerAreaCode\": {\n \"type\": \"number\",\n \"description\": \"Area code of the customer\"\n },\n \"customerIntent\": {\n \"type\": \"string\",\n \"enum\": [\"new-customer\", \"existing-customer\"],\n \"description\": \"Use new-customer when customer is a new customer, existing-customer when customer is an existing customer\"\n },\n \"customerSentiment\": {\n \"type\": \"string\",\n \"enum\": [\"positive\", \"negative\", \"neutral\"],\n \"description\": \"Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral\"\n }\n },\n \"required\": [\"destination\", \"customerAreaCode\", \"customerIntent\", \"customerSentiment\"]\n }\n }\n}\n```",
+ "allOf": [
{
- "$ref": "#/components/schemas/CreateCustomKnowledgeBaseDTO",
- "title": "Custom"
+ "$ref": "#/components/schemas/OpenAIFunction"
}
]
},
- "provider": {
- "type": "string",
- "description": "The provider identifier for Anthropic via AWS Bedrock.",
- "enum": [
- "anthropic-bedrock"
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ToolRejectionPlan"
+ }
]
- },
- "model": {
+ }
+ },
+ "required": [
+ "type"
+ ]
+ },
+ "CreateCustomKnowledgeBaseDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
"type": "string",
- "description": "The specific Anthropic/Claude model that will be used via Bedrock.",
+ "description": "This knowledge base is bring your own knowledge base implementation.",
"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"
+ "custom-knowledge-base"
]
},
- "thinking": {
- "description": "Optional configuration for Anthropic's thinking feature.\nOnly applicable for claude-3-7-sonnet-20250219 model.\nIf provided, maxTokens must be greater than thinking.budgetTokens.",
+ "server": {
+ "description": "This is where the knowledge base request will be sent.\n\nRequest Example:\n\nPOST https://{server.url}\nContent-Type: application/json\n\n{\n \"messsage\": {\n \"type\": \"knowledge-base-request\",\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": \"Why is ocean blue?\"\n }\n ],\n ...other metadata about the call...\n }\n}\n\nResponse Expected:\n```\n{\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"The ocean is blue because water absorbs everything but blue.\",\n }, // YOU CAN RETURN THE EXACT RESPONSE TO SPEAK\n \"documents\": [\n {\n \"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.\",\n \"similarity\": 1\n },\n {\n \"content\": \"Blue light is scattered more by the water molecules than other colors, enhancing the blue appearance of the ocean.\",\n \"similarity\": .5\n }\n ] // OR, YOU CAN RETURN AN ARRAY OF DOCUMENTS THAT WILL BE SENT TO THE MODEL\n}\n```",
"allOf": [
{
- "$ref": "#/components/schemas/AnthropicThinkingConfig"
+ "$ref": "#/components/schemas/Server"
}
]
+ }
+ },
+ "required": [
+ "provider",
+ "server"
+ ]
+ },
+ "KnowledgeBase": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the knowledge base",
+ "example": "My Knowledge Base"
},
- "temperature": {
- "type": "number",
- "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.",
- "minimum": 0,
- "maximum": 2
+ "provider": {
+ "type": "string",
+ "description": "The provider of the knowledge base",
+ "enum": [
+ "google"
+ ],
+ "example": "google"
},
- "maxTokens": {
- "type": "number",
- "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.",
- "minimum": 50,
- "maximum": 10000
+ "model": {
+ "type": "string",
+ "description": "The model to use for the knowledge base",
+ "enum": [
+ "gemini-3.5-flash",
+ "gemini-3.1-flash-lite",
+ "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"
+ ]
},
- "emotionRecognitionEnabled": {
- "type": "boolean",
- "description": "This determines whether we detect user's emotion while they speak and send it as an additional info to model.\n\nDefault `false` because the model is usually are good at understanding the user's emotion from text.\n\n@default false"
+ "description": {
+ "type": "string",
+ "description": "A description of the knowledge base"
},
- "numFastTurns": {
- "type": "number",
- "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.\n\nDefault is 0.\n\n@default 0",
- "minimum": 0
+ "fileIds": {
+ "description": "The file IDs associated with this knowledge base",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
}
},
"required": [
+ "name",
"provider",
- "model"
+ "description",
+ "fileIds"
]
},
- "CerebrasModel": {
+ "CreateQueryToolDTO": {
"type": "object",
"properties": {
"messages": {
- "description": "This is the starting state for the conversation.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/OpenAIMessage"
- }
- },
- "tools": {
"type": "array",
- "description": "These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
- "$ref": "#/components/schemas/CreateApiRequestToolDTO",
- "title": "ApiRequestTool"
- },
- {
- "$ref": "#/components/schemas/CreateBashToolDTO",
- "title": "BashTool"
- },
- {
- "$ref": "#/components/schemas/CreateCodeToolDTO",
- "title": "CodeTool"
- },
- {
- "$ref": "#/components/schemas/CreateComputerToolDTO",
- "title": "ComputerTool"
- },
- {
- "$ref": "#/components/schemas/CreateDtmfToolDTO",
- "title": "DtmfTool"
- },
- {
- "$ref": "#/components/schemas/CreateEndCallToolDTO",
- "title": "EndCallTool"
- },
- {
- "$ref": "#/components/schemas/CreateFunctionToolDTO",
- "title": "FunctionTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO",
- "title": "GoHighLevelCalendarAvailabilityTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO",
- "title": "GoHighLevelCalendarEventCreateTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelContactCreateToolDTO",
- "title": "GoHighLevelContactCreateTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelContactGetToolDTO",
- "title": "GoHighLevelContactGetTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO",
- "title": "GoogleCalendarCheckAvailabilityTool"
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
},
{
- "$ref": "#/components/schemas/CreateGoogleCalendarCreateEventToolDTO",
- "title": "GoogleCalendarCreateEventTool"
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
},
{
- "$ref": "#/components/schemas/CreateGoogleSheetsRowAppendToolDTO",
- "title": "GoogleSheetsRowAppendTool"
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
},
{
- "$ref": "#/components/schemas/CreateHandoffToolDTO",
- "title": "HandoffTool"
- },
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
+ }
+ ]
+ }
+ },
+ "type": {
+ "type": "string",
+ "enum": [
+ "query"
+ ],
+ "description": "The type of tool. \"query\" for Query tool."
+ },
+ "knowledgeBases": {
+ "description": "The knowledge bases to query",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/KnowledgeBase"
+ }
+ },
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ToolRejectionPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "type"
+ ]
+ },
+ "CreateGoogleCalendarCreateEventToolDTO": {
+ "type": "object",
+ "properties": {
+ "messages": {
+ "type": "array",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
+ "items": {
+ "oneOf": [
{
- "$ref": "#/components/schemas/CreateMcpToolDTO",
- "title": "McpTool"
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
},
{
- "$ref": "#/components/schemas/CreateQueryToolDTO",
- "title": "QueryTool"
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
},
{
- "$ref": "#/components/schemas/CreateSlackSendMessageToolDTO",
- "title": "SlackSendMessageTool"
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
},
{
- "$ref": "#/components/schemas/CreateSmsToolDTO",
- "title": "SmsTool"
- },
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
+ }
+ ]
+ }
+ },
+ "type": {
+ "type": "string",
+ "enum": [
+ "google.calendar.event.create"
+ ],
+ "description": "The type of tool. \"google.calendar.event.create\" for Google Calendar Create Event tool."
+ },
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ToolRejectionPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "type"
+ ]
+ },
+ "CreateGoogleSheetsRowAppendToolDTO": {
+ "type": "object",
+ "properties": {
+ "messages": {
+ "type": "array",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
+ "items": {
+ "oneOf": [
{
- "$ref": "#/components/schemas/CreateTextEditorToolDTO",
- "title": "TextEditorTool"
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
},
{
- "$ref": "#/components/schemas/CreateTransferCallToolDTO",
- "title": "TransferCallTool"
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
},
{
- "$ref": "#/components/schemas/CreateSipRequestToolDTO",
- "title": "SipRequestTool"
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
},
{
- "$ref": "#/components/schemas/CreateVoicemailToolDTO",
- "title": "VoicemailTool"
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
}
]
}
},
- "toolIds": {
- "description": "These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together.",
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "knowledgeBase": {
- "description": "These are the options for the knowledge base.",
- "oneOf": [
- {
- "$ref": "#/components/schemas/CreateCustomKnowledgeBaseDTO",
- "title": "Custom"
- }
- ]
- },
- "model": {
+ "type": {
"type": "string",
- "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b",
"enum": [
- "llama3.1-8b",
- "llama-3.3-70b"
- ]
+ "google.sheets.row.append"
+ ],
+ "description": "The type of tool. \"google.sheets.row.append\" for Google Sheets Row Append tool."
},
- "provider": {
- "type": "string",
- "enum": [
- "cerebras"
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ToolRejectionPlan"
+ }
]
- },
- "temperature": {
- "type": "number",
- "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.",
- "minimum": 0,
- "maximum": 2
- },
- "maxTokens": {
- "type": "number",
- "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.",
- "minimum": 50,
- "maximum": 10000
- },
- "emotionRecognitionEnabled": {
- "type": "boolean",
- "description": "This determines whether we detect user's emotion while they speak and send it as an additional info to model.\n\nDefault `false` because the model is usually are good at understanding the user's emotion from text.\n\n@default false"
- },
- "numFastTurns": {
- "type": "number",
- "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.\n\nDefault is 0.\n\n@default 0",
- "minimum": 0
}
},
"required": [
- "model",
- "provider"
+ "type"
]
},
- "CustomLLMModel": {
+ "CreateGoogleCalendarCheckAvailabilityToolDTO": {
"type": "object",
"properties": {
"messages": {
- "description": "This is the starting state for the conversation.",
"type": "array",
- "items": {
- "$ref": "#/components/schemas/OpenAIMessage"
- }
- },
- "tools": {
- "type": "array",
- "description": "These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
- "$ref": "#/components/schemas/CreateApiRequestToolDTO",
- "title": "ApiRequestTool"
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
},
{
- "$ref": "#/components/schemas/CreateBashToolDTO",
- "title": "BashTool"
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
},
{
- "$ref": "#/components/schemas/CreateCodeToolDTO",
- "title": "CodeTool"
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
},
{
- "$ref": "#/components/schemas/CreateComputerToolDTO",
- "title": "ComputerTool"
- },
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
+ }
+ ]
+ }
+ },
+ "type": {
+ "type": "string",
+ "enum": [
+ "google.calendar.availability.check"
+ ],
+ "description": "The type of tool. \"google.calendar.availability.check\" for Google Calendar Check Availability tool."
+ },
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ToolRejectionPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "type"
+ ]
+ },
+ "CreateSlackSendMessageToolDTO": {
+ "type": "object",
+ "properties": {
+ "messages": {
+ "type": "array",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
+ "items": {
+ "oneOf": [
{
- "$ref": "#/components/schemas/CreateDtmfToolDTO",
- "title": "DtmfTool"
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
},
{
- "$ref": "#/components/schemas/CreateEndCallToolDTO",
- "title": "EndCallTool"
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
},
{
- "$ref": "#/components/schemas/CreateFunctionToolDTO",
- "title": "FunctionTool"
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
},
{
- "$ref": "#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO",
- "title": "GoHighLevelCalendarAvailabilityTool"
- },
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
+ }
+ ]
+ }
+ },
+ "type": {
+ "type": "string",
+ "enum": [
+ "slack.message.send"
+ ],
+ "description": "The type of tool. \"slack.message.send\" for Slack Send Message tool."
+ },
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ToolRejectionPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "type"
+ ]
+ },
+ "McpToolMessages": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the tool from the MCP server."
+ },
+ "messages": {
+ "type": "array",
+ "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. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
+ "items": {
+ "oneOf": [
{
- "$ref": "#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO",
- "title": "GoHighLevelCalendarEventCreateTool"
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
},
{
- "$ref": "#/components/schemas/CreateGoHighLevelContactCreateToolDTO",
- "title": "GoHighLevelContactCreateTool"
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
},
{
- "$ref": "#/components/schemas/CreateGoHighLevelContactGetToolDTO",
- "title": "GoHighLevelContactGetTool"
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
},
{
- "$ref": "#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO",
- "title": "GoogleCalendarCheckAvailabilityTool"
- },
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
+ }
+ ]
+ }
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "McpToolMetadata": {
+ "type": "object",
+ "properties": {
+ "protocol": {
+ "type": "string",
+ "enum": [
+ "sse",
+ "shttp"
+ ],
+ "description": "This is the protocol used for MCP communication. Defaults to Streamable HTTP."
+ }
+ }
+ },
+ "CreateMcpToolDTO": {
+ "type": "object",
+ "properties": {
+ "messages": {
+ "type": "array",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
+ "items": {
+ "oneOf": [
{
- "$ref": "#/components/schemas/CreateGoogleCalendarCreateEventToolDTO",
- "title": "GoogleCalendarCreateEventTool"
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
},
{
- "$ref": "#/components/schemas/CreateGoogleSheetsRowAppendToolDTO",
- "title": "GoogleSheetsRowAppendTool"
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
},
{
- "$ref": "#/components/schemas/CreateHandoffToolDTO",
- "title": "HandoffTool"
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
},
{
- "$ref": "#/components/schemas/CreateMcpToolDTO",
- "title": "McpTool"
- },
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
+ }
+ ]
+ }
+ },
+ "type": {
+ "type": "string",
+ "enum": [
+ "mcp"
+ ],
+ "description": "The type of tool. \"mcp\" for MCP tool."
+ },
+ "server": {
+ "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Server"
+ }
+ ]
+ },
+ "toolMessages": {
+ "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.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/McpToolMessages"
+ }
+ },
+ "metadata": {
+ "$ref": "#/components/schemas/McpToolMetadata"
+ },
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ToolRejectionPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "type"
+ ]
+ },
+ "CreateGoHighLevelCalendarAvailabilityToolDTO": {
+ "type": "object",
+ "properties": {
+ "messages": {
+ "type": "array",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
+ "items": {
+ "oneOf": [
{
- "$ref": "#/components/schemas/CreateQueryToolDTO",
- "title": "QueryTool"
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
},
{
- "$ref": "#/components/schemas/CreateSlackSendMessageToolDTO",
- "title": "SlackSendMessageTool"
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
},
{
- "$ref": "#/components/schemas/CreateSmsToolDTO",
- "title": "SmsTool"
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
},
{
- "$ref": "#/components/schemas/CreateTextEditorToolDTO",
- "title": "TextEditorTool"
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
+ }
+ ]
+ }
+ },
+ "type": {
+ "type": "string",
+ "enum": [
+ "gohighlevel.calendar.availability.check"
+ ],
+ "description": "The type of tool. \"gohighlevel.calendar.availability.check\" for GoHighLevel Calendar Availability Check tool."
+ },
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ToolRejectionPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "type"
+ ]
+ },
+ "CreateGoHighLevelCalendarEventCreateToolDTO": {
+ "type": "object",
+ "properties": {
+ "messages": {
+ "type": "array",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
},
{
- "$ref": "#/components/schemas/CreateTransferCallToolDTO",
- "title": "TransferCallTool"
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
},
{
- "$ref": "#/components/schemas/CreateSipRequestToolDTO",
- "title": "SipRequestTool"
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
},
{
- "$ref": "#/components/schemas/CreateVoicemailToolDTO",
- "title": "VoicemailTool"
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
}
]
}
},
- "toolIds": {
- "description": "These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together.",
+ "type": {
+ "type": "string",
+ "enum": [
+ "gohighlevel.calendar.event.create"
+ ],
+ "description": "The type of tool. \"gohighlevel.calendar.event.create\" for GoHighLevel Calendar Event Create tool."
+ },
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ToolRejectionPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "type"
+ ]
+ },
+ "CreateGoHighLevelContactCreateToolDTO": {
+ "type": "object",
+ "properties": {
+ "messages": {
"type": "array",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
- "type": "string"
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
+ }
+ ]
}
},
- "knowledgeBase": {
- "description": "These are the options for the knowledge base.",
- "oneOf": [
+ "type": {
+ "type": "string",
+ "enum": [
+ "gohighlevel.contact.create"
+ ],
+ "description": "The type of tool. \"gohighlevel.contact.create\" for GoHighLevel Contact Create tool."
+ },
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "allOf": [
{
- "$ref": "#/components/schemas/CreateCustomKnowledgeBaseDTO",
- "title": "Custom"
+ "$ref": "#/components/schemas/ToolRejectionPlan"
}
]
+ }
+ },
+ "required": [
+ "type"
+ ]
+ },
+ "CreateGoHighLevelContactGetToolDTO": {
+ "type": "object",
+ "properties": {
+ "messages": {
+ "type": "array",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
+ }
+ ]
+ }
},
- "provider": {
+ "type": {
"type": "string",
- "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.",
"enum": [
- "custom-llm"
+ "gohighlevel.contact.get"
+ ],
+ "description": "The type of tool. \"gohighlevel.contact.get\" for GoHighLevel Contact Get tool."
+ },
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ToolRejectionPlan"
+ }
]
+ }
+ },
+ "required": [
+ "type"
+ ]
+ },
+ "OpenAIMessage": {
+ "type": "object",
+ "properties": {
+ "content": {
+ "type": "string",
+ "nullable": true,
+ "maxLength": 100000000
},
- "metadataSendMode": {
+ "role": {
"type": "string",
- "description": "This determines whether metadata is sent in requests to the custom provider.\n\n- `off` will not send any metadata. payload will look like `{ messages }`\n- `variable` will send `assistant.metadata` as a variable on the payload. payload will look like `{ messages, metadata }`\n- `destructured` will send `assistant.metadata` fields directly on the payload. payload will look like `{ messages, ...metadata }`\n\nFurther, `variable` and `destructured` will send `call`, `phoneNumber`, and `customer` objects in the payload.\n\nDefault is `variable`.",
"enum": [
- "off",
- "variable",
- "destructured"
+ "assistant",
+ "function",
+ "user",
+ "system",
+ "tool"
]
- },
- "headers": {
- "type": "object",
- "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).",
- "additionalProperties": {
- "type": "string"
- },
- "example": {
- "X-Custom-Header": "value"
- }
- },
- "url": {
+ }
+ },
+ "required": [
+ "content",
+ "role"
+ ]
+ },
+ "ToolRef": {
+ "type": "object",
+ "properties": {
+ "toolId": {
"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.\nThis only works for Deepgram transcribers."
- },
- "timeoutSeconds": {
- "type": "number",
- "description": "This sets the timeout for the connection to the custom provider without needing to stream any tokens back. Default is 20 seconds.",
- "minimum": 0,
- "maximum": 300
+ "description": "This is the unique identifier of the tool whose version is being pinned.",
+ "format": "uuid"
},
- "model": {
+ "version": {
"type": "string",
- "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b"
- },
- "temperature": {
- "type": "number",
- "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.",
- "minimum": 0,
- "maximum": 2
- },
- "maxTokens": {
- "type": "number",
- "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.",
- "minimum": 50,
- "maximum": 10000
- },
- "emotionRecognitionEnabled": {
- "type": "boolean",
- "description": "This determines whether we detect user's emotion while they speak and send it as an additional info to model.\n\nDefault `false` because the model is usually are good at understanding the user's emotion from text.\n\n@default false"
- },
- "numFastTurns": {
- "type": "number",
- "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.\n\nDefault is 0.\n\n@default 0",
- "minimum": 0
+ "description": "Public version label of the tool, e.g. \"v3\""
}
},
"required": [
- "provider",
- "url",
- "model"
+ "toolId",
+ "version"
]
},
- "DeepInfraModel": {
+ "AnyscaleModel": {
"type": "object",
"properties": {
"messages": {
@@ -14976,6 +16242,13 @@
"type": "string"
}
},
+ "toolRefs": {
+ "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolRef"
+ }
+ },
"knowledgeBase": {
"description": "These are the options for the knowledge base.",
"oneOf": [
@@ -14988,7 +16261,7 @@
"provider": {
"type": "string",
"enum": [
- "deepinfra"
+ "anyscale"
]
},
"model": {
@@ -14997,7 +16270,7 @@
},
"temperature": {
"type": "number",
- "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.",
+ "description": "This is the temperature that will be used for calls. Default is 0.5.",
"minimum": 0,
"maximum": 2
},
@@ -15022,7 +16295,28 @@
"model"
]
},
- "DeepSeekModel": {
+ "AnthropicThinkingConfig": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "enum": [
+ "enabled"
+ ]
+ },
+ "budgetTokens": {
+ "type": "number",
+ "description": "The maximum number of tokens to allocate for thinking.\nMust be between 1024 and 100000 tokens.",
+ "minimum": 1024,
+ "maximum": 100000
+ }
+ },
+ "required": [
+ "type",
+ "budgetTokens"
+ ]
+ },
+ "AnthropicModel": {
"type": "object",
"properties": {
"messages": {
@@ -15139,6 +16433,13 @@
"type": "string"
}
},
+ "toolRefs": {
+ "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolRef"
+ }
+ },
"knowledgeBase": {
"description": "These are the options for the knowledge base.",
"oneOf": [
@@ -15150,21 +16451,42 @@
},
"model": {
"type": "string",
- "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b",
+ "description": "The specific Anthropic/Claude model that will be used.",
"enum": [
- "deepseek-chat",
- "deepseek-reasoner"
+ "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"
]
},
"provider": {
"type": "string",
+ "description": "The provider identifier for Anthropic.",
"enum": [
- "deep-seek"
+ "anthropic"
+ ]
+ },
+ "thinking": {
+ "description": "Optional configuration for Anthropic's thinking feature.\nOnly applicable for claude-3-7-sonnet-20250219 model.\nIf provided, maxTokens must be greater than thinking.budgetTokens.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/AnthropicThinkingConfig"
+ }
]
},
"temperature": {
"type": "number",
- "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.",
+ "description": "This is the temperature that will be used for calls. Default is 0.5.",
"minimum": 0,
"maximum": 2
},
@@ -15189,76 +16511,7 @@
"provider"
]
},
- "GeminiMultimodalLivePrebuiltVoiceConfig": {
- "type": "object",
- "properties": {
- "voiceName": {
- "type": "string",
- "enum": [
- "Puck",
- "Charon",
- "Kore",
- "Fenrir",
- "Aoede"
- ]
- }
- },
- "required": [
- "voiceName"
- ]
- },
- "GeminiMultimodalLiveVoiceConfig": {
- "type": "object",
- "properties": {
- "prebuiltVoiceConfig": {
- "$ref": "#/components/schemas/GeminiMultimodalLivePrebuiltVoiceConfig"
- }
- },
- "required": [
- "prebuiltVoiceConfig"
- ]
- },
- "GeminiMultimodalLiveSpeechConfig": {
- "type": "object",
- "properties": {
- "voiceConfig": {
- "$ref": "#/components/schemas/GeminiMultimodalLiveVoiceConfig"
- }
- },
- "required": [
- "voiceConfig"
- ]
- },
- "GoogleRealtimeConfig": {
- "type": "object",
- "properties": {
- "topP": {
- "type": "number",
- "description": "This is the nucleus sampling parameter that controls the cumulative probability of tokens considered during text generation.\nOnly applicable with the Gemini Flash 2.0 Multimodal Live API."
- },
- "topK": {
- "type": "number",
- "description": "This is the top-k sampling parameter that limits the number of highest probability tokens considered during text generation.\nOnly applicable with the Gemini Flash 2.0 Multimodal Live API."
- },
- "presencePenalty": {
- "type": "number",
- "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.\nOnly applicable with the Gemini Flash 2.0 Multimodal Live API."
- },
- "frequencyPenalty": {
- "type": "number",
- "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.\nOnly applicable with the Gemini Flash 2.0 Multimodal Live API."
- },
- "speechConfig": {
- "description": "This is the speech configuration object that defines the voice settings to be used for the model's speech output.\nOnly applicable with the Gemini Flash 2.0 Multimodal Live API.",
- "allOf": [
- {
- "$ref": "#/components/schemas/GeminiMultimodalLiveSpeechConfig"
- }
- ]
- }
- }
- },
- "GoogleModel": {
+ "AnthropicBedrockModel": {
"type": "object",
"properties": {
"messages": {
@@ -15375,6 +16628,13 @@
"type": "string"
}
},
+ "toolRefs": {
+ "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolRef"
+ }
+ },
"knowledgeBase": {
"description": "These are the options for the knowledge base.",
"oneOf": [
@@ -15384,44 +16644,45 @@
}
]
},
- "model": {
+ "provider": {
"type": "string",
- "description": "This is the Google model that will be used.",
+ "description": "The provider identifier for Anthropic via AWS Bedrock.",
"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"
+ "anthropic-bedrock"
]
},
- "provider": {
+ "model": {
"type": "string",
+ "description": "The specific Anthropic/Claude model that will be used via Bedrock.",
"enum": [
- "google"
+ "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",
+ "global.anthropic.claude-haiku-4-5-20251001-v1:0"
]
},
- "realtimeConfig": {
- "description": "This is the session configuration for the Gemini Flash 2.0 Multimodal Live API.\nOnly applicable if the model `gemini-2.0-flash-realtime-exp` is selected.",
+ "thinking": {
+ "description": "Optional configuration for Anthropic's thinking feature.\nOnly applicable for claude-3-7-sonnet-20250219 model.\nIf provided, maxTokens must be greater than thinking.budgetTokens.",
"allOf": [
{
- "$ref": "#/components/schemas/GoogleRealtimeConfig"
+ "$ref": "#/components/schemas/AnthropicThinkingConfig"
}
]
},
"temperature": {
"type": "number",
- "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.",
+ "description": "This is the temperature that will be used for calls. Default is 0.5.",
"minimum": 0,
"maximum": 2
},
@@ -15442,11 +16703,11 @@
}
},
"required": [
- "model",
- "provider"
+ "provider",
+ "model"
]
},
- "GroqModel": {
+ "CerebrasModel": {
"type": "object",
"properties": {
"messages": {
@@ -15563,6 +16824,13 @@
"type": "string"
}
},
+ "toolRefs": {
+ "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolRef"
+ }
+ },
"knowledgeBase": {
"description": "These are the options for the knowledge base.",
"oneOf": [
@@ -15576,32 +16844,19 @@
"type": "string",
"description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b",
"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"
+ "llama3.1-8b",
+ "llama-3.3-70b"
]
},
"provider": {
"type": "string",
"enum": [
- "groq"
+ "cerebras"
]
},
"temperature": {
"type": "number",
- "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.",
+ "description": "This is the temperature that will be used for calls. Default is 0.5.",
"minimum": 0,
"maximum": 2
},
@@ -15626,7 +16881,7 @@
"provider"
]
},
- "InflectionAIModel": {
+ "CustomLLMModel": {
"type": "object",
"properties": {
"messages": {
@@ -15743,6 +16998,13 @@
"type": "string"
}
},
+ "toolRefs": {
+ "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolRef"
+ }
+ },
"knowledgeBase": {
"description": "These are the options for the knowledge base.",
"oneOf": [
@@ -15752,22 +17014,53 @@
}
]
},
- "model": {
+ "provider": {
"type": "string",
- "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b",
+ "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.",
"enum": [
- "inflection_3_pi"
+ "custom-llm"
]
},
- "provider": {
+ "metadataSendMode": {
"type": "string",
+ "description": "This determines whether metadata is sent in requests to the custom provider.\n\n- `off` will not send any metadata. payload will look like `{ messages }`\n- `variable` will send `assistant.metadata` as a variable on the payload. payload will look like `{ messages, metadata }`\n- `destructured` will send `assistant.metadata` fields directly on the payload. payload will look like `{ messages, ...metadata }`\n\nFurther, `variable` and `destructured` will send `call`, `phoneNumber`, and `customer` objects in the payload.\n\nDefault is `variable`.",
"enum": [
- "inflection-ai"
+ "off",
+ "variable",
+ "destructured"
]
},
+ "headers": {
+ "type": "object",
+ "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).",
+ "additionalProperties": {
+ "type": "string"
+ },
+ "example": {
+ "X-Custom-Header": "value"
+ }
+ },
+ "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.\nThis only works for Deepgram transcribers."
+ },
+ "timeoutSeconds": {
+ "type": "number",
+ "description": "This sets the timeout for the connection to the custom provider without needing to stream any tokens back. Default is 20 seconds.",
+ "minimum": 0,
+ "maximum": 300
+ },
+ "model": {
+ "type": "string",
+ "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b"
+ },
"temperature": {
"type": "number",
- "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.",
+ "description": "This is the temperature that will be used for calls. Default is 0.5.",
"minimum": 0,
"maximum": 2
},
@@ -15788,11 +17081,12 @@
}
},
"required": [
- "model",
- "provider"
+ "provider",
+ "url",
+ "model"
]
},
- "MinimaxLLMModel": {
+ "DeepInfraModel": {
"type": "object",
"properties": {
"messages": {
@@ -15909,6 +17203,13 @@
"type": "string"
}
},
+ "toolRefs": {
+ "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolRef"
+ }
+ },
"knowledgeBase": {
"description": "These are the options for the knowledge base.",
"oneOf": [
@@ -15921,19 +17222,16 @@
"provider": {
"type": "string",
"enum": [
- "minimax"
+ "deepinfra"
]
},
"model": {
"type": "string",
- "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b",
- "enum": [
- "MiniMax-M2.7"
- ]
+ "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b"
},
"temperature": {
"type": "number",
- "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.",
+ "description": "This is the temperature that will be used for calls. Default is 0.5.",
"minimum": 0,
"maximum": 2
},
@@ -15958,7 +17256,7 @@
"model"
]
},
- "OpenAIModel": {
+ "DeepSeekModel": {
"type": "object",
"properties": {
"messages": {
@@ -16075,6 +17373,13 @@
"type": "string"
}
},
+ "toolRefs": {
+ "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolRef"
+ }
+ },
"knowledgeBase": {
"description": "These are the options for the knowledge base.",
"oneOf": [
@@ -16084,292 +17389,23 @@
}
]
},
- "provider": {
- "type": "string",
- "description": "This is the provider that will be used for the model.",
- "enum": [
- "openai"
- ]
- },
"model": {
"type": "string",
- "description": "This is the OpenAI model that will be used.\n\nWhen 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.\nThis 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/.\n\n@default undefined",
- "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"
- ]
- },
- "fallbackModels": {
- "type": "array",
- "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.",
- "example": [
- "gpt-4-0125-preview",
- "gpt-4-0613"
- ],
- "items": {
- "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"
- ]
- }
- },
- "toolStrictCompatibilityMode": {
- "type": "string",
- "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.\n\n- `strip-parameters-with-unsupported-validation` will strip parameters with unsupported validation.\n- `strip-unsupported-validation` will keep the parameters but strip unsupported validation.\n\n@default `strip-unsupported-validation`",
+ "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b",
"enum": [
- "strip-parameters-with-unsupported-validation",
- "strip-unsupported-validation"
+ "deepseek-chat",
+ "deepseek-reasoner"
]
},
- "promptCacheRetention": {
+ "provider": {
"type": "string",
- "description": "This controls the prompt cache retention policy for models that support extended caching (GPT-4.1, GPT-5 series).\n\n- `in_memory`: Default behavior, cache retained in GPU memory only\n- `24h`: Extended caching, keeps cached prefixes active for up to 24 hours by offloading to GPU-local storage\n\nOnly 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\n\n@default undefined (uses API default which is 'in_memory')",
"enum": [
- "in_memory",
- "24h"
+ "deep-seek"
]
},
- "promptCacheKey": {
- "type": "string",
- "description": "This is the prompt cache key for models that support extended caching (GPT-4.1, GPT-5 series).\n\nProviding a cache key allows you to share cached prefixes across requests.\n\n@default undefined",
- "maxLength": 64
- },
"temperature": {
"type": "number",
- "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.",
+ "description": "This is the temperature that will be used for calls. Default is 0.5.",
"minimum": 0,
"maximum": 2
},
@@ -16390,11 +17426,80 @@
}
},
"required": [
- "provider",
- "model"
+ "model",
+ "provider"
]
},
- "OpenRouterModel": {
+ "GeminiMultimodalLivePrebuiltVoiceConfig": {
+ "type": "object",
+ "properties": {
+ "voiceName": {
+ "type": "string",
+ "enum": [
+ "Puck",
+ "Charon",
+ "Kore",
+ "Fenrir",
+ "Aoede"
+ ]
+ }
+ },
+ "required": [
+ "voiceName"
+ ]
+ },
+ "GeminiMultimodalLiveVoiceConfig": {
+ "type": "object",
+ "properties": {
+ "prebuiltVoiceConfig": {
+ "$ref": "#/components/schemas/GeminiMultimodalLivePrebuiltVoiceConfig"
+ }
+ },
+ "required": [
+ "prebuiltVoiceConfig"
+ ]
+ },
+ "GeminiMultimodalLiveSpeechConfig": {
+ "type": "object",
+ "properties": {
+ "voiceConfig": {
+ "$ref": "#/components/schemas/GeminiMultimodalLiveVoiceConfig"
+ }
+ },
+ "required": [
+ "voiceConfig"
+ ]
+ },
+ "GoogleRealtimeConfig": {
+ "type": "object",
+ "properties": {
+ "topP": {
+ "type": "number",
+ "description": "This is the nucleus sampling parameter that controls the cumulative probability of tokens considered during text generation.\nOnly applicable with the Gemini Flash 2.0 Multimodal Live API."
+ },
+ "topK": {
+ "type": "number",
+ "description": "This is the top-k sampling parameter that limits the number of highest probability tokens considered during text generation.\nOnly applicable with the Gemini Flash 2.0 Multimodal Live API."
+ },
+ "presencePenalty": {
+ "type": "number",
+ "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.\nOnly applicable with the Gemini Flash 2.0 Multimodal Live API."
+ },
+ "frequencyPenalty": {
+ "type": "number",
+ "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.\nOnly applicable with the Gemini Flash 2.0 Multimodal Live API."
+ },
+ "speechConfig": {
+ "description": "This is the speech configuration object that defines the voice settings to be used for the model's speech output.\nOnly applicable with the Gemini Flash 2.0 Multimodal Live API.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/GeminiMultimodalLiveSpeechConfig"
+ }
+ ]
+ }
+ }
+ },
+ "GoogleModel": {
"type": "object",
"properties": {
"messages": {
@@ -16511,6 +17616,13 @@
"type": "string"
}
},
+ "toolRefs": {
+ "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolRef"
+ }
+ },
"knowledgeBase": {
"description": "These are the options for the knowledge base.",
"oneOf": [
@@ -16520,19 +17632,46 @@
}
]
},
- "provider": {
+ "model": {
"type": "string",
+ "description": "This is the Google model that will be used.",
"enum": [
- "openrouter"
+ "gemini-3.5-flash",
+ "gemini-3.1-flash-lite",
+ "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"
]
},
- "model": {
+ "provider": {
"type": "string",
- "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b"
+ "enum": [
+ "google"
+ ]
+ },
+ "realtimeConfig": {
+ "description": "This is the session configuration for the Gemini Flash 2.0 Multimodal Live API.\nOnly applicable if the model `gemini-2.0-flash-realtime-exp` is selected.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/GoogleRealtimeConfig"
+ }
+ ]
},
"temperature": {
"type": "number",
- "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.",
+ "description": "This is the temperature that will be used for calls. Default is 0.5.",
"minimum": 0,
"maximum": 2
},
@@ -16553,11 +17692,11 @@
}
},
"required": [
- "provider",
- "model"
- ]
+ "model",
+ "provider"
+ ]
},
- "PerplexityAIModel": {
+ "GroqModel": {
"type": "object",
"properties": {
"messages": {
@@ -16674,6 +17813,13 @@
"type": "string"
}
},
+ "toolRefs": {
+ "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolRef"
+ }
+ },
"knowledgeBase": {
"description": "These are the options for the knowledge base.",
"oneOf": [
@@ -16683,19 +17829,36 @@
}
]
},
- "provider": {
+ "model": {
"type": "string",
+ "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b",
"enum": [
- "perplexity-ai"
+ "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"
]
},
- "model": {
+ "provider": {
"type": "string",
- "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b"
+ "enum": [
+ "groq"
+ ]
},
"temperature": {
"type": "number",
- "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.",
+ "description": "This is the temperature that will be used for calls. Default is 0.5.",
"minimum": 0,
"maximum": 2
},
@@ -16716,11 +17879,11 @@
}
},
"required": [
- "provider",
- "model"
+ "model",
+ "provider"
]
},
- "TogetherAIModel": {
+ "InflectionAIModel": {
"type": "object",
"properties": {
"messages": {
@@ -16837,6 +18000,13 @@
"type": "string"
}
},
+ "toolRefs": {
+ "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolRef"
+ }
+ },
"knowledgeBase": {
"description": "These are the options for the knowledge base.",
"oneOf": [
@@ -16846,19 +18016,22 @@
}
]
},
- "provider": {
+ "model": {
"type": "string",
+ "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b",
"enum": [
- "together-ai"
+ "inflection_3_pi"
]
},
- "model": {
+ "provider": {
"type": "string",
- "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b"
+ "enum": [
+ "inflection-ai"
+ ]
},
"temperature": {
"type": "number",
- "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.",
+ "description": "This is the temperature that will be used for calls. Default is 0.5.",
"minimum": 0,
"maximum": 2
},
@@ -16879,51 +18052,326 @@
}
},
"required": [
- "provider",
- "model"
+ "model",
+ "provider"
]
},
- "HangupNode": {
+ "MinimaxLLMModel": {
"type": "object",
"properties": {
- "type": {
+ "messages": {
+ "description": "This is the starting state for the conversation.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/OpenAIMessage"
+ }
+ },
+ "tools": {
+ "type": "array",
+ "description": "These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CreateApiRequestToolDTO",
+ "title": "ApiRequestTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateBashToolDTO",
+ "title": "BashTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCodeToolDTO",
+ "title": "CodeTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateComputerToolDTO",
+ "title": "ComputerTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateDtmfToolDTO",
+ "title": "DtmfTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateEndCallToolDTO",
+ "title": "EndCallTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateFunctionToolDTO",
+ "title": "FunctionTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO",
+ "title": "GoHighLevelCalendarAvailabilityTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO",
+ "title": "GoHighLevelCalendarEventCreateTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelContactCreateToolDTO",
+ "title": "GoHighLevelContactCreateTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelContactGetToolDTO",
+ "title": "GoHighLevelContactGetTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO",
+ "title": "GoogleCalendarCheckAvailabilityTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarCreateEventToolDTO",
+ "title": "GoogleCalendarCreateEventTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleSheetsRowAppendToolDTO",
+ "title": "GoogleSheetsRowAppendTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateHandoffToolDTO",
+ "title": "HandoffTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMcpToolDTO",
+ "title": "McpTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateQueryToolDTO",
+ "title": "QueryTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSlackSendMessageToolDTO",
+ "title": "SlackSendMessageTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSmsToolDTO",
+ "title": "SmsTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTextEditorToolDTO",
+ "title": "TextEditorTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTransferCallToolDTO",
+ "title": "TransferCallTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSipRequestToolDTO",
+ "title": "SipRequestTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateVoicemailToolDTO",
+ "title": "VoicemailTool"
+ }
+ ]
+ }
+ },
+ "toolIds": {
+ "description": "These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "toolRefs": {
+ "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolRef"
+ }
+ },
+ "knowledgeBase": {
+ "description": "These are the options for the knowledge base.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CreateCustomKnowledgeBaseDTO",
+ "title": "Custom"
+ }
+ ]
+ },
+ "provider": {
"type": "string",
"enum": [
- "hangup"
+ "minimax"
]
},
- "name": {
+ "model": {
"type": "string",
- "maxLength": 80
+ "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b",
+ "enum": [
+ "MiniMax-M2.7"
+ ]
},
- "isStart": {
+ "temperature": {
+ "type": "number",
+ "description": "This is the temperature that will be used for calls. Default is 0.5.",
+ "minimum": 0,
+ "maximum": 2
+ },
+ "maxTokens": {
+ "type": "number",
+ "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.",
+ "minimum": 50,
+ "maximum": 10000
+ },
+ "emotionRecognitionEnabled": {
"type": "boolean",
- "description": "This is whether or not the node is the start of the workflow."
+ "description": "This determines whether we detect user's emotion while they speak and send it as an additional info to model.\n\nDefault `false` because the model is usually are good at understanding the user's emotion from text.\n\n@default false"
},
- "metadata": {
- "type": "object",
- "description": "This is for metadata you want to store on the task."
+ "numFastTurns": {
+ "type": "number",
+ "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.\n\nDefault is 0.\n\n@default 0",
+ "minimum": 0
}
},
"required": [
- "type",
- "name"
+ "provider",
+ "model"
]
},
- "WorkflowOpenAIModel": {
+ "OpenAIModel": {
"type": "object",
"properties": {
+ "messages": {
+ "description": "This is the starting state for the conversation.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/OpenAIMessage"
+ }
+ },
+ "tools": {
+ "type": "array",
+ "description": "These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CreateApiRequestToolDTO",
+ "title": "ApiRequestTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateBashToolDTO",
+ "title": "BashTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCodeToolDTO",
+ "title": "CodeTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateComputerToolDTO",
+ "title": "ComputerTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateDtmfToolDTO",
+ "title": "DtmfTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateEndCallToolDTO",
+ "title": "EndCallTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateFunctionToolDTO",
+ "title": "FunctionTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO",
+ "title": "GoHighLevelCalendarAvailabilityTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO",
+ "title": "GoHighLevelCalendarEventCreateTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelContactCreateToolDTO",
+ "title": "GoHighLevelContactCreateTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelContactGetToolDTO",
+ "title": "GoHighLevelContactGetTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO",
+ "title": "GoogleCalendarCheckAvailabilityTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarCreateEventToolDTO",
+ "title": "GoogleCalendarCreateEventTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleSheetsRowAppendToolDTO",
+ "title": "GoogleSheetsRowAppendTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateHandoffToolDTO",
+ "title": "HandoffTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMcpToolDTO",
+ "title": "McpTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateQueryToolDTO",
+ "title": "QueryTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSlackSendMessageToolDTO",
+ "title": "SlackSendMessageTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSmsToolDTO",
+ "title": "SmsTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTextEditorToolDTO",
+ "title": "TextEditorTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTransferCallToolDTO",
+ "title": "TransferCallTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSipRequestToolDTO",
+ "title": "SipRequestTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateVoicemailToolDTO",
+ "title": "VoicemailTool"
+ }
+ ]
+ }
+ },
+ "toolIds": {
+ "description": "These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "toolRefs": {
+ "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolRef"
+ }
+ },
+ "knowledgeBase": {
+ "description": "These are the options for the knowledge base.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CreateCustomKnowledgeBaseDTO",
+ "title": "Custom"
+ }
+ ]
+ },
"provider": {
"type": "string",
- "description": "This is the provider of the model (`openai`).",
+ "description": "This is the provider that will be used for the model.",
"enum": [
"openai"
]
},
"model": {
"type": "string",
- "description": "This is the OpenAI model that will be used.\n\nWhen 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.\nThis 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/.",
- "maxLength": 100,
+ "description": "This is the OpenAI model that will be used.\n\nWhen 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.\nThis 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/.\n\n@default undefined",
"enum": [
"gpt-5.4",
"gpt-5.4-mini",
@@ -16948,6 +18396,12 @@
"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-realtime-2",
"gpt-4o-mini-2024-07-18",
"gpt-4o-mini",
"gpt-4o",
@@ -17037,77 +18491,198 @@
"gpt-3.5-turbo-0125:northcentralus",
"gpt-3.5-turbo-0125:southcentralus",
"gpt-3.5-turbo-1106:canadaeast",
- "gpt-3.5-turbo-1106:westus"
+ "gpt-3.5-turbo-1106:westus",
+ "gpt-4.1:australiaeast",
+ "gpt-4o:australiaeast",
+ "gpt-5.4-mini:australiaeast"
]
},
- "temperature": {
- "type": "number",
- "description": "This is the temperature of the model.",
- "minimum": 0,
- "maximum": 2
+ "fallbackModels": {
+ "type": "array",
+ "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.",
+ "example": [
+ "gpt-4-0125-preview",
+ "gpt-4-0613"
+ ],
+ "items": {
+ "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-realtime-2",
+ "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",
+ "gpt-4.1:australiaeast",
+ "gpt-4o:australiaeast",
+ "gpt-5.4-mini:australiaeast"
+ ]
+ }
},
- "maxTokens": {
- "type": "number",
- "description": "This is the max tokens of the model.",
- "minimum": 50,
- "maximum": 10000
- }
- },
- "required": [
- "provider",
- "model"
- ]
- },
- "WorkflowAnthropicModel": {
- "type": "object",
- "properties": {
- "provider": {
+ "toolStrictCompatibilityMode": {
"type": "string",
- "description": "This is the provider of the model (`anthropic`).",
+ "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.\n\n- `strip-parameters-with-unsupported-validation` will strip parameters with unsupported validation.\n- `strip-unsupported-validation` will keep the parameters but strip unsupported validation.\n\n@default `strip-unsupported-validation`",
"enum": [
- "anthropic"
+ "strip-parameters-with-unsupported-validation",
+ "strip-unsupported-validation"
]
},
- "model": {
+ "promptCacheRetention": {
"type": "string",
- "description": "This is the specific model that will be used.",
- "maxLength": 100,
+ "description": "This controls the prompt cache retention policy for models that support extended caching (GPT-4.1, GPT-5 series).\n\n- `in_memory`: Default behavior, cache retained in GPU memory only\n- `24h`: Extended caching, keeps cached prefixes active for up to 24 hours by offloading to GPU-local storage\n\nOnly 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\n\n@default undefined (uses API default which is 'in_memory')",
"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"
+ "in_memory",
+ "24h"
]
},
- "thinking": {
- "description": "This is the optional configuration for Anthropic's thinking feature.\n\n- If provided, `maxTokens` must be greater than `thinking.budgetTokens`.",
- "allOf": [
- {
- "$ref": "#/components/schemas/AnthropicThinkingConfig"
- }
+ "promptCacheKey": {
+ "type": "string",
+ "description": "This is the prompt cache key for models that support extended caching (GPT-4.1, GPT-5 series).\n\nProviding a cache key allows you to share cached prefixes across requests.\n\n@default undefined",
+ "maxLength": 64
+ },
+ "reasoningEffort": {
+ "type": "string",
+ "description": "Reasoning effort for reasoning-capable OpenAI models.\nFor `gpt-realtime-2`: forwarded to V2 stream's session.update as `reasoning.effort`.\nFor non-realtime OpenAI models: routed through `modelSpecificOverridesGet` (openAIUtil.ts:622-726).\nNarrower than CompletionRequestParams.reasoningEffort intentionally: 'none' is an internal-only override value set by modelSpecificOverridesGet for GPT-5 family, not user-settable via DTO.",
+ "enum": [
+ "minimal",
+ "low",
+ "medium",
+ "high"
]
},
"temperature": {
"type": "number",
- "description": "This is the temperature of the model.",
+ "description": "This is the temperature that will be used for calls. Default is 0.5.",
"minimum": 0,
"maximum": 2
},
"maxTokens": {
"type": "number",
- "description": "This is the max tokens of the model.",
+ "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.",
"minimum": 50,
"maximum": 10000
+ },
+ "emotionRecognitionEnabled": {
+ "type": "boolean",
+ "description": "This determines whether we detect user's emotion while they speak and send it as an additional info to model.\n\nDefault `false` because the model is usually are good at understanding the user's emotion from text.\n\n@default false"
+ },
+ "numFastTurns": {
+ "type": "number",
+ "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.\n\nDefault is 0.\n\n@default 0",
+ "minimum": 0
}
},
"required": [
@@ -17115,354 +18690,189 @@
"model"
]
},
- "WorkflowAnthropicBedrockModel": {
+ "OpenRouterModel": {
"type": "object",
"properties": {
- "provider": {
- "type": "string",
- "description": "This is the provider of the model (`anthropic-bedrock`).",
- "enum": [
- "anthropic-bedrock"
- ]
+ "messages": {
+ "description": "This is the starting state for the conversation.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/OpenAIMessage"
+ }
},
- "model": {
- "type": "string",
- "description": "This is the specific model that will be used.",
- "maxLength": 100,
- "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"
- ]
+ "tools": {
+ "type": "array",
+ "description": "These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CreateApiRequestToolDTO",
+ "title": "ApiRequestTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateBashToolDTO",
+ "title": "BashTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCodeToolDTO",
+ "title": "CodeTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateComputerToolDTO",
+ "title": "ComputerTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateDtmfToolDTO",
+ "title": "DtmfTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateEndCallToolDTO",
+ "title": "EndCallTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateFunctionToolDTO",
+ "title": "FunctionTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO",
+ "title": "GoHighLevelCalendarAvailabilityTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO",
+ "title": "GoHighLevelCalendarEventCreateTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelContactCreateToolDTO",
+ "title": "GoHighLevelContactCreateTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelContactGetToolDTO",
+ "title": "GoHighLevelContactGetTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO",
+ "title": "GoogleCalendarCheckAvailabilityTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarCreateEventToolDTO",
+ "title": "GoogleCalendarCreateEventTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleSheetsRowAppendToolDTO",
+ "title": "GoogleSheetsRowAppendTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateHandoffToolDTO",
+ "title": "HandoffTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMcpToolDTO",
+ "title": "McpTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateQueryToolDTO",
+ "title": "QueryTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSlackSendMessageToolDTO",
+ "title": "SlackSendMessageTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSmsToolDTO",
+ "title": "SmsTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTextEditorToolDTO",
+ "title": "TextEditorTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTransferCallToolDTO",
+ "title": "TransferCallTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSipRequestToolDTO",
+ "title": "SipRequestTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateVoicemailToolDTO",
+ "title": "VoicemailTool"
+ }
+ ]
+ }
},
- "thinking": {
- "description": "This is the optional configuration for Anthropic's thinking feature.\n\n- If provided, `maxTokens` must be greater than `thinking.budgetTokens`.",
- "allOf": [
+ "toolIds": {
+ "description": "These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "toolRefs": {
+ "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolRef"
+ }
+ },
+ "knowledgeBase": {
+ "description": "These are the options for the knowledge base.",
+ "oneOf": [
{
- "$ref": "#/components/schemas/AnthropicThinkingConfig"
+ "$ref": "#/components/schemas/CreateCustomKnowledgeBaseDTO",
+ "title": "Custom"
}
]
},
- "temperature": {
- "type": "number",
- "description": "This is the temperature of the model.",
- "minimum": 0,
- "maximum": 2
- },
- "maxTokens": {
- "type": "number",
- "description": "This is the max tokens of the model.",
- "minimum": 50,
- "maximum": 10000
- }
- },
- "required": [
- "provider",
- "model"
- ]
- },
- "WorkflowGoogleModel": {
- "type": "object",
- "properties": {
"provider": {
"type": "string",
- "description": "This is the provider of the model (`google`).",
"enum": [
- "google"
+ "openrouter"
]
},
"model": {
"type": "string",
- "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b",
- "maxLength": 100,
- "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"
},
"temperature": {
"type": "number",
- "description": "This is the temperature of the model.",
+ "description": "This is the temperature that will be used for calls. Default is 0.5.",
"minimum": 0,
"maximum": 2
},
"maxTokens": {
"type": "number",
- "description": "This is the max tokens of the model.",
+ "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.",
"minimum": 50,
"maximum": 10000
- }
- },
- "required": [
- "provider",
- "model"
- ]
- },
- "WorkflowCustomModel": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "description": "This is the provider of the model (`custom-llm`).",
- "enum": [
- "custom-llm"
- ]
- },
- "metadataSendMode": {
- "type": "string",
- "description": "This determines whether metadata is sent in requests to the custom provider.\n\n- `off` will not send any metadata. payload will look like `{ messages }`\n- `variable` will send `assistant.metadata` as a variable on the payload. payload will look like `{ messages, metadata }`\n- `destructured` will send `assistant.metadata` fields directly on the payload. payload will look like `{ messages, ...metadata }`\n\nFurther, `variable` and `destructured` will send `call`, `phoneNumber`, and `customer` objects in the payload.\n\nDefault is `variable`.",
- "enum": [
- "off",
- "variable",
- "destructured"
- ]
- },
- "url": {
- "type": "string",
- "description": "These is the URL we'll use for the OpenAI client's `baseURL`. Ex. https://openrouter.ai/api/v1"
- },
- "headers": {
- "type": "object",
- "description": "These are the headers we'll use for the OpenAI client's `headers`."
- },
- "timeoutSeconds": {
- "type": "number",
- "description": "This sets the timeout for the connection to the custom provider without needing to stream any tokens back. Default is 20 seconds.",
- "minimum": 20,
- "maximum": 600
- },
- "model": {
- "type": "string",
- "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b",
- "maxLength": 100
},
- "temperature": {
- "type": "number",
- "description": "This is the temperature of the model.",
- "minimum": 0,
- "maximum": 2
+ "emotionRecognitionEnabled": {
+ "type": "boolean",
+ "description": "This determines whether we detect user's emotion while they speak and send it as an additional info to model.\n\nDefault `false` because the model is usually are good at understanding the user's emotion from text.\n\n@default false"
},
- "maxTokens": {
+ "numFastTurns": {
"type": "number",
- "description": "This is the max tokens of the model.",
- "minimum": 50,
- "maximum": 10000
+ "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.\n\nDefault is 0.\n\n@default 0",
+ "minimum": 0
}
},
"required": [
"provider",
- "url",
"model"
]
},
- "GlobalNodePlan": {
- "type": "object",
- "properties": {
- "enabled": {
- "type": "boolean",
- "description": "This is the flag to determine if this node is a global node\n\n@default false",
- "default": false
- },
- "enterCondition": {
- "type": "string",
- "description": "This is the condition that will be checked to determine if the global node should be executed.\n\n@default ''",
- "maxLength": 1000,
- "default": ""
- }
- }
- },
- "ConversationNode": {
+ "PerplexityAIModel": {
"type": "object",
"properties": {
- "type": {
- "type": "string",
- "description": "This is the Conversation node. This can be used to start a conversation with the customer.\n\nThe flow is:\n- Workflow starts the conversation node\n- Model is active with the `prompt` and global context.\n- Model will call a tool to exit this node.\n- Workflow will extract variables from the conversation.\n- Workflow continues.",
- "enum": [
- "conversation"
- ]
- },
- "model": {
- "description": "This is the model for the node.\n\nThis overrides `workflow.model`.",
- "oneOf": [
- {
- "$ref": "#/components/schemas/WorkflowOpenAIModel",
- "title": "WorkflowOpenAIModel"
- },
- {
- "$ref": "#/components/schemas/WorkflowAnthropicModel",
- "title": "WorkflowAnthropicModel"
- },
- {
- "$ref": "#/components/schemas/WorkflowAnthropicBedrockModel",
- "title": "WorkflowAnthropicBedrockModel"
- },
- {
- "$ref": "#/components/schemas/WorkflowGoogleModel",
- "title": "WorkflowGoogleModel"
- },
- {
- "$ref": "#/components/schemas/WorkflowCustomModel",
- "title": "WorkflowCustomModel"
- }
- ]
- },
- "transcriber": {
- "description": "This is the transcriber for the node.\n\nThis overrides `workflow.transcriber`.",
- "oneOf": [
- {
- "$ref": "#/components/schemas/AssemblyAITranscriber",
- "title": "AssemblyAITranscriber"
- },
- {
- "$ref": "#/components/schemas/AzureSpeechTranscriber",
- "title": "AzureSpeechTranscriber"
- },
- {
- "$ref": "#/components/schemas/CustomTranscriber",
- "title": "CustomTranscriber"
- },
- {
- "$ref": "#/components/schemas/DeepgramTranscriber",
- "title": "DeepgramTranscriber"
- },
- {
- "$ref": "#/components/schemas/ElevenLabsTranscriber",
- "title": "ElevenLabsTranscriber"
- },
- {
- "$ref": "#/components/schemas/GladiaTranscriber",
- "title": "GladiaTranscriber"
- },
- {
- "$ref": "#/components/schemas/GoogleTranscriber",
- "title": "GoogleTranscriber"
- },
- {
- "$ref": "#/components/schemas/SpeechmaticsTranscriber",
- "title": "SpeechmaticsTranscriber"
- },
- {
- "$ref": "#/components/schemas/TalkscriberTranscriber",
- "title": "TalkscriberTranscriber"
- },
- {
- "$ref": "#/components/schemas/OpenAITranscriber",
- "title": "OpenAITranscriber"
- },
- {
- "$ref": "#/components/schemas/CartesiaTranscriber",
- "title": "CartesiaTranscriber"
- },
- {
- "$ref": "#/components/schemas/SonioxTranscriber",
- "title": "SonioxTranscriber"
- }
- ]
- },
- "voice": {
- "description": "This is the voice for the node.\n\nThis overrides `workflow.voice`.",
- "oneOf": [
- {
- "$ref": "#/components/schemas/AzureVoice",
- "title": "AzureVoice"
- },
- {
- "$ref": "#/components/schemas/CartesiaVoice",
- "title": "CartesiaVoice"
- },
- {
- "$ref": "#/components/schemas/CustomVoice",
- "title": "CustomVoice"
- },
- {
- "$ref": "#/components/schemas/DeepgramVoice",
- "title": "DeepgramVoice"
- },
- {
- "$ref": "#/components/schemas/ElevenLabsVoice",
- "title": "ElevenLabsVoice"
- },
- {
- "$ref": "#/components/schemas/HumeVoice",
- "title": "HumeVoice"
- },
- {
- "$ref": "#/components/schemas/LMNTVoice",
- "title": "LMNTVoice"
- },
- {
- "$ref": "#/components/schemas/NeuphonicVoice",
- "title": "NeuphonicVoice"
- },
- {
- "$ref": "#/components/schemas/OpenAIVoice",
- "title": "OpenAIVoice"
- },
- {
- "$ref": "#/components/schemas/PlayHTVoice",
- "title": "PlayHTVoice"
- },
- {
- "$ref": "#/components/schemas/WellSaidVoice",
- "title": "WellSaidVoice"
- },
- {
- "$ref": "#/components/schemas/RimeAIVoice",
- "title": "RimeAIVoice"
- },
- {
- "$ref": "#/components/schemas/SmallestAIVoice",
- "title": "SmallestAIVoice"
- },
- {
- "$ref": "#/components/schemas/TavusVoice",
- "title": "TavusVoice"
- },
- {
- "$ref": "#/components/schemas/VapiVoice",
- "title": "VapiVoice"
- },
- {
- "$ref": "#/components/schemas/SesameVoice",
- "title": "SesameVoice"
- },
- {
- "$ref": "#/components/schemas/InworldVoice",
- "title": "InworldVoice"
- },
- {
- "$ref": "#/components/schemas/MinimaxVoice",
- "title": "MinimaxVoice"
- }
- ]
+ "messages": {
+ "description": "This is the starting state for the conversation.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/OpenAIMessage"
+ }
},
"tools": {
"type": "array",
- "description": "These are the tools that the conversation node can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together.",
+ "description": "These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together.",
"items": {
"oneOf": [
{
@@ -17561,160 +18971,243 @@
}
},
"toolIds": {
- "description": "These are the tools that the conversation node can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together.",
+ "description": "These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together.",
"type": "array",
"items": {
"type": "string"
}
},
- "prompt": {
- "type": "string",
- "maxLength": 5000
+ "toolRefs": {
+ "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolRef"
+ }
},
- "globalNodePlan": {
- "description": "This is the plan for the global node.",
- "allOf": [
+ "knowledgeBase": {
+ "description": "These are the options for the knowledge base.",
+ "oneOf": [
{
- "$ref": "#/components/schemas/GlobalNodePlan"
+ "$ref": "#/components/schemas/CreateCustomKnowledgeBaseDTO",
+ "title": "Custom"
}
]
},
- "variableExtractionPlan": {
- "description": "This is the plan that controls the variable extraction from the user's responses.\n\nUsage:\nUse `schema` to specify what you want to extract from the user's responses.\n```json\n{\n \"schema\": {\n \"type\": \"object\",\n \"properties\": {\n \"user\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"age\": {\n \"type\": \"number\"\n }\n }\n }\n }\n }\n}\n```\n\nThis will be extracted as `{{ user.name }}` and `{{ user.age }}` respectively.\n\n(Optional) Use `aliases` to create new variables.\n\n```json\n{\n \"aliases\": [\n {\n \"key\": \"userAge\",\n \"value\": \"{{user.age}}\"\n },\n {\n \"key\": \"userName\",\n \"value\": \"{{user.name}}\"\n }\n ]\n}\n```\n\nThis will be extracted as `{{ userAge }}` and `{{ userName }}` respectively.\n\nNote: The `schema` field is required for Conversation nodes if you want to extract variables from the user's responses. `aliases` is just a convenience.",
- "allOf": [
- {
- "$ref": "#/components/schemas/VariableExtractionPlan"
- }
+ "provider": {
+ "type": "string",
+ "enum": [
+ "perplexity-ai"
]
},
- "name": {
+ "model": {
"type": "string",
- "maxLength": 80
+ "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b"
},
- "isStart": {
+ "temperature": {
+ "type": "number",
+ "description": "This is the temperature that will be used for calls. Default is 0.5.",
+ "minimum": 0,
+ "maximum": 2
+ },
+ "maxTokens": {
+ "type": "number",
+ "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.",
+ "minimum": 50,
+ "maximum": 10000
+ },
+ "emotionRecognitionEnabled": {
"type": "boolean",
- "description": "This is whether or not the node is the start of the workflow."
+ "description": "This determines whether we detect user's emotion while they speak and send it as an additional info to model.\n\nDefault `false` because the model is usually are good at understanding the user's emotion from text.\n\n@default false"
},
- "metadata": {
- "type": "object",
- "description": "This is for metadata you want to store on the task."
+ "numFastTurns": {
+ "type": "number",
+ "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.\n\nDefault is 0.\n\n@default 0",
+ "minimum": 0
}
},
"required": [
- "type",
- "name"
+ "provider",
+ "model"
]
},
- "ToolNode": {
+ "TogetherAIModel": {
"type": "object",
"properties": {
- "type": {
- "type": "string",
- "description": "This is the Tool node. This can be used to call a tool in your workflow.\n\nThe flow is:\n- Workflow starts the tool node\n- Model is called to extract parameters needed by the tool from the conversation history\n- Tool is called with the parameters\n- Server returns a response\n- Workflow continues with the response",
- "enum": [
- "tool"
- ]
+ "messages": {
+ "description": "This is the starting state for the conversation.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/OpenAIMessage"
+ }
},
- "tool": {
- "description": "This is the tool to call. To use an existing tool, send `toolId` instead.",
+ "tools": {
+ "type": "array",
+ "description": "These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CreateApiRequestToolDTO",
+ "title": "ApiRequestTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateBashToolDTO",
+ "title": "BashTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCodeToolDTO",
+ "title": "CodeTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateComputerToolDTO",
+ "title": "ComputerTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateDtmfToolDTO",
+ "title": "DtmfTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateEndCallToolDTO",
+ "title": "EndCallTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateFunctionToolDTO",
+ "title": "FunctionTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO",
+ "title": "GoHighLevelCalendarAvailabilityTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO",
+ "title": "GoHighLevelCalendarEventCreateTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelContactCreateToolDTO",
+ "title": "GoHighLevelContactCreateTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelContactGetToolDTO",
+ "title": "GoHighLevelContactGetTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO",
+ "title": "GoogleCalendarCheckAvailabilityTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarCreateEventToolDTO",
+ "title": "GoogleCalendarCreateEventTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleSheetsRowAppendToolDTO",
+ "title": "GoogleSheetsRowAppendTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateHandoffToolDTO",
+ "title": "HandoffTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMcpToolDTO",
+ "title": "McpTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateQueryToolDTO",
+ "title": "QueryTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSlackSendMessageToolDTO",
+ "title": "SlackSendMessageTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSmsToolDTO",
+ "title": "SmsTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTextEditorToolDTO",
+ "title": "TextEditorTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTransferCallToolDTO",
+ "title": "TransferCallTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSipRequestToolDTO",
+ "title": "SipRequestTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateVoicemailToolDTO",
+ "title": "VoicemailTool"
+ }
+ ]
+ }
+ },
+ "toolIds": {
+ "description": "These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "toolRefs": {
+ "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolRef"
+ }
+ },
+ "knowledgeBase": {
+ "description": "These are the options for the knowledge base.",
"oneOf": [
{
- "$ref": "#/components/schemas/CreateApiRequestToolDTO",
- "title": "ApiRequestTool"
- },
- {
- "$ref": "#/components/schemas/CreateBashToolDTO",
- "title": "BashTool"
- },
- {
- "$ref": "#/components/schemas/CreateCodeToolDTO",
- "title": "CodeTool"
- },
- {
- "$ref": "#/components/schemas/CreateComputerToolDTO",
- "title": "ComputerTool"
- },
- {
- "$ref": "#/components/schemas/CreateDtmfToolDTO",
- "title": "DtmfTool"
- },
- {
- "$ref": "#/components/schemas/CreateEndCallToolDTO",
- "title": "EndCallTool"
- },
- {
- "$ref": "#/components/schemas/CreateFunctionToolDTO",
- "title": "FunctionTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO",
- "title": "GoHighLevelCalendarAvailabilityTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO",
- "title": "GoHighLevelCalendarEventCreateTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelContactCreateToolDTO",
- "title": "GoHighLevelContactCreateTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelContactGetToolDTO",
- "title": "GoHighLevelContactGetTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO",
- "title": "GoogleCalendarCheckAvailabilityTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoogleCalendarCreateEventToolDTO",
- "title": "GoogleCalendarCreateEventTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoogleSheetsRowAppendToolDTO",
- "title": "GoogleSheetsRowAppendTool"
- },
- {
- "$ref": "#/components/schemas/CreateHandoffToolDTO",
- "title": "HandoffTool"
- },
- {
- "$ref": "#/components/schemas/CreateMcpToolDTO",
- "title": "McpTool"
- },
- {
- "$ref": "#/components/schemas/CreateQueryToolDTO",
- "title": "QueryTool"
- },
- {
- "$ref": "#/components/schemas/CreateSlackSendMessageToolDTO",
- "title": "SlackSendMessageTool"
- },
- {
- "$ref": "#/components/schemas/CreateSmsToolDTO",
- "title": "SmsTool"
- },
- {
- "$ref": "#/components/schemas/CreateTextEditorToolDTO",
- "title": "TextEditorTool"
- },
- {
- "$ref": "#/components/schemas/CreateTransferCallToolDTO",
- "title": "TransferCallTool"
- },
- {
- "$ref": "#/components/schemas/CreateSipRequestToolDTO",
- "title": "SipRequestTool"
- },
- {
- "$ref": "#/components/schemas/CreateVoicemailToolDTO",
- "title": "VoicemailTool"
+ "$ref": "#/components/schemas/CreateCustomKnowledgeBaseDTO",
+ "title": "Custom"
}
]
},
- "toolId": {
+ "provider": {
"type": "string",
- "description": "This is the tool to call. To use a transient tool, send `tool` instead."
+ "enum": [
+ "together-ai"
+ ]
+ },
+ "model": {
+ "type": "string",
+ "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b"
+ },
+ "temperature": {
+ "type": "number",
+ "description": "This is the temperature that will be used for calls. Default is 0.5.",
+ "minimum": 0,
+ "maximum": 2
+ },
+ "maxTokens": {
+ "type": "number",
+ "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.",
+ "minimum": 50,
+ "maximum": 10000
+ },
+ "emotionRecognitionEnabled": {
+ "type": "boolean",
+ "description": "This determines whether we detect user's emotion while they speak and send it as an additional info to model.\n\nDefault `false` because the model is usually are good at understanding the user's emotion from text.\n\n@default false"
+ },
+ "numFastTurns": {
+ "type": "number",
+ "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.\n\nDefault is 0.\n\n@default 0",
+ "minimum": 0
+ }
+ },
+ "required": [
+ "provider",
+ "model"
+ ]
+ },
+ "HangupNode": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "enum": [
+ "hangup"
+ ]
},
"name": {
"type": "string",
@@ -17734,576 +19227,729 @@
"name"
]
},
- "VoicemailDetectionBackoffPlan": {
- "type": "object",
- "properties": {
- "startAtSeconds": {
- "type": "number",
- "description": "This is the number of seconds to wait before starting the first retry attempt.",
- "minimum": 0,
- "default": 5
- },
- "frequencySeconds": {
- "type": "number",
- "description": "This is the interval in seconds between retry attempts.",
- "minimum": 2.5,
- "default": 5
- },
- "maxRetries": {
- "type": "number",
- "description": "This is the maximum number of retry attempts before giving up.",
- "minimum": 1,
- "maximum": 10,
- "default": 6
- }
- }
- },
- "GoogleVoicemailDetectionPlan": {
+ "WorkflowOpenAIModel": {
"type": "object",
"properties": {
- "beepMaxAwaitSeconds": {
- "type": "number",
- "description": "This is the maximum duration from the start of the call that we will wait for a voicemail beep, before speaking our message\n\n- If we detect a voicemail beep before this, we will speak the message at that point.\n\n- 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.\n\n@default 30\n@min 0\n@max 60",
- "minimum": 0,
- "maximum": 30,
- "default": 30
- },
"provider": {
"type": "string",
- "description": "This is the provider to use for voicemail detection.",
+ "description": "This is the provider of the model (`openai`).",
"enum": [
- "google"
- ]
- },
- "backoffPlan": {
- "description": "This is the backoff plan for the voicemail detection.",
- "allOf": [
- {
- "$ref": "#/components/schemas/VoicemailDetectionBackoffPlan"
- }
+ "openai"
]
},
- "type": {
+ "model": {
"type": "string",
- "description": "This is the detection type to use for voicemail detection.\n- 'audio': Uses native audio models (default)\n- 'transcript': Uses ASR/transcript-based detection\n@default 'audio' (audio detection)",
+ "description": "This is the OpenAI model that will be used.\n\nWhen 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.\nThis 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/.",
+ "maxLength": 100,
"enum": [
- "audio",
- "transcript"
+ "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",
+ "gpt-4.1:australiaeast",
+ "gpt-4o:australiaeast",
+ "gpt-5.4-mini:australiaeast"
]
+ },
+ "temperature": {
+ "type": "number",
+ "description": "This is the temperature of the model.",
+ "minimum": 0,
+ "maximum": 2
+ },
+ "maxTokens": {
+ "type": "number",
+ "description": "This is the max tokens of the model.",
+ "minimum": 50,
+ "maximum": 10000
}
},
"required": [
- "provider"
+ "provider",
+ "model"
]
},
- "OpenAIVoicemailDetectionPlan": {
+ "WorkflowAnthropicModel": {
"type": "object",
"properties": {
- "beepMaxAwaitSeconds": {
- "type": "number",
- "description": "This is the maximum duration from the start of the call that we will wait for a voicemail beep, before speaking our message\n\n- If we detect a voicemail beep before this, we will speak the message at that point.\n\n- 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.\n\n@default 30\n@min 0\n@max 60",
- "minimum": 0,
- "maximum": 30,
- "default": 30
- },
"provider": {
"type": "string",
- "description": "This is the provider to use for voicemail detection.",
+ "description": "This is the provider of the model (`anthropic`).",
"enum": [
- "openai"
- ]
- },
- "backoffPlan": {
- "description": "This is the backoff plan for the voicemail detection.",
- "allOf": [
- {
- "$ref": "#/components/schemas/VoicemailDetectionBackoffPlan"
- }
+ "anthropic"
]
},
- "type": {
+ "model": {
"type": "string",
- "description": "This is the detection type to use for voicemail detection.\n- 'audio': Uses native audio models (default)\n- 'transcript': Uses ASR/transcript-based detection\n@default 'audio' (audio detection)",
+ "description": "This is the specific model that will be used.",
+ "maxLength": 100,
"enum": [
- "audio",
- "transcript"
+ "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"
+ ]
+ },
+ "thinking": {
+ "description": "This is the optional configuration for Anthropic's thinking feature.\n\n- If provided, `maxTokens` must be greater than `thinking.budgetTokens`.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/AnthropicThinkingConfig"
+ }
]
+ },
+ "temperature": {
+ "type": "number",
+ "description": "This is the temperature of the model.",
+ "minimum": 0,
+ "maximum": 2
+ },
+ "maxTokens": {
+ "type": "number",
+ "description": "This is the max tokens of the model.",
+ "minimum": 50,
+ "maximum": 10000
}
},
"required": [
- "provider"
+ "provider",
+ "model"
]
},
- "TwilioVoicemailDetectionPlan": {
+ "WorkflowAnthropicBedrockModel": {
"type": "object",
"properties": {
"provider": {
"type": "string",
- "description": "This is the provider to use for voicemail detection.",
+ "description": "This is the provider of the model (`anthropic-bedrock`).",
"enum": [
- "twilio"
+ "anthropic-bedrock"
]
},
- "voicemailDetectionTypes": {
- "type": "array",
- "description": "These are the AMD messages from Twilio that are considered as voicemail. Default is ['machine_end_beep', 'machine_end_silence'].\n\n@default {Array} ['machine_end_beep', 'machine_end_silence']",
+ "model": {
+ "type": "string",
+ "description": "This is the specific model that will be used.",
+ "maxLength": 100,
"enum": [
- "machine_start",
- "human",
- "fax",
- "unknown",
- "machine_end_beep",
- "machine_end_silence",
- "machine_end_other"
- ],
- "example": [
- "machine_end_beep",
- "machine_end_silence"
- ],
- "items": {
- "type": "string",
- "enum": [
- "machine_start",
- "human",
- "fax",
- "unknown",
- "machine_end_beep",
- "machine_end_silence",
- "machine_end_other"
- ]
- }
- },
- "enabled": {
- "type": "boolean",
- "description": "This sets whether the assistant should detect voicemail. Defaults to true.\n\n@default true"
- },
- "machineDetectionTimeout": {
- "type": "number",
- "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.\n\nIncreasing 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.\n\nDecreasing 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.\n\nCheck the [Twilio docs](https://www.twilio.com/docs/voice/answering-machine-detection#optional-api-tuning-parameters) for more info.\n\n@default 30",
- "minimum": 3,
- "maximum": 59
+ "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",
+ "global.anthropic.claude-haiku-4-5-20251001-v1:0"
+ ]
},
- "machineDetectionSpeechThreshold": {
- "type": "number",
- "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.\n\nIncreasing 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.\n\nDecreasing 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.\n\nCheck the [Twilio docs](https://www.twilio.com/docs/voice/answering-machine-detection#optional-api-tuning-parameters) for more info.\n\n@default 2400",
- "minimum": 1000,
- "maximum": 6000
+ "thinking": {
+ "description": "This is the optional configuration for Anthropic's thinking feature.\n\n- If provided, `maxTokens` must be greater than `thinking.budgetTokens`.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/AnthropicThinkingConfig"
+ }
+ ]
},
- "machineDetectionSpeechEndThreshold": {
+ "temperature": {
"type": "number",
- "description": "The number of milliseconds of silence after speech activity at which point the speech activity is considered complete. Default is 1200 milliseconds.\n\nIncreasing 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:\n- 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.\n- 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.\n\nDecreasing 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.\n\nCheck the [Twilio docs](https://www.twilio.com/docs/voice/answering-machine-detection#optional-api-tuning-parameters) for more info.\n\n@default 1200",
- "minimum": 500,
- "maximum": 5000
+ "description": "This is the temperature of the model.",
+ "minimum": 0,
+ "maximum": 2
},
- "machineDetectionSilenceTimeout": {
+ "maxTokens": {
"type": "number",
- "description": "The number of milliseconds of initial silence after which an unknown AnsweredBy result will be returned. Default is 5000 milliseconds.\n\nIncreasing this value will result in waiting for a longer period of initial silence before returning an 'unknown' AMD result.\n\nDecreasing this value will result in waiting for a shorter period of initial silence before returning an 'unknown' AMD result.\n\nCheck the [Twilio docs](https://www.twilio.com/docs/voice/answering-machine-detection#optional-api-tuning-parameters) for more info.\n\n@default 5000",
- "minimum": 2000,
+ "description": "This is the max tokens of the model.",
+ "minimum": 50,
"maximum": 10000
}
},
"required": [
- "provider"
+ "provider",
+ "model"
]
},
- "VapiVoicemailDetectionPlan": {
+ "WorkflowGoogleModel": {
"type": "object",
"properties": {
- "beepMaxAwaitSeconds": {
- "type": "number",
- "description": "This is the maximum duration from the start of the call that we will wait for a voicemail beep, before speaking our message\n\n- If we detect a voicemail beep before this, we will speak the message at that point.\n\n- 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.\n\n@default 30\n@min 0\n@max 60",
- "minimum": 0,
- "maximum": 30,
- "default": 30
- },
"provider": {
"type": "string",
- "description": "This is the provider to use for voicemail detection.",
+ "description": "This is the provider of the model (`google`).",
"enum": [
- "vapi"
- ]
- },
- "backoffPlan": {
- "description": "This is the backoff plan for the voicemail detection.",
- "allOf": [
- {
- "$ref": "#/components/schemas/VoicemailDetectionBackoffPlan"
- }
+ "google"
]
},
- "type": {
+ "model": {
"type": "string",
- "description": "This is the detection type to use for voicemail detection.\n- 'audio': Uses native audio models (default)\n- 'transcript': Uses ASR/transcript-based detection\n@default 'audio' (audio detection)",
+ "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b",
+ "maxLength": 100,
"enum": [
- "audio",
- "transcript"
+ "gemini-3.5-flash",
+ "gemini-3.1-flash-lite",
+ "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"
]
+ },
+ "temperature": {
+ "type": "number",
+ "description": "This is the temperature of the model.",
+ "minimum": 0,
+ "maximum": 2
+ },
+ "maxTokens": {
+ "type": "number",
+ "description": "This is the max tokens of the model.",
+ "minimum": 50,
+ "maximum": 10000
}
},
"required": [
- "provider"
+ "provider",
+ "model"
]
},
- "TransferHookAction": {
+ "WorkflowCustomModel": {
"type": "object",
"properties": {
- "type": {
+ "provider": {
"type": "string",
- "description": "This is the type of action - must be \"transfer\"",
+ "description": "This is the provider of the model (`custom-llm`).",
"enum": [
- "transfer"
- ]
- },
- "destination": {
- "description": "This is the destination details for the transfer - can be a phone number or SIP URI",
- "oneOf": [
- {
- "$ref": "#/components/schemas/TransferDestinationNumber",
- "title": "NumberTransferDestination"
- },
- {
- "$ref": "#/components/schemas/TransferDestinationSip",
- "title": "SipTransferDestination"
- }
+ "custom-llm"
]
- }
- },
- "required": [
- "type"
- ]
- },
- "FunctionCallHookAction": {
- "type": "object",
- "properties": {
- "messages": {
- "type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/ToolMessageStart",
- "title": "ToolMessageStart"
- },
- {
- "$ref": "#/components/schemas/ToolMessageComplete",
- "title": "ToolMessageComplete"
- },
- {
- "$ref": "#/components/schemas/ToolMessageFailed",
- "title": "ToolMessageFailed"
- },
- {
- "$ref": "#/components/schemas/ToolMessageDelayed",
- "title": "ToolMessageDelayed"
- }
- ]
- }
},
- "type": {
+ "metadataSendMode": {
"type": "string",
+ "description": "This determines whether metadata is sent in requests to the custom provider.\n\n- `off` will not send any metadata. payload will look like `{ messages }`\n- `variable` will send `assistant.metadata` as a variable on the payload. payload will look like `{ messages, metadata }`\n- `destructured` will send `assistant.metadata` fields directly on the payload. payload will look like `{ messages, ...metadata }`\n\nFurther, `variable` and `destructured` will send `call`, `phoneNumber`, and `customer` objects in the payload.\n\nDefault is `variable`.",
"enum": [
- "function"
- ],
- "description": "The type of tool. \"function\" for Function tool."
+ "off",
+ "variable",
+ "destructured"
+ ]
},
- "async": {
- "type": "boolean",
- "example": false,
- "description": "This determines if the tool is async.\n\n 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.\n\n 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.\n\n Defaults to synchronous (`false`)."
+ "url": {
+ "type": "string",
+ "description": "These is the URL we'll use for the OpenAI client's `baseURL`. Ex. https://openrouter.ai/api/v1"
},
- "server": {
- "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
- "allOf": [
- {
- "$ref": "#/components/schemas/Server"
- }
- ]
+ "headers": {
+ "type": "object",
+ "description": "These are the headers we'll use for the OpenAI client's `headers`."
},
- "variableExtractionPlan": {
- "description": "Plan to extract variables from the tool response",
- "allOf": [
- {
- "$ref": "#/components/schemas/VariableExtractionPlan"
- }
- ]
+ "timeoutSeconds": {
+ "type": "number",
+ "description": "This sets the timeout for the connection to the custom provider without needing to stream any tokens back. Default is 20 seconds.",
+ "minimum": 20,
+ "maximum": 600
},
- "parameters": {
- "description": "Static key-value pairs merged into the request body. Values support Liquid templates.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/ToolParameter"
- }
+ "model": {
+ "type": "string",
+ "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b",
+ "maxLength": 100
},
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
- "allOf": [
- {
- "$ref": "#/components/schemas/ToolRejectionPlan"
- }
- ]
+ "temperature": {
+ "type": "number",
+ "description": "This is the temperature of the model.",
+ "minimum": 0,
+ "maximum": 2
},
- "function": {
- "description": "This is the function definition of the tool.",
- "allOf": [
- {
- "$ref": "#/components/schemas/OpenAIFunction"
- }
- ]
+ "maxTokens": {
+ "type": "number",
+ "description": "This is the max tokens of the model.",
+ "minimum": 50,
+ "maximum": 10000
}
},
"required": [
- "type"
+ "provider",
+ "url",
+ "model"
]
},
- "SayHookAction": {
+ "GlobalNodePlan": {
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "type": "boolean",
+ "description": "This is the flag to determine if this node is a global node\n\n@default false",
+ "default": false
+ },
+ "enterCondition": {
+ "type": "string",
+ "description": "This is the condition that will be checked to determine if the global node should be executed.\n\n@default ''",
+ "maxLength": 1000,
+ "default": ""
+ }
+ }
+ },
+ "ConversationNode": {
"type": "object",
"properties": {
"type": {
"type": "string",
- "description": "This is the type of action - must be \"say\"",
+ "description": "This is the Conversation node. This can be used to start a conversation with the customer.\n\nThe flow is:\n- Workflow starts the conversation node\n- Model is active with the `prompt` and global context.\n- Model will call a tool to exit this node.\n- Workflow will extract variables from the conversation.\n- Workflow continues.",
"enum": [
- "say"
+ "conversation"
]
},
- "prompt": {
- "description": "This is the prompt for the assistant to generate a response based on existing conversation.\nCan be a string or an array of chat messages.",
+ "model": {
+ "description": "This is the model for the node.\n\nThis overrides `workflow.model`.",
"oneOf": [
{
- "type": "string",
- "title": "String"
+ "$ref": "#/components/schemas/WorkflowOpenAIModel",
+ "title": "WorkflowOpenAIModel"
},
{
- "type": "array",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/SystemMessage",
- "title": "SystemMessage"
- },
- {
- "$ref": "#/components/schemas/UserMessage",
- "title": "UserMessage"
- },
- {
- "$ref": "#/components/schemas/AssistantMessage",
- "title": "AssistantMessage"
- },
- {
- "$ref": "#/components/schemas/ToolMessage",
- "title": "ToolMessage"
- },
- {
- "$ref": "#/components/schemas/DeveloperMessage",
- "title": "DeveloperMessage"
- }
- ]
- },
- "title": "MessageArray"
+ "$ref": "#/components/schemas/WorkflowAnthropicModel",
+ "title": "WorkflowAnthropicModel"
+ },
+ {
+ "$ref": "#/components/schemas/WorkflowAnthropicBedrockModel",
+ "title": "WorkflowAnthropicBedrockModel"
+ },
+ {
+ "$ref": "#/components/schemas/WorkflowGoogleModel",
+ "title": "WorkflowGoogleModel"
+ },
+ {
+ "$ref": "#/components/schemas/WorkflowCustomModel",
+ "title": "WorkflowCustomModel"
}
- ],
- "examples": [
- "Ask the user if they're still in the call",
- [
- {
- "role": "system",
- "content": "You are a helpful assistant, and would like to know if the user is still in the call based on the conversation history in {{transcript}}"
- }
- ]
- ]
- },
- "exact": {
- "type": "object",
- "description": "This is the message to say"
- }
- },
- "required": [
- "type"
- ]
- },
- "MessageAddHookAction": {
- "type": "object",
- "properties": {
- "type": {
- "type": "string",
- "description": "This is the type of action - must be \"message.add\"",
- "enum": [
- "message.add"
]
},
- "message": {
- "description": "The message to add to the conversation in OpenAI format",
- "example": {
- "role": "system",
- "content": "Context update from hook"
- },
- "allOf": [
+ "transcriber": {
+ "description": "This is the transcriber for the node.\n\nThis overrides `workflow.transcriber`.",
+ "oneOf": [
{
- "$ref": "#/components/schemas/OpenAIMessage"
+ "$ref": "#/components/schemas/AssemblyAITranscriber",
+ "title": "AssemblyAITranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/AzureSpeechTranscriber",
+ "title": "AzureSpeechTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/CustomTranscriber",
+ "title": "CustomTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/DeepgramTranscriber",
+ "title": "DeepgramTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/ElevenLabsTranscriber",
+ "title": "ElevenLabsTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/GladiaTranscriber",
+ "title": "GladiaTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/GoogleTranscriber",
+ "title": "GoogleTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/SpeechmaticsTranscriber",
+ "title": "SpeechmaticsTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/TalkscriberTranscriber",
+ "title": "TalkscriberTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAITranscriber",
+ "title": "OpenAITranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/CartesiaTranscriber",
+ "title": "CartesiaTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/SonioxTranscriber",
+ "title": "SonioxTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/XaiTranscriber",
+ "title": "XaiTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/VapiTranscriber",
+ "title": "VapiTranscriber"
}
]
},
- "triggerResponseEnabled": {
- "type": "boolean",
- "description": "Whether to trigger an assistant response after adding the message",
- "default": true
- }
- },
- "required": [
- "type",
- "message"
- ]
- },
- "CallHookFilter": {
- "type": "object",
- "properties": {
- "type": {
- "type": "string",
- "description": "This is the type of filter - currently only \"oneOf\" is supported",
- "enum": [
- "oneOf"
- ],
- "maxLength": 1000
- },
- "key": {
- "type": "string",
- "description": "This is the key to filter on (e.g. \"call.endedReason\")",
- "maxLength": 1000
- },
- "oneOf": {
- "description": "This is the array of possible values to match against",
- "type": "array",
- "items": {
- "type": "string",
- "maxLength": 1000
- }
- }
- },
- "required": [
- "type",
- "key",
- "oneOf"
- ]
- },
- "CallHookCallEnding": {
- "type": "object",
- "properties": {
- "on": {
- "type": "string",
- "description": "This is the event that triggers this hook",
- "enum": [
- "call.ending"
- ],
- "maxLength": 1000
+ "voice": {
+ "description": "This is the voice for the node.\n\nThis overrides `workflow.voice`.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/AzureVoice",
+ "title": "AzureVoice"
+ },
+ {
+ "$ref": "#/components/schemas/CartesiaVoice",
+ "title": "CartesiaVoice"
+ },
+ {
+ "$ref": "#/components/schemas/CustomVoice",
+ "title": "CustomVoice"
+ },
+ {
+ "$ref": "#/components/schemas/DeepgramVoice",
+ "title": "DeepgramVoice"
+ },
+ {
+ "$ref": "#/components/schemas/ElevenLabsVoice",
+ "title": "ElevenLabsVoice"
+ },
+ {
+ "$ref": "#/components/schemas/HumeVoice",
+ "title": "HumeVoice"
+ },
+ {
+ "$ref": "#/components/schemas/LMNTVoice",
+ "title": "LMNTVoice"
+ },
+ {
+ "$ref": "#/components/schemas/NeuphonicVoice",
+ "title": "NeuphonicVoice"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAIVoice",
+ "title": "OpenAIVoice"
+ },
+ {
+ "$ref": "#/components/schemas/PlayHTVoice",
+ "title": "PlayHTVoice"
+ },
+ {
+ "$ref": "#/components/schemas/WellSaidVoice",
+ "title": "WellSaidVoice"
+ },
+ {
+ "$ref": "#/components/schemas/RimeAIVoice",
+ "title": "RimeAIVoice"
+ },
+ {
+ "$ref": "#/components/schemas/SmallestAIVoice",
+ "title": "SmallestAIVoice"
+ },
+ {
+ "$ref": "#/components/schemas/TavusVoice",
+ "title": "TavusVoice"
+ },
+ {
+ "$ref": "#/components/schemas/VapiVoice",
+ "title": "VapiVoice"
+ },
+ {
+ "$ref": "#/components/schemas/SesameVoice",
+ "title": "SesameVoice"
+ },
+ {
+ "$ref": "#/components/schemas/InworldVoice",
+ "title": "InworldVoice"
+ },
+ {
+ "$ref": "#/components/schemas/MinimaxVoice",
+ "title": "MinimaxVoice"
+ },
+ {
+ "$ref": "#/components/schemas/XaiVoice",
+ "title": "XaiVoice"
+ },
+ {
+ "$ref": "#/components/schemas/MicrosoftVoice",
+ "title": "MicrosoftVoice"
+ }
+ ]
},
- "do": {
+ "tools": {
"type": "array",
- "description": "This is the set of actions to perform when the hook triggers",
+ "description": "These are the tools that the conversation node can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together.",
"items": {
"oneOf": [
{
- "$ref": "#/components/schemas/ToolCallHookAction",
- "title": "ToolCallHookAction"
+ "$ref": "#/components/schemas/CreateApiRequestToolDTO",
+ "title": "ApiRequestTool"
},
{
- "$ref": "#/components/schemas/MessageAddHookAction",
- "title": "MessageAddHookAction"
- }
- ]
- }
- },
- "filters": {
- "description": "This is the set of filters that must match for the hook to trigger",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/CallHookFilter"
- }
- }
- },
- "required": [
- "on",
- "do"
- ]
- },
- "CallHookAssistantSpeechInterrupted": {
- "type": "object",
- "properties": {
- "on": {
- "type": "string",
- "description": "This is the event that triggers this hook",
- "enum": [
- "assistant.speech.interrupted"
- ],
- "maxLength": 1000
- },
- "do": {
- "type": "array",
- "description": "This is the set of actions to perform when the hook triggers",
- "items": {
- "oneOf": [
+ "$ref": "#/components/schemas/CreateBashToolDTO",
+ "title": "BashTool"
+ },
{
- "$ref": "#/components/schemas/SayHookAction",
- "title": "SayHookAction"
+ "$ref": "#/components/schemas/CreateCodeToolDTO",
+ "title": "CodeTool"
},
{
- "$ref": "#/components/schemas/ToolCallHookAction",
- "title": "ToolCallHookAction"
+ "$ref": "#/components/schemas/CreateComputerToolDTO",
+ "title": "ComputerTool"
},
{
- "$ref": "#/components/schemas/MessageAddHookAction",
- "title": "MessageAddHookAction"
- }
- ]
- }
- }
- },
- "required": [
- "on",
- "do"
- ]
- },
- "CallHookCustomerSpeechInterrupted": {
- "type": "object",
- "properties": {
- "on": {
- "type": "string",
- "description": "This is the event that triggers this hook",
- "enum": [
- "customer.speech.interrupted"
- ],
- "maxLength": 1000
- },
- "do": {
- "type": "array",
- "description": "This is the set of actions to perform when the hook triggers",
- "items": {
- "oneOf": [
+ "$ref": "#/components/schemas/CreateDtmfToolDTO",
+ "title": "DtmfTool"
+ },
{
- "$ref": "#/components/schemas/SayHookAction",
- "title": "SayHookAction"
+ "$ref": "#/components/schemas/CreateEndCallToolDTO",
+ "title": "EndCallTool"
},
{
- "$ref": "#/components/schemas/ToolCallHookAction",
- "title": "ToolCallHookAction"
+ "$ref": "#/components/schemas/CreateFunctionToolDTO",
+ "title": "FunctionTool"
},
{
- "$ref": "#/components/schemas/MessageAddHookAction",
- "title": "MessageAddHookAction"
+ "$ref": "#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO",
+ "title": "GoHighLevelCalendarAvailabilityTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO",
+ "title": "GoHighLevelCalendarEventCreateTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelContactCreateToolDTO",
+ "title": "GoHighLevelContactCreateTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelContactGetToolDTO",
+ "title": "GoHighLevelContactGetTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO",
+ "title": "GoogleCalendarCheckAvailabilityTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarCreateEventToolDTO",
+ "title": "GoogleCalendarCreateEventTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleSheetsRowAppendToolDTO",
+ "title": "GoogleSheetsRowAppendTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateHandoffToolDTO",
+ "title": "HandoffTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMcpToolDTO",
+ "title": "McpTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateQueryToolDTO",
+ "title": "QueryTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSlackSendMessageToolDTO",
+ "title": "SlackSendMessageTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSmsToolDTO",
+ "title": "SmsTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTextEditorToolDTO",
+ "title": "TextEditorTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTransferCallToolDTO",
+ "title": "TransferCallTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSipRequestToolDTO",
+ "title": "SipRequestTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateVoicemailToolDTO",
+ "title": "VoicemailTool"
}
]
}
+ },
+ "toolIds": {
+ "description": "These are the tools that the conversation node can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "prompt": {
+ "type": "string",
+ "maxLength": 5000
+ },
+ "globalNodePlan": {
+ "description": "This is the plan for the global node.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/GlobalNodePlan"
+ }
+ ]
+ },
+ "variableExtractionPlan": {
+ "description": "This is the plan that controls the variable extraction from the user's responses.\n\nUsage:\nUse `schema` to specify what you want to extract from the user's responses.\n```json\n{\n \"schema\": {\n \"type\": \"object\",\n \"properties\": {\n \"user\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"age\": {\n \"type\": \"number\"\n }\n }\n }\n }\n }\n}\n```\n\nThis will be extracted as `{{ user.name }}` and `{{ user.age }}` respectively.\n\n(Optional) Use `aliases` to create new variables.\n\n```json\n{\n \"aliases\": [\n {\n \"key\": \"userAge\",\n \"value\": \"{{user.age}}\"\n },\n {\n \"key\": \"userName\",\n \"value\": \"{{user.name}}\"\n }\n ]\n}\n```\n\nThis will be extracted as `{{ userAge }}` and `{{ userName }}` respectively.\n\nNote: The `schema` field is required for Conversation nodes if you want to extract variables from the user's responses. `aliases` is just a convenience.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/VariableExtractionPlan"
+ }
+ ]
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 80
+ },
+ "isStart": {
+ "type": "boolean",
+ "description": "This is whether or not the node is the start of the workflow."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "This is for metadata you want to store on the task."
}
},
"required": [
- "on",
- "do"
+ "type",
+ "name"
]
},
- "ToolCallHookAction": {
+ "ToolNode": {
"type": "object",
"properties": {
"type": {
"type": "string",
- "description": "This is the type of action - must be \"tool\"",
+ "description": "This is the Tool node. This can be used to call a tool in your workflow.\n\nThe flow is:\n- Workflow starts the tool node\n- Model is called to extract parameters needed by the tool from the conversation history\n- Tool is called with the parameters\n- Server returns a response\n- Workflow continues with the response",
"enum": [
"tool"
]
@@ -18408,1177 +20054,1027 @@
"toolId": {
"type": "string",
"description": "This is the tool to call. To use a transient tool, send `tool` instead."
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 80
+ },
+ "isStart": {
+ "type": "boolean",
+ "description": "This is whether or not the node is the start of the workflow."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "This is for metadata you want to store on the task."
}
},
"required": [
- "type"
+ "type",
+ "name"
]
},
- "CustomerSpeechTimeoutOptions": {
+ "VoicemailDetectionBackoffPlan": {
"type": "object",
"properties": {
- "timeoutSeconds": {
+ "startAtSeconds": {
"type": "number",
- "description": "This is the timeout in seconds before action is triggered.\nThe clock starts when the assistant finishes speaking and remains active until the user speaks.\n\n@default 7.5",
- "minimum": 1,
- "maximum": 1000
+ "description": "This is the number of seconds to wait before starting the first retry attempt.",
+ "minimum": 0,
+ "default": 5
},
- "triggerMaxCount": {
+ "frequencySeconds": {
"type": "number",
- "description": "This is the maximum number of times the hook will trigger in a call.\n\n@default 3",
- "minimum": 1,
- "maximum": 10
+ "description": "This is the interval in seconds between retry attempts.",
+ "minimum": 2.5,
+ "default": 5
},
- "triggerResetMode": {
- "type": "object",
- "description": "This is whether the counter for hook trigger resets the user speaks.\n\n@default never"
+ "maxRetries": {
+ "type": "number",
+ "description": "This is the maximum number of retry attempts before giving up.",
+ "minimum": 1,
+ "maximum": 10,
+ "default": 6
}
- },
- "required": [
- "timeoutSeconds"
- ]
+ }
},
- "CallHookCustomerSpeechTimeout": {
+ "GoogleVoicemailDetectionPlan": {
"type": "object",
"properties": {
- "on": {
- "type": "string",
- "description": "Must be either \"customer.speech.timeout\" or match the pattern \"customer.speech.timeout[property=value]\"",
- "maxLength": 1000
+ "beepMaxAwaitSeconds": {
+ "type": "number",
+ "description": "This is the maximum duration from the start of the call that we will wait for a voicemail beep, before speaking our message\n\n- If we detect a voicemail beep before this, we will speak the message at that point.\n\n- 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.\n\n@default 30\n@min 0\n@max 60",
+ "minimum": 0,
+ "maximum": 30,
+ "default": 30
},
- "do": {
- "type": "array",
- "description": "This is the set of actions to perform when the hook triggers",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/SayHookAction",
- "title": "SayHookAction"
- },
- {
- "$ref": "#/components/schemas/ToolCallHookAction",
- "title": "ToolCallHookAction"
- },
- {
- "$ref": "#/components/schemas/MessageAddHookAction",
- "title": "MessageAddHookAction"
- }
- ]
- }
+ "provider": {
+ "type": "string",
+ "description": "This is the provider to use for voicemail detection.",
+ "enum": [
+ "google"
+ ]
},
- "options": {
- "description": "This is the set of filters that must match for the hook to trigger",
+ "backoffPlan": {
+ "description": "This is the backoff plan for the voicemail detection.",
"allOf": [
{
- "$ref": "#/components/schemas/CustomerSpeechTimeoutOptions"
+ "$ref": "#/components/schemas/VoicemailDetectionBackoffPlan"
}
]
},
- "name": {
- "type": "string",
- "description": "This is the name of the hook, it can be set by the user to identify the hook.\nIf no name is provided, the hook will be auto generated as UUID.\n\n@default UUID",
- "maxLength": 1000
- }
- },
- "required": [
- "on",
- "do"
- ]
- },
- "CallHookModelResponseTimeout": {
- "type": "object",
- "properties": {
- "on": {
+ "type": {
"type": "string",
- "description": "This is the event that triggers this hook",
+ "description": "This is the detection type to use for voicemail detection.\n- 'audio': Uses native audio models (default)\n- 'transcript': Uses ASR/transcript-based detection\n@default 'audio' (audio detection)",
"enum": [
- "model.response.timeout"
- ],
- "maxLength": 1000
- },
- "do": {
- "type": "array",
- "description": "This is the set of actions to perform when the hook triggers",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/SayHookAction",
- "title": "SayHookAction"
- },
- {
- "$ref": "#/components/schemas/ToolCallHookAction",
- "title": "ToolCallHookAction"
- },
- {
- "$ref": "#/components/schemas/MessageAddHookAction",
- "title": "MessageAddHookAction"
- }
- ]
- }
+ "audio",
+ "transcript"
+ ]
}
},
"required": [
- "on",
- "do"
+ "provider"
]
},
- "AIEdgeCondition": {
+ "OpenAIVoicemailDetectionPlan": {
"type": "object",
"properties": {
- "type": {
+ "beepMaxAwaitSeconds": {
+ "type": "number",
+ "description": "This is the maximum duration from the start of the call that we will wait for a voicemail beep, before speaking our message\n\n- If we detect a voicemail beep before this, we will speak the message at that point.\n\n- 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.\n\n@default 30\n@min 0\n@max 60",
+ "minimum": 0,
+ "maximum": 30,
+ "default": 30
+ },
+ "provider": {
"type": "string",
+ "description": "This is the provider to use for voicemail detection.",
"enum": [
- "ai"
+ "openai"
]
},
- "prompt": {
- "type": "string",
- "description": "This is the prompt for the AI edge condition. It should evaluate to a boolean.",
- "maxLength": 1000
- }
- },
- "required": [
- "type",
- "prompt"
- ]
- },
- "Edge": {
- "type": "object",
- "properties": {
- "condition": {
- "oneOf": [
+ "backoffPlan": {
+ "description": "This is the backoff plan for the voicemail detection.",
+ "allOf": [
{
- "$ref": "#/components/schemas/AIEdgeCondition",
- "title": "AIEdgeCondition"
+ "$ref": "#/components/schemas/VoicemailDetectionBackoffPlan"
}
]
},
- "from": {
- "type": "string",
- "maxLength": 80
- },
- "to": {
+ "type": {
"type": "string",
- "maxLength": 80
- },
- "metadata": {
- "type": "object",
- "description": "This is for metadata you want to store on the edge."
+ "description": "This is the detection type to use for voicemail detection.\n- 'audio': Uses native audio models (default)\n- 'transcript': Uses ASR/transcript-based detection\n@default 'audio' (audio detection)",
+ "enum": [
+ "audio",
+ "transcript"
+ ]
}
},
"required": [
- "from",
- "to"
+ "provider"
]
},
- "RecordingConsentPlanStayOnLine": {
+ "TwilioVoicemailDetectionPlan": {
"type": "object",
"properties": {
- "message": {
+ "provider": {
"type": "string",
- "description": "This is the message asking for consent to record the call.\nIf the type is `stay-on-line`, the message should ask the user to hang up if they do not consent.\nIf the type is `verbal`, the message should ask the user to verbally consent or decline.",
- "maxLength": 1000,
- "examples": [
- "For quality purposes, this call may be recorded. Please stay on the line if you agree or end the call if you do not consent.",
- "This call may be recorded for quality and training purposes. Say \"I agree\" if you consent to being recorded, or \"I disagree\" if you do not consent."
+ "description": "This is the provider to use for voicemail detection.",
+ "enum": [
+ "twilio"
]
},
- "voice": {
- "description": "This is the voice to use for the consent message. If not specified, inherits from the assistant's voice.\nUse a different voice for the consent message for a better user experience.",
- "oneOf": [
- {
- "$ref": "#/components/schemas/AzureVoice",
- "title": "AzureVoice"
- },
- {
- "$ref": "#/components/schemas/CartesiaVoice",
- "title": "CartesiaVoice"
- },
- {
- "$ref": "#/components/schemas/CustomVoice",
- "title": "CustomVoice"
- },
- {
- "$ref": "#/components/schemas/DeepgramVoice",
- "title": "DeepgramVoice"
- },
- {
- "$ref": "#/components/schemas/ElevenLabsVoice",
- "title": "ElevenLabsVoice"
- },
- {
- "$ref": "#/components/schemas/HumeVoice",
- "title": "HumeVoice"
- },
- {
- "$ref": "#/components/schemas/LMNTVoice",
- "title": "LMNTVoice"
- },
- {
- "$ref": "#/components/schemas/NeuphonicVoice",
- "title": "NeuphonicVoice"
- },
- {
- "$ref": "#/components/schemas/OpenAIVoice",
- "title": "OpenAIVoice"
- },
- {
- "$ref": "#/components/schemas/PlayHTVoice",
- "title": "PlayHTVoice"
- },
- {
- "$ref": "#/components/schemas/WellSaidVoice",
- "title": "WellSaidVoice"
- },
- {
- "$ref": "#/components/schemas/RimeAIVoice",
- "title": "RimeAIVoice"
- },
- {
- "$ref": "#/components/schemas/SmallestAIVoice",
- "title": "SmallestAIVoice"
- },
- {
- "$ref": "#/components/schemas/TavusVoice",
- "title": "TavusVoice"
- },
- {
- "$ref": "#/components/schemas/VapiVoice",
- "title": "VapiVoice"
- },
- {
- "$ref": "#/components/schemas/SesameVoice",
- "title": "SesameVoice"
- },
- {
- "$ref": "#/components/schemas/InworldVoice",
- "title": "InworldVoice"
- },
+ "voicemailDetectionTypes": {
+ "type": "array",
+ "description": "These are the AMD messages from Twilio that are considered as voicemail. Default is ['machine_end_beep', 'machine_end_silence'].\n\n@default {Array} ['machine_end_beep', 'machine_end_silence']",
+ "enum": [
+ "machine_start",
+ "human",
+ "fax",
+ "unknown",
+ "machine_end_beep",
+ "machine_end_silence",
+ "machine_end_other"
+ ],
+ "example": [
+ "machine_end_beep",
+ "machine_end_silence"
+ ],
+ "items": {
+ "type": "string",
+ "enum": [
+ "machine_start",
+ "human",
+ "fax",
+ "unknown",
+ "machine_end_beep",
+ "machine_end_silence",
+ "machine_end_other"
+ ]
+ }
+ },
+ "enabled": {
+ "type": "boolean",
+ "description": "This sets whether the assistant should detect voicemail. Defaults to true.\n\n@default true"
+ },
+ "machineDetectionTimeout": {
+ "type": "number",
+ "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.\n\nIncreasing 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.\n\nDecreasing 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.\n\nCheck the [Twilio docs](https://www.twilio.com/docs/voice/answering-machine-detection#optional-api-tuning-parameters) for more info.\n\n@default 30",
+ "minimum": 3,
+ "maximum": 59
+ },
+ "machineDetectionSpeechThreshold": {
+ "type": "number",
+ "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.\n\nIncreasing 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.\n\nDecreasing 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.\n\nCheck the [Twilio docs](https://www.twilio.com/docs/voice/answering-machine-detection#optional-api-tuning-parameters) for more info.\n\n@default 2400",
+ "minimum": 1000,
+ "maximum": 6000
+ },
+ "machineDetectionSpeechEndThreshold": {
+ "type": "number",
+ "description": "The number of milliseconds of silence after speech activity at which point the speech activity is considered complete. Default is 1200 milliseconds.\n\nIncreasing 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:\n- 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.\n- 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.\n\nDecreasing 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.\n\nCheck the [Twilio docs](https://www.twilio.com/docs/voice/answering-machine-detection#optional-api-tuning-parameters) for more info.\n\n@default 1200",
+ "minimum": 500,
+ "maximum": 5000
+ },
+ "machineDetectionSilenceTimeout": {
+ "type": "number",
+ "description": "The number of milliseconds of initial silence after which an unknown AnsweredBy result will be returned. Default is 5000 milliseconds.\n\nIncreasing this value will result in waiting for a longer period of initial silence before returning an 'unknown' AMD result.\n\nDecreasing this value will result in waiting for a shorter period of initial silence before returning an 'unknown' AMD result.\n\nCheck the [Twilio docs](https://www.twilio.com/docs/voice/answering-machine-detection#optional-api-tuning-parameters) for more info.\n\n@default 5000",
+ "minimum": 2000,
+ "maximum": 10000
+ }
+ },
+ "required": [
+ "provider"
+ ]
+ },
+ "VapiVoicemailDetectionPlan": {
+ "type": "object",
+ "properties": {
+ "beepMaxAwaitSeconds": {
+ "type": "number",
+ "description": "This is the maximum duration from the start of the call that we will wait for a voicemail beep, before speaking our message\n\n- If we detect a voicemail beep before this, we will speak the message at that point.\n\n- 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.\n\n@default 30\n@min 0\n@max 60",
+ "minimum": 0,
+ "maximum": 30,
+ "default": 30
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the provider to use for voicemail detection.",
+ "enum": [
+ "vapi"
+ ]
+ },
+ "backoffPlan": {
+ "description": "This is the backoff plan for the voicemail detection.",
+ "allOf": [
{
- "$ref": "#/components/schemas/MinimaxVoice",
- "title": "MinimaxVoice"
+ "$ref": "#/components/schemas/VoicemailDetectionBackoffPlan"
}
]
},
"type": {
"type": "string",
- "description": "This is the type of recording consent plan. This type assumes consent is granted if the user stays on the line.",
+ "description": "This is the detection type to use for voicemail detection.\n- 'audio': Uses native audio models (default)\n- 'transcript': Uses ASR/transcript-based detection\n@default 'audio' (audio detection)",
"enum": [
- "stay-on-line"
- ],
- "example": "stay-on-line"
- },
- "waitSeconds": {
- "type": "number",
- "description": "Number of seconds to wait before transferring to the assistant if user stays on the call",
- "minimum": 1,
- "maximum": 6,
- "default": 3,
- "example": 3
+ "audio",
+ "transcript"
+ ]
}
},
"required": [
- "message",
- "type"
+ "provider"
]
},
- "RecordingConsentPlanVerbal": {
+ "TransferHookAction": {
"type": "object",
"properties": {
- "message": {
+ "type": {
"type": "string",
- "description": "This is the message asking for consent to record the call.\nIf the type is `stay-on-line`, the message should ask the user to hang up if they do not consent.\nIf the type is `verbal`, the message should ask the user to verbally consent or decline.",
- "maxLength": 1000,
- "examples": [
- "For quality purposes, this call may be recorded. Please stay on the line if you agree or end the call if you do not consent.",
- "This call may be recorded for quality and training purposes. Say \"I agree\" if you consent to being recorded, or \"I disagree\" if you do not consent."
+ "description": "This is the type of action - must be \"transfer\"",
+ "enum": [
+ "transfer"
]
},
- "voice": {
- "description": "This is the voice to use for the consent message. If not specified, inherits from the assistant's voice.\nUse a different voice for the consent message for a better user experience.",
+ "destination": {
+ "description": "This is the destination details for the transfer - can be a phone number or SIP URI",
"oneOf": [
{
- "$ref": "#/components/schemas/AzureVoice",
- "title": "AzureVoice"
- },
- {
- "$ref": "#/components/schemas/CartesiaVoice",
- "title": "CartesiaVoice"
- },
- {
- "$ref": "#/components/schemas/CustomVoice",
- "title": "CustomVoice"
- },
- {
- "$ref": "#/components/schemas/DeepgramVoice",
- "title": "DeepgramVoice"
- },
- {
- "$ref": "#/components/schemas/ElevenLabsVoice",
- "title": "ElevenLabsVoice"
- },
- {
- "$ref": "#/components/schemas/HumeVoice",
- "title": "HumeVoice"
- },
- {
- "$ref": "#/components/schemas/LMNTVoice",
- "title": "LMNTVoice"
- },
- {
- "$ref": "#/components/schemas/NeuphonicVoice",
- "title": "NeuphonicVoice"
- },
- {
- "$ref": "#/components/schemas/OpenAIVoice",
- "title": "OpenAIVoice"
- },
- {
- "$ref": "#/components/schemas/PlayHTVoice",
- "title": "PlayHTVoice"
- },
- {
- "$ref": "#/components/schemas/WellSaidVoice",
- "title": "WellSaidVoice"
- },
- {
- "$ref": "#/components/schemas/RimeAIVoice",
- "title": "RimeAIVoice"
- },
- {
- "$ref": "#/components/schemas/SmallestAIVoice",
- "title": "SmallestAIVoice"
- },
- {
- "$ref": "#/components/schemas/TavusVoice",
- "title": "TavusVoice"
- },
- {
- "$ref": "#/components/schemas/VapiVoice",
- "title": "VapiVoice"
- },
- {
- "$ref": "#/components/schemas/SesameVoice",
- "title": "SesameVoice"
- },
- {
- "$ref": "#/components/schemas/InworldVoice",
- "title": "InworldVoice"
+ "$ref": "#/components/schemas/TransferDestinationNumber",
+ "title": "NumberTransferDestination"
},
{
- "$ref": "#/components/schemas/MinimaxVoice",
- "title": "MinimaxVoice"
+ "$ref": "#/components/schemas/TransferDestinationSip",
+ "title": "SipTransferDestination"
}
]
- },
- "type": {
- "type": "string",
- "description": "This is the type of recording consent plan. This type assumes consent is granted if the user verbally consents or declines.",
- "enum": [
- "verbal"
- ],
- "example": "verbal"
- },
- "declineTool": {
- "type": "object",
- "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": [
- "message",
"type"
]
},
- "SecurityFilterBase": {
- "type": "object",
- "properties": {}
- },
- "SecurityFilterPlan": {
+ "FunctionCallHookAction": {
"type": "object",
"properties": {
- "enabled": {
- "type": "boolean",
- "description": "Whether the security filter is enabled.\n@default false",
- "default": false
- },
- "filters": {
- "description": "Array of security filter types to apply.\nIf array is not empty, only those security filters are run.",
- "example": "[{ type: \"sql-injection\" }, { type: \"xss\" }]",
+ "messages": {
"type": "array",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
- "$ref": "#/components/schemas/SecurityFilterBase"
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
+ }
+ ]
}
},
- "mode": {
+ "type": {
"type": "string",
- "description": "Mode of operation when a security threat is detected.\n- 'sanitize': Remove or replace the threatening content\n- 'reject': Replace the entire transcript with replacement text\n- 'replace': Replace threatening patterns with replacement text\n@default 'sanitize'",
"enum": [
- "sanitize",
- "reject",
- "replace"
+ "function"
],
- "default": "sanitize"
- },
- "replacementText": {
- "type": "string",
- "description": "Text to use when replacing filtered content.\n@default '[FILTERED]'",
- "default": "[FILTERED]"
- }
- }
- },
- "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."
+ "description": "The type of tool. \"function\" for Function tool."
},
- "pciEnabled": {
+ "async": {
"type": "boolean",
- "description": "When this is enabled, the user will be restricted to use PCI-compliant providers, and no logs or transcripts are stored.\nAt the end of the call, you will receive an end-of-call-report message to store on your server. Defaults to false.",
- "example": {
- "pciEnabled": false
- }
+ "example": false,
+ "description": "This determines if the tool is async.\n\n 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.\n\n 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.\n\n Defaults to synchronous (`false`)."
},
- "securityFilterPlan": {
- "description": "This is the security filter plan for the assistant. It allows filtering of transcripts for security threats before sending to LLM.",
+ "server": {
+ "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
"allOf": [
{
- "$ref": "#/components/schemas/SecurityFilterPlan"
+ "$ref": "#/components/schemas/Server"
}
]
},
- "recordingConsentPlan": {
- "oneOf": [
+ "variableExtractionPlan": {
+ "description": "Plan to extract variables from the tool response",
+ "allOf": [
{
- "$ref": "#/components/schemas/RecordingConsentPlanStayOnLine",
- "title": "RecordingConsentStayOnLinePlan"
- },
+ "$ref": "#/components/schemas/VariableExtractionPlan"
+ }
+ ]
+ },
+ "parameters": {
+ "description": "Static key-value pairs merged into the request body. Values support Liquid templates.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolParameter"
+ }
+ },
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "allOf": [
{
- "$ref": "#/components/schemas/RecordingConsentPlanVerbal",
- "title": "RecordingConsentPlanVerbal"
+ "$ref": "#/components/schemas/ToolRejectionPlan"
}
- ],
- "discriminator": {
- "propertyName": "type",
- "mapping": {
- "stay-on-line": "#/components/schemas/RecordingConsentPlanStayOnLine",
- "verbal": "#/components/schemas/RecordingConsentPlanVerbal"
+ ]
+ },
+ "function": {
+ "description": "This is the function definition of the tool.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/OpenAIFunction"
}
- }
+ ]
}
- }
+ },
+ "required": [
+ "type"
+ ]
},
- "StructuredDataPlan": {
+ "SayHookAction": {
"type": "object",
"properties": {
- "messages": {
- "description": "These are the messages used to generate the structured data.\n\n@default: ```\n[\n {\n \"role\": \"system\",\n \"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.\"\n },\n {\n \"role\": \"user\",\n \"content\": \"Here is the transcript:\\n\\n{{transcript}}\\n\\n. Here is the ended reason of the call:\\n\\n{{endedReason}}\\n\\n\"\n }\n]```\n\nYou can customize by providing any messages you want.\n\nHere are the template variables available:\n- {{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`",
- "type": "array",
- "items": {
- "type": "object"
- }
- },
- "enabled": {
- "type": "boolean",
- "description": "This determines whether structured data is generated and stored in `call.analysis.structuredData`. Defaults to false.\n\nUsage:\n- If you want to extract structured data, set this to true and provide a `schema`.\n\n@default false"
+ "type": {
+ "type": "string",
+ "description": "This is the type of action - must be \"say\"",
+ "enum": [
+ "say"
+ ]
},
- "schema": {
- "description": "This is the schema of the structured data. The output is stored in `call.analysis.structuredData`.\n\nComplete guide on JSON Schema can be found [here](https://ajv.js.org/json-schema.html#json-data-type).",
- "allOf": [
+ "exact": {
+ "description": "This is the exact message to say. When a string array is provided, one is randomly selected.",
+ "oneOf": [
{
- "$ref": "#/components/schemas/JsonSchema"
+ "type": "string"
+ },
+ {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
}
+ ],
+ "examples": [
+ "Are you still there?",
+ [
+ "I didn't catch that.",
+ "Could you repeat that?",
+ "Are you still there?"
+ ]
]
},
- "timeoutSeconds": {
- "type": "number",
- "description": "This is how long the request is tried before giving up. When request times out, `call.analysis.structuredData` will be empty.\n\nUsage:\n- 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.\n\n@default 5 seconds",
- "minimum": 1,
- "maximum": 60
+ "prompt": {
+ "description": "This is the prompt for the assistant to generate a response based on existing conversation.\nCan be a string or an array of chat messages.",
+ "oneOf": [
+ {
+ "type": "string",
+ "title": "String"
+ },
+ {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/SystemMessage",
+ "title": "SystemMessage"
+ },
+ {
+ "$ref": "#/components/schemas/UserMessage",
+ "title": "UserMessage"
+ },
+ {
+ "$ref": "#/components/schemas/AssistantMessage",
+ "title": "AssistantMessage"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessage",
+ "title": "ToolMessage"
+ },
+ {
+ "$ref": "#/components/schemas/DeveloperMessage",
+ "title": "DeveloperMessage"
+ }
+ ]
+ },
+ "title": "MessageArray"
+ }
+ ],
+ "examples": [
+ "Ask the user if they're still in the call",
+ [
+ {
+ "role": "system",
+ "content": "You are a helpful assistant, and would like to know if the user is still in the call based on the conversation history in {{transcript}}"
+ }
+ ]
+ ]
}
- }
+ },
+ "required": [
+ "type"
+ ]
},
- "StructuredDataMultiPlan": {
+ "MessageAddHookAction": {
"type": "object",
"properties": {
- "key": {
+ "type": {
"type": "string",
- "description": "This is the key of the structured data plan in the catalog."
+ "description": "This is the type of action - must be \"message.add\"",
+ "enum": [
+ "message.add"
+ ]
},
- "plan": {
- "description": "This is an individual structured data plan in the catalog.",
+ "message": {
+ "description": "The message to add to the conversation in OpenAI format",
+ "example": {
+ "role": "system",
+ "content": "Context update from hook"
+ },
"allOf": [
{
- "$ref": "#/components/schemas/StructuredDataPlan"
+ "$ref": "#/components/schemas/OpenAIMessage"
}
]
+ },
+ "triggerResponseEnabled": {
+ "type": "boolean",
+ "description": "Whether to trigger an assistant response after adding the message",
+ "default": true
}
},
"required": [
- "key",
- "plan"
+ "type",
+ "message"
]
},
- "SuccessEvaluationPlan": {
+ "CallHookFilter": {
"type": "object",
"properties": {
- "rubric": {
+ "type": {
"type": "string",
+ "description": "This is the type of filter - currently only \"oneOf\" is supported",
"enum": [
- "NumericScale",
- "DescriptiveScale",
- "Checklist",
- "Matrix",
- "PercentageScale",
- "LikertScale",
- "AutomaticRubric",
- "PassFail"
+ "oneOf"
],
- "description": "This enforces the rubric of the evaluation. The output is stored in `call.analysis.successEvaluation`.\n\nOptions include:\n- 'NumericScale': A scale of 1 to 10.\n- 'DescriptiveScale': A scale of Excellent, Good, Fair, Poor.\n- 'Checklist': A checklist of criteria and their status.\n- 'Matrix': A grid that evaluates multiple criteria across different performance levels.\n- 'PercentageScale': A scale of 0% to 100%.\n- 'LikertScale': A scale of Strongly Agree, Agree, Neutral, Disagree, Strongly Disagree.\n- 'AutomaticRubric': Automatically break down evaluation into several criteria, each with its own score.\n- 'PassFail': A simple 'true' if call passed, 'false' if not.\n\nDefault is 'PassFail'."
+ "maxLength": 1000
},
- "messages": {
- "description": "These are the messages used to generate the success evaluation.\n\n@default: ```\n[\n {\n \"role\": \"system\",\n \"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.\"\n },\n {\n \"role\": \"user\",\n \"content\": \"Here is the transcript:\\n\\n{{transcript}}\\n\\n\"\n },\n {\n \"role\": \"user\",\n \"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\"\n }\n]```\n\nYou can customize by providing any messages you want.\n\nHere are the template variables available:\n- {{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`",
+ "key": {
+ "type": "string",
+ "description": "This is the key to filter on (e.g. \"call.endedReason\")",
+ "maxLength": 1000
+ },
+ "oneOf": {
+ "description": "This is the array of possible values to match against",
"type": "array",
"items": {
- "type": "object"
+ "type": "string",
+ "maxLength": 1000
}
- },
- "enabled": {
- "type": "boolean",
- "description": "This determines whether a success evaluation is generated and stored in `call.analysis.successEvaluation`. Defaults to true.\n\nUsage:\n- If you want to disable the success evaluation, set this to false.\n\n@default true"
- },
- "timeoutSeconds": {
- "type": "number",
- "description": "This is how long the request is tried before giving up. When request times out, `call.analysis.successEvaluation` will be empty.\n\nUsage:\n- 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.\n\n@default 5 seconds",
- "minimum": 1,
- "maximum": 60
}
- }
+ },
+ "required": [
+ "type",
+ "key",
+ "oneOf"
+ ]
},
- "AnalysisPlan": {
+ "CallHookCallEnding": {
"type": "object",
"properties": {
- "minMessagesThreshold": {
- "type": "number",
- "description": "The minimum number of messages required to run the analysis plan.\nIf the number of messages is less than this, analysis will be skipped.\n\n@default 2",
- "deprecated": true,
- "minimum": 0
- },
- "summaryPlan": {
- "description": "This is the plan for generating the summary of the call. This outputs to `call.analysis.summary`.",
- "deprecated": true,
- "allOf": [
- {
- "$ref": "#/components/schemas/SummaryPlan"
- }
- ]
- },
- "structuredDataPlan": {
- "description": "This is the plan for generating the structured data from the call. This outputs to `call.analysis.structuredData`.",
- "deprecated": true,
- "allOf": [
- {
- "$ref": "#/components/schemas/StructuredDataPlan"
- }
- ]
+ "on": {
+ "type": "string",
+ "description": "This is the event that triggers this hook",
+ "enum": [
+ "call.ending"
+ ],
+ "maxLength": 1000
},
- "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`.",
- "deprecated": true,
+ "do": {
"type": "array",
+ "description": "This is the set of actions to perform when the hook triggers",
"items": {
- "$ref": "#/components/schemas/StructuredDataMultiPlan"
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/ToolCallHookAction",
+ "title": "ToolCallHookAction"
+ },
+ {
+ "$ref": "#/components/schemas/MessageAddHookAction",
+ "title": "MessageAddHookAction"
+ }
+ ]
}
},
- "successEvaluationPlan": {
- "description": "This is the plan for generating the success evaluation of the call. This outputs to `call.analysis.successEvaluation`.",
- "deprecated": true,
- "allOf": [
- {
- "$ref": "#/components/schemas/SuccessEvaluationPlan"
- }
- ]
- },
- "outcomeIds": {
- "description": "This is an array of outcome UUIDs to be calculated during analysis.\nThe outcomes will be calculated and stored in `call.analysis.outcomes`.",
- "deprecated": true,
+ "filters": {
+ "description": "This is the set of filters that must match for the hook to trigger",
"type": "array",
"items": {
- "type": "string"
+ "$ref": "#/components/schemas/CallHookFilter"
}
}
- }
+ },
+ "required": [
+ "on",
+ "do"
+ ]
},
- "TranscriptPlan": {
+ "CallHookAssistantSpeechInterrupted": {
"type": "object",
"properties": {
- "enabled": {
- "type": "boolean",
- "description": "This determines whether the transcript is stored in `call.artifact.transcript`. Defaults to true.\n\n@default true",
- "example": true
- },
- "assistantName": {
+ "on": {
"type": "string",
- "description": "This is the name of the assistant in the transcript. Defaults to 'AI'.\n\nUsage:\n- 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':\n```\nUser: Hello, how are you?\nBuyer: I'm fine.\nUser: Do you want to buy a car?\nBuyer: No.\n```\n\n@default 'AI'"
+ "description": "This is the event that triggers this hook",
+ "enum": [
+ "assistant.speech.interrupted"
+ ],
+ "maxLength": 1000
},
- "userName": {
- "type": "string",
- "description": "This is the name of the user in the transcript. Defaults to 'User'.\n\nUsage:\n- 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':\n```\nSeller: Hello, how are you?\nAI: I'm fine.\nSeller: Do you want to buy a car?\nAI: No.\n```\n\n@default 'User'"
+ "do": {
+ "type": "array",
+ "description": "This is the set of actions to perform when the hook triggers",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/SayHookAction",
+ "title": "SayHookAction"
+ },
+ {
+ "$ref": "#/components/schemas/ToolCallHookAction",
+ "title": "ToolCallHookAction"
+ },
+ {
+ "$ref": "#/components/schemas/MessageAddHookAction",
+ "title": "MessageAddHookAction"
+ }
+ ]
+ }
}
- }
+ },
+ "required": [
+ "on",
+ "do"
+ ]
},
- "ComplianceOverride": {
+ "CallHookCustomerSpeechInterrupted": {
"type": "object",
"properties": {
- "forceStoreOnHipaaEnabled": {
- "type": "boolean",
- "description": "Force storage for this output under HIPAA. Only enable if output contains no sensitive data.",
- "example": false
+ "on": {
+ "type": "string",
+ "description": "This is the event that triggers this hook",
+ "enum": [
+ "customer.speech.interrupted"
+ ],
+ "maxLength": 1000
+ },
+ "do": {
+ "type": "array",
+ "description": "This is the set of actions to perform when the hook triggers",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/SayHookAction",
+ "title": "SayHookAction"
+ },
+ {
+ "$ref": "#/components/schemas/ToolCallHookAction",
+ "title": "ToolCallHookAction"
+ },
+ {
+ "$ref": "#/components/schemas/MessageAddHookAction",
+ "title": "MessageAddHookAction"
+ }
+ ]
+ }
}
- }
+ },
+ "required": [
+ "on",
+ "do"
+ ]
},
- "CreateStructuredOutputDTO": {
+ "ToolCallHookAction": {
"type": "object",
"properties": {
"type": {
"type": "string",
- "description": "This is the type of structured output.\n\n- 'ai': Uses an LLM to extract structured data from the conversation (default).\n- 'regex': Uses a regex pattern to extract data from the transcript without an LLM.\n\nDefaults to 'ai' if not specified.",
+ "description": "This is the type of action - must be \"tool\"",
"enum": [
- "ai",
- "regex"
- ],
- "default": "ai"
- },
- "regex": {
- "type": "string",
- "description": "This is the regex pattern to match against the transcript.\n\nOnly used when type is 'regex'. Supports both raw patterns (e.g. '\\d+') and\nregex literal format (e.g. '/\\d+/gi'). Uses RE2 syntax for safety.\n\nThe result depends on the schema type:\n- boolean: true if the pattern matches, false otherwise\n- string: the first match or first capture group\n- number/integer: the first match parsed as a number\n- array: all matches",
- "minLength": 1,
- "maxLength": 1000
+ "tool"
+ ]
},
- "model": {
- "description": "This is the model that will be used to extract the structured output.\n\nTo 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.\nBetween the system or user messages, you must reference either 'transcript' or 'messages' with the `{{}}` syntax to access the conversation history.\nBetween the system or user messages, you must reference a variation of the structured output with the `{{}}` syntax to access the structured output definition.\ni.e.:\n`{{structuredOutput}}`\n`{{structuredOutput.name}}`\n`{{structuredOutput.description}}`\n`{{structuredOutput.schema}}`\n\nIf model is not specified, GPT-4.1 will be used by default for extraction, utilizing default system and user prompts.\nIf messages or required fields are not specified, the default system and user prompts will be used.",
+ "tool": {
+ "description": "This is the tool to call. To use an existing tool, send `toolId` instead.",
"oneOf": [
{
- "$ref": "#/components/schemas/WorkflowOpenAIModel",
- "title": "WorkflowOpenAIModel"
+ "$ref": "#/components/schemas/CreateApiRequestToolDTO",
+ "title": "ApiRequestTool"
},
{
- "$ref": "#/components/schemas/WorkflowAnthropicModel",
- "title": "WorkflowAnthropicModel"
+ "$ref": "#/components/schemas/CreateBashToolDTO",
+ "title": "BashTool"
},
{
- "$ref": "#/components/schemas/WorkflowAnthropicBedrockModel",
- "title": "WorkflowAnthropicBedrockModel"
+ "$ref": "#/components/schemas/CreateCodeToolDTO",
+ "title": "CodeTool"
},
{
- "$ref": "#/components/schemas/WorkflowGoogleModel",
- "title": "WorkflowGoogleModel"
+ "$ref": "#/components/schemas/CreateComputerToolDTO",
+ "title": "ComputerTool"
},
{
- "$ref": "#/components/schemas/WorkflowCustomModel",
- "title": "WorkflowCustomModel"
+ "$ref": "#/components/schemas/CreateDtmfToolDTO",
+ "title": "DtmfTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateEndCallToolDTO",
+ "title": "EndCallTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateFunctionToolDTO",
+ "title": "FunctionTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO",
+ "title": "GoHighLevelCalendarAvailabilityTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO",
+ "title": "GoHighLevelCalendarEventCreateTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelContactCreateToolDTO",
+ "title": "GoHighLevelContactCreateTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelContactGetToolDTO",
+ "title": "GoHighLevelContactGetTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO",
+ "title": "GoogleCalendarCheckAvailabilityTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarCreateEventToolDTO",
+ "title": "GoogleCalendarCreateEventTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleSheetsRowAppendToolDTO",
+ "title": "GoogleSheetsRowAppendTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateHandoffToolDTO",
+ "title": "HandoffTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMcpToolDTO",
+ "title": "McpTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateQueryToolDTO",
+ "title": "QueryTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSlackSendMessageToolDTO",
+ "title": "SlackSendMessageTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSmsToolDTO",
+ "title": "SmsTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTextEditorToolDTO",
+ "title": "TextEditorTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTransferCallToolDTO",
+ "title": "TransferCallTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSipRequestToolDTO",
+ "title": "SipRequestTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateVoicemailToolDTO",
+ "title": "VoicemailTool"
}
]
},
- "compliancePlan": {
- "description": "Compliance configuration for this output. Only enable overrides if no sensitive data will be stored.",
- "example": {
- "forceStoreOnHipaaEnabled": false
- },
- "allOf": [
- {
- "$ref": "#/components/schemas/ComplianceOverride"
- }
+ "toolId": {
+ "type": "string",
+ "description": "This is the tool to call. To use a transient tool, send `tool` instead."
+ }
+ },
+ "required": [
+ "type"
+ ]
+ },
+ "CustomerSpeechTimeoutOptions": {
+ "type": "object",
+ "properties": {
+ "triggerResetMode": {
+ "type": "string",
+ "description": "This is whether the counter for hook trigger resets the user speaks.\n\n@default never",
+ "enum": [
+ "onUserSpeech",
+ "never"
]
},
- "name": {
+ "timeoutSeconds": {
+ "type": "number",
+ "description": "This is the timeout in seconds before action is triggered.\nThe clock starts when the assistant finishes speaking and remains active until the user speaks.\n\n@default 7.5\n@minimum 2\n@maximum 1000",
+ "minimum": 1,
+ "maximum": 1000
+ },
+ "triggerMaxCount": {
+ "type": "number",
+ "description": "This is the maximum number of times the hook will trigger in a call.\n\n@default 3",
+ "minimum": 1,
+ "maximum": 10
+ }
+ },
+ "required": [
+ "timeoutSeconds"
+ ]
+ },
+ "CallHookCustomerSpeechTimeout": {
+ "type": "object",
+ "properties": {
+ "on": {
"type": "string",
- "description": "This is the name of the structured output.",
- "minLength": 1,
- "maxLength": 40
+ "description": "Must be either \"customer.speech.timeout\" or match the pattern \"customer.speech.timeout[property=value]\"",
+ "maxLength": 1000
},
- "schema": {
- "description": "This is the JSON Schema definition for the structured output.\n\nThis 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:\n- Objects and nested properties\n- Arrays and array validation\n- String, number, boolean, and null types\n- Enums and const values\n- Validation constraints (min/max, patterns, etc.)\n- Composition with allOf, anyOf, oneOf",
+ "do": {
+ "type": "array",
+ "description": "This is the set of actions to perform when the hook triggers",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/SayHookAction",
+ "title": "SayHookAction"
+ },
+ {
+ "$ref": "#/components/schemas/ToolCallHookAction",
+ "title": "ToolCallHookAction"
+ },
+ {
+ "$ref": "#/components/schemas/MessageAddHookAction",
+ "title": "MessageAddHookAction"
+ }
+ ]
+ }
+ },
+ "options": {
+ "description": "This is the set of filters that must match for the hook to trigger",
"allOf": [
{
- "$ref": "#/components/schemas/JsonSchema"
+ "$ref": "#/components/schemas/CustomerSpeechTimeoutOptions"
}
]
},
- "description": {
+ "name": {
"type": "string",
- "description": "This is the description of what the structured output extracts.\n\nUse this to provide context about what data will be extracted and how it will be used."
- },
- "assistantIds": {
- "description": "These are the assistant IDs that this structured output is linked to.\n\nWhen linked to assistants, this structured output will be available for extraction during those assistant's calls.",
- "type": "array",
- "items": {
- "type": "string"
- }
+ "description": "This is the name of the hook, it can be set by the user to identify the hook.\nIf no name is provided, the hook will be auto generated as UUID.\n\n@default UUID",
+ "maxLength": 1000
+ }
+ },
+ "required": [
+ "on",
+ "do"
+ ]
+ },
+ "CallHookModelResponseTimeout": {
+ "type": "object",
+ "properties": {
+ "on": {
+ "type": "string",
+ "description": "This is the event that triggers this hook",
+ "enum": [
+ "model.response.timeout"
+ ],
+ "maxLength": 1000
},
- "workflowIds": {
- "description": "These are the workflow IDs that this structured output is linked to.\n\nWhen linked to workflows, this structured output will be available for extraction during those workflow's execution.",
+ "do": {
"type": "array",
+ "description": "This is the set of actions to perform when the hook triggers",
"items": {
- "type": "string"
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/SayHookAction",
+ "title": "SayHookAction"
+ },
+ {
+ "$ref": "#/components/schemas/ToolCallHookAction",
+ "title": "ToolCallHookAction"
+ },
+ {
+ "$ref": "#/components/schemas/MessageAddHookAction",
+ "title": "MessageAddHookAction"
+ }
+ ]
}
}
},
"required": [
- "name",
- "schema"
+ "on",
+ "do"
]
},
- "ScorecardMetric": {
+ "AIEdgeCondition": {
"type": "object",
"properties": {
- "structuredOutputId": {
+ "type": {
"type": "string",
- "description": "This is the unique identifier for the structured output that will be used to evaluate the scorecard.\nThe structured output must be of type number or boolean only for now."
+ "enum": [
+ "ai"
+ ]
},
- "conditions": {
- "description": "These are the conditions that will be used to evaluate the scorecard.\nEach condition will have a comparator, value, and points that will be used to calculate the final score.\nThe points will be added to the overall score if the condition is met.\nThe overall score will be normalized to a 100 point scale to ensure uniformity across different scorecards.",
- "type": "array",
- "items": {
- "type": "object"
- }
+ "prompt": {
+ "type": "string",
+ "description": "This is the prompt for the AI edge condition. It should evaluate to a boolean.",
+ "maxLength": 1000
}
},
"required": [
- "structuredOutputId",
- "conditions"
+ "type",
+ "prompt"
]
},
- "CreateScorecardDTO": {
+ "Edge": {
"type": "object",
"properties": {
- "name": {
+ "condition": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/AIEdgeCondition",
+ "title": "AIEdgeCondition"
+ }
+ ]
+ },
+ "from": {
"type": "string",
- "description": "This is the name of the scorecard. It is only for user reference and will not be used for any evaluation.",
"maxLength": 80
},
- "description": {
+ "to": {
"type": "string",
- "description": "This is the description of the scorecard. It is only for user reference and will not be used for any evaluation.",
- "maxLength": 500
- },
- "metrics": {
- "description": "These are the metrics that will be used to evaluate the scorecard.\nEach metric will have a set of conditions and points that will be used to generate the score.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/ScorecardMetric"
- }
+ "maxLength": 80
},
- "assistantIds": {
- "description": "These are the assistant IDs that this scorecard is linked to.\nWhen linked to assistants, this scorecard will be available for evaluation during those assistants' calls.",
- "type": "array",
- "items": {
- "type": "string"
- }
+ "metadata": {
+ "type": "object",
+ "description": "This is for metadata you want to store on the edge."
}
},
"required": [
- "metrics"
+ "from",
+ "to"
]
},
- "ArtifactPlan": {
+ "RecordingConsentPlanStayOnLine": {
"type": "object",
"properties": {
- "recordingEnabled": {
- "type": "boolean",
- "description": "This determines whether assistant's calls are recorded. Defaults to true.\n\nUsage:\n- If you don't want to record the calls, set this to false.\n- 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.\n\nYou can find the recording at `call.artifact.recordingUrl` and `call.artifact.stereoRecordingUrl` after the call is ended.\n\n@default true",
- "example": true
- },
- "recordingFormat": {
+ "message": {
"type": "string",
- "description": "This determines the format of the recording. Defaults to `wav;l16`.\n\n@default 'wav;l16'",
- "enum": [
- "wav;l16",
- "mp3"
+ "description": "This is the message asking for consent to record the call.\nIf the type is `stay-on-line`, the message should ask the user to hang up if they do not consent.\nIf the type is `verbal`, the message should ask the user to verbally consent or decline.",
+ "maxLength": 1000,
+ "examples": [
+ "For quality purposes, this call may be recorded. Please stay on the line if you agree or end the call if you do not consent.",
+ "This call may be recorded for quality and training purposes. Say \"I agree\" if you consent to being recorded, or \"I disagree\" if you do not consent."
]
},
- "recordingUseCustomStorageEnabled": {
- "type": "boolean",
- "description": "This determines whether to use custom storage (S3 or GCP) for call recordings when storage credentials are configured.\n\nWhen set to false, recordings will be stored on Vapi's storage instead of your custom storage, even if you have custom storage credentials configured.\n\nUsage:\n- Set to false if you have custom storage configured but want to store recordings on Vapi's storage for this assistant.\n- Set to true (or leave unset) to use your custom storage for recordings when available.\n\n@default true",
- "example": true
- },
- "videoRecordingEnabled": {
- "type": "boolean",
- "description": "This determines whether the video is recorded during the call. Defaults to false. Only relevant for `webCall` type.\n\nYou can find the video recording at `call.artifact.videoRecordingUrl` after the call is ended.\n\n@default false",
- "example": false
- },
- "fullMessageHistoryEnabled": {
- "type": "boolean",
- "description": "This determines whether the artifact contains the full message history, even after handoff context engineering. Defaults to false.",
- "example": 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`.\n\nYou can find the packet capture at `call.artifact.pcapUrl` after the call is ended.\n\n@default true",
- "example": 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.\n\nIf credential.s3PathPrefix or credential.bucketPlan.path is set, this will append to it.\n\nUsage:\n- If you want to upload the packet capture to a specific path, set this to the path. Example: `/my-assistant-captures`.\n- If you want to upload the packet capture to the root of the bucket, set this to `/`.\n\n@default '/'",
- "example": "/pcaps"
- },
- "pcapUseCustomStorageEnabled": {
- "type": "boolean",
- "description": "This determines whether to use custom storage (S3 or GCP) for SIP packet captures when storage credentials are configured.\n\nWhen 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.\n\nUsage:\n- Set to false if you have custom storage configured but want to store packet captures on Vapi's storage for this assistant.\n- Set to true (or leave unset) to use your custom storage for packet captures when available.\n\n@default true",
- "example": true
- },
- "loggingEnabled": {
- "type": "boolean",
- "description": "This determines whether the call logs are enabled. Defaults to true.\n\n@default true",
- "example": true
- },
- "loggingUseCustomStorageEnabled": {
- "type": "boolean",
- "description": "This determines whether to use custom storage (S3 or GCP) for call logs when storage credentials are configured.\n\nWhen set to false, logs will be stored on Vapi's storage instead of your custom storage, even if you have custom storage credentials configured.\n\nUsage:\n- Set to false if you have custom storage configured but want to store logs on Vapi's storage for this assistant.\n- Set to true (or leave unset) to use your custom storage for logs when available.\n\n@default true",
- "example": true
- },
- "transcriptPlan": {
- "description": "This is the plan for `call.artifact.transcript`. To disable, set `transcriptPlan.enabled` to false.",
- "allOf": [
- {
- "$ref": "#/components/schemas/TranscriptPlan"
- }
- ]
- },
- "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.\n\nIf credential.s3PathPrefix or credential.bucketPlan.path is set, this will append to it.\n\nUsage:\n- If you want to upload the recording to a specific path, set this to the path. Example: `/my-assistant-recordings`.\n- If you want to upload the recording to the root of the bucket, set this to `/`.\n\n@default '/'"
- },
- "structuredOutputIds": {
- "description": "This is an array of structured output IDs to be calculated during the call.\nThe outputs will be extracted and stored in `call.artifact.structuredOutputs` after the call is ended.",
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "structuredOutputs": {
- "description": "This is an array of transient structured outputs to be calculated during the call.\nThe outputs will be extracted and stored in `call.artifact.structuredOutputs` after the call is ended.\nUse this to provide inline structured output configurations instead of referencing existing ones via structuredOutputIds.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/CreateStructuredOutputDTO"
- }
- },
- "scorecardIds": {
- "description": "This is an array of scorecard IDs that will be evaluated based on the structured outputs extracted during the call.\nThe scorecards will be evaluated and the results will be stored in `call.artifact.scorecards` after the call has ended.",
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "scorecards": {
- "description": "This is the array of scorecards that will be evaluated based on the structured outputs extracted during the call.\nThe scorecards will be evaluated and the results will be stored in `call.artifact.scorecards` after the call has ended.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/CreateScorecardDTO"
- }
- },
- "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.\n\nIf credential.s3PathPrefix or credential.bucketPlan.path is set, this will append to it.\n\nUsage:\n- If you want to upload the call logs to a specific path, set this to the path. Example: `/my-assistant-logs`.\n- If you want to upload the call logs to the root of the bucket, set this to `/`.\n\n@default '/'"
- }
- }
- },
- "StopSpeakingPlan": {
- "type": "object",
- "properties": {
- "numWords": {
- "type": "number",
- "description": "This is the number of words that the customer has to say before the assistant will stop talking.\n\nWords like \"stop\", \"actually\", \"no\", etc. will always interrupt immediately regardless of this value.\n\nWords like \"okay\", \"yeah\", \"right\" will never interrupt.\n\nWhen set to 0, `voiceSeconds` is used in addition to the transcriptions to determine the customer has started speaking.\n\nDefaults to 0.\n\n@default 0",
- "minimum": 0,
- "maximum": 10,
- "example": 0
- },
- "voiceSeconds": {
- "type": "number",
- "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.\n\nConsiderations:\n- A lower value might be more responsive but could potentially pick up non-speech sounds.\n- A higher value reduces false positives but might slightly delay the detection of speech onset.\n\nThis is only used if `numWords` is set to 0.\n\nDefaults to 0.2\n\n@default 0.2",
- "minimum": 0,
- "maximum": 0.5,
- "example": 0.2
- },
- "backoffSeconds": {
- "type": "number",
- "description": "This is the seconds to wait before the assistant will start talking again after being interrupted.\n\nDefaults to 1.\n\n@default 1",
- "minimum": 0,
- "maximum": 10,
- "example": 1
- },
- "acknowledgementPhrases": {
- "description": "These are the phrases that will never interrupt the assistant, even if numWords threshold is met.\nThese are typically acknowledgement or backchanneling phrases.",
- "example": [
- "i understand",
- "i see",
- "i got it",
- "i hear you",
- "im listening",
- "im with you",
- "right",
- "okay",
- "ok",
- "sure",
- "alright",
- "got it",
- "understood",
- "yeah",
- "yes",
- "uh-huh",
- "mm-hmm",
- "gotcha",
- "mhmm",
- "ah",
- "yeah okay",
- "yeah sure"
- ],
- "default": [
- "i understand",
- "i see",
- "i got it",
- "i hear you",
- "im listening",
- "im with you",
- "right",
- "okay",
- "ok",
- "sure",
- "alright",
- "got it",
- "understood",
- "yeah",
- "yes",
- "uh-huh",
- "mm-hmm",
- "gotcha",
- "mhmm",
- "ah",
- "yeah okay",
- "yeah sure"
- ],
- "type": "array",
- "items": {
- "type": "string",
- "maxLength": 240
- }
- },
- "interruptionPhrases": {
- "description": "These are the phrases that will always interrupt the assistant immediately, regardless of numWords.\nThese are typically phrases indicating disagreement or desire to stop.",
- "example": [
- "stop",
- "shut",
- "up",
- "enough",
- "quiet",
- "silence",
- "but",
- "dont",
- "not",
- "no",
- "hold",
- "wait",
- "cut",
- "pause",
- "nope",
- "nah",
- "nevermind",
- "never",
- "bad",
- "actually"
- ],
- "default": [
- "stop",
- "shut",
- "up",
- "enough",
- "quiet",
- "silence",
- "but",
- "dont",
- "not",
- "no",
- "hold",
- "wait",
- "cut",
- "pause",
- "nope",
- "nah",
- "nevermind",
- "never",
- "bad",
- "actually"
- ],
- "type": "array",
- "items": {
- "type": "string",
- "maxLength": 240
- }
- }
- }
- },
- "MonitorPlan": {
- "type": "object",
- "properties": {
- "listenEnabled": {
- "type": "boolean",
- "description": "This determines whether the assistant's calls allow live listening. Defaults to true.\n\nFetch `call.monitor.listenUrl` to get the live listening URL.\n\n@default true",
- "example": false
- },
- "listenAuthenticationEnabled": {
- "type": "boolean",
- "description": "This enables authentication on the `call.monitor.listenUrl`.\n\nIf `listenAuthenticationEnabled` is `true`, the `call.monitor.listenUrl` will require an `Authorization: Bearer ` header.\n\n@default false",
- "example": false
- },
- "controlEnabled": {
- "type": "boolean",
- "description": "This determines whether the assistant's calls allow live control. Defaults to true.\n\nFetch `call.monitor.controlUrl` to get the live control URL.\n\nTo 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\n\n@default true",
- "example": false
- },
- "controlAuthenticationEnabled": {
- "type": "boolean",
- "description": "This enables authentication on the `call.monitor.controlUrl`.\n\nIf `controlAuthenticationEnabled` is `true`, the `call.monitor.controlUrl` will require an `Authorization: Bearer ` header.\n\n@default false",
- "example": false
- },
- "monitorIds": {
- "description": "This the set of monitor ids that are attached to the assistant.\nThe source of truth for the monitor ids is the assistant_monitor join table.\nThis field can be used for transient assistants and to update assistants with new monitor ids.\n\n@default []",
- "example": [
- "123e4567-e89b-12d3-a456-426614174000"
- ],
- "type": "array",
- "items": {
- "type": "string"
- }
- }
- }
- },
- "KeypadInputPlan": {
- "type": "object",
- "properties": {
- "enabled": {
- "type": "boolean",
- "description": "This keeps track of whether the user has enabled keypad input.\nBy default, it is off.\n\n@default false"
- },
- "timeoutSeconds": {
- "type": "number",
- "description": "This is the time in seconds to wait before processing the input.\nIf the input is not received within this time, the input will be ignored.\nIf set to \"off\", the input will be processed when the user enters a delimiter or immediately if no delimiter is used.\n\n@default 2",
- "minimum": 0,
- "maximum": 10
- },
- "delimiters": {
- "type": "string",
- "description": "This is the delimiter(s) that will be used to process the input.\nCan be '#', '*', or an empty array.",
- "enum": [
- "#",
- "*",
- ""
- ]
- }
- }
- },
- "WorkflowUserEditable": {
- "type": "object",
- "properties": {
- "nodes": {
- "type": "array",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/ConversationNode",
- "title": "ConversationNode"
- },
- {
- "$ref": "#/components/schemas/ToolNode",
- "title": "ToolNode"
- }
- ]
- }
- },
- "model": {
- "description": "This is the model for the workflow.\n\nThis can be overridden at node level using `nodes[n].model`.",
+ "voice": {
+ "description": "This is the voice to use for the consent message. If not specified, inherits from the assistant's voice.\nUse a different voice for the consent message for a better user experience.",
"oneOf": [
{
- "$ref": "#/components/schemas/WorkflowOpenAIModel",
- "title": "WorkflowOpenAIModel"
+ "$ref": "#/components/schemas/AzureVoice",
+ "title": "AzureVoice"
},
{
- "$ref": "#/components/schemas/WorkflowAnthropicModel",
- "title": "WorkflowAnthropicModel"
+ "$ref": "#/components/schemas/CartesiaVoice",
+ "title": "CartesiaVoice"
},
{
- "$ref": "#/components/schemas/WorkflowAnthropicBedrockModel",
- "title": "WorkflowAnthropicBedrockModel"
+ "$ref": "#/components/schemas/CustomVoice",
+ "title": "CustomVoice"
},
{
- "$ref": "#/components/schemas/WorkflowGoogleModel",
- "title": "WorkflowGoogleModel"
+ "$ref": "#/components/schemas/DeepgramVoice",
+ "title": "DeepgramVoice"
},
{
- "$ref": "#/components/schemas/WorkflowCustomModel",
- "title": "WorkflowCustomModel"
- }
- ]
- },
- "transcriber": {
- "description": "This is the transcriber for the workflow.\n\nThis can be overridden at node level using `nodes[n].transcriber`.",
- "oneOf": [
+ "$ref": "#/components/schemas/ElevenLabsVoice",
+ "title": "ElevenLabsVoice"
+ },
{
- "$ref": "#/components/schemas/AssemblyAITranscriber",
- "title": "AssemblyAITranscriber"
+ "$ref": "#/components/schemas/HumeVoice",
+ "title": "HumeVoice"
},
{
- "$ref": "#/components/schemas/AzureSpeechTranscriber",
- "title": "AzureSpeechTranscriber"
+ "$ref": "#/components/schemas/LMNTVoice",
+ "title": "LMNTVoice"
},
{
- "$ref": "#/components/schemas/CustomTranscriber",
- "title": "CustomTranscriber"
+ "$ref": "#/components/schemas/NeuphonicVoice",
+ "title": "NeuphonicVoice"
},
{
- "$ref": "#/components/schemas/DeepgramTranscriber",
- "title": "DeepgramTranscriber"
+ "$ref": "#/components/schemas/OpenAIVoice",
+ "title": "OpenAIVoice"
},
{
- "$ref": "#/components/schemas/ElevenLabsTranscriber",
- "title": "ElevenLabsTranscriber"
+ "$ref": "#/components/schemas/PlayHTVoice",
+ "title": "PlayHTVoice"
},
{
- "$ref": "#/components/schemas/GladiaTranscriber",
- "title": "GladiaTranscriber"
+ "$ref": "#/components/schemas/WellSaidVoice",
+ "title": "WellSaidVoice"
},
{
- "$ref": "#/components/schemas/GoogleTranscriber",
- "title": "GoogleTranscriber"
+ "$ref": "#/components/schemas/RimeAIVoice",
+ "title": "RimeAIVoice"
},
{
- "$ref": "#/components/schemas/SpeechmaticsTranscriber",
- "title": "SpeechmaticsTranscriber"
+ "$ref": "#/components/schemas/SmallestAIVoice",
+ "title": "SmallestAIVoice"
},
{
- "$ref": "#/components/schemas/TalkscriberTranscriber",
- "title": "TalkscriberTranscriber"
+ "$ref": "#/components/schemas/TavusVoice",
+ "title": "TavusVoice"
},
{
- "$ref": "#/components/schemas/OpenAITranscriber",
- "title": "OpenAITranscriber"
+ "$ref": "#/components/schemas/VapiVoice",
+ "title": "VapiVoice"
},
{
- "$ref": "#/components/schemas/CartesiaTranscriber",
- "title": "CartesiaTranscriber"
+ "$ref": "#/components/schemas/SesameVoice",
+ "title": "SesameVoice"
},
{
- "$ref": "#/components/schemas/SonioxTranscriber",
- "title": "SonioxTranscriber"
+ "$ref": "#/components/schemas/InworldVoice",
+ "title": "InworldVoice"
+ },
+ {
+ "$ref": "#/components/schemas/MinimaxVoice",
+ "title": "MinimaxVoice"
+ },
+ {
+ "$ref": "#/components/schemas/XaiVoice",
+ "title": "XaiVoice"
+ },
+ {
+ "$ref": "#/components/schemas/MicrosoftVoice",
+ "title": "MicrosoftVoice"
}
]
},
+ "firstMessageMode": {
+ "type": "string",
+ "description": "This controls whether the consent assistant speaks first or waits for the caller to speak first.\n\nUse:\n- `assistant-speaks-first` (default) to have the consent assistant play the consent message as soon as the call is answered.\n- `assistant-waits-for-user` to have the consent assistant wait for the caller to speak before playing the consent message.\n\nWe strongly recommend `assistant-waits-for-user` for outbound calls. Some telephony providers signal \"answered\" while the line is still ringing, which can cause the consent message to play into a ringing line and be missed by the caller. Waiting for the caller to speak first guarantees they hear the full consent message.\n\nNote: when combined with `type: 'stay-on-line'`, silence only counts toward consent after the caller has spoken at least once.\n\n@default 'assistant-speaks-first'",
+ "enum": [
+ "assistant-speaks-first",
+ "assistant-waits-for-user"
+ ],
+ "default": "assistant-speaks-first",
+ "example": "assistant-speaks-first"
+ },
+ "type": {
+ "type": "string",
+ "description": "This is the type of recording consent plan. This type assumes consent is granted if the user stays on the line.",
+ "enum": [
+ "stay-on-line"
+ ],
+ "example": "stay-on-line"
+ },
+ "waitSeconds": {
+ "type": "number",
+ "description": "Number of seconds to wait before transferring to the assistant if user stays on the call",
+ "minimum": 1,
+ "maximum": 6,
+ "default": 3,
+ "example": 3
+ }
+ },
+ "required": [
+ "message",
+ "type"
+ ]
+ },
+ "RecordingConsentPlanVerbal": {
+ "type": "object",
+ "properties": {
+ "message": {
+ "type": "string",
+ "description": "This is the message asking for consent to record the call.\nIf the type is `stay-on-line`, the message should ask the user to hang up if they do not consent.\nIf the type is `verbal`, the message should ask the user to verbally consent or decline.",
+ "maxLength": 1000,
+ "examples": [
+ "For quality purposes, this call may be recorded. Please stay on the line if you agree or end the call if you do not consent.",
+ "This call may be recorded for quality and training purposes. Say \"I agree\" if you consent to being recorded, or \"I disagree\" if you do not consent."
+ ]
+ },
"voice": {
- "description": "This is the voice for the workflow.\n\nThis can be overridden at node level using `nodes[n].voice`.",
+ "description": "This is the voice to use for the consent message. If not specified, inherits from the assistant's voice.\nUse a different voice for the consent message for a better user experience.",
"oneOf": [
{
"$ref": "#/components/schemas/AzureVoice",
@@ -19651,2114 +21147,5852 @@
{
"$ref": "#/components/schemas/MinimaxVoice",
"title": "MinimaxVoice"
- }
- ]
- },
- "observabilityPlan": {
- "description": "This is the plan for observability of workflow's calls.\n\nCurrently, only Langfuse is supported.",
- "oneOf": [
- {
- "$ref": "#/components/schemas/LangfuseObservabilityPlan",
- "title": "Langfuse"
- }
- ],
- "allOf": [
- {
- "$ref": "#/components/schemas/LangfuseObservabilityPlan"
- }
- ]
- },
- "backgroundSound": {
- "description": "This is the background sound in the call. Default for phone calls is 'office' and default for web calls is 'off'.\nYou can also provide a custom sound by providing a URL to an audio file.",
- "oneOf": [
+ },
{
- "type": "enum",
- "enum": [
- "off",
- "office"
- ],
- "example": "office"
+ "$ref": "#/components/schemas/XaiVoice",
+ "title": "XaiVoice"
},
{
- "type": "string",
- "format": "uri",
- "example": "https://www.soundjay.com/ambient/sounds/people-in-lounge-1.mp3"
+ "$ref": "#/components/schemas/MicrosoftVoice",
+ "title": "MicrosoftVoice"
}
]
},
- "hooks": {
+ "firstMessageMode": {
+ "type": "string",
+ "description": "This controls whether the consent assistant speaks first or waits for the caller to speak first.\n\nUse:\n- `assistant-speaks-first` (default) to have the consent assistant play the consent message as soon as the call is answered.\n- `assistant-waits-for-user` to have the consent assistant wait for the caller to speak before playing the consent message.\n\nWe strongly recommend `assistant-waits-for-user` for outbound calls. Some telephony providers signal \"answered\" while the line is still ringing, which can cause the consent message to play into a ringing line and be missed by the caller. Waiting for the caller to speak first guarantees they hear the full consent message.\n\nNote: when combined with `type: 'stay-on-line'`, silence only counts toward consent after the caller has spoken at least once.\n\n@default 'assistant-speaks-first'",
+ "enum": [
+ "assistant-speaks-first",
+ "assistant-waits-for-user"
+ ],
+ "default": "assistant-speaks-first",
+ "example": "assistant-speaks-first"
+ },
+ "type": {
+ "type": "string",
+ "description": "This is the type of recording consent plan. This type assumes consent is granted if the user verbally consents or declines.",
+ "enum": [
+ "verbal"
+ ],
+ "example": "verbal"
+ },
+ "declineTool": {
+ "type": "object",
+ "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": [
+ "message",
+ "type"
+ ]
+ },
+ "SecurityFilterBase": {
+ "type": "object",
+ "properties": {}
+ },
+ "SecurityFilterPlan": {
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "type": "boolean",
+ "description": "Whether the security filter is enabled.\n@default false",
+ "default": false
+ },
+ "filters": {
+ "description": "Array of security filter types to apply.\nIf array is not empty, only those security filters are run.",
+ "example": "[{ type: \"sql-injection\" }, { type: \"xss\" }]",
"type": "array",
- "description": "This is a set of actions that will be performed on certain events.",
"items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/CallHookCallEnding",
- "title": "CallHookCallEnding"
- },
- {
- "$ref": "#/components/schemas/CallHookAssistantSpeechInterrupted",
- "title": "CallHookAssistantSpeechInterrupted"
- },
- {
- "$ref": "#/components/schemas/CallHookCustomerSpeechInterrupted",
- "title": "CallHookCustomerSpeechInterrupted"
- },
- {
- "$ref": "#/components/schemas/CallHookCustomerSpeechTimeout",
- "title": "CallHookCustomerSpeechTimeout"
- },
- {
- "$ref": "#/components/schemas/CallHookModelResponseTimeout",
- "title": "CallHookModelResponseTimeout"
- }
- ]
- }
- },
- "credentials": {
- "type": "array",
- "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.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/CreateAnthropicCredentialDTO",
- "title": "AnthropicCredential"
- },
- {
- "$ref": "#/components/schemas/CreateAnthropicBedrockCredentialDTO",
- "title": "AnthropicBedrockCredential"
- },
- {
- "$ref": "#/components/schemas/CreateAnyscaleCredentialDTO",
- "title": "AnyscaleCredential"
- },
- {
- "$ref": "#/components/schemas/CreateAssemblyAICredentialDTO",
- "title": "AssemblyAICredential"
- },
- {
- "$ref": "#/components/schemas/CreateAzureCredentialDTO",
- "title": "AzureCredential"
- },
- {
- "$ref": "#/components/schemas/CreateAzureOpenAICredentialDTO",
- "title": "AzureOpenAICredential"
- },
- {
- "$ref": "#/components/schemas/CreateByoSipTrunkCredentialDTO",
- "title": "ByoSipTrunkCredential"
- },
- {
- "$ref": "#/components/schemas/CreateCartesiaCredentialDTO",
- "title": "CartesiaCredential"
- },
- {
- "$ref": "#/components/schemas/CreateCerebrasCredentialDTO",
- "title": "CerebrasCredential"
- },
- {
- "$ref": "#/components/schemas/CreateCloudflareCredentialDTO",
- "title": "CloudflareCredential"
- },
- {
- "$ref": "#/components/schemas/CreateCustomLLMCredentialDTO",
- "title": "CustomLLMCredential"
- },
- {
- "$ref": "#/components/schemas/CreateDeepgramCredentialDTO",
- "title": "DeepgramCredential"
- },
- {
- "$ref": "#/components/schemas/CreateDeepInfraCredentialDTO",
- "title": "DeepInfraCredential"
- },
- {
- "$ref": "#/components/schemas/CreateDeepSeekCredentialDTO",
- "title": "DeepSeekCredential"
- },
- {
- "$ref": "#/components/schemas/CreateElevenLabsCredentialDTO",
- "title": "ElevenLabsCredential"
- },
- {
- "$ref": "#/components/schemas/CreateGcpCredentialDTO",
- "title": "GcpCredential"
- },
- {
- "$ref": "#/components/schemas/CreateGladiaCredentialDTO",
- "title": "GladiaCredential"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelCredentialDTO",
- "title": "GhlCredential"
- },
- {
- "$ref": "#/components/schemas/CreateGoogleCredentialDTO",
- "title": "GoogleCredential"
- },
- {
- "$ref": "#/components/schemas/CreateGroqCredentialDTO",
- "title": "GroqCredential"
- },
- {
- "$ref": "#/components/schemas/CreateHumeCredentialDTO",
- "title": "HumeCredential"
- },
- {
- "$ref": "#/components/schemas/CreateInflectionAICredentialDTO",
- "title": "InflectionAICredential"
- },
- {
- "$ref": "#/components/schemas/CreateLangfuseCredentialDTO",
- "title": "LangfuseCredential"
- },
- {
- "$ref": "#/components/schemas/CreateLmntCredentialDTO",
- "title": "LmntCredential"
- },
- {
- "$ref": "#/components/schemas/CreateMakeCredentialDTO",
- "title": "MakeCredential"
- },
- {
- "$ref": "#/components/schemas/CreateMistralCredentialDTO",
- "title": "MistralCredential"
- },
- {
- "$ref": "#/components/schemas/CreateNeuphonicCredentialDTO",
- "title": "NeuphonicCredential"
- },
- {
- "$ref": "#/components/schemas/CreateOpenAICredentialDTO",
- "title": "OpenAICredential"
- },
- {
- "$ref": "#/components/schemas/CreateOpenRouterCredentialDTO",
- "title": "OpenRouterCredential"
- },
- {
- "$ref": "#/components/schemas/CreatePerplexityAICredentialDTO",
- "title": "PerplexityAICredential"
- },
- {
- "$ref": "#/components/schemas/CreatePlayHTCredentialDTO",
- "title": "PlayHTCredential"
- },
- {
- "$ref": "#/components/schemas/CreateRimeAICredentialDTO",
- "title": "RimeAICredential"
- },
- {
- "$ref": "#/components/schemas/CreateRunpodCredentialDTO",
- "title": "RunpodCredential"
- },
- {
- "$ref": "#/components/schemas/CreateS3CredentialDTO",
- "title": "S3Credential"
- },
- {
- "$ref": "#/components/schemas/CreateSmallestAICredentialDTO",
- "title": "SmallestAICredential"
- },
- {
- "$ref": "#/components/schemas/CreateSpeechmaticsCredentialDTO",
- "title": "SpeechmaticsCredential"
- },
- {
- "$ref": "#/components/schemas/CreateSonioxCredentialDTO",
- "title": "SonioxCredential"
- },
- {
- "$ref": "#/components/schemas/CreateSupabaseCredentialDTO",
- "title": "SupabaseCredential"
- },
- {
- "$ref": "#/components/schemas/CreateTavusCredentialDTO",
- "title": "TavusCredential"
- },
- {
- "$ref": "#/components/schemas/CreateTogetherAICredentialDTO",
- "title": "TogetherAICredential"
- },
- {
- "$ref": "#/components/schemas/CreateTrieveCredentialDTO",
- "title": "TrieveCredential"
- },
- {
- "$ref": "#/components/schemas/CreateTwilioCredentialDTO",
- "title": "TwilioCredential"
- },
- {
- "$ref": "#/components/schemas/CreateVonageCredentialDTO",
- "title": "VonageCredential"
- },
- {
- "$ref": "#/components/schemas/CreateWebhookCredentialDTO",
- "title": "WebhookCredential"
- },
- {
- "$ref": "#/components/schemas/CreateCustomCredentialDTO",
- "title": "CustomCredential"
- },
- {
- "$ref": "#/components/schemas/CreateXAiCredentialDTO",
- "title": "XAiCredential"
- },
- {
- "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
- "title": "GoogleCalendarOAuth2ClientCredential"
- },
- {
- "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO",
- "title": "GoogleCalendarOAuth2AuthorizationCredential"
- },
- {
- "$ref": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO",
- "title": "GoogleSheetsOAuth2AuthorizationCredential"
- },
- {
- "$ref": "#/components/schemas/CreateSlackOAuth2AuthorizationCredentialDTO",
- "title": "SlackOAuth2AuthorizationCredential"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelMCPCredentialDTO",
- "title": "GoHighLevelMCPCredential"
- },
- {
- "$ref": "#/components/schemas/CreateInworldCredentialDTO",
- "title": "InworldCredential"
- },
- {
- "$ref": "#/components/schemas/CreateMinimaxCredentialDTO",
- "title": "MinimaxCredential"
- },
- {
- "$ref": "#/components/schemas/CreateWellSaidCredentialDTO",
- "title": "WellSaidCredential"
- },
- {
- "$ref": "#/components/schemas/CreateEmailCredentialDTO",
- "title": "EmailCredential"
- },
- {
- "$ref": "#/components/schemas/CreateSlackWebhookCredentialDTO",
- "title": "SlackWebhookCredential"
- }
- ],
- "discriminator": {
- "propertyName": "provider",
- "mapping": {
- "11labs": "#/components/schemas/CreateElevenLabsCredentialDTO",
- "anthropic": "#/components/schemas/CreateAnthropicCredentialDTO",
- "anthropic-bedrock": "#/components/schemas/CreateAnthropicBedrockCredentialDTO",
- "anyscale": "#/components/schemas/CreateAnyscaleCredentialDTO",
- "assembly-ai": "#/components/schemas/CreateAssemblyAICredentialDTO",
- "azure-openai": "#/components/schemas/CreateAzureOpenAICredentialDTO",
- "azure": "#/components/schemas/CreateAzureCredentialDTO",
- "byo-sip-trunk": "#/components/schemas/CreateByoSipTrunkCredentialDTO",
- "cartesia": "#/components/schemas/CreateCartesiaCredentialDTO",
- "cerebras": "#/components/schemas/CreateCerebrasCredentialDTO",
- "cloudflare": "#/components/schemas/CreateCloudflareCredentialDTO",
- "custom-llm": "#/components/schemas/CreateCustomLLMCredentialDTO",
- "deepgram": "#/components/schemas/CreateDeepgramCredentialDTO",
- "deepinfra": "#/components/schemas/CreateDeepInfraCredentialDTO",
- "deep-seek": "#/components/schemas/CreateDeepSeekCredentialDTO",
- "gcp": "#/components/schemas/CreateGcpCredentialDTO",
- "gladia": "#/components/schemas/CreateGladiaCredentialDTO",
- "gohighlevel": "#/components/schemas/CreateGoHighLevelCredentialDTO",
- "google": "#/components/schemas/CreateGoogleCredentialDTO",
- "groq": "#/components/schemas/CreateGroqCredentialDTO",
- "inflection-ai": "#/components/schemas/CreateInflectionAICredentialDTO",
- "langfuse": "#/components/schemas/CreateLangfuseCredentialDTO",
- "lmnt": "#/components/schemas/CreateLmntCredentialDTO",
- "make": "#/components/schemas/CreateMakeCredentialDTO",
- "openai": "#/components/schemas/CreateOpenAICredentialDTO",
- "openrouter": "#/components/schemas/CreateOpenRouterCredentialDTO",
- "perplexity-ai": "#/components/schemas/CreatePerplexityAICredentialDTO",
- "playht": "#/components/schemas/CreatePlayHTCredentialDTO",
- "rime-ai": "#/components/schemas/CreateRimeAICredentialDTO",
- "runpod": "#/components/schemas/CreateRunpodCredentialDTO",
- "s3": "#/components/schemas/CreateS3CredentialDTO",
- "supabase": "#/components/schemas/CreateSupabaseCredentialDTO",
- "smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO",
- "tavus": "#/components/schemas/CreateTavusCredentialDTO",
- "together-ai": "#/components/schemas/CreateTogetherAICredentialDTO",
- "twilio": "#/components/schemas/CreateTwilioCredentialDTO",
- "vonage": "#/components/schemas/CreateVonageCredentialDTO",
- "webhook": "#/components/schemas/CreateWebhookCredentialDTO",
- "custom-credential": "#/components/schemas/CreateCustomCredentialDTO",
- "xai": "#/components/schemas/CreateXAiCredentialDTO",
- "neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO",
- "hume": "#/components/schemas/CreateHumeCredentialDTO",
- "mistral": "#/components/schemas/CreateMistralCredentialDTO",
- "speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO",
- "soniox": "#/components/schemas/CreateSonioxCredentialDTO",
- "trieve": "#/components/schemas/CreateTrieveCredentialDTO",
- "google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
- "google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO",
- "google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO",
- "slack.oauth2-authorization": "#/components/schemas/CreateSlackOAuth2AuthorizationCredentialDTO",
- "ghl.oauth2-authorization": "#/components/schemas/CreateGoHighLevelMCPCredentialDTO",
- "inworld": "#/components/schemas/CreateInworldCredentialDTO",
- "minimax": "#/components/schemas/CreateMinimaxCredentialDTO",
- "wellsaid": "#/components/schemas/CreateWellSaidCredentialDTO",
- "email": "#/components/schemas/CreateEmailCredentialDTO",
- "slack-webhook": "#/components/schemas/CreateSlackWebhookCredentialDTO"
- }
- }
+ "$ref": "#/components/schemas/SecurityFilterBase"
}
},
- "voicemailDetection": {
- "description": "This is the voicemail detection plan for the workflow.",
- "oneOf": [
- {
- "type": "string",
- "enum": [
- "off"
- ]
- },
- {
- "$ref": "#/components/schemas/GoogleVoicemailDetectionPlan",
- "title": "Google"
- },
- {
- "$ref": "#/components/schemas/OpenAIVoicemailDetectionPlan",
- "title": "OpenAI"
- },
- {
- "$ref": "#/components/schemas/TwilioVoicemailDetectionPlan",
- "title": "Twilio"
- },
- {
- "$ref": "#/components/schemas/VapiVoicemailDetectionPlan",
- "title": "Vapi"
- }
- ]
- },
- "maxDurationSeconds": {
- "type": "number",
- "description": "This is the maximum duration of the call in seconds.\n\nAfter this duration, the call will automatically end.\n\nDefault is 1800 (30 minutes), max is 43200 (12 hours), and min is 10 seconds.",
- "minimum": 10,
- "maximum": 43200,
- "example": 600
- },
- "name": {
+ "mode": {
"type": "string",
- "maxLength": 80
- },
- "edges": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/Edge"
- }
+ "description": "Mode of operation when a security threat is detected.\n- 'sanitize': Remove or replace the threatening content\n- 'reject': Replace the entire transcript with replacement text\n- 'replace': Replace threatening patterns with replacement text\n@default 'sanitize'",
+ "enum": [
+ "sanitize",
+ "reject",
+ "replace"
+ ],
+ "default": "sanitize"
},
- "globalPrompt": {
+ "replacementText": {
"type": "string",
- "maxLength": 5000
- },
- "server": {
- "description": "This is where Vapi will send webhooks. You can find all webhooks available along with their shape in ServerMessage schema.\n\nThe order of precedence is:\n\n1. tool.server\n2. workflow.server / assistant.server\n3. phoneNumber.server\n4. org.server",
- "allOf": [
- {
- "$ref": "#/components/schemas/Server"
- }
- ]
+ "description": "Text to use when replacing filtered content.\n@default '[FILTERED]'",
+ "default": "[FILTERED]"
+ }
+ }
+ },
+ "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."
},
- "compliancePlan": {
- "description": "This is the compliance plan for the workflow. It allows you to configure HIPAA and other compliance settings.",
- "allOf": [
- {
- "$ref": "#/components/schemas/CompliancePlan"
- }
- ]
+ "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.\nAt the end of the call, you will receive an end-of-call-report message to store on your server. Defaults to false.",
+ "example": {
+ "pciEnabled": false
+ }
},
- "analysisPlan": {
- "description": "This is the plan for analysis of workflow's calls. Stored in `call.analysis`.",
+ "securityFilterPlan": {
+ "description": "This is the security filter plan for the assistant. It allows filtering of transcripts for security threats before sending to LLM.",
"allOf": [
{
- "$ref": "#/components/schemas/AnalysisPlan"
+ "$ref": "#/components/schemas/SecurityFilterPlan"
}
]
},
- "artifactPlan": {
- "description": "This is the plan for artifacts generated during workflow's calls. Stored in `call.artifact`.",
- "allOf": [
+ "recordingConsentPlan": {
+ "oneOf": [
{
- "$ref": "#/components/schemas/ArtifactPlan"
- }
- ]
- },
- "startSpeakingPlan": {
- "description": "This is the plan for when the workflow nodes should start talking.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to start talking after the customer is done speaking.\n- The assistant is too fast to start talking after the customer is done speaking.\n- The assistant is so fast that it's actually interrupting the customer.",
- "allOf": [
+ "$ref": "#/components/schemas/RecordingConsentPlanStayOnLine",
+ "title": "RecordingConsentStayOnLinePlan"
+ },
{
- "$ref": "#/components/schemas/StartSpeakingPlan"
+ "$ref": "#/components/schemas/RecordingConsentPlanVerbal",
+ "title": "RecordingConsentPlanVerbal"
}
- ]
- },
- "stopSpeakingPlan": {
- "description": "This is the plan for when workflow nodes should stop talking on customer interruption.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to recognize customer's interruption.\n- The assistant is too fast to recognize customer's interruption.\n- The assistant is getting interrupted by phrases that are just acknowledgments.\n- The assistant is getting interrupted by background noises.\n- The assistant is not properly stopping -- it starts talking right after getting interrupted.",
- "allOf": [
- {
- "$ref": "#/components/schemas/StopSpeakingPlan"
+ ],
+ "discriminator": {
+ "propertyName": "type",
+ "mapping": {
+ "stay-on-line": "#/components/schemas/RecordingConsentPlanStayOnLine",
+ "verbal": "#/components/schemas/RecordingConsentPlanVerbal"
}
- ]
+ }
+ }
+ }
+ },
+ "StructuredDataPlan": {
+ "type": "object",
+ "properties": {
+ "messages": {
+ "description": "These are the messages used to generate the structured data.\n\n@default: ```\n[\n {\n \"role\": \"system\",\n \"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.\"\n },\n {\n \"role\": \"user\",\n \"content\": \"Here is the transcript:\\n\\n{{transcript}}\\n\\n. Here is the ended reason of the call:\\n\\n{{endedReason}}\\n\\n\"\n }\n]```\n\nYou can customize by providing any messages you want.\n\nHere are the template variables available:\n- {{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`",
+ "type": "array",
+ "items": {
+ "type": "object"
+ }
},
- "monitorPlan": {
- "description": "This is the plan for real-time monitoring of the workflow's calls.\n\nUsage:\n- To enable live listening of the workflow's calls, set `monitorPlan.listenEnabled` to `true`.\n- To enable live control of the workflow's calls, set `monitorPlan.controlEnabled` to `true`.",
- "allOf": [
- {
- "$ref": "#/components/schemas/MonitorPlan"
- }
- ]
+ "enabled": {
+ "type": "boolean",
+ "description": "This determines whether structured data is generated and stored in `call.analysis.structuredData`. Defaults to false.\n\nUsage:\n- If you want to extract structured data, set this to true and provide a `schema`.\n\n@default false"
},
- "backgroundSpeechDenoisingPlan": {
- "description": "This enables filtering of noise and background speech while the user is talking.\n\nFeatures:\n- Smart denoising using Krisp\n- Fourier denoising\n\nBoth can be used together. Order of precedence:\n- Smart denoising\n- Fourier denoising",
+ "schema": {
+ "description": "This is the schema of the structured data. The output is stored in `call.analysis.structuredData`.\n\nComplete guide on JSON Schema can be found [here](https://ajv.js.org/json-schema.html#json-data-type).",
"allOf": [
{
- "$ref": "#/components/schemas/BackgroundSpeechDenoisingPlan"
+ "$ref": "#/components/schemas/JsonSchema"
}
]
},
- "credentialIds": {
- "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.",
- "type": "array",
- "items": {
- "type": "string"
- }
+ "timeoutSeconds": {
+ "type": "number",
+ "description": "This is how long the request is tried before giving up. When request times out, `call.analysis.structuredData` will be empty.\n\nUsage:\n- 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.\n\n@default 5 seconds",
+ "minimum": 1,
+ "maximum": 60
+ }
+ }
+ },
+ "StructuredDataMultiPlan": {
+ "type": "object",
+ "properties": {
+ "key": {
+ "type": "string",
+ "description": "This is the key of the structured data plan in the catalog."
},
- "keypadInputPlan": {
- "description": "This is the plan for keypad input handling during workflow calls.",
+ "plan": {
+ "description": "This is an individual structured data plan in the catalog.",
"allOf": [
{
- "$ref": "#/components/schemas/KeypadInputPlan"
+ "$ref": "#/components/schemas/StructuredDataPlan"
}
]
- },
- "voicemailMessage": {
- "type": "string",
- "description": "This is the message that the assistant will say if the call is forwarded to voicemail.\n\nIf unspecified, it will hang up.",
- "maxLength": 1000
}
},
"required": [
- "nodes",
- "name",
- "edges"
+ "key",
+ "plan"
]
},
- "VapiModel": {
+ "SuccessEvaluationPlan": {
"type": "object",
"properties": {
+ "rubric": {
+ "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`.\n\nOptions include:\n- 'NumericScale': A scale of 1 to 10.\n- 'DescriptiveScale': A scale of Excellent, Good, Fair, Poor.\n- 'Checklist': A checklist of criteria and their status.\n- 'Matrix': A grid that evaluates multiple criteria across different performance levels.\n- 'PercentageScale': A scale of 0% to 100%.\n- 'LikertScale': A scale of Strongly Agree, Agree, Neutral, Disagree, Strongly Disagree.\n- 'AutomaticRubric': Automatically break down evaluation into several criteria, each with its own score.\n- 'PassFail': A simple 'true' if call passed, 'false' if not.\n\nDefault is 'PassFail'."
+ },
"messages": {
- "description": "This is the starting state for the conversation.",
+ "description": "These are the messages used to generate the success evaluation.\n\n@default: ```\n[\n {\n \"role\": \"system\",\n \"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.\"\n },\n {\n \"role\": \"user\",\n \"content\": \"Here is the transcript:\\n\\n{{transcript}}\\n\\n\"\n },\n {\n \"role\": \"user\",\n \"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\"\n }\n]```\n\nYou can customize by providing any messages you want.\n\nHere are the template variables available:\n- {{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`",
"type": "array",
"items": {
- "$ref": "#/components/schemas/OpenAIMessage"
+ "type": "object"
}
},
- "tools": {
- "type": "array",
- "description": "These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/CreateApiRequestToolDTO",
- "title": "ApiRequestTool"
- },
- {
- "$ref": "#/components/schemas/CreateBashToolDTO",
- "title": "BashTool"
- },
- {
- "$ref": "#/components/schemas/CreateCodeToolDTO",
- "title": "CodeTool"
- },
- {
- "$ref": "#/components/schemas/CreateComputerToolDTO",
- "title": "ComputerTool"
- },
- {
- "$ref": "#/components/schemas/CreateDtmfToolDTO",
- "title": "DtmfTool"
- },
- {
- "$ref": "#/components/schemas/CreateEndCallToolDTO",
- "title": "EndCallTool"
- },
- {
- "$ref": "#/components/schemas/CreateFunctionToolDTO",
- "title": "FunctionTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO",
- "title": "GoHighLevelCalendarAvailabilityTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO",
- "title": "GoHighLevelCalendarEventCreateTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelContactCreateToolDTO",
- "title": "GoHighLevelContactCreateTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelContactGetToolDTO",
- "title": "GoHighLevelContactGetTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO",
- "title": "GoogleCalendarCheckAvailabilityTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoogleCalendarCreateEventToolDTO",
- "title": "GoogleCalendarCreateEventTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoogleSheetsRowAppendToolDTO",
- "title": "GoogleSheetsRowAppendTool"
- },
- {
- "$ref": "#/components/schemas/CreateHandoffToolDTO",
- "title": "HandoffTool"
- },
- {
- "$ref": "#/components/schemas/CreateMcpToolDTO",
- "title": "McpTool"
- },
- {
- "$ref": "#/components/schemas/CreateQueryToolDTO",
- "title": "QueryTool"
- },
- {
- "$ref": "#/components/schemas/CreateSlackSendMessageToolDTO",
- "title": "SlackSendMessageTool"
- },
- {
- "$ref": "#/components/schemas/CreateSmsToolDTO",
- "title": "SmsTool"
- },
- {
- "$ref": "#/components/schemas/CreateTextEditorToolDTO",
- "title": "TextEditorTool"
- },
- {
- "$ref": "#/components/schemas/CreateTransferCallToolDTO",
- "title": "TransferCallTool"
- },
- {
- "$ref": "#/components/schemas/CreateSipRequestToolDTO",
- "title": "SipRequestTool"
- },
- {
- "$ref": "#/components/schemas/CreateVoicemailToolDTO",
- "title": "VoicemailTool"
- }
- ]
- }
+ "enabled": {
+ "type": "boolean",
+ "description": "This determines whether a success evaluation is generated and stored in `call.analysis.successEvaluation`. Defaults to true.\n\nUsage:\n- If you want to disable the success evaluation, set this to false.\n\n@default true"
},
- "toolIds": {
- "description": "These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together.",
- "type": "array",
- "items": {
- "type": "string"
- }
+ "timeoutSeconds": {
+ "type": "number",
+ "description": "This is how long the request is tried before giving up. When request times out, `call.analysis.successEvaluation` will be empty.\n\nUsage:\n- 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.\n\n@default 5 seconds",
+ "minimum": 1,
+ "maximum": 60
+ }
+ }
+ },
+ "AnalysisPlan": {
+ "type": "object",
+ "properties": {
+ "minMessagesThreshold": {
+ "type": "number",
+ "description": "The minimum number of messages required to run the analysis plan.\nIf the number of messages is less than this, analysis will be skipped.\n\n@default 2",
+ "deprecated": true,
+ "minimum": 0
},
- "knowledgeBase": {
- "description": "These are the options for the knowledge base.",
- "oneOf": [
+ "summaryPlan": {
+ "description": "This is the plan for generating the summary of the call. This outputs to `call.analysis.summary`.",
+ "deprecated": true,
+ "allOf": [
{
- "$ref": "#/components/schemas/CreateCustomKnowledgeBaseDTO",
- "title": "Custom"
+ "$ref": "#/components/schemas/SummaryPlan"
}
]
},
- "provider": {
- "type": "string",
- "enum": [
- "vapi"
+ "structuredDataPlan": {
+ "description": "This is the plan for generating the structured data from the call. This outputs to `call.analysis.structuredData`.",
+ "deprecated": true,
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/StructuredDataPlan"
+ }
]
},
- "workflowId": {
- "type": "string",
- "description": "This is the workflow that will be used for the call. To use a transient workflow, use `workflow` instead."
+ "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`.",
+ "deprecated": true,
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/StructuredDataMultiPlan"
+ }
},
- "workflow": {
- "description": "This is the workflow that will be used for the call. To use an existing workflow, use `workflowId` instead.",
+ "successEvaluationPlan": {
+ "description": "This is the plan for generating the success evaluation of the call. This outputs to `call.analysis.successEvaluation`.",
+ "deprecated": true,
"allOf": [
{
- "$ref": "#/components/schemas/WorkflowUserEditable"
+ "$ref": "#/components/schemas/SuccessEvaluationPlan"
}
]
},
- "model": {
- "type": "string",
- "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b"
- },
- "temperature": {
- "type": "number",
- "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.",
- "minimum": 0,
- "maximum": 2
+ "outcomeIds": {
+ "description": "This is an array of outcome UUIDs to be calculated during analysis.\nThe outcomes will be calculated and stored in `call.analysis.outcomes`.",
+ "deprecated": true,
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "TranscriptPlan": {
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "type": "boolean",
+ "description": "This determines whether the transcript is stored in `call.artifact.transcript`. Defaults to true.\n\n@default true",
+ "example": true
},
- "maxTokens": {
- "type": "number",
- "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.",
- "minimum": 50,
- "maximum": 10000
+ "assistantName": {
+ "type": "string",
+ "description": "This is the name of the assistant in the transcript. Defaults to 'AI'.\n\nUsage:\n- 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':\n```\nUser: Hello, how are you?\nBuyer: I'm fine.\nUser: Do you want to buy a car?\nBuyer: No.\n```\n\n@default 'AI'"
},
- "emotionRecognitionEnabled": {
+ "userName": {
+ "type": "string",
+ "description": "This is the name of the user in the transcript. Defaults to 'User'.\n\nUsage:\n- 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':\n```\nSeller: Hello, how are you?\nAI: I'm fine.\nSeller: Do you want to buy a car?\nAI: No.\n```\n\n@default 'User'"
+ }
+ }
+ },
+ "ComplianceOverride": {
+ "type": "object",
+ "properties": {
+ "forceStoreOnHipaaEnabled": {
"type": "boolean",
- "description": "This determines whether we detect user's emotion while they speak and send it as an additional info to model.\n\nDefault `false` because the model is usually are good at understanding the user's emotion from text.\n\n@default false"
- },
- "numFastTurns": {
- "type": "number",
- "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.\n\nDefault is 0.\n\n@default 0",
- "minimum": 0
+ "description": "Force storage for this output under HIPAA. Only enable if output contains no sensitive data.",
+ "example": false
}
- },
- "required": [
- "provider",
- "model"
- ]
+ }
},
- "XaiModel": {
+ "CreateStructuredOutputDTO": {
"type": "object",
"properties": {
- "messages": {
- "description": "This is the starting state for the conversation.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/OpenAIMessage"
- }
- },
- "tools": {
- "type": "array",
- "description": "These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/CreateApiRequestToolDTO",
- "title": "ApiRequestTool"
- },
- {
- "$ref": "#/components/schemas/CreateBashToolDTO",
- "title": "BashTool"
- },
- {
- "$ref": "#/components/schemas/CreateCodeToolDTO",
- "title": "CodeTool"
- },
- {
- "$ref": "#/components/schemas/CreateComputerToolDTO",
- "title": "ComputerTool"
- },
- {
- "$ref": "#/components/schemas/CreateDtmfToolDTO",
- "title": "DtmfTool"
- },
- {
- "$ref": "#/components/schemas/CreateEndCallToolDTO",
- "title": "EndCallTool"
- },
- {
- "$ref": "#/components/schemas/CreateFunctionToolDTO",
- "title": "FunctionTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO",
- "title": "GoHighLevelCalendarAvailabilityTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO",
- "title": "GoHighLevelCalendarEventCreateTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelContactCreateToolDTO",
- "title": "GoHighLevelContactCreateTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelContactGetToolDTO",
- "title": "GoHighLevelContactGetTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO",
- "title": "GoogleCalendarCheckAvailabilityTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoogleCalendarCreateEventToolDTO",
- "title": "GoogleCalendarCreateEventTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoogleSheetsRowAppendToolDTO",
- "title": "GoogleSheetsRowAppendTool"
- },
- {
- "$ref": "#/components/schemas/CreateHandoffToolDTO",
- "title": "HandoffTool"
- },
- {
- "$ref": "#/components/schemas/CreateMcpToolDTO",
- "title": "McpTool"
- },
- {
- "$ref": "#/components/schemas/CreateQueryToolDTO",
- "title": "QueryTool"
- },
- {
- "$ref": "#/components/schemas/CreateSlackSendMessageToolDTO",
- "title": "SlackSendMessageTool"
- },
- {
- "$ref": "#/components/schemas/CreateSmsToolDTO",
- "title": "SmsTool"
- },
- {
- "$ref": "#/components/schemas/CreateTextEditorToolDTO",
- "title": "TextEditorTool"
- },
- {
- "$ref": "#/components/schemas/CreateTransferCallToolDTO",
- "title": "TransferCallTool"
- },
- {
- "$ref": "#/components/schemas/CreateSipRequestToolDTO",
- "title": "SipRequestTool"
- },
- {
- "$ref": "#/components/schemas/CreateVoicemailToolDTO",
- "title": "VoicemailTool"
- }
- ]
- }
+ "type": {
+ "type": "string",
+ "description": "This is the type of structured output.\n\n- 'ai': Uses an LLM to extract structured data from the conversation (default).\n- 'regex': Uses a regex pattern to extract data from the transcript without an LLM.\n\nDefaults to 'ai' if not specified.",
+ "enum": [
+ "ai",
+ "regex"
+ ],
+ "default": "ai"
},
- "toolIds": {
- "description": "These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together.",
- "type": "array",
- "items": {
- "type": "string"
- }
+ "regex": {
+ "type": "string",
+ "description": "This is the regex pattern to match against the transcript.\n\nOnly used when type is 'regex'. Supports both raw patterns (e.g. '\\d+') and\nregex literal format (e.g. '/\\d+/gi'). Uses RE2 syntax for safety.\n\nThe result depends on the schema type:\n- boolean: true if the pattern matches, false otherwise\n- string: the first match or first capture group\n- number/integer: the first match parsed as a number\n- array: all matches",
+ "minLength": 1,
+ "maxLength": 1000
},
- "knowledgeBase": {
- "description": "These are the options for the knowledge base.",
+ "model": {
+ "description": "This is the model that will be used to extract the structured output.\n\nTo 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.\nBetween the system or user messages, you must reference either 'transcript' or 'messages' with the `{{}}` syntax to access the conversation history.\nBetween the system or user messages, you must reference a variation of the structured output with the `{{}}` syntax to access the structured output definition.\ni.e.:\n`{{structuredOutput}}`\n`{{structuredOutput.name}}`\n`{{structuredOutput.description}}`\n`{{structuredOutput.schema}}`\n\nIf model is not specified, GPT-4.1 will be used by default for extraction, utilizing default system and user prompts.\nIf messages or required fields are not specified, the default system and user prompts will be used.",
"oneOf": [
{
- "$ref": "#/components/schemas/CreateCustomKnowledgeBaseDTO",
- "title": "Custom"
+ "$ref": "#/components/schemas/WorkflowOpenAIModel",
+ "title": "WorkflowOpenAIModel"
+ },
+ {
+ "$ref": "#/components/schemas/WorkflowAnthropicModel",
+ "title": "WorkflowAnthropicModel"
+ },
+ {
+ "$ref": "#/components/schemas/WorkflowAnthropicBedrockModel",
+ "title": "WorkflowAnthropicBedrockModel"
+ },
+ {
+ "$ref": "#/components/schemas/WorkflowGoogleModel",
+ "title": "WorkflowGoogleModel"
+ },
+ {
+ "$ref": "#/components/schemas/WorkflowCustomModel",
+ "title": "WorkflowCustomModel"
}
]
},
- "model": {
- "type": "string",
- "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b",
- "enum": [
- "grok-beta",
- "grok-2",
- "grok-3",
- "grok-4-fast-reasoning",
- "grok-4-fast-non-reasoning"
+ "compliancePlan": {
+ "description": "Compliance configuration for this output. Only enable overrides if no sensitive data will be stored.",
+ "example": {
+ "forceStoreOnHipaaEnabled": false
+ },
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ComplianceOverride"
+ }
]
},
- "provider": {
+ "name": {
"type": "string",
- "enum": [
- "xai"
- ]
+ "description": "This is the name of the structured output.",
+ "minLength": 1,
+ "maxLength": 40
},
- "temperature": {
- "type": "number",
- "description": "This is the temperature that will be used for calls. Default is 0 to leverage caching for lower latency.",
- "minimum": 0,
- "maximum": 2
+ "schema": {
+ "description": "This is the JSON Schema definition for the structured output.\n\nThis 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:\n- Objects and nested properties\n- Arrays and array validation\n- String, number, boolean, and null types\n- Enums and const values\n- Validation constraints (min/max, patterns, etc.)\n- Composition with allOf, anyOf, oneOf",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/JsonSchema"
+ }
+ ]
},
- "maxTokens": {
- "type": "number",
- "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.",
- "minimum": 50,
- "maximum": 10000
+ "description": {
+ "type": "string",
+ "description": "This is the description of what the structured output extracts.\n\nUse this to provide context about what data will be extracted and how it will be used."
},
- "emotionRecognitionEnabled": {
- "type": "boolean",
- "description": "This determines whether we detect user's emotion while they speak and send it as an additional info to model.\n\nDefault `false` because the model is usually are good at understanding the user's emotion from text.\n\n@default false"
+ "assistantIds": {
+ "description": "These are the assistant IDs that this structured output is linked to.\n\nWhen linked to assistants, this structured output will be available for extraction during those assistant's calls.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
},
- "numFastTurns": {
- "type": "number",
- "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.\n\nDefault is 0.\n\n@default 0",
- "minimum": 0
+ "workflowIds": {
+ "description": "These are the workflow IDs that this structured output is linked to.\n\nWhen linked to workflows, this structured output will be available for extraction during those workflow's execution.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
}
},
"required": [
- "model",
- "provider"
+ "name",
+ "schema"
]
},
- "ExactReplacement": {
+ "NumberComparatorScorecardMetricCondition": {
"type": "object",
"properties": {
"type": {
"type": "string",
- "description": "This is the exact replacement type. You can use this to replace a specific word or phrase with a different word or phrase.\n\nUsage:\n- Replace \"hello\" with \"hi\": { type: 'exact', key: 'hello', value: 'hi' }\n- Replace \"good morning\" with \"good day\": { type: 'exact', key: 'good morning', value: 'good day' }\n- Replace a specific name: { type: 'exact', key: 'John Doe', value: 'Jane Smith' }\n- Replace an acronym: { type: 'exact', key: 'AI', value: 'Artificial Intelligence' }\n- Replace a company name with its phonetic pronunciation: { type: 'exact', key: 'Vapi', value: 'Vappy' }",
+ "description": "This is the type of the condition. Currently only 'comparator' is supported.",
"enum": [
- "exact"
+ "comparator"
]
},
- "replaceAllEnabled": {
- "type": "boolean",
- "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.\nExamples:\n- For { type: 'exact', key: 'hello', value: 'hi', replaceAllEnabled: false }. Before: \"hello world, hello universe\" | After: \"hi world, hello universe\"\n- For { type: 'exact', key: 'hello', value: 'hi', replaceAllEnabled: true }. Before: \"hello world, hello universe\" | After: \"hi world, hi universe\"\n@default false",
- "default": false
- },
- "key": {
+ "comparator": {
"type": "string",
- "description": "This is the key to replace."
+ "description": "This is the comparator that will be used to compare the result of the structured output with the value specified.\nOnly '=', '!=', '>', '<', '>=', and '<=' are supported for number conditions\nOnly '=' is supported for boolean conditions.",
+ "enum": [
+ "=",
+ "!=",
+ ">",
+ "<",
+ ">=",
+ "<="
+ ]
},
"value": {
- "type": "string",
- "description": "This is the value that will replace the match.",
- "maxLength": 1000
+ "type": "number",
+ "description": "This is the value that will be used to compare the result of the structured output with the comparator.\nIf the result of the comparison is true, the points will be added to the overall score."
+ },
+ "points": {
+ "type": "number",
+ "description": "These are the points that will be added to the overall score if the condition is met.\nThe points must be between 0 and 100.",
+ "minimum": 0,
+ "maximum": 100
}
},
"required": [
"type",
- "key",
- "value"
+ "comparator",
+ "value",
+ "points"
]
},
- "RegexReplacement": {
+ "BooleanComparatorScorecardMetricCondition": {
"type": "object",
"properties": {
"type": {
"type": "string",
- "description": "This is the regex replacement type. You can use this to replace a word or phrase that matches a pattern.\n\nUsage:\n- Replace all numbers with \"some number\": { type: 'regex', regex: '\\\\d+', value: 'some number' }\n- 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]' }\n- Replace phone numbers with a formatted version: { type: 'regex', regex: '(\\\\d{3})(\\\\d{3})(\\\\d{4})', value: '($1) $2-$3' }\n- Replace all instances of \"color\" or \"colour\" with \"hue\": { type: 'regex', regex: 'colou?r', value: 'hue' }\n- Capitalize the first letter of every sentence: { type: 'regex', regex: '(?<=\\\\. |^)[a-z]', value: (match) => match.toUpperCase() }",
+ "description": "This is the type of the condition. Currently only 'comparator' is supported.",
"enum": [
- "regex"
+ "comparator"
]
},
- "regex": {
+ "comparator": {
"type": "string",
- "description": "This is the regex pattern to replace.\n\nNote:\n- This works by using the `string.replace` method in Node.JS. Eg. `\"hello there\".replace(/hello/g, \"hi\")` will return `\"hi there\"`.\n\nHot tip:\n- In JavaScript, escape `\\` when sending the regex pattern. Eg. `\"hello\\sthere\"` will be sent over the wire as `\"hellosthere\"`. Send `\"hello\\\\sthere\"` instead."
- },
- "options": {
- "description": "These are the options for the regex replacement. Defaults to all disabled.\n\n@default []",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/RegexOption"
- }
+ "description": "The comparator can only be '=' for boolean conditions.",
+ "enum": [
+ "="
+ ]
},
"value": {
- "type": "string",
- "description": "This is the value that will replace the match.",
- "maxLength": 1000
+ "type": "boolean",
+ "description": "This is the value that will be used to compare the result of the structured output with the comparator.\nIf the result of the comparison is true, the points will be added to the overall score."
+ },
+ "points": {
+ "type": "number",
+ "description": "These are the points that will be added to the overall score if the condition is met.\nThe points must be between 0 and 100.",
+ "minimum": 0,
+ "maximum": 100
}
},
"required": [
"type",
- "regex",
- "value"
+ "comparator",
+ "value",
+ "points"
]
},
- "FormatPlan": {
+ "ScorecardMetric": {
"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`.\n\nUsage:\n- To rely on the voice provider's formatting logic, set this to `false`.\n\nIf `voice.chunkPlan.enabled` is `false`, this is automatically `false` since there's no chunk to format.\n\n@default true",
- "example": true
- },
- "numberToDigitsCutoff": {
- "type": "number",
- "description": "This is the cutoff after which a number is converted to individual digits instead of being spoken as words.\n\nExample:\n- If cutoff 2025, \"12345\" is converted to \"1 2 3 4 5\" while \"1200\" is converted to \"twelve hundred\".\n\nUsage:\n- If your use case doesn't involve IDs like zip codes, set this to a high value.\n- If your use case involves IDs that are shorter than 5 digits, set this to a lower value.\n\n@default 2025",
- "minimum": 0,
- "example": 2025
- },
- "replacements": {
+ "conditions": {
"type": "array",
- "description": "These are the custom replacements you can make to the chunk before it is sent to the voice provider.\n\nUsage:\n- To replace a specific word or phrase with a different word or phrase, use the `ExactReplacement` type. Eg. `{ type: 'exact', key: 'hello', value: 'hi' }`\n- 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' }`\n\n@default []",
+ "description": "These are the conditions that will be used to evaluate the scorecard.\nEach condition will have a comparator, value, and points that will be used to calculate the final score.\nThe points will be added to the overall score if the condition is met.\nThe overall score will be normalized to a 100 point scale to ensure uniformity across different scorecards.",
"items": {
"oneOf": [
{
- "$ref": "#/components/schemas/ExactReplacement",
- "title": "ExactReplacement"
+ "$ref": "#/components/schemas/NumberComparatorScorecardMetricCondition",
+ "title": "NumberComparatorScorecardMetricCondition"
},
{
- "$ref": "#/components/schemas/RegexReplacement",
- "title": "RegexReplacement"
+ "$ref": "#/components/schemas/BooleanComparatorScorecardMetricCondition",
+ "title": "BooleanComparatorScorecardMetricCondition"
}
]
}
},
- "formattersEnabled": {
- "type": "array",
- "description": "List of formatters to apply. If not provided, all default formatters will be applied.\nIf provided, only the specified formatters will be applied.\nNote: Some essential formatters like angle bracket removal will always be applied.\n@default undefined",
- "enum": [
- "markdown",
- "asterisk",
- "quote",
- "dash",
- "newline",
- "colon",
- "acronym",
- "dollarAmount",
- "email",
- "date",
- "time",
- "distance",
- "unit",
- "percentage",
- "phoneNumber",
- "number",
- "stripAsterisk"
- ],
- "items": {
- "type": "string",
- "enum": [
- "markdown",
- "asterisk",
- "quote",
- "dash",
- "newline",
- "colon",
- "acronym",
- "dollarAmount",
- "email",
- "date",
- "time",
- "distance",
- "unit",
- "percentage",
- "phoneNumber",
- "number",
- "stripAsterisk"
- ]
- }
+ "structuredOutputId": {
+ "type": "string",
+ "description": "This is the unique identifier for the structured output that will be used to evaluate the scorecard.\nThe structured output must be of type number or boolean only for now."
}
- }
+ },
+ "required": [
+ "conditions",
+ "structuredOutputId"
+ ]
},
- "ChunkPlan": {
+ "CreateScorecardDTO": {
"type": "object",
"properties": {
- "enabled": {
- "type": "boolean",
- "description": "This determines whether the model output is chunked before being sent to the voice provider. Default `true`.\n\nUsage:\n- To rely on the voice provider's audio generation logic, set this to `false`.\n- If seeing issues with quality, set this to `true`.\n\nIf disabled, Vapi-provided audio control tokens like will not work.\n\n@default true",
- "example": true
+ "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.",
+ "maxLength": 80
},
- "minCharacters": {
- "type": "number",
- "description": "This is the minimum number of characters in a chunk.\n\nUsage:\n- To increase quality, set this to a higher value.\n- To decrease latency, set this to a lower value.\n\n@default 30",
- "minimum": 1,
- "maximum": 80,
- "example": 30
+ "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.",
+ "maxLength": 500
},
- "punctuationBoundaries": {
+ "metrics": {
+ "description": "These are the metrics that will be used to evaluate the scorecard.\nEach metric will have a set of conditions and points that will be used to generate the score.",
"type": "array",
- "description": "These are the punctuations that are considered valid boundaries for a chunk to be created.\n\nUsage:\n- To increase quality, constrain to fewer boundaries.\n- To decrease latency, enable all.\n\nDefault is automatically set to balance the trade-off between quality and latency based on the provider.",
- "enum": [
- "。",
- ",",
- ".",
- "!",
- "?",
- ";",
- ")",
- "،",
- "۔",
- "।",
- "॥",
- "|",
- "||",
- ",",
- ":"
- ],
- "example": [
- "。",
- ",",
- ".",
- "!",
- "?",
- ";",
- "،",
- "۔",
- "।",
- "॥",
- "|",
- "||",
- ",",
- ":"
- ],
"items": {
- "type": "string",
- "enum": [
- "。",
- ",",
- ".",
- "!",
- "?",
- ";",
- ")",
- "،",
- "۔",
- "।",
- "॥",
- "|",
- "||",
- ",",
- ":"
- ]
+ "$ref": "#/components/schemas/ScorecardMetric"
}
},
- "formatPlan": {
- "description": "This is the plan for formatting the chunk before it is sent to the voice provider.",
- "allOf": [
- {
- "$ref": "#/components/schemas/FormatPlan"
- }
- ]
- }
- }
- },
- "FallbackPlan": {
- "type": "object",
- "properties": {
- "voices": {
+ "assistantIds": {
+ "description": "These are the assistant IDs that this scorecard is linked to.\nWhen linked to assistants, this scorecard will be available for evaluation during those assistants' calls.",
"type": "array",
- "description": "This is the list of voices to fallback to in the event that the primary voice provider fails.",
"items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/FallbackAzureVoice",
- "title": "Azure"
- },
- {
- "$ref": "#/components/schemas/FallbackCartesiaVoice",
- "title": "Cartesia"
- },
- {
- "$ref": "#/components/schemas/FallbackHumeVoice",
- "title": "Hume"
- },
- {
- "$ref": "#/components/schemas/FallbackCustomVoice",
- "title": "CustomVoice"
- },
- {
- "$ref": "#/components/schemas/FallbackDeepgramVoice",
- "title": "Deepgram"
- },
- {
- "$ref": "#/components/schemas/FallbackElevenLabsVoice",
- "title": "ElevenLabs"
- },
- {
- "$ref": "#/components/schemas/FallbackVapiVoice",
- "title": "Vapi"
- },
- {
- "$ref": "#/components/schemas/FallbackLMNTVoice",
- "title": "LMNT"
- },
- {
- "$ref": "#/components/schemas/FallbackOpenAIVoice",
- "title": "OpenAI"
- },
- {
- "$ref": "#/components/schemas/FallbackPlayHTVoice",
- "title": "PlayHT"
- },
- {
- "$ref": "#/components/schemas/FallbackWellSaidVoice",
- "title": "WellSaid"
- },
- {
- "$ref": "#/components/schemas/FallbackRimeAIVoice",
- "title": "RimeAI"
- },
- {
- "$ref": "#/components/schemas/FallbackSmallestAIVoice",
- "title": "Smallest AI"
- },
- {
- "$ref": "#/components/schemas/FallbackTavusVoice",
- "title": "TavusVoice"
- },
- {
- "$ref": "#/components/schemas/FallbackNeuphonicVoice",
- "title": "Neuphonic"
- },
- {
- "$ref": "#/components/schemas/FallbackSesameVoice",
- "title": "Sesame"
- },
- {
- "$ref": "#/components/schemas/FallbackInworldVoice",
- "title": "Inworld"
- }
- ]
+ "type": "string"
}
}
},
"required": [
- "voices"
+ "metrics"
]
},
- "AzureVoice": {
+ "ArtifactPlan": {
"type": "object",
"properties": {
- "cachingEnabled": {
+ "recordingEnabled": {
"type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
+ "description": "This determines whether assistant's calls are recorded. Defaults to true.\n\nUsage:\n- If you don't want to record the calls, set this to false.\n- 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.\n\nYou can find the recording at `call.artifact.recordingUrl` and `call.artifact.stereoRecordingUrl` after the call is ended.\n\n@default true",
+ "example": true
},
- "provider": {
+ "recordingFormat": {
"type": "string",
- "description": "This is the voice provider that will be used.",
+ "description": "This determines the format of the recording. Defaults to `wav;l16`.\n\n@default 'wav;l16'",
"enum": [
- "azure"
+ "wav;l16",
+ "mp3"
]
},
- "voiceId": {
- "description": "This is the provider-specific ID that will be used.",
- "oneOf": [
- {
- "type": "string",
- "enum": [
- "andrew",
- "brian",
- "emma"
- ],
- "title": "Preset Voice Options"
- },
- {
- "type": "string",
- "title": "Azure Voice ID"
- }
- ]
+ "recordingUseCustomStorageEnabled": {
+ "type": "boolean",
+ "description": "This determines whether to use custom storage (S3 or GCP) for call recordings when storage credentials are configured.\n\nWhen set to false, recordings will be stored on Vapi's storage instead of your custom storage, even if you have custom storage credentials configured.\n\nUsage:\n- Set to false if you have custom storage configured but want to store recordings on Vapi's storage for this assistant.\n- Set to true (or leave unset) to use your custom storage for recordings when available.\n\n@default true",
+ "example": true
},
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
- {
- "$ref": "#/components/schemas/ChunkPlan"
- }
- ]
+ "videoRecordingEnabled": {
+ "type": "boolean",
+ "description": "This determines whether the video is recorded during the call. Defaults to false. Only relevant for `webCall` type.\n\nYou can find the video recording at `call.artifact.videoRecordingUrl` after the call is ended.\n\n@default false",
+ "example": false
},
- "speed": {
- "type": "number",
- "description": "This is the speed multiplier that will be used.",
- "minimum": 0.5,
- "maximum": 2
+ "fullMessageHistoryEnabled": {
+ "type": "boolean",
+ "description": "This determines whether the artifact contains the full message history, even after handoff context engineering. Defaults to false.",
+ "example": false
},
- "fallbackPlan": {
- "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
- "allOf": [
- {
- "$ref": "#/components/schemas/FallbackPlan"
- }
- ]
- }
- },
- "required": [
- "provider",
- "voiceId"
- ]
- },
- "CartesiaExperimentalControls": {
- "type": "object",
- "properties": {
- "speed": {
- "oneOf": [
- {
- "type": "string",
- "enum": [
- "slowest",
- "slow",
- "normal",
- "fast",
- "fastest"
- ],
- "example": "normal"
- },
- {
- "type": "number",
- "minimum": -1,
- "maximum": 1,
- "example": 0.5
- }
- ]
+ "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`.\n\nYou can find the packet capture at `call.artifact.pcapUrl` after the call is ended.\n\n@default true",
+ "example": true
},
- "emotion": {
+ "pcapS3PathPrefix": {
"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"
- ],
- "example": [
- "happiness:high"
- ]
- }
- }
- },
- "CartesiaGenerationConfigExperimental": {
- "type": "object",
- "properties": {
- "accentLocalization": {
- "type": "integer",
- "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.",
- "example": 0,
- "minimum": 0,
- "maximum": 1,
- "default": 0
- }
- }
- },
- "CartesiaGenerationConfig": {
- "type": "object",
- "properties": {
- "speed": {
- "type": "number",
- "description": "Fine-grained speed control for sonic-3. Only available for sonic-3 model.",
- "example": 1,
- "minimum": 0.6,
- "maximum": 1.5,
- "default": 1
+ "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.\n\nIf credential.s3PathPrefix or credential.bucketPlan.path is set, this will append to it.\n\nUsage:\n- If you want to upload the packet capture to a specific path, set this to the path. Example: `/my-assistant-captures`.\n- If you want to upload the packet capture to the root of the bucket, set this to `/`.\n\n@default '/'",
+ "example": "/pcaps"
},
- "volume": {
- "type": "number",
- "description": "Fine-grained volume control for sonic-3. Only available for sonic-3 model.",
- "example": 1,
- "minimum": 0.5,
- "maximum": 2,
- "default": 1
+ "pcapUseCustomStorageEnabled": {
+ "type": "boolean",
+ "description": "This determines whether to use custom storage (S3 or GCP) for SIP packet captures when storage credentials are configured.\n\nWhen 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.\n\nUsage:\n- Set to false if you have custom storage configured but want to store packet captures on Vapi's storage for this assistant.\n- Set to true (or leave unset) to use your custom storage for packet captures when available.\n\n@default true",
+ "example": true
},
- "experimental": {
- "description": "Experimental model controls for sonic-3. These are subject to breaking changes.",
+ "loggingEnabled": {
+ "type": "boolean",
+ "description": "This determines whether the call logs are enabled. Defaults to true.\n\n@default true",
+ "example": true
+ },
+ "loggingUseCustomStorageEnabled": {
+ "type": "boolean",
+ "description": "This determines whether to use custom storage (S3 or GCP) for call logs when storage credentials are configured.\n\nWhen set to false, logs will be stored on Vapi's storage instead of your custom storage, even if you have custom storage credentials configured.\n\nUsage:\n- Set to false if you have custom storage configured but want to store logs on Vapi's storage for this assistant.\n- Set to true (or leave unset) to use your custom storage for logs when available.\n\n@default true",
+ "example": true
+ },
+ "transcriptPlan": {
+ "description": "This is the plan for `call.artifact.transcript`. To disable, set `transcriptPlan.enabled` to false.",
"allOf": [
{
- "$ref": "#/components/schemas/CartesiaGenerationConfigExperimental"
+ "$ref": "#/components/schemas/TranscriptPlan"
}
]
+ },
+ "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.\n\nIf credential.s3PathPrefix or credential.bucketPlan.path is set, this will append to it.\n\nUsage:\n- If you want to upload the recording to a specific path, set this to the path. Example: `/my-assistant-recordings`.\n- If you want to upload the recording to the root of the bucket, set this to `/`.\n\n@default '/'"
+ },
+ "structuredOutputIds": {
+ "description": "This is an array of structured output IDs to be calculated during the call.\nThe outputs will be extracted and stored in `call.artifact.structuredOutputs` after the call is ended.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "structuredOutputs": {
+ "description": "This is an array of transient structured outputs to be calculated during the call.\nThe outputs will be extracted and stored in `call.artifact.structuredOutputs` after the call is ended.\nUse this to provide inline structured output configurations instead of referencing existing ones via structuredOutputIds.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CreateStructuredOutputDTO"
+ }
+ },
+ "scorecardIds": {
+ "description": "This is an array of scorecard IDs that will be evaluated based on the structured outputs extracted during the call.\nThe scorecards will be evaluated and the results will be stored in `call.artifact.scorecards` after the call has ended.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "scorecards": {
+ "description": "This is the array of scorecards that will be evaluated based on the structured outputs extracted during the call.\nThe scorecards will be evaluated and the results will be stored in `call.artifact.scorecards` after the call has ended.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CreateScorecardDTO"
+ }
+ },
+ "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.\n\nIf credential.s3PathPrefix or credential.bucketPlan.path is set, this will append to it.\n\nUsage:\n- If you want to upload the call logs to a specific path, set this to the path. Example: `/my-assistant-logs`.\n- If you want to upload the call logs to the root of the bucket, set this to `/`.\n\n@default '/'"
}
}
},
- "CartesiaVoice": {
+ "StopSpeakingPlan": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
+ "numWords": {
+ "type": "number",
+ "description": "This is the number of words that the customer has to say before the assistant will stop talking.\n\nWords like \"stop\", \"actually\", \"no\", etc. will always interrupt immediately regardless of this value.\n\nWords like \"okay\", \"yeah\", \"right\" will never interrupt.\n\nWhen set to 0, `voiceSeconds` is used in addition to the transcriptions to determine the customer has started speaking.\n\nDefaults to 0.\n\n@default 0",
+ "minimum": 0,
+ "maximum": 10,
+ "example": 0
},
- "provider": {
- "type": "string",
- "description": "This is the voice provider that will be used.",
- "enum": [
- "cartesia"
- ]
+ "voiceSeconds": {
+ "type": "number",
+ "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.\n\nConsiderations:\n- A lower value might be more responsive but could potentially pick up non-speech sounds.\n- A higher value reduces false positives but might slightly delay the detection of speech onset.\n\nThis is only used if `numWords` is set to 0.\n\nDefaults to 0.2\n\n@default 0.2",
+ "minimum": 0,
+ "maximum": 0.5,
+ "example": 0.2
},
- "voiceId": {
- "type": "string",
- "description": "The ID of the particular voice you want to use."
+ "backoffSeconds": {
+ "type": "number",
+ "description": "This is the seconds to wait before the assistant will start talking again after being interrupted.\n\nDefaults to 1.\n\n@default 1",
+ "minimum": 0,
+ "maximum": 10,
+ "example": 1
},
- "model": {
- "type": "string",
- "description": "This is the model that will be used. This is optional and will default to the correct model for the voiceId.",
- "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"
+ "acknowledgementPhrases": {
+ "description": "These are the phrases that will never interrupt the assistant, even if numWords threshold is met.\nThese are typically acknowledgement or backchanneling phrases.",
+ "example": [
+ "i understand",
+ "i see",
+ "i got it",
+ "i hear you",
+ "im listening",
+ "im with you",
+ "right",
+ "okay",
+ "ok",
+ "sure",
+ "alright",
+ "got it",
+ "understood",
+ "yeah",
+ "yes",
+ "uh-huh",
+ "mm-hmm",
+ "gotcha",
+ "mhmm",
+ "ah",
+ "yeah okay",
+ "yeah sure"
],
- "example": "sonic-english"
- },
- "language": {
- "type": "string",
- "description": "This is the language that will be used. This is optional and will default to the correct language for the voiceId.",
- "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"
+ "default": [
+ "i understand",
+ "i see",
+ "i got it",
+ "i hear you",
+ "im listening",
+ "im with you",
+ "right",
+ "okay",
+ "ok",
+ "sure",
+ "alright",
+ "got it",
+ "understood",
+ "yeah",
+ "yes",
+ "uh-huh",
+ "mm-hmm",
+ "gotcha",
+ "mhmm",
+ "ah",
+ "yeah okay",
+ "yeah sure"
],
- "example": "en"
- },
- "experimentalControls": {
- "description": "Experimental controls for Cartesia voice generation",
- "allOf": [
- {
- "$ref": "#/components/schemas/CartesiaExperimentalControls"
- }
- ]
- },
- "generationConfig": {
- "description": "Generation config for fine-grained control of sonic-3 voice output (speed, volume, and experimental controls). Only available for sonic-3 model.",
- "allOf": [
- {
- "$ref": "#/components/schemas/CartesiaGenerationConfig"
- }
- ]
- },
- "pronunciationDictId": {
- "type": "string",
- "description": "Pronunciation dictionary ID for sonic-3. Allows custom pronunciations for specific words. Only available for sonic-3 model.",
- "example": "dict_abc123"
- },
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
- {
- "$ref": "#/components/schemas/ChunkPlan"
- }
- ]
+ "type": "array",
+ "items": {
+ "type": "string",
+ "maxLength": 240
+ }
},
- "fallbackPlan": {
- "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
- "allOf": [
- {
- "$ref": "#/components/schemas/FallbackPlan"
- }
- ]
+ "interruptionPhrases": {
+ "description": "These are the phrases that will always interrupt the assistant immediately, regardless of numWords.\nThese are typically phrases indicating disagreement or desire to stop.",
+ "example": [
+ "stop",
+ "shut",
+ "up",
+ "enough",
+ "quiet",
+ "silence",
+ "but",
+ "dont",
+ "not",
+ "no",
+ "hold",
+ "wait",
+ "cut",
+ "pause",
+ "nope",
+ "nah",
+ "nevermind",
+ "never",
+ "bad",
+ "actually"
+ ],
+ "default": [
+ "stop",
+ "shut",
+ "up",
+ "enough",
+ "quiet",
+ "silence",
+ "but",
+ "dont",
+ "not",
+ "no",
+ "hold",
+ "wait",
+ "cut",
+ "pause",
+ "nope",
+ "nah",
+ "nevermind",
+ "never",
+ "bad",
+ "actually"
+ ],
+ "type": "array",
+ "items": {
+ "type": "string",
+ "maxLength": 240
+ }
}
- },
- "required": [
- "provider",
- "voiceId"
- ]
+ }
},
- "CustomVoice": {
+ "MonitorPlan": {
"type": "object",
"properties": {
- "cachingEnabled": {
+ "listenEnabled": {
"type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
- "provider": {
- "type": "string",
- "description": "This is the voice provider that will be used. Use `custom-voice` for providers that are not natively supported.",
- "enum": [
- "custom-voice"
- ]
+ "description": "This determines whether the assistant's calls allow live listening. Defaults to true.\n\nFetch `call.monitor.listenUrl` to get the live listening URL.\n\n@default true",
+ "example": false
},
- "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."
+ "listenAuthenticationEnabled": {
+ "type": "boolean",
+ "description": "This enables authentication on the `call.monitor.listenUrl`.\n\nIf `listenAuthenticationEnabled` is `true`, the `call.monitor.listenUrl` will require an `Authorization: Bearer ` header.\n\n@default false",
+ "example": false
},
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
- {
- "$ref": "#/components/schemas/ChunkPlan"
- }
- ]
+ "controlEnabled": {
+ "type": "boolean",
+ "description": "This determines whether the assistant's calls allow live control. Defaults to true.\n\nFetch `call.monitor.controlUrl` to get the live control URL.\n\nTo 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\n\n@default true",
+ "example": false
},
- "server": {
- "description": "This is where the voice request will be sent.\n\nRequest Example:\n\nPOST https://{server.url}\nContent-Type: application/json\n\n{\n \"message\": {\n \"type\": \"voice-request\",\n \"text\": \"Hello, world!\",\n \"sampleRate\": 24000,\n ...other metadata about the call...\n }\n}\n\nResponse 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:\n```\nresponse.on('data', (chunk: Buffer) => {\n outputStream.write(chunk);\n});\n```",
- "allOf": [
- {
- "$ref": "#/components/schemas/Server"
- }
- ]
+ "controlAuthenticationEnabled": {
+ "type": "boolean",
+ "description": "This enables authentication on the `call.monitor.controlUrl`.\n\nIf `controlAuthenticationEnabled` is `true`, the `call.monitor.controlUrl` will require an `Authorization: Bearer ` header.\n\n@default false",
+ "example": false
},
- "fallbackPlan": {
- "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
- "allOf": [
- {
- "$ref": "#/components/schemas/FallbackPlan"
- }
- ]
+ "monitorIds": {
+ "description": "This the set of monitor ids that are attached to the assistant.\nThe source of truth for the monitor ids is the assistant_monitor join table.\nThis field can be used for transient assistants and to update assistants with new monitor ids.\n\n@default []",
+ "example": [
+ "123e4567-e89b-12d3-a456-426614174000"
+ ],
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
}
- },
- "required": [
- "provider",
- "server"
- ]
+ }
},
- "DeepgramVoice": {
+ "KeypadInputPlan": {
"type": "object",
"properties": {
- "cachingEnabled": {
+ "enabled": {
"type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
- "provider": {
- "type": "string",
- "description": "This is the voice provider that will be used.",
- "enum": [
- "deepgram"
- ]
+ "description": "This keeps track of whether the user has enabled keypad input.\nBy default, it is off.\n\n@default false"
},
- "voiceId": {
- "type": "string",
- "description": "This is the provider-specific ID that will be used.",
- "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"
- ],
- "title": "This is the Deepgram Voice ID"
+ "timeoutSeconds": {
+ "type": "number",
+ "description": "This is the time in seconds to wait before processing the input.\nIf the input is not received within this time, the input will be ignored.\nIf set to \"off\", the input will be processed when the user enters a delimiter or immediately if no delimiter is used.\n\n@default 2",
+ "minimum": 0,
+ "maximum": 10
},
- "model": {
+ "delimiters": {
"type": "string",
- "description": "This is the model that will be used. Defaults to 'aura-2' when not specified.",
+ "description": "This is the delimiter(s) that will be used to process the input.\nCan be '#', '*', or an empty array.",
"enum": [
- "aura",
- "aura-2"
- ],
- "example": "aura-2"
- },
- "mipOptOut": {
- "type": "boolean",
- "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\n\nThis will only be used if you are using your own Deepgram API key.\n\n@default false",
- "example": false,
- "default": false
- },
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
- {
- "$ref": "#/components/schemas/ChunkPlan"
- }
- ]
- },
- "fallbackPlan": {
- "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
- "allOf": [
- {
- "$ref": "#/components/schemas/FallbackPlan"
- }
+ "#",
+ "*",
+ ""
]
}
- },
- "required": [
- "provider",
- "voiceId"
- ]
- },
- "ElevenLabsPronunciationDictionaryLocator": {
- "type": "object",
- "properties": {
- "pronunciationDictionaryId": {
- "type": "string",
- "description": "This is the ID of the pronunciation dictionary to use.",
- "title": "This is the ElevenLabs Pronunciation Dictionary ID"
- },
- "versionId": {
- "type": "string",
- "description": "This is the version ID of the pronunciation dictionary to use.",
- "title": "This is the ElevenLabs Pronunciation Dictionary Version ID"
- }
- },
- "required": [
- "pronunciationDictionaryId",
- "versionId"
- ]
+ }
},
- "ElevenLabsVoice": {
+ "WorkflowUserEditable": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
+ "nodes": {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/ConversationNode",
+ "title": "ConversationNode"
+ },
+ {
+ "$ref": "#/components/schemas/ToolNode",
+ "title": "ToolNode"
+ }
+ ]
+ }
},
- "provider": {
- "type": "string",
- "description": "This is the voice provider that will be used.",
- "enum": [
- "11labs"
+ "model": {
+ "description": "This is the model for the workflow.\n\nThis can be overridden at node level using `nodes[n].model`.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/WorkflowOpenAIModel",
+ "title": "WorkflowOpenAIModel"
+ },
+ {
+ "$ref": "#/components/schemas/WorkflowAnthropicModel",
+ "title": "WorkflowAnthropicModel"
+ },
+ {
+ "$ref": "#/components/schemas/WorkflowAnthropicBedrockModel",
+ "title": "WorkflowAnthropicBedrockModel"
+ },
+ {
+ "$ref": "#/components/schemas/WorkflowGoogleModel",
+ "title": "WorkflowGoogleModel"
+ },
+ {
+ "$ref": "#/components/schemas/WorkflowCustomModel",
+ "title": "WorkflowCustomModel"
+ }
]
},
- "voiceId": {
- "description": "This is the provider-specific ID that will be used. Ensure the Voice is present in your 11Labs Voice Library.",
+ "transcriber": {
+ "description": "This is the transcriber for the workflow.\n\nThis can be overridden at node level using `nodes[n].transcriber`.",
"oneOf": [
{
- "type": "string",
- "enum": [
- "burt",
- "marissa",
- "andrea",
- "sarah",
- "phillip",
- "steve",
- "joseph",
- "myra",
- "paula",
- "ryan",
- "drew",
- "paul",
- "mrb",
- "matilda",
- "mark"
- ],
- "title": "Preset Voice Options"
+ "$ref": "#/components/schemas/AssemblyAITranscriber",
+ "title": "AssemblyAITranscriber"
},
{
- "type": "string",
- "title": "11Labs Voice ID"
+ "$ref": "#/components/schemas/AzureSpeechTranscriber",
+ "title": "AzureSpeechTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/CustomTranscriber",
+ "title": "CustomTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/DeepgramTranscriber",
+ "title": "DeepgramTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/ElevenLabsTranscriber",
+ "title": "ElevenLabsTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/GladiaTranscriber",
+ "title": "GladiaTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/GoogleTranscriber",
+ "title": "GoogleTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/SpeechmaticsTranscriber",
+ "title": "SpeechmaticsTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/TalkscriberTranscriber",
+ "title": "TalkscriberTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAITranscriber",
+ "title": "OpenAITranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/CartesiaTranscriber",
+ "title": "CartesiaTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/SonioxTranscriber",
+ "title": "SonioxTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/XaiTranscriber",
+ "title": "XaiTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/VapiTranscriber",
+ "title": "VapiTranscriber"
}
]
},
- "stability": {
- "type": "number",
- "description": "Defines the stability for voice settings.",
- "minimum": 0,
- "maximum": 1,
- "example": 0.5
- },
- "similarityBoost": {
- "type": "number",
- "description": "Defines the similarity boost for voice settings.",
- "minimum": 0,
- "maximum": 1,
- "example": 0.75
- },
- "style": {
- "type": "number",
- "description": "Defines the style for voice settings.",
- "minimum": 0,
- "maximum": 1,
- "example": 0
- },
- "useSpeakerBoost": {
- "type": "boolean",
- "description": "Defines the use speaker boost for voice settings.",
- "example": false
- },
- "speed": {
- "type": "number",
- "description": "Defines the speed for voice settings.",
- "minimum": 0.7,
- "maximum": 1.2,
- "example": 0.9
- },
- "optimizeStreamingLatency": {
- "type": "number",
- "description": "Defines the optimize streaming latency for voice settings. Defaults to 3.",
- "minimum": 0,
- "maximum": 4,
- "example": 3
- },
- "enableSsmlParsing": {
- "type": "boolean",
- "description": "This enables the use of https://elevenlabs.io/docs/speech-synthesis/prompting#pronunciation. Defaults to false to save latency.\n\n@default false",
- "example": false
- },
- "autoMode": {
- "type": "boolean",
- "description": "Defines the auto mode for voice settings. Defaults to false.",
- "example": false
- },
- "model": {
- "type": "string",
- "description": "This is the model that will be used. Defaults to 'eleven_turbo_v2' if not specified.",
- "enum": [
- "eleven_multilingual_v2",
- "eleven_turbo_v2",
- "eleven_turbo_v2_5",
- "eleven_flash_v2",
- "eleven_flash_v2_5",
- "eleven_monolingual_v1",
- "eleven_v3"
- ],
- "example": "eleven_turbo_v2_5"
- },
- "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": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
+ "voice": {
+ "description": "This is the voice for the workflow.\n\nThis can be overridden at node level using `nodes[n].voice`.",
+ "oneOf": [
{
- "$ref": "#/components/schemas/ChunkPlan"
- }
- ]
- },
- "pronunciationDictionaryLocators": {
- "description": "This is the pronunciation dictionary locators to use.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/ElevenLabsPronunciationDictionaryLocator"
- }
- },
- "fallbackPlan": {
- "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
- "allOf": [
+ "$ref": "#/components/schemas/AzureVoice",
+ "title": "AzureVoice"
+ },
{
- "$ref": "#/components/schemas/FallbackPlan"
- }
- ]
- }
- },
- "required": [
- "provider",
- "voiceId"
- ]
- },
- "WellSaidVoice": {
- "type": "object",
- "properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
- "provider": {
- "type": "string",
- "description": "This is the voice provider that will be used.",
- "enum": [
- "wellsaid"
- ]
- },
- "voiceId": {
- "type": "string",
- "description": "The WellSaid speaker ID to synthesize."
- },
- "model": {
- "type": "string",
- "description": "This is the model that will be used.",
- "enum": [
- "caruso",
- "legacy"
- ]
- },
- "enableSsml": {
- "type": "boolean",
- "description": "Enables limited SSML translation for input text."
- },
- "libraryIds": {
- "description": "Array of library IDs to use for voice synthesis.",
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
+ "$ref": "#/components/schemas/CartesiaVoice",
+ "title": "CartesiaVoice"
+ },
{
- "$ref": "#/components/schemas/ChunkPlan"
- }
- ]
- },
- "fallbackPlan": {
- "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
- "allOf": [
+ "$ref": "#/components/schemas/CustomVoice",
+ "title": "CustomVoice"
+ },
{
- "$ref": "#/components/schemas/FallbackPlan"
+ "$ref": "#/components/schemas/DeepgramVoice",
+ "title": "DeepgramVoice"
+ },
+ {
+ "$ref": "#/components/schemas/ElevenLabsVoice",
+ "title": "ElevenLabsVoice"
+ },
+ {
+ "$ref": "#/components/schemas/HumeVoice",
+ "title": "HumeVoice"
+ },
+ {
+ "$ref": "#/components/schemas/LMNTVoice",
+ "title": "LMNTVoice"
+ },
+ {
+ "$ref": "#/components/schemas/NeuphonicVoice",
+ "title": "NeuphonicVoice"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAIVoice",
+ "title": "OpenAIVoice"
+ },
+ {
+ "$ref": "#/components/schemas/PlayHTVoice",
+ "title": "PlayHTVoice"
+ },
+ {
+ "$ref": "#/components/schemas/WellSaidVoice",
+ "title": "WellSaidVoice"
+ },
+ {
+ "$ref": "#/components/schemas/RimeAIVoice",
+ "title": "RimeAIVoice"
+ },
+ {
+ "$ref": "#/components/schemas/SmallestAIVoice",
+ "title": "SmallestAIVoice"
+ },
+ {
+ "$ref": "#/components/schemas/TavusVoice",
+ "title": "TavusVoice"
+ },
+ {
+ "$ref": "#/components/schemas/VapiVoice",
+ "title": "VapiVoice"
+ },
+ {
+ "$ref": "#/components/schemas/SesameVoice",
+ "title": "SesameVoice"
+ },
+ {
+ "$ref": "#/components/schemas/InworldVoice",
+ "title": "InworldVoice"
+ },
+ {
+ "$ref": "#/components/schemas/MinimaxVoice",
+ "title": "MinimaxVoice"
+ },
+ {
+ "$ref": "#/components/schemas/XaiVoice",
+ "title": "XaiVoice"
+ },
+ {
+ "$ref": "#/components/schemas/MicrosoftVoice",
+ "title": "MicrosoftVoice"
}
]
- }
- },
- "required": [
- "provider",
- "voiceId"
- ]
- },
- "HumeVoice": {
- "type": "object",
- "properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
- "provider": {
- "type": "string",
- "description": "This is the voice provider that will be used.",
- "enum": [
- "hume"
- ]
- },
- "model": {
- "type": "string",
- "description": "This is the model that will be used.",
- "enum": [
- "octave",
- "octave2"
- ],
- "example": "octave2"
- },
- "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.",
- "example": false
- },
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
+ "observabilityPlan": {
+ "description": "This is the plan for observability of workflow's calls.\n\nCurrently, only Langfuse is supported.",
+ "oneOf": [
{
- "$ref": "#/components/schemas/ChunkPlan"
+ "$ref": "#/components/schemas/LangfuseObservabilityPlan",
+ "title": "Langfuse"
}
- ]
- },
- "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').\n\nIf a Voice is specified in the request, this description serves as acting instructions.\nIf no Voice is specified, a new voice is generated based on this description."
- },
- "fallbackPlan": {
- "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
+ ],
"allOf": [
{
- "$ref": "#/components/schemas/FallbackPlan"
+ "$ref": "#/components/schemas/LangfuseObservabilityPlan"
}
]
- }
- },
- "required": [
- "provider",
- "voiceId"
- ]
- },
- "LMNTVoice": {
- "type": "object",
- "properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
- "provider": {
- "type": "string",
- "description": "This is the voice provider that will be used.",
- "enum": [
- "lmnt"
- ]
},
- "voiceId": {
- "description": "This is the provider-specific ID that will be used.",
+ "backgroundSound": {
+ "description": "This is the background sound in the call. Default for phone calls is 'office' and default for web calls is 'off'.\nYou can also provide a custom sound by providing a URL to an audio file.",
"oneOf": [
{
"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"
+ "off",
+ "office"
],
- "title": "Preset Voice Options"
+ "example": "office"
},
{
"type": "string",
- "title": "LMNT Voice ID"
+ "format": "uri",
+ "example": "https://www.soundjay.com/ambient/sounds/people-in-lounge-1.mp3"
}
]
},
- "speed": {
- "type": "number",
- "description": "This is the speed multiplier that will be used.",
- "minimum": 0.25,
- "maximum": 2,
- "example": null
+ "hooks": {
+ "type": "array",
+ "description": "This is a set of actions that will be performed on certain events.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CallHookCallEnding",
+ "title": "CallHookCallEnding"
+ },
+ {
+ "$ref": "#/components/schemas/CallHookAssistantSpeechInterrupted",
+ "title": "CallHookAssistantSpeechInterrupted"
+ },
+ {
+ "$ref": "#/components/schemas/CallHookCustomerSpeechInterrupted",
+ "title": "CallHookCustomerSpeechInterrupted"
+ },
+ {
+ "$ref": "#/components/schemas/CallHookCustomerSpeechTimeout",
+ "title": "CallHookCustomerSpeechTimeout"
+ },
+ {
+ "$ref": "#/components/schemas/CallHookModelResponseTimeout",
+ "title": "CallHookModelResponseTimeout"
+ }
+ ]
+ }
},
- "language": {
- "description": "Two letter ISO 639-1 language code. Use \"auto\" for auto-detection.",
- "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",
+ "credentials": {
+ "type": "array",
+ "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.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CreateAnthropicCredentialDTO",
+ "title": "AnthropicCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAnthropicBedrockCredentialDTO",
+ "title": "AnthropicBedrockCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAnyscaleCredentialDTO",
+ "title": "AnyscaleCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAssemblyAICredentialDTO",
+ "title": "AssemblyAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAzureCredentialDTO",
+ "title": "AzureCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAzureOpenAICredentialDTO",
+ "title": "AzureOpenAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateByoSipTrunkCredentialDTO",
+ "title": "ByoSipTrunkCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCartesiaCredentialDTO",
+ "title": "CartesiaCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCerebrasCredentialDTO",
+ "title": "CerebrasCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCloudflareCredentialDTO",
+ "title": "CloudflareCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCustomLLMCredentialDTO",
+ "title": "CustomLLMCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateDeepgramCredentialDTO",
+ "title": "DeepgramCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateDeepInfraCredentialDTO",
+ "title": "DeepInfraCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateDeepSeekCredentialDTO",
+ "title": "DeepSeekCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateElevenLabsCredentialDTO",
+ "title": "ElevenLabsCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGcpCredentialDTO",
+ "title": "GcpCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGladiaCredentialDTO",
+ "title": "GladiaCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelCredentialDTO",
+ "title": "GhlCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCredentialDTO",
+ "title": "GoogleCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGroqCredentialDTO",
+ "title": "GroqCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateHumeCredentialDTO",
+ "title": "HumeCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateInflectionAICredentialDTO",
+ "title": "InflectionAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateLangfuseCredentialDTO",
+ "title": "LangfuseCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateLmntCredentialDTO",
+ "title": "LmntCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMakeCredentialDTO",
+ "title": "MakeCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMistralCredentialDTO",
+ "title": "MistralCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateNeuphonicCredentialDTO",
+ "title": "NeuphonicCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateOpenAICredentialDTO",
+ "title": "OpenAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateOpenRouterCredentialDTO",
+ "title": "OpenRouterCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreatePerplexityAICredentialDTO",
+ "title": "PerplexityAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreatePlayHTCredentialDTO",
+ "title": "PlayHTCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateRimeAICredentialDTO",
+ "title": "RimeAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateRunpodCredentialDTO",
+ "title": "RunpodCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateS3CredentialDTO",
+ "title": "S3Credential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateS3CompatibleCredentialDTO",
+ "title": "S3CompatibleStorageCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSmallestAICredentialDTO",
+ "title": "SmallestAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSpeechmaticsCredentialDTO",
+ "title": "SpeechmaticsCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSonioxCredentialDTO",
+ "title": "SonioxCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSupabaseCredentialDTO",
+ "title": "SupabaseCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTavusCredentialDTO",
+ "title": "TavusCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTogetherAICredentialDTO",
+ "title": "TogetherAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTwilioCredentialDTO",
+ "title": "TwilioCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateVonageCredentialDTO",
+ "title": "VonageCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateWebhookCredentialDTO",
+ "title": "WebhookCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCustomCredentialDTO",
+ "title": "CustomCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateXAiCredentialDTO",
+ "title": "XAiCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO",
+ "title": "MicrosoftCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
+ "title": "GoogleCalendarOAuth2ClientCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO",
+ "title": "GoogleCalendarOAuth2AuthorizationCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO",
+ "title": "GoogleSheetsOAuth2AuthorizationCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSlackOAuth2AuthorizationCredentialDTO",
+ "title": "SlackOAuth2AuthorizationCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelMCPCredentialDTO",
+ "title": "GoHighLevelMCPCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateInworldCredentialDTO",
+ "title": "InworldCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMinimaxCredentialDTO",
+ "title": "MinimaxCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateWellSaidCredentialDTO",
+ "title": "WellSaidCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateEmailCredentialDTO",
+ "title": "EmailCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSlackWebhookCredentialDTO",
+ "title": "SlackWebhookCredential"
+ }
+ ],
+ "discriminator": {
+ "propertyName": "provider",
+ "mapping": {
+ "11labs": "#/components/schemas/CreateElevenLabsCredentialDTO",
+ "anthropic": "#/components/schemas/CreateAnthropicCredentialDTO",
+ "anthropic-bedrock": "#/components/schemas/CreateAnthropicBedrockCredentialDTO",
+ "anyscale": "#/components/schemas/CreateAnyscaleCredentialDTO",
+ "assembly-ai": "#/components/schemas/CreateAssemblyAICredentialDTO",
+ "azure-openai": "#/components/schemas/CreateAzureOpenAICredentialDTO",
+ "azure": "#/components/schemas/CreateAzureCredentialDTO",
+ "byo-sip-trunk": "#/components/schemas/CreateByoSipTrunkCredentialDTO",
+ "cartesia": "#/components/schemas/CreateCartesiaCredentialDTO",
+ "cerebras": "#/components/schemas/CreateCerebrasCredentialDTO",
+ "cloudflare": "#/components/schemas/CreateCloudflareCredentialDTO",
+ "custom-llm": "#/components/schemas/CreateCustomLLMCredentialDTO",
+ "deepgram": "#/components/schemas/CreateDeepgramCredentialDTO",
+ "deepinfra": "#/components/schemas/CreateDeepInfraCredentialDTO",
+ "deep-seek": "#/components/schemas/CreateDeepSeekCredentialDTO",
+ "gcp": "#/components/schemas/CreateGcpCredentialDTO",
+ "gladia": "#/components/schemas/CreateGladiaCredentialDTO",
+ "gohighlevel": "#/components/schemas/CreateGoHighLevelCredentialDTO",
+ "google": "#/components/schemas/CreateGoogleCredentialDTO",
+ "groq": "#/components/schemas/CreateGroqCredentialDTO",
+ "inflection-ai": "#/components/schemas/CreateInflectionAICredentialDTO",
+ "langfuse": "#/components/schemas/CreateLangfuseCredentialDTO",
+ "lmnt": "#/components/schemas/CreateLmntCredentialDTO",
+ "make": "#/components/schemas/CreateMakeCredentialDTO",
+ "openai": "#/components/schemas/CreateOpenAICredentialDTO",
+ "openrouter": "#/components/schemas/CreateOpenRouterCredentialDTO",
+ "perplexity-ai": "#/components/schemas/CreatePerplexityAICredentialDTO",
+ "playht": "#/components/schemas/CreatePlayHTCredentialDTO",
+ "rime-ai": "#/components/schemas/CreateRimeAICredentialDTO",
+ "runpod": "#/components/schemas/CreateRunpodCredentialDTO",
+ "s3": "#/components/schemas/CreateS3CredentialDTO",
+ "s3-compatible": "#/components/schemas/CreateS3CompatibleCredentialDTO",
+ "supabase": "#/components/schemas/CreateSupabaseCredentialDTO",
+ "smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO",
+ "tavus": "#/components/schemas/CreateTavusCredentialDTO",
+ "together-ai": "#/components/schemas/CreateTogetherAICredentialDTO",
+ "twilio": "#/components/schemas/CreateTwilioCredentialDTO",
+ "vonage": "#/components/schemas/CreateVonageCredentialDTO",
+ "webhook": "#/components/schemas/CreateWebhookCredentialDTO",
+ "custom-credential": "#/components/schemas/CreateCustomCredentialDTO",
+ "xai": "#/components/schemas/CreateXAiCredentialDTO",
+ "microsoft": "#/components/schemas/CreateMicrosoftCredentialDTO",
+ "neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO",
+ "hume": "#/components/schemas/CreateHumeCredentialDTO",
+ "mistral": "#/components/schemas/CreateMistralCredentialDTO",
+ "speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO",
+ "soniox": "#/components/schemas/CreateSonioxCredentialDTO",
+ "google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
+ "google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO",
+ "google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO",
+ "slack.oauth2-authorization": "#/components/schemas/CreateSlackOAuth2AuthorizationCredentialDTO",
+ "ghl.oauth2-authorization": "#/components/schemas/CreateGoHighLevelMCPCredentialDTO",
+ "inworld": "#/components/schemas/CreateInworldCredentialDTO",
+ "minimax": "#/components/schemas/CreateMinimaxCredentialDTO",
+ "wellsaid": "#/components/schemas/CreateWellSaidCredentialDTO",
+ "email": "#/components/schemas/CreateEmailCredentialDTO",
+ "slack-webhook": "#/components/schemas/CreateSlackWebhookCredentialDTO"
+ }
+ }
+ }
+ },
+ "voicemailDetection": {
+ "description": "This is the voicemail detection plan for the workflow.",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "off"
+ ]
+ },
+ {
+ "$ref": "#/components/schemas/GoogleVoicemailDetectionPlan",
+ "title": "Google"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAIVoicemailDetectionPlan",
+ "title": "OpenAI"
+ },
+ {
+ "$ref": "#/components/schemas/TwilioVoicemailDetectionPlan",
+ "title": "Twilio"
+ },
+ {
+ "$ref": "#/components/schemas/VapiVoicemailDetectionPlan",
+ "title": "Vapi"
+ }
+ ]
+ },
+ "maxDurationSeconds": {
+ "type": "number",
+ "description": "This is the maximum duration of the call in seconds.\n\nAfter this duration, the call will automatically end.\n\nDefault is 1800 (30 minutes), max is 43200 (12 hours), and min is 10 seconds.",
+ "minimum": 10,
+ "maximum": 43200,
+ "example": 600
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 80
+ },
+ "edges": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Edge"
+ }
+ },
+ "globalPrompt": {
+ "type": "string",
+ "maxLength": 5000
+ },
+ "server": {
+ "description": "This is where Vapi will send webhooks. You can find all webhooks available along with their shape in ServerMessage schema.\n\nThe order of precedence is:\n\n1. tool.server\n2. workflow.server / assistant.server\n3. phoneNumber.server\n4. org.server",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Server"
+ }
+ ]
+ },
+ "compliancePlan": {
+ "description": "This is the compliance plan for the workflow. It allows you to configure HIPAA and other compliance settings.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/CompliancePlan"
+ }
+ ]
+ },
+ "analysisPlan": {
+ "description": "This is the plan for analysis of workflow's calls. Stored in `call.analysis`.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/AnalysisPlan"
+ }
+ ]
+ },
+ "artifactPlan": {
+ "description": "This is the plan for artifacts generated during workflow's calls. Stored in `call.artifact`.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ArtifactPlan"
+ }
+ ]
+ },
+ "startSpeakingPlan": {
+ "description": "This is the plan for when the workflow nodes should start talking.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to start talking after the customer is done speaking.\n- The assistant is too fast to start talking after the customer is done speaking.\n- The assistant is so fast that it's actually interrupting the customer.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/StartSpeakingPlan"
+ }
+ ]
+ },
+ "stopSpeakingPlan": {
+ "description": "This is the plan for when workflow nodes should stop talking on customer interruption.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to recognize customer's interruption.\n- The assistant is too fast to recognize customer's interruption.\n- The assistant is getting interrupted by phrases that are just acknowledgments.\n- The assistant is getting interrupted by background noises.\n- The assistant is not properly stopping -- it starts talking right after getting interrupted.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/StopSpeakingPlan"
+ }
+ ]
+ },
+ "monitorPlan": {
+ "description": "This is the plan for real-time monitoring of the workflow's calls.\n\nUsage:\n- To enable live listening of the workflow's calls, set `monitorPlan.listenEnabled` to `true`.\n- To enable live control of the workflow's calls, set `monitorPlan.controlEnabled` to `true`.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/MonitorPlan"
+ }
+ ]
+ },
+ "backgroundSpeechDenoisingPlan": {
+ "description": "This enables filtering of noise and background speech while the user is talking.\n\nFeatures:\n- Smart denoising using Krisp\n- Fourier denoising\n\nBoth can be used together. Order of precedence:\n- Smart denoising\n- Fourier denoising",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BackgroundSpeechDenoisingPlan"
+ }
+ ]
+ },
+ "credentialIds": {
+ "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.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "keypadInputPlan": {
+ "description": "This is the plan for keypad input handling during workflow calls.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/KeypadInputPlan"
+ }
+ ]
+ },
+ "voicemailMessage": {
+ "type": "string",
+ "description": "This is the message that the assistant will say if the call is forwarded to voicemail.\n\nIf unspecified, it will hang up.",
+ "maxLength": 1000
+ }
+ },
+ "required": [
+ "nodes",
+ "name",
+ "edges"
+ ]
+ },
+ "VapiModel": {
+ "type": "object",
+ "properties": {
+ "messages": {
+ "description": "This is the starting state for the conversation.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/OpenAIMessage"
+ }
+ },
+ "tools": {
+ "type": "array",
+ "description": "These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CreateApiRequestToolDTO",
+ "title": "ApiRequestTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateBashToolDTO",
+ "title": "BashTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCodeToolDTO",
+ "title": "CodeTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateComputerToolDTO",
+ "title": "ComputerTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateDtmfToolDTO",
+ "title": "DtmfTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateEndCallToolDTO",
+ "title": "EndCallTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateFunctionToolDTO",
+ "title": "FunctionTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO",
+ "title": "GoHighLevelCalendarAvailabilityTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO",
+ "title": "GoHighLevelCalendarEventCreateTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelContactCreateToolDTO",
+ "title": "GoHighLevelContactCreateTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelContactGetToolDTO",
+ "title": "GoHighLevelContactGetTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO",
+ "title": "GoogleCalendarCheckAvailabilityTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarCreateEventToolDTO",
+ "title": "GoogleCalendarCreateEventTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleSheetsRowAppendToolDTO",
+ "title": "GoogleSheetsRowAppendTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateHandoffToolDTO",
+ "title": "HandoffTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMcpToolDTO",
+ "title": "McpTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateQueryToolDTO",
+ "title": "QueryTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSlackSendMessageToolDTO",
+ "title": "SlackSendMessageTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSmsToolDTO",
+ "title": "SmsTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTextEditorToolDTO",
+ "title": "TextEditorTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTransferCallToolDTO",
+ "title": "TransferCallTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSipRequestToolDTO",
+ "title": "SipRequestTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateVoicemailToolDTO",
+ "title": "VoicemailTool"
+ }
+ ]
+ }
+ },
+ "toolIds": {
+ "description": "These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "toolRefs": {
+ "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolRef"
+ }
+ },
+ "knowledgeBase": {
+ "description": "These are the options for the knowledge base.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CreateCustomKnowledgeBaseDTO",
+ "title": "Custom"
+ }
+ ]
+ },
+ "model": {
+ "type": "string",
+ "description": "White-label Vapi models are selected by `version`, not a model name, so\n`model` is optional here (the runtime already accepts a version-only Vapi\npayload). Overriding the required `ModelBase.model`: the declared type stays\n`string` to match the base (avoids TS2416) and the `= undefined!` initializer\nsatisfies TS2612 for the field override, while `@IsOptional` +\n`@ApiPropertyOptional` make validation and the generated OpenAPI schema treat\nit as optional (so `VapiModel.required` is `['provider']`)."
+ },
+ "version": {
+ "type": "string",
+ "description": "Vapi-managed model version (update channel). When set, this is a Vapi-managed\nLLM routed by the registry; when absent, this is the legacy workflow form\nbelow (`steps` / `workflow`).",
+ "enum": [
+ "latest",
+ "1"
+ ]
+ },
+ "provider": {
+ "type": "string",
+ "enum": [
+ "vapi"
+ ]
+ },
+ "workflowId": {
+ "type": "string",
+ "description": "This is the workflow that will be used for the call. To use a transient workflow, use `workflow` instead."
+ },
+ "workflow": {
+ "description": "This is the workflow that will be used for the call. To use an existing workflow, use `workflowId` instead.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/WorkflowUserEditable"
+ }
+ ]
+ },
+ "temperature": {
+ "type": "number",
+ "description": "This is the temperature that will be used for calls. Default is 0.5.",
+ "minimum": 0,
+ "maximum": 2
+ },
+ "emotionRecognitionEnabled": {
+ "type": "boolean",
+ "description": "This determines whether we detect user's emotion while they speak and send it as an additional info to model.\n\nDefault `false` because the model is usually are good at understanding the user's emotion from text.\n\n@default false"
+ },
+ "numFastTurns": {
+ "type": "number",
+ "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.\n\nDefault is 0.\n\n@default 0",
+ "minimum": 0
+ }
+ },
+ "required": [
+ "provider"
+ ]
+ },
+ "XaiModel": {
+ "type": "object",
+ "properties": {
+ "messages": {
+ "description": "This is the starting state for the conversation.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/OpenAIMessage"
+ }
+ },
+ "tools": {
+ "type": "array",
+ "description": "These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CreateApiRequestToolDTO",
+ "title": "ApiRequestTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateBashToolDTO",
+ "title": "BashTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCodeToolDTO",
+ "title": "CodeTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateComputerToolDTO",
+ "title": "ComputerTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateDtmfToolDTO",
+ "title": "DtmfTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateEndCallToolDTO",
+ "title": "EndCallTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateFunctionToolDTO",
+ "title": "FunctionTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO",
+ "title": "GoHighLevelCalendarAvailabilityTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO",
+ "title": "GoHighLevelCalendarEventCreateTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelContactCreateToolDTO",
+ "title": "GoHighLevelContactCreateTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelContactGetToolDTO",
+ "title": "GoHighLevelContactGetTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO",
+ "title": "GoogleCalendarCheckAvailabilityTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarCreateEventToolDTO",
+ "title": "GoogleCalendarCreateEventTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleSheetsRowAppendToolDTO",
+ "title": "GoogleSheetsRowAppendTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateHandoffToolDTO",
+ "title": "HandoffTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMcpToolDTO",
+ "title": "McpTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateQueryToolDTO",
+ "title": "QueryTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSlackSendMessageToolDTO",
+ "title": "SlackSendMessageTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSmsToolDTO",
+ "title": "SmsTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTextEditorToolDTO",
+ "title": "TextEditorTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTransferCallToolDTO",
+ "title": "TransferCallTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSipRequestToolDTO",
+ "title": "SipRequestTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateVoicemailToolDTO",
+ "title": "VoicemailTool"
+ }
+ ]
+ }
+ },
+ "toolIds": {
+ "description": "These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "toolRefs": {
+ "description": "These are version-pinned references to tools. Each entry pins a specific\nversion of a tool by `(toolId, version)`. When the same `toolId` appears\nin both `toolIds` and `toolRefs[]`, the `toolRefs` pin wins (the\n`toolIds` entry is dropped at write time).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolRef"
+ }
+ },
+ "knowledgeBase": {
+ "description": "These are the options for the knowledge base.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CreateCustomKnowledgeBaseDTO",
+ "title": "Custom"
+ }
+ ]
+ },
+ "model": {
+ "type": "string",
+ "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b",
+ "enum": [
+ "grok-beta",
+ "grok-2",
+ "grok-3",
+ "grok-4-fast-reasoning",
+ "grok-4-fast-non-reasoning",
+ "grok-4.20-0309-reasoning",
+ "grok-4.20-0309-non-reasoning",
+ "grok-4.3"
+ ]
+ },
+ "provider": {
+ "type": "string",
+ "enum": [
+ "xai"
+ ]
+ },
+ "temperature": {
+ "type": "number",
+ "description": "This is the temperature that will be used for calls. Default is 0.5.",
+ "minimum": 0,
+ "maximum": 2
+ },
+ "maxTokens": {
+ "type": "number",
+ "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.",
+ "minimum": 50,
+ "maximum": 10000
+ },
+ "emotionRecognitionEnabled": {
+ "type": "boolean",
+ "description": "This determines whether we detect user's emotion while they speak and send it as an additional info to model.\n\nDefault `false` because the model is usually are good at understanding the user's emotion from text.\n\n@default false"
+ },
+ "numFastTurns": {
+ "type": "number",
+ "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.\n\nDefault is 0.\n\n@default 0",
+ "minimum": 0
+ }
+ },
+ "required": [
+ "model",
+ "provider"
+ ]
+ },
+ "ExactReplacement": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "This is the exact replacement type. You can use this to replace a specific word or phrase with a different word or phrase.\n\nUsage:\n- Replace \"hello\" with \"hi\": { type: 'exact', key: 'hello', value: 'hi' }\n- Replace \"good morning\" with \"good day\": { type: 'exact', key: 'good morning', value: 'good day' }\n- Replace a specific name: { type: 'exact', key: 'John Doe', value: 'Jane Smith' }\n- Replace an acronym: { type: 'exact', key: 'AI', value: 'Artificial Intelligence' }\n- Replace a company name with its phonetic pronunciation: { type: 'exact', key: 'Vapi', value: 'Vappy' }",
+ "enum": [
+ "exact"
+ ]
+ },
+ "replaceAllEnabled": {
+ "type": "boolean",
+ "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.\nExamples:\n- For { type: 'exact', key: 'hello', value: 'hi', replaceAllEnabled: false }. Before: \"hello world, hello universe\" | After: \"hi world, hello universe\"\n- For { type: 'exact', key: 'hello', value: 'hi', replaceAllEnabled: true }. Before: \"hello world, hello universe\" | After: \"hi world, hi universe\"\n@default false",
+ "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.",
+ "maxLength": 1000
+ }
+ },
+ "required": [
+ "type",
+ "key",
+ "value"
+ ]
+ },
+ "RegexReplacement": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "This is the regex replacement type. You can use this to replace a word or phrase that matches a pattern.\n\nUsage:\n- Replace all numbers with \"some number\": { type: 'regex', regex: '\\\\d+', value: 'some number' }\n- 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]' }\n- Replace phone numbers with a formatted version: { type: 'regex', regex: '(\\\\d{3})(\\\\d{3})(\\\\d{4})', value: '($1) $2-$3' }\n- Replace all instances of \"color\" or \"colour\" with \"hue\": { type: 'regex', regex: 'colou?r', value: 'hue' }\n- Capitalize the first letter of every sentence: { type: 'regex', regex: '(?<=\\\\. |^)[a-z]', value: (match) => match.toUpperCase() }",
+ "enum": [
+ "regex"
+ ]
+ },
+ "regex": {
+ "type": "string",
+ "description": "This is the regex pattern to replace.\n\nNote:\n- This works by using the `string.replace` method in Node.JS. Eg. `\"hello there\".replace(/hello/g, \"hi\")` will return `\"hi there\"`.\n\nHot tip:\n- In JavaScript, escape `\\` when sending the regex pattern. Eg. `\"hello\\sthere\"` will be sent over the wire as `\"hellosthere\"`. Send `\"hello\\\\sthere\"` instead."
+ },
+ "options": {
+ "description": "These are the options for the regex replacement. Defaults to all disabled.\n\n@default []",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/RegexOption"
+ }
+ },
+ "value": {
+ "type": "string",
+ "description": "This is the value that will replace the match.",
+ "maxLength": 1000
+ }
+ },
+ "required": [
+ "type",
+ "regex",
+ "value"
+ ]
+ },
+ "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`.\n\nUsage:\n- To rely on the voice provider's formatting logic, set this to `false`.\n\nIf `voice.chunkPlan.enabled` is `false`, this is automatically `false` since there's no chunk to format.\n\n@default true",
+ "example": true
+ },
+ "numberToDigitsCutoff": {
+ "type": "number",
+ "description": "This is the cutoff after which a number is converted to individual digits instead of being spoken as words.\n\nExample:\n- If cutoff 2025, \"12345\" is converted to \"1 2 3 4 5\" while \"1200\" is converted to \"twelve hundred\".\n\nUsage:\n- If your use case doesn't involve IDs like zip codes, set this to a high value.\n- If your use case involves IDs that are shorter than 5 digits, set this to a lower value.\n\n@default 2025",
+ "minimum": 0,
+ "example": 2025
+ },
+ "replacements": {
+ "type": "array",
+ "description": "These are the custom replacements you can make to the chunk before it is sent to the voice provider.\n\nUsage:\n- To replace a specific word or phrase with a different word or phrase, use the `ExactReplacement` type. Eg. `{ type: 'exact', key: 'hello', value: 'hi' }`\n- 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' }`\n\n@default []",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/ExactReplacement",
+ "title": "ExactReplacement"
+ },
+ {
+ "$ref": "#/components/schemas/RegexReplacement",
+ "title": "RegexReplacement"
+ }
+ ]
+ }
+ },
+ "formattersEnabled": {
+ "type": "array",
+ "description": "List of formatters to apply. If not provided, all default formatters will be applied.\nIf provided, only the specified formatters will be applied.\nNote: Some essential formatters like angle bracket removal will always be applied.\n@default undefined",
+ "enum": [
+ "markdown",
+ "asterisk",
+ "quote",
+ "dash",
+ "newline",
+ "colon",
+ "acronym",
+ "dollarAmount",
+ "email",
+ "date",
+ "time",
+ "distance",
+ "unit",
+ "percentage",
+ "phoneNumber",
+ "number",
+ "stripAsterisk"
+ ],
+ "items": {
+ "type": "string",
+ "enum": [
+ "markdown",
+ "asterisk",
+ "quote",
+ "dash",
+ "newline",
+ "colon",
+ "acronym",
+ "dollarAmount",
+ "email",
+ "date",
+ "time",
+ "distance",
+ "unit",
+ "percentage",
+ "phoneNumber",
+ "number",
+ "stripAsterisk"
+ ]
+ }
+ }
+ }
+ },
+ "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`.\n\nUsage:\n- To rely on the voice provider's audio generation logic, set this to `false`.\n- If seeing issues with quality, set this to `true`.\n\nIf disabled, Vapi-provided audio control tokens like will not work.\n\n@default true",
+ "example": true
+ },
+ "minCharacters": {
+ "type": "number",
+ "description": "This is the minimum number of characters in a chunk.\n\nUsage:\n- To increase quality, set this to a higher value.\n- To decrease latency, set this to a lower value.\n\n@default 30",
+ "minimum": 1,
+ "maximum": 80,
+ "example": 30
+ },
+ "punctuationBoundaries": {
+ "type": "array",
+ "description": "These are the punctuations that are considered valid boundaries for a chunk to be created.\n\nUsage:\n- To increase quality, constrain to fewer boundaries.\n- To decrease latency, enable all.\n\nDefault is automatically set to balance the trade-off between quality and latency based on the provider.",
+ "enum": [
+ "。",
+ ",",
+ ".",
+ "!",
+ "?",
+ ";",
+ ")",
+ "،",
+ "۔",
+ "।",
+ "॥",
+ "|",
+ "||",
+ ",",
+ ":"
+ ],
+ "example": [
+ "。",
+ ",",
+ ".",
+ "!",
+ "?",
+ ";",
+ "،",
+ "۔",
+ "।",
+ "॥",
+ "|",
+ "||",
+ ",",
+ ":"
+ ],
+ "items": {
+ "type": "string",
+ "enum": [
+ "。",
+ ",",
+ ".",
+ "!",
+ "?",
+ ";",
+ ")",
+ "،",
+ "۔",
+ "।",
+ "॥",
+ "|",
+ "||",
+ ",",
+ ":"
+ ]
+ }
+ },
+ "formatPlan": {
+ "description": "This is the plan for formatting the chunk before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/FormatPlan"
+ }
+ ]
+ }
+ }
+ },
+ "FallbackPlan": {
+ "type": "object",
+ "properties": {
+ "voices": {
+ "type": "array",
+ "description": "This is the list of voices to fallback to in the event that the primary voice provider fails.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/FallbackAzureVoice",
+ "title": "Azure"
+ },
+ {
+ "$ref": "#/components/schemas/FallbackCartesiaVoice",
+ "title": "Cartesia"
+ },
+ {
+ "$ref": "#/components/schemas/FallbackHumeVoice",
+ "title": "Hume"
+ },
+ {
+ "$ref": "#/components/schemas/FallbackCustomVoice",
+ "title": "CustomVoice"
+ },
+ {
+ "$ref": "#/components/schemas/FallbackDeepgramVoice",
+ "title": "Deepgram"
+ },
+ {
+ "$ref": "#/components/schemas/FallbackElevenLabsVoice",
+ "title": "ElevenLabs"
+ },
+ {
+ "$ref": "#/components/schemas/FallbackVapiVoice",
+ "title": "Vapi"
+ },
+ {
+ "$ref": "#/components/schemas/FallbackLMNTVoice",
+ "title": "LMNT"
+ },
+ {
+ "$ref": "#/components/schemas/FallbackOpenAIVoice",
+ "title": "OpenAI"
+ },
+ {
+ "$ref": "#/components/schemas/FallbackPlayHTVoice",
+ "title": "PlayHT"
+ },
+ {
+ "$ref": "#/components/schemas/FallbackWellSaidVoice",
+ "title": "WellSaid"
+ },
+ {
+ "$ref": "#/components/schemas/FallbackRimeAIVoice",
+ "title": "RimeAI"
+ },
+ {
+ "$ref": "#/components/schemas/FallbackSmallestAIVoice",
+ "title": "Smallest AI"
+ },
+ {
+ "$ref": "#/components/schemas/FallbackTavusVoice",
+ "title": "TavusVoice"
+ },
+ {
+ "$ref": "#/components/schemas/FallbackNeuphonicVoice",
+ "title": "Neuphonic"
+ },
+ {
+ "$ref": "#/components/schemas/FallbackSesameVoice",
+ "title": "Sesame"
+ },
+ {
+ "$ref": "#/components/schemas/FallbackInworldVoice",
+ "title": "Inworld"
+ },
+ {
+ "$ref": "#/components/schemas/FallbackXaiVoice",
+ "title": "xAI"
+ },
+ {
+ "$ref": "#/components/schemas/FallbackMicrosoftVoice",
+ "title": "Microsoft"
+ }
+ ]
+ }
+ }
+ },
+ "required": [
+ "voices"
+ ]
+ },
+ "AzureVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "azure"
+ ]
+ },
+ "voiceId": {
+ "description": "This is the provider-specific ID that will be used.",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "andrew",
+ "brian",
+ "emma"
+ ],
+ "title": "Preset Voice Options"
+ },
+ {
+ "type": "string",
+ "title": "Azure Voice ID"
+ }
+ ]
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ },
+ "speed": {
+ "type": "number",
+ "description": "This is the speed multiplier that will be used.",
+ "minimum": 0.5,
+ "maximum": 2
+ },
+ "fallbackPlan": {
+ "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/FallbackPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "CartesiaExperimentalControls": {
+ "type": "object",
+ "properties": {
+ "speed": {
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "slowest",
+ "slow",
+ "normal",
+ "fast",
+ "fastest"
+ ],
+ "example": "normal"
+ },
+ {
+ "type": "number",
+ "minimum": -1,
+ "maximum": 1,
+ "example": 0.5
+ }
+ ]
+ },
+ "emotion": {
+ "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"
+ ],
+ "example": [
+ "happiness:high"
+ ]
+ }
+ }
+ },
+ "CartesiaGenerationConfigExperimental": {
+ "type": "object",
+ "properties": {
+ "accentLocalization": {
+ "type": "integer",
+ "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.",
+ "example": 0,
+ "minimum": 0,
+ "maximum": 1,
+ "default": 0
+ }
+ }
+ },
+ "CartesiaGenerationConfig": {
+ "type": "object",
+ "properties": {
+ "speed": {
+ "type": "number",
+ "description": "Fine-grained speed control for sonic-3. Only available for sonic-3 model.",
+ "example": 1,
+ "minimum": 0.6,
+ "maximum": 1.5,
+ "default": 1
+ },
+ "volume": {
+ "type": "number",
+ "description": "Fine-grained volume control for sonic-3. Only available for sonic-3 model.",
+ "example": 1,
+ "minimum": 0.5,
+ "maximum": 2,
+ "default": 1
+ },
+ "experimental": {
+ "description": "Experimental model controls for sonic-3. These are subject to breaking changes.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/CartesiaGenerationConfigExperimental"
+ }
+ ]
+ }
+ }
+ },
+ "CartesiaVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "cartesia"
+ ]
+ },
+ "voiceId": {
+ "type": "string",
+ "description": "The ID of the particular voice you want to use."
+ },
+ "model": {
+ "type": "string",
+ "description": "This is the model that will be used. This is optional and will default to the correct model for the voiceId.",
+ "enum": [
+ "sonic-3.5",
+ "sonic-3.5-2026-05-04",
+ "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"
+ ],
+ "example": "sonic-english"
+ },
+ "language": {
+ "type": "string",
+ "description": "This is the language that will be used. This is optional and will default to the correct language for the voiceId.",
+ "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"
+ ],
+ "example": "en"
+ },
+ "experimentalControls": {
+ "description": "Experimental controls for Cartesia voice generation",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/CartesiaExperimentalControls"
+ }
+ ]
+ },
+ "generationConfig": {
+ "description": "Generation config for fine-grained control of sonic-3 voice output (speed, volume, and experimental controls). Only available for sonic-3 model.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/CartesiaGenerationConfig"
+ }
+ ]
+ },
+ "pronunciationDictId": {
+ "type": "string",
+ "description": "Pronunciation dictionary ID for sonic-3. Allows custom pronunciations for specific words. Only available for sonic-3 model.",
+ "example": "dict_abc123"
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ },
+ "fallbackPlan": {
+ "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/FallbackPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "CustomVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used. Use `custom-voice` for providers that are not natively supported.",
+ "enum": [
+ "custom-voice"
+ ]
+ },
+ "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": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ },
+ "server": {
+ "description": "This is where the voice request will be sent.\n\nRequest Example:\n\nPOST https://{server.url}\nContent-Type: application/json\n\n{\n \"message\": {\n \"type\": \"voice-request\",\n \"text\": \"Hello, world!\",\n \"sampleRate\": 24000,\n ...other metadata about the call...\n }\n}\n\nResponse 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:\n```\nresponse.on('data', (chunk: Buffer) => {\n outputStream.write(chunk);\n});\n```",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Server"
+ }
+ ]
+ },
+ "fallbackPlan": {
+ "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/FallbackPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "server"
+ ]
+ },
+ "DeepgramVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "deepgram"
+ ]
+ },
+ "voiceId": {
+ "type": "string",
+ "description": "This is the provider-specific ID that will be used.",
+ "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"
+ ],
+ "title": "This is the Deepgram Voice ID"
+ },
+ "model": {
+ "type": "string",
+ "description": "This is the model that will be used. Defaults to 'aura-2' when not specified.",
+ "enum": [
+ "aura",
+ "aura-2"
+ ],
+ "example": "aura-2"
+ },
+ "mipOptOut": {
+ "type": "boolean",
+ "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\n\nThis will only be used if you are using your own Deepgram API key.\n\n@default false",
+ "example": false,
+ "default": false
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ },
+ "fallbackPlan": {
+ "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/FallbackPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "ElevenLabsPronunciationDictionaryLocator": {
+ "type": "object",
+ "properties": {
+ "pronunciationDictionaryId": {
+ "type": "string",
+ "description": "This is the ID of the pronunciation dictionary to use.",
+ "title": "This is the ElevenLabs Pronunciation Dictionary ID"
+ },
+ "versionId": {
+ "type": "string",
+ "description": "This is the version ID of the pronunciation dictionary to use.",
+ "title": "This is the ElevenLabs Pronunciation Dictionary Version ID"
+ }
+ },
+ "required": [
+ "pronunciationDictionaryId",
+ "versionId"
+ ]
+ },
+ "ElevenLabsVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "11labs"
+ ]
+ },
+ "voiceId": {
+ "description": "This is the provider-specific ID that will be used. Ensure the Voice is present in your 11Labs Voice Library.",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "burt",
+ "marissa",
+ "andrea",
+ "sarah",
+ "phillip",
+ "steve",
+ "joseph",
+ "myra",
+ "paula",
+ "ryan",
+ "drew",
+ "paul",
+ "mrb",
+ "matilda",
+ "mark"
+ ],
+ "title": "Preset Voice Options"
+ },
+ {
+ "type": "string",
+ "title": "11Labs Voice ID"
+ }
+ ]
+ },
+ "stability": {
+ "type": "number",
+ "description": "Defines the stability for voice settings.",
+ "minimum": 0,
+ "maximum": 1,
+ "example": 0.5
+ },
+ "similarityBoost": {
+ "type": "number",
+ "description": "Defines the similarity boost for voice settings.",
+ "minimum": 0,
+ "maximum": 1,
+ "example": 0.75
+ },
+ "style": {
+ "type": "number",
+ "description": "Defines the style for voice settings.",
+ "minimum": 0,
+ "maximum": 1,
+ "example": 0
+ },
+ "useSpeakerBoost": {
+ "type": "boolean",
+ "description": "Defines the use speaker boost for voice settings.",
+ "example": false
+ },
+ "speed": {
+ "type": "number",
+ "description": "Defines the speed for voice settings.",
+ "minimum": 0.7,
+ "maximum": 1.2,
+ "example": 0.9
+ },
+ "optimizeStreamingLatency": {
+ "type": "number",
+ "description": "Defines the optimize streaming latency for voice settings. Defaults to 3.",
+ "minimum": 0,
+ "maximum": 4,
+ "example": 3
+ },
+ "enableSsmlParsing": {
+ "type": "boolean",
+ "description": "This enables the use of https://elevenlabs.io/docs/speech-synthesis/prompting#pronunciation. Defaults to false to save latency.\n\n@default false",
+ "example": false
+ },
+ "autoMode": {
+ "type": "boolean",
+ "description": "Defines the auto mode for voice settings. Defaults to false.",
+ "example": false
+ },
+ "model": {
+ "type": "string",
+ "description": "This is the model that will be used. Defaults to 'eleven_turbo_v2' if not specified.",
+ "enum": [
+ "eleven_multilingual_v2",
+ "eleven_turbo_v2",
+ "eleven_turbo_v2_5",
+ "eleven_flash_v2",
+ "eleven_flash_v2_5",
+ "eleven_monolingual_v1",
+ "eleven_v3"
+ ],
+ "example": "eleven_turbo_v2_5"
+ },
+ "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": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ },
+ "pronunciationDictionaryLocators": {
+ "description": "This is the pronunciation dictionary locators to use.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ElevenLabsPronunciationDictionaryLocator"
+ }
+ },
+ "fallbackPlan": {
+ "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/FallbackPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "WellSaidVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "wellsaid"
+ ]
+ },
+ "voiceId": {
+ "type": "string",
+ "description": "The WellSaid speaker ID to synthesize."
+ },
+ "model": {
+ "type": "string",
+ "description": "This is the model that will be used.",
+ "enum": [
+ "caruso",
+ "legacy"
+ ]
+ },
+ "enableSsml": {
+ "type": "boolean",
+ "description": "Enables limited SSML translation for input text."
+ },
+ "libraryIds": {
+ "description": "Array of library IDs to use for voice synthesis.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ },
+ "fallbackPlan": {
+ "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/FallbackPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "HumeVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "hume"
+ ]
+ },
+ "model": {
+ "type": "string",
+ "description": "This is the model that will be used.",
+ "enum": [
+ "octave",
+ "octave2"
+ ],
+ "example": "octave2"
+ },
+ "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.",
+ "example": false
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ },
+ "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').\n\nIf a Voice is specified in the request, this description serves as acting instructions.\nIf no Voice is specified, a new voice is generated based on this description."
+ },
+ "fallbackPlan": {
+ "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/FallbackPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "LMNTVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "lmnt"
+ ]
+ },
+ "voiceId": {
+ "description": "This is the provider-specific ID that will be used.",
+ "oneOf": [
+ {
+ "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": "Preset Voice Options"
+ },
+ {
+ "type": "string",
+ "title": "LMNT Voice ID"
+ }
+ ]
+ },
+ "speed": {
+ "type": "number",
+ "description": "This is the speed multiplier that will be used.",
+ "minimum": 0.25,
+ "maximum": 2,
+ "example": null
+ },
+ "language": {
+ "description": "Two letter ISO 639-1 language code. Use \"auto\" for auto-detection.",
+ "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"
+ ],
+ "example": "en",
+ "oneOf": [
+ {
+ "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": "ISO 639-1 Language Code"
+ },
+ {
+ "type": "string",
+ "enum": [
+ "auto"
+ ],
+ "title": "Auto-detect"
+ }
+ ]
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ },
+ "fallbackPlan": {
+ "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/FallbackPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "NeuphonicVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "neuphonic"
+ ]
+ },
+ "voiceId": {
+ "description": "This is the provider-specific ID that will be used.",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [],
+ "title": "Preset Voice Options"
+ },
+ {
+ "type": "string",
+ "title": "Neuphonic Voice ID"
+ }
+ ]
+ },
+ "model": {
+ "type": "string",
+ "description": "This is the model that will be used. Defaults to 'neu_fast' if not specified.",
+ "enum": [
+ "neu_hq",
+ "neu_fast"
+ ],
+ "example": "neu_fast"
+ },
+ "language": {
+ "type": "object",
+ "description": "This is the language (ISO 639-1) that is enforced for the model.",
+ "example": "en"
+ },
+ "speed": {
+ "type": "number",
+ "description": "This is the speed multiplier that will be used.",
+ "minimum": 0.25,
+ "maximum": 2,
+ "example": null
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ },
+ "fallbackPlan": {
+ "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/FallbackPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId",
+ "language"
+ ]
+ },
+ "OpenAIVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "openai"
+ ]
+ },
+ "voiceId": {
+ "description": "This is the provider-specific ID that will be used.\nPlease note that ash, ballad, coral, sage, and verse may only be used with realtime models.",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "alloy",
+ "echo",
+ "fable",
+ "onyx",
+ "nova",
+ "shimmer",
+ "marin",
+ "cedar"
+ ],
+ "title": "Preset Voice Options"
+ },
+ {
+ "type": "string",
+ "title": "OpenAI Voice ID"
+ }
+ ]
+ },
+ "model": {
+ "type": "string",
+ "description": "This is the model that will be used for text-to-speech.",
+ "enum": [
+ "tts-1",
+ "tts-1-hd",
+ "gpt-4o-mini-tts"
+ ]
+ },
+ "instructions": {
+ "type": "string",
+ "description": "This is a prompt that allows you to control the voice of your generated audio.\nDoes not work with 'tts-1' or 'tts-1-hd' models.",
+ "maxLength": 10000
+ },
+ "speed": {
+ "type": "number",
+ "description": "This is the speed multiplier that will be used.",
+ "minimum": 0.25,
+ "maximum": 4,
+ "example": null
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ },
+ "fallbackPlan": {
+ "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/FallbackPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "PlayHTVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "playht"
+ ]
+ },
+ "voiceId": {
+ "description": "This is the provider-specific ID that will be used.",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "jennifer",
+ "melissa",
+ "will",
+ "chris",
+ "matt",
+ "jack",
+ "ruby",
+ "davis",
+ "donna",
+ "michael"
+ ],
+ "title": "Preset Voice Options"
+ },
+ {
+ "type": "string",
+ "title": "PlayHT Voice ID"
+ }
+ ]
+ },
+ "speed": {
+ "type": "number",
+ "description": "This is the speed multiplier that will be used.",
+ "minimum": 0.1,
+ "maximum": 5,
+ "example": null
+ },
+ "temperature": {
+ "type": "number",
+ "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.",
+ "minimum": 0.1,
+ "maximum": 2,
+ "example": null
+ },
+ "emotion": {
+ "type": "string",
+ "description": "An emotion to be applied to the speech.",
+ "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"
+ ],
+ "example": null
+ },
+ "voiceGuidance": {
+ "type": "number",
+ "description": "A number between 1 and 6. Use lower numbers to reduce how unique your chosen voice will be compared to other voices.",
+ "minimum": 1,
+ "maximum": 6,
+ "example": null
+ },
+ "styleGuidance": {
+ "type": "number",
+ "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.",
+ "minimum": 1,
+ "maximum": 30,
+ "example": null
+ },
+ "textGuidance": {
+ "type": "number",
+ "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.",
+ "minimum": 1,
+ "maximum": 2,
+ "example": null
+ },
+ "model": {
+ "type": "string",
+ "description": "Playht voice model/engine to use.",
+ "enum": [
+ "PlayHT2.0",
+ "PlayHT2.0-turbo",
+ "Play3.0-mini",
+ "PlayDialog"
+ ]
+ },
+ "language": {
+ "type": "string",
+ "description": "The language to use for the speech.",
+ "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"
+ ]
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ },
+ "fallbackPlan": {
+ "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/FallbackPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "RimeAIVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "rime-ai"
+ ]
+ },
+ "voiceId": {
+ "description": "This is the provider-specific ID that will be used.",
+ "oneOf": [
+ {
+ "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"
+ ],
+ "title": "Suggested Voice Options",
+ "description": "Popular Rime AI voices across mist, mistv2, and arcana models. Any valid Rime AI voice ID is accepted, not just these suggestions."
+ },
+ {
+ "type": "string",
+ "title": "Any Rime AI Voice ID",
+ "description": "Any valid Rime AI voice ID. See https://docs.rime.ai/docs/voices for the full catalog."
+ }
+ ]
+ },
+ "model": {
+ "type": "string",
+ "description": "This is the model that will be used. Defaults to 'arcana' when not specified.",
+ "enum": [
+ "arcana",
+ "mistv2",
+ "mist"
+ ],
+ "example": "arcana"
+ },
+ "speed": {
+ "type": "number",
+ "description": "This is the speed multiplier that will be used.",
+ "minimum": 0.1,
+ "example": null
+ },
+ "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.",
+ "example": false
+ },
+ "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.",
+ "example": false
+ },
+ "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",
+ "example": false
+ },
+ "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",
+ "example": null
+ },
+ "language": {
+ "type": "string",
+ "description": "Language for speech synthesis. Uses ISO 639 codes. Supported: en, es, de, fr, ar, hi, ja, he, pt, ta, si.",
+ "enum": [
+ "en",
+ "es",
+ "de",
+ "fr",
+ "ar",
+ "hi",
+ "ja",
+ "he",
+ "pt",
+ "ta",
+ "si"
+ ],
+ "example": "en"
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ },
+ "fallbackPlan": {
+ "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/FallbackPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "SesameVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "sesame"
+ ]
+ },
+ "voiceId": {
+ "type": "string",
+ "description": "This is the provider-specific ID that will be used.",
+ "title": "Sesame Voice ID. This should be either a name (a built-in voice) or a UUID (a custom voice)."
+ },
+ "model": {
+ "type": "string",
+ "description": "This is the model that will be used.",
+ "enum": [
+ "csm-1b"
+ ]
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ },
+ "fallbackPlan": {
+ "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/FallbackPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId",
+ "model"
+ ]
+ },
+ "SmallestAIVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "smallest-ai"
+ ]
+ },
+ "voiceId": {
+ "description": "This is the provider-specific ID that will be used.",
+ "oneOf": [
+ {
+ "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": "Preset Voice Options"
+ },
+ {
+ "type": "string",
+ "title": "Smallest AI Voice ID"
+ }
+ ]
+ },
+ "model": {
+ "type": "string",
+ "description": "Smallest AI voice model to use. Defaults to 'lightning' when not specified.",
+ "enum": [
+ "lightning"
+ ]
+ },
+ "speed": {
+ "type": "number",
+ "description": "This is the speed multiplier that will be used.",
+ "example": null
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ },
+ "fallbackPlan": {
+ "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/FallbackPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "TavusConversationProperties": {
+ "type": "object",
+ "properties": {
+ "maxCallDuration": {
+ "type": "number",
+ "description": "The maximum duration of the call in seconds. The default `maxCallDuration` is 3600 seconds (1 hour).\nOnce the time limit specified by this parameter has been reached, the conversation will automatically shut down."
+ },
+ "participantLeftTimeout": {
+ "type": "number",
+ "description": "The duration in seconds after which the call will be automatically shut down once the last participant leaves."
+ },
+ "participantAbsentTimeout": {
+ "type": "number",
+ "description": "Starting from conversation creation, the duration in seconds after which the call will be automatically shut down if no participant joins the call.\nDefault 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.\nYou can find more instructions on displaying transcriptions if you are using your custom DailyJS components here.\nYou 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]`).\nYou 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.\nIf you are using your own TTS voice, please ensure it supports the language you provide.\nIf you are using a stock replica or default persona, please note that only ElevenLabs and Cartesia supported languages are available.\nYou 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."
+ }
+ }
+ },
+ "TavusVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "tavus"
+ ]
+ },
+ "voiceId": {
+ "description": "This is the provider-specific ID that will be used.",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "r52da2535a"
+ ],
+ "title": "Preset Voice Options"
+ },
+ {
+ "type": "string",
+ "title": "Tavus Voice ID"
+ }
+ ]
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ },
+ "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": {
+ "description": "These are optional properties used to customize the conversation.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/TavusConversationProperties"
+ }
+ ]
+ },
+ "fallbackPlan": {
+ "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/FallbackPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "VapiPronunciationDictionaryLocator": {
+ "type": "object",
+ "properties": {
+ "pronunciationDictId": {
+ "type": "string",
+ "description": "The pronunciation dictionary ID",
+ "example": "pdict_abc123"
+ },
+ "versionId": {
+ "type": "string",
+ "description": "Version ID (only required for ElevenLabs, ignored for Cartesia)",
+ "example": "ver_abc123"
+ }
+ },
+ "required": [
+ "pronunciationDictId"
+ ]
+ },
+ "VapiVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "vapi"
+ ]
+ },
+ "voiceId": {
+ "type": "string",
+ "description": "The voices provided by Vapi",
+ "enum": [
+ "Clara",
+ "Godfrey",
+ "Elliot",
+ "Savannah",
+ "Nico",
+ "Kai",
+ "Emma",
+ "Sagar",
+ "Neil",
+ "Layla",
+ "Sid",
+ "Gustavo",
+ "Kylie",
+ "Rohan",
+ "Lily",
+ "Hana",
+ "Neha",
+ "Cole",
+ "Harry",
+ "Paige",
+ "Spencer",
+ "Naina",
+ "Leah",
+ "Tara",
+ "Jess",
+ "Leo",
+ "Dan",
+ "Mia",
+ "Zac",
+ "Zoe"
+ ]
+ },
+ "version": {
+ "description": "The Vapi voice routing generation. `latest` auto-updates to the newest generation; version 1 uses legacy mappings; version 2 can use xAI-backed voices when available. When omitted, Version 1 is used. Accepts the string channel ('latest', '1', '2'); legacy numeric values (1, 2) are also accepted and coerced to their string form.",
+ "enum": [
+ "1",
+ "2",
+ "latest"
+ ],
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "1",
+ "2",
+ "latest"
+ ]
+ },
+ {
+ "type": "number",
+ "enum": [
+ 1,
+ 2
+ ]
+ }
+ ]
+ },
+ "speed": {
+ "type": "number",
+ "description": "This is the speed multiplier that will be used.\n\n@default 1",
+ "minimum": 0.25,
+ "maximum": 2,
+ "default": 1
+ },
+ "language": {
+ "type": "string",
+ "description": "Language for Vapi voice synthesis. For Version 2, omit this field or set `auto` for automatic language detection. Version 1 supports legacy Vapi language values.",
+ "enum": [
+ "en-US",
+ "en-GB",
+ "en-AU",
+ "en-CA",
+ "ja",
+ "zh",
+ "de",
+ "hi",
+ "fr-FR",
+ "fr-CA",
+ "ko",
+ "pt-BR",
+ "pt-PT",
+ "it",
+ "es-ES",
+ "es-MX",
+ "id",
+ "nl",
+ "tr",
+ "fil",
+ "pl",
+ "sv",
+ "bg",
+ "ro",
+ "ar-SA",
+ "ar-AE",
+ "cs",
+ "el",
+ "fi",
+ "hr",
+ "ms",
+ "sk",
+ "da",
+ "ta",
+ "uk",
+ "ru",
+ "hu",
+ "no",
+ "vi",
+ "auto",
+ "en",
+ "ar",
+ "ar-EG",
+ "bn",
+ "es",
+ "fr",
+ "gu",
+ "he",
+ "ka",
+ "kn",
+ "ml",
+ "mr",
+ "pa",
+ "pt",
+ "te",
+ "th",
+ "tl"
+ ]
+ },
+ "pronunciationDictionary": {
+ "description": "List of pronunciation dictionary locators for custom word pronunciations.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/VapiPronunciationDictionaryLocator"
+ }
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "InworldVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "inworld"
+ ]
+ },
+ "voiceId": {
+ "type": "string",
+ "description": "Available voices by language:\n• 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\n• zh: Yichen, Xiaoyin, Xinyi, Jing\n• nl: Erik, Katrien, Lennart, Lore\n• fr: Alain, Hélène, Mathieu, Étienne\n• de: Johanna, Josef\n• it: Gianni, Orietta\n• ja: Asuka, Satoshi\n• ko: Hyunwoo, Minji, Seojun, Yoona\n• pl: Szymon, Wojciech\n• pt: Heitor, Maitê\n• es: Diego, Lupita, Miguel, Rafael\n• ru: Svetlana, Elena, Dmitry, Nikolai\n• hi: Riya, Manoj\n• he: Yael, Oren\n• ar: Nour, Omar",
+ "maxLength": 120,
+ "title": "Inworld Voice ID",
+ "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"
+ ],
+ "example": "Alex"
+ },
+ "model": {
+ "type": "string",
+ "description": "This is the model that will be used.",
+ "enum": [
+ "inworld-tts-1"
+ ],
+ "default": "inworld-tts-1"
+ },
+ "languageCode": {
+ "type": "string",
+ "description": "Language code for Inworld TTS synthesis",
+ "default": "en",
+ "enum": [
+ "en",
+ "zh",
+ "ko",
+ "nl",
+ "fr",
+ "es",
+ "ja",
+ "de",
+ "it",
+ "pl",
+ "pt",
+ "ru",
+ "hi",
+ "he",
+ "ar"
+ ]
+ },
+ "temperature": {
+ "type": "number",
+ "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.\nHigher values will make the output more random and can lead to more expressive results. Lower values will make it more deterministic.\nSee https://docs.inworld.ai/docs/tts/capabilities/generating-audio#additional-configurations for more details.",
+ "minimum": 0.1,
+ "maximum": 2,
+ "default": 1.1,
+ "example": null
+ },
+ "speakingRate": {
+ "type": "number",
+ "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.\nValues above 0.8 are recommended for higher quality.\nSee https://docs.inworld.ai/docs/tts/capabilities/generating-audio#additional-configurations for more details.",
+ "minimum": 0.5,
+ "maximum": 1.5,
+ "default": 1,
+ "example": null
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ },
+ "fallbackPlan": {
+ "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/FallbackPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "MinimaxVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "minimax"
+ ]
+ },
+ "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.",
+ "title": "This is the Minimax Voice ID"
+ },
+ "model": {
+ "type": "string",
+ "description": "This is the model that will be used. Options are 'speech-02-hd' and 'speech-02-turbo'.\nspeech-02-hd is optimized for high-fidelity applications like voiceovers and audiobooks.\nspeech-02-turbo is designed for real-time applications with low latency.\n\n@default \"speech-02-turbo\"",
+ "enum": [
+ "speech-02-hd",
+ "speech-02-turbo",
+ "speech-2.5-turbo-preview"
+ ],
+ "example": "speech-02-turbo",
+ "default": "speech-02-turbo"
+ },
+ "emotion": {
+ "type": "string",
+ "description": "The emotion to use for the voice. If not provided, will use auto-detect mode.\nOptions include: 'happy', 'sad', 'angry', 'fearful', 'surprised', 'disgusted', 'neutral'",
+ "example": "happy"
+ },
+ "subtitleType": {
+ "type": "string",
+ "description": "Controls the granularity of subtitle/timing data returned by Minimax\nduring synthesis. Set to 'word' to receive per-word timestamps in\nassistant.speechStarted events for karaoke-style caption rendering.\n\n@default \"sentence\"",
+ "enum": [
+ "word",
+ "sentence"
+ ],
+ "default": "sentence"
+ },
+ "pitch": {
+ "type": "number",
+ "description": "Voice pitch adjustment. Range from -12 to 12 semitones.\n@default 0",
+ "minimum": -12,
+ "maximum": 12,
+ "example": 0,
+ "default": 0
+ },
+ "speed": {
+ "type": "number",
+ "description": "Voice speed adjustment. Range from 0.5 to 2.0.\n@default 1.0",
+ "minimum": 0.5,
+ "maximum": 2,
+ "example": 1,
+ "default": 1
+ },
+ "volume": {
+ "type": "number",
+ "description": "Voice volume adjustment. Range from 0.5 to 2.0.\n@default 1.0",
+ "minimum": 0.5,
+ "maximum": 2,
+ "example": 1,
+ "default": 1
+ },
+ "region": {
+ "type": "string",
+ "description": "The region for Minimax API. Defaults to \"worldwide\".",
+ "enum": [
+ "worldwide",
+ "china"
+ ],
+ "default": "worldwide"
+ },
+ "languageBoost": {
+ "type": "string",
+ "description": "Language hint for MiniMax T2A. Example: yue (Cantonese), zh (Chinese), en (English).",
+ "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"
+ ]
+ },
+ "textNormalizationEnabled": {
+ "type": "boolean",
+ "description": "Enable MiniMax text normalization to improve number reading and formatting.",
+ "default": true
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ },
+ "fallbackPlan": {
+ "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/FallbackPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "FallbackMinimaxVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "minimax"
+ ]
+ },
+ "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.",
+ "title": "This is the Minimax Voice ID"
+ },
+ "model": {
+ "type": "string",
+ "description": "This is the model that will be used. Options are 'speech-02-hd' and 'speech-02-turbo'.\nspeech-02-hd is optimized for high-fidelity applications like voiceovers and audiobooks.\nspeech-02-turbo is designed for real-time applications with low latency.\n\n@default \"speech-02-turbo\"",
+ "enum": [
+ "speech-02-hd",
+ "speech-02-turbo",
+ "speech-2.5-turbo-preview"
+ ],
+ "example": "speech-02-turbo",
+ "default": "speech-02-turbo"
+ },
+ "emotion": {
+ "type": "string",
+ "description": "The emotion to use for the voice. If not provided, will use auto-detect mode.\nOptions include: 'happy', 'sad', 'angry', 'fearful', 'surprised', 'disgusted', 'neutral'",
+ "example": "happy"
+ },
+ "subtitleType": {
+ "type": "string",
+ "description": "Controls the granularity of subtitle/timing data returned by Minimax\nduring synthesis. Set to 'word' to receive per-word timestamps in\nassistant.speechStarted events for karaoke-style caption rendering.\n\n@default \"sentence\"",
+ "enum": [
+ "word",
+ "sentence"
+ ],
+ "default": "sentence"
+ },
+ "pitch": {
+ "type": "number",
+ "description": "Voice pitch adjustment. Range from -12 to 12 semitones.\n@default 0",
+ "minimum": -12,
+ "maximum": 12,
+ "example": 0,
+ "default": 0
+ },
+ "speed": {
+ "type": "number",
+ "description": "Voice speed adjustment. Range from 0.5 to 2.0.\n@default 1.0",
+ "minimum": 0.5,
+ "maximum": 2,
+ "example": 1,
+ "default": 1
+ },
+ "volume": {
+ "type": "number",
+ "description": "Voice volume adjustment. Range from 0.5 to 2.0.\n@default 1.0",
+ "minimum": 0.5,
+ "maximum": 2,
+ "example": 1,
+ "default": 1
+ },
+ "region": {
+ "type": "string",
+ "description": "The region for Minimax API. Defaults to \"worldwide\".",
+ "enum": [
+ "worldwide",
+ "china"
+ ],
+ "default": "worldwide"
+ },
+ "languageBoost": {
+ "type": "string",
+ "description": "Language hint for MiniMax T2A. Example: yue (Cantonese), zh (Chinese), en (English).",
+ "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"
+ ]
+ },
+ "textNormalizationEnabled": {
+ "type": "boolean",
+ "description": "Enable MiniMax text normalization to improve number reading and formatting.",
+ "default": true
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "FallbackWellSaidVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "wellsaid"
+ ]
+ },
+ "voiceId": {
+ "type": "string",
+ "description": "The WellSaid speaker ID to synthesize."
+ },
+ "model": {
+ "type": "string",
+ "description": "This is the model that will be used.",
+ "enum": [
+ "caruso",
+ "legacy"
+ ]
+ },
+ "enableSsml": {
+ "type": "boolean",
+ "description": "Enables limited SSML translation for input text."
+ },
+ "libraryIds": {
+ "description": "Array of library IDs to use for voice synthesis.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "XaiVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "xai"
+ ]
+ },
+ "voiceId": {
+ "type": "string",
+ "description": "Built-in voices: eve, ara, rex, sal, leo. Cloned voice IDs are also accepted.",
+ "maxLength": 120,
+ "title": "xAI Voice ID",
+ "enum": [
+ "eve",
+ "ara",
+ "rex",
+ "sal",
+ "leo"
+ ],
+ "example": "eve"
+ },
+ "language": {
+ "type": "string",
+ "description": "BCP-47 language code for xAI TTS synthesis.",
+ "enum": [
+ "auto",
+ "en",
+ "ar-EG",
+ "ar-SA",
+ "ar-AE",
+ "bn",
+ "zh",
+ "fr",
+ "de",
+ "hi",
+ "id",
+ "it",
+ "ja",
+ "ko",
+ "pt-BR",
+ "pt-PT",
+ "ru",
+ "es-MX",
+ "es-ES",
+ "tr",
+ "vi"
+ ],
+ "default": "en"
+ },
+ "speed": {
+ "type": "number",
+ "description": "Speed multiplier for xAI TTS synthesis.",
+ "minimum": 0.7,
+ "maximum": 1.5,
+ "default": 1.1
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ },
+ "fallbackPlan": {
+ "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/FallbackPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "MicrosoftVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "microsoft"
+ ]
+ },
+ "voiceId": {
+ "type": "string",
+ "description": "MAI-Voice-2 voice ID. Built-in voices listed in enum.",
+ "enum": [
+ "de-DE-Klaus:MAI-Voice-2",
+ "de-DE-Mia:MAI-Voice-2",
+ "en-AU-Lisa:MAI-Voice-2",
+ "en-US-Ethan:MAI-Voice-2",
+ "en-US-Grant:MAI-Voice-2",
+ "en-US-Harper:MAI-Voice-2",
+ "en-US-Iris:MAI-Voice-2",
+ "en-US-Jasper:MAI-Voice-2",
+ "en-US-Olivia:MAI-Voice-2",
+ "es-ES-Marta:MAI-Voice-2",
+ "es-MX-Alejo:MAI-Voice-2",
+ "es-MX-Valeria:MAI-Voice-2",
+ "fr-FR-Marc:MAI-Voice-2",
+ "fr-FR-Soleil:MAI-Voice-2",
+ "hi-IN-Arjun:MAI-Voice-2",
+ "hi-IN-Dhruv:MAI-Voice-2",
+ "hi-IN-Kavya:MAI-Voice-2",
+ "hi-IN-Priya:MAI-Voice-2",
+ "hu-HU-Bence:MAI-Voice-2",
+ "hu-HU-Levente:MAI-Voice-2",
+ "hu-HU-Lilla:MAI-Voice-2",
+ "hu-HU-Réka:MAI-Voice-2",
+ "it-IT-Luca:MAI-Voice-2",
+ "it-IT-Rosa:MAI-Voice-2",
+ "ko-KR-Hana:MAI-Voice-2",
+ "ko-KR-Junho:MAI-Voice-2",
+ "nl-NL-Fleur:MAI-Voice-2",
+ "nl-NL-Sander:MAI-Voice-2",
+ "pt-BR-Caio:MAI-Voice-2",
+ "pt-BR-Luana:MAI-Voice-2",
+ "pt-BR-Pedro:MAI-Voice-2",
+ "pt-BR-Rafael:MAI-Voice-2",
+ "pt-PT-Rui:MAI-Voice-2",
+ "ro-RO-Andrei:MAI-Voice-2",
+ "ro-RO-Elena:MAI-Voice-2",
+ "ro-RO-Ioana:MAI-Voice-2",
+ "ro-RO-Radu:MAI-Voice-2",
+ "ru-RU-Lev:MAI-Voice-2",
+ "ru-RU-Masha:MAI-Voice-2",
+ "th-TH-Krit:MAI-Voice-2",
+ "th-TH-Nattapong:MAI-Voice-2",
+ "tr-TR-Aydin:MAI-Voice-2",
+ "tr-TR-Elif:MAI-Voice-2",
+ "zh-CN-Bo:MAI-Voice-2",
+ "zh-CN-Lan:MAI-Voice-2",
+ "zh-CN-Mei:MAI-Voice-2"
+ ],
+ "example": "en-US-Ethan:MAI-Voice-2"
+ },
+ "style": {
+ "type": "string",
+ "description": "Speaking style applied via mstts:express-as on every request. Unknown styles are ignored by Azure and fall back to neutral.",
+ "enum": [
+ "adventurous",
+ "angry",
+ "caring",
+ "cheerful",
+ "confused",
+ "curious",
+ "determined",
+ "disappointed",
+ "disgusted",
+ "embarrassed",
+ "empathy",
+ "encouraging",
+ "excited",
+ "fearful",
+ "friendly",
+ "happy",
+ "hopeful",
+ "jealous",
+ "joyful",
+ "nostalgic",
+ "reflective",
+ "regretful",
+ "relieved",
+ "sad",
+ "serious",
+ "shouting",
+ "softvoice",
+ "surprised",
+ "whispering"
+ ],
+ "example": "happy"
+ },
+ "styleDegree": {
+ "type": "number",
+ "description": "Style intensity (0.01–2). Default 1 = the predefined style strength. Only applies when `style` is set.",
+ "minimum": 0.01,
+ "maximum": 2,
+ "default": 1
+ },
+ "role": {
+ "type": "string",
+ "description": "Role-play (age/gender imitation). Requires `style` to be set; ignored otherwise.",
+ "enum": [
+ "Girl",
+ "Boy",
+ "YoungAdultFemale",
+ "YoungAdultMale",
+ "OlderAdultFemale",
+ "OlderAdultMale",
+ "SeniorFemale",
+ "SeniorMale"
+ ],
+ "example": "YoungAdultFemale"
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ },
+ "speed": {
+ "type": "number",
+ "description": "This is the speed multiplier that will be used.",
+ "minimum": 0.5,
+ "maximum": 2
+ },
+ "fallbackPlan": {
+ "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/FallbackPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "FallbackAzureVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "azure"
+ ]
+ },
+ "voiceId": {
+ "description": "This is the provider-specific ID that will be used.",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "andrew",
+ "brian",
+ "emma"
+ ],
+ "title": "Preset Voice Options"
+ },
+ {
+ "type": "string",
+ "title": "Azure Voice ID"
+ }
+ ]
+ },
+ "speed": {
+ "type": "number",
+ "description": "This is the speed multiplier that will be used.",
+ "minimum": 0.5,
+ "maximum": 2
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "FallbackCartesiaVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "cartesia"
+ ]
+ },
+ "voiceId": {
+ "type": "string",
+ "description": "The ID of the particular voice you want to use."
+ },
+ "model": {
+ "type": "string",
+ "description": "This is the model that will be used. This is optional and will default to the correct model for the voiceId.",
+ "enum": [
+ "sonic-3.5",
+ "sonic-3.5-2026-05-04",
+ "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"
+ ],
+ "example": "sonic-english"
+ },
+ "language": {
+ "type": "string",
+ "description": "This is the language that will be used. This is optional and will default to the correct language for the voiceId.",
+ "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"
+ ],
+ "example": "en"
+ },
+ "experimentalControls": {
+ "description": "Experimental controls for Cartesia voice generation",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/CartesiaExperimentalControls"
+ }
+ ]
+ },
+ "generationConfig": {
+ "description": "Generation config for fine-grained control of sonic-3 voice output (speed, volume, and experimental controls). Only available for sonic-3 model.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/CartesiaGenerationConfig"
+ }
+ ]
+ },
+ "pronunciationDictId": {
+ "type": "string",
+ "description": "Pronunciation dictionary ID for sonic-3. Allows custom pronunciations for specific words. Only available for sonic-3 model.",
+ "example": "dict_abc123"
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "FallbackCustomVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used. Use `custom-voice` for providers that are not natively supported.",
+ "enum": [
+ "custom-voice"
+ ]
+ },
+ "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": {
+ "description": "This is where the voice request will be sent.\n\nRequest Example:\n\nPOST https://{server.url}\nContent-Type: application/json\n\n{\n \"message\": {\n \"type\": \"voice-request\",\n \"text\": \"Hello, world!\",\n \"sampleRate\": 24000,\n ...other metadata about the call...\n }\n}\n\nResponse 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:\n```\nresponse.on('data', (chunk: Buffer) => {\n outputStream.write(chunk);\n});\n```",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Server"
+ }
+ ]
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "server"
+ ]
+ },
+ "FallbackDeepgramVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "deepgram"
+ ]
+ },
+ "voiceId": {
+ "type": "string",
+ "description": "This is the provider-specific ID that will be used.",
+ "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"
+ ],
+ "title": "This is the Deepgram Voice ID"
+ },
+ "model": {
+ "type": "string",
+ "description": "This is the model that will be used. Defaults to 'aura-2' when not specified.",
+ "enum": [
+ "aura",
+ "aura-2"
+ ],
+ "example": "aura-2"
+ },
+ "mipOptOut": {
+ "type": "boolean",
+ "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\n\nThis will only be used if you are using your own Deepgram API key.\n\n@default false",
+ "example": false,
+ "default": false
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "FallbackElevenLabsVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "11labs"
+ ]
+ },
+ "voiceId": {
+ "description": "This is the provider-specific ID that will be used. Ensure the Voice is present in your 11Labs Voice Library.",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "burt",
+ "marissa",
+ "andrea",
+ "sarah",
+ "phillip",
+ "steve",
+ "joseph",
+ "myra",
+ "paula",
+ "ryan",
+ "drew",
+ "paul",
+ "mrb",
+ "matilda",
+ "mark"
+ ],
+ "title": "Preset Voice Options"
+ },
+ {
+ "type": "string",
+ "title": "11Labs Voice ID"
+ }
+ ]
+ },
+ "stability": {
+ "type": "number",
+ "description": "Defines the stability for voice settings.",
+ "minimum": 0,
+ "maximum": 1,
+ "example": 0.5
+ },
+ "similarityBoost": {
+ "type": "number",
+ "description": "Defines the similarity boost for voice settings.",
+ "minimum": 0,
+ "maximum": 1,
+ "example": 0.75
+ },
+ "style": {
+ "type": "number",
+ "description": "Defines the style for voice settings.",
+ "minimum": 0,
+ "maximum": 1,
+ "example": 0
+ },
+ "useSpeakerBoost": {
+ "type": "boolean",
+ "description": "Defines the use speaker boost for voice settings.",
+ "example": false
+ },
+ "speed": {
+ "type": "number",
+ "description": "Defines the speed for voice settings.",
+ "minimum": 0.7,
+ "maximum": 1.2,
+ "example": 0.9
+ },
+ "optimizeStreamingLatency": {
+ "type": "number",
+ "description": "Defines the optimize streaming latency for voice settings. Defaults to 3.",
+ "minimum": 0,
+ "maximum": 4,
+ "example": 3
+ },
+ "enableSsmlParsing": {
+ "type": "boolean",
+ "description": "This enables the use of https://elevenlabs.io/docs/speech-synthesis/prompting#pronunciation. Defaults to false to save latency.\n\n@default false",
+ "example": false
+ },
+ "autoMode": {
+ "type": "boolean",
+ "description": "Defines the auto mode for voice settings. Defaults to false.",
+ "example": false
+ },
+ "model": {
+ "type": "string",
+ "description": "This is the model that will be used. Defaults to 'eleven_turbo_v2' if not specified.",
+ "enum": [
+ "eleven_multilingual_v2",
+ "eleven_turbo_v2",
+ "eleven_turbo_v2_5",
+ "eleven_flash_v2",
+ "eleven_flash_v2_5",
+ "eleven_monolingual_v1",
+ "eleven_v3"
+ ],
+ "example": "eleven_turbo_v2_5"
+ },
+ "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": {
+ "description": "This is the pronunciation dictionary locators to use.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ElevenLabsPronunciationDictionaryLocator"
+ }
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "FallbackHumeVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "hume"
+ ]
+ },
+ "model": {
+ "type": "string",
+ "description": "This is the model that will be used.",
+ "enum": [
+ "octave",
+ "octave2"
+ ],
+ "example": "octave2"
+ },
+ "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.",
+ "example": false
+ },
+ "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').\n\nIf a Voice is specified in the request, this description serves as acting instructions.\nIf no Voice is specified, a new voice is generated based on this description."
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "FallbackLMNTVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "lmnt"
+ ]
+ },
+ "voiceId": {
+ "description": "This is the provider-specific ID that will be used.",
+ "oneOf": [
+ {
+ "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": "Preset Voice Options"
+ },
+ {
+ "type": "string",
+ "title": "LMNT Voice ID"
+ }
+ ]
+ },
+ "speed": {
+ "type": "number",
+ "description": "This is the speed multiplier that will be used.",
+ "minimum": 0.25,
+ "maximum": 2,
+ "example": null
+ },
+ "language": {
+ "description": "Two letter ISO 639-1 language code. Use \"auto\" for auto-detection.",
+ "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",
@@ -21779,252 +27013,896 @@
"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"
+ "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"
+ ],
+ "example": "en",
+ "oneOf": [
+ {
+ "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": "ISO 639-1 Language Code"
+ },
+ {
+ "type": "string",
+ "enum": [
+ "auto"
+ ],
+ "title": "Auto-detect"
+ }
+ ]
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "FallbackNeuphonicVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "neuphonic"
+ ]
+ },
+ "voiceId": {
+ "description": "This is the provider-specific ID that will be used.",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [],
+ "title": "Preset Voice Options"
+ },
+ {
+ "type": "string",
+ "title": "Neuphonic Voice ID"
+ }
+ ]
+ },
+ "model": {
+ "type": "string",
+ "description": "This is the model that will be used. Defaults to 'neu_fast' if not specified.",
+ "enum": [
+ "neu_hq",
+ "neu_fast"
+ ],
+ "example": "neu_fast"
+ },
+ "language": {
+ "type": "object",
+ "description": "This is the language (ISO 639-1) that is enforced for the model.",
+ "example": "en"
+ },
+ "speed": {
+ "type": "number",
+ "description": "This is the speed multiplier that will be used.",
+ "minimum": 0.25,
+ "maximum": 2,
+ "example": null
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId",
+ "language"
+ ]
+ },
+ "FallbackOpenAIVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "openai"
+ ]
+ },
+ "voiceId": {
+ "description": "This is the provider-specific ID that will be used.\nPlease note that ash, ballad, coral, sage, and verse may only be used with realtime models.",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "alloy",
+ "echo",
+ "fable",
+ "onyx",
+ "nova",
+ "shimmer",
+ "marin",
+ "cedar"
+ ],
+ "title": "Preset Voice Options"
+ },
+ {
+ "type": "string",
+ "title": "OpenAI Voice ID"
+ }
+ ]
+ },
+ "model": {
+ "type": "string",
+ "description": "This is the model that will be used for text-to-speech.",
+ "enum": [
+ "tts-1",
+ "tts-1-hd",
+ "gpt-4o-mini-tts"
+ ]
+ },
+ "instructions": {
+ "type": "string",
+ "description": "This is a prompt that allows you to control the voice of your generated audio.\nDoes not work with 'tts-1' or 'tts-1-hd' models.",
+ "maxLength": 10000
+ },
+ "speed": {
+ "type": "number",
+ "description": "This is the speed multiplier that will be used.",
+ "minimum": 0.25,
+ "maximum": 4,
+ "example": null
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "FallbackPlayHTVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "playht"
+ ]
+ },
+ "voiceId": {
+ "description": "This is the provider-specific ID that will be used.",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "jennifer",
+ "melissa",
+ "will",
+ "chris",
+ "matt",
+ "jack",
+ "ruby",
+ "davis",
+ "donna",
+ "michael"
+ ],
+ "title": "Preset Voice Options"
+ },
+ {
+ "type": "string",
+ "title": "PlayHT Voice ID"
+ }
+ ]
+ },
+ "speed": {
+ "type": "number",
+ "description": "This is the speed multiplier that will be used.",
+ "minimum": 0.1,
+ "maximum": 5,
+ "example": null
+ },
+ "temperature": {
+ "type": "number",
+ "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.",
+ "minimum": 0.1,
+ "maximum": 2,
+ "example": null
+ },
+ "emotion": {
+ "type": "string",
+ "description": "An emotion to be applied to the speech.",
+ "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"
+ ],
+ "example": null
+ },
+ "voiceGuidance": {
+ "type": "number",
+ "description": "A number between 1 and 6. Use lower numbers to reduce how unique your chosen voice will be compared to other voices.",
+ "minimum": 1,
+ "maximum": 6,
+ "example": null
+ },
+ "styleGuidance": {
+ "type": "number",
+ "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.",
+ "minimum": 1,
+ "maximum": 30,
+ "example": null
+ },
+ "textGuidance": {
+ "type": "number",
+ "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.",
+ "minimum": 1,
+ "maximum": 2,
+ "example": null
+ },
+ "model": {
+ "type": "string",
+ "description": "Playht voice model/engine to use.",
+ "enum": [
+ "PlayHT2.0",
+ "PlayHT2.0-turbo",
+ "Play3.0-mini",
+ "PlayDialog"
+ ]
+ },
+ "language": {
+ "type": "string",
+ "description": "The language to use for the speech.",
+ "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"
+ ]
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "FallbackRimeAIVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "rime-ai"
+ ]
+ },
+ "voiceId": {
+ "description": "This is the provider-specific ID that will be used.",
+ "oneOf": [
+ {
+ "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"
+ ],
+ "title": "Suggested Voice Options",
+ "description": "Popular Rime AI voices across mist, mistv2, and arcana models. Any valid Rime AI voice ID is accepted, not just these suggestions."
+ },
+ {
+ "type": "string",
+ "title": "Any Rime AI Voice ID",
+ "description": "Any valid Rime AI voice ID. See https://docs.rime.ai/docs/voices for the full catalog."
+ }
+ ]
+ },
+ "model": {
+ "type": "string",
+ "description": "This is the model that will be used. Defaults to 'arcana' when not specified.",
+ "enum": [
+ "arcana",
+ "mistv2",
+ "mist"
+ ],
+ "example": "arcana"
+ },
+ "speed": {
+ "type": "number",
+ "description": "This is the speed multiplier that will be used.",
+ "minimum": 0.1,
+ "example": null
+ },
+ "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.",
+ "example": false
+ },
+ "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.",
+ "example": false
+ },
+ "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",
+ "example": false
+ },
+ "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",
+ "example": null
+ },
+ "language": {
+ "type": "string",
+ "description": "Language for speech synthesis. Uses ISO 639 codes. Supported: en, es, de, fr, ar, hi, ja, he, pt, ta, si.",
+ "enum": [
+ "en",
+ "es",
+ "de",
+ "fr",
+ "ar",
+ "hi",
+ "ja",
+ "he",
+ "pt",
+ "ta",
+ "si"
],
- "example": "en",
+ "example": "en"
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "FallbackSesameVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "sesame"
+ ]
+ },
+ "voiceId": {
+ "type": "string",
+ "description": "This is the provider-specific ID that will be used.",
+ "title": "Sesame Voice ID. This should be either a name (a built-in voice) or a UUID (a custom voice)."
+ },
+ "model": {
+ "type": "string",
+ "description": "This is the model that will be used.",
+ "enum": [
+ "csm-1b"
+ ]
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId",
+ "model"
+ ]
+ },
+ "FallbackSmallestAIVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "smallest-ai"
+ ]
+ },
+ "voiceId": {
+ "description": "This is the provider-specific ID that will be used.",
"oneOf": [
{
"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"
+ "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": "ISO 639-1 Language Code"
+ "title": "Preset Voice Options"
},
+ {
+ "type": "string",
+ "title": "Smallest AI Voice ID"
+ }
+ ]
+ },
+ "model": {
+ "type": "string",
+ "description": "Smallest AI voice model to use. Defaults to 'lightning' when not specified.",
+ "enum": [
+ "lightning"
+ ]
+ },
+ "speed": {
+ "type": "number",
+ "description": "This is the speed multiplier that will be used.",
+ "example": null
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "FallbackTavusVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "tavus"
+ ]
+ },
+ "voiceId": {
+ "description": "This is the provider-specific ID that will be used.",
+ "oneOf": [
{
"type": "string",
"enum": [
- "auto"
+ "r52da2535a"
],
- "title": "Auto-detect"
+ "title": "Preset Voice Options"
+ },
+ {
+ "type": "string",
+ "title": "Tavus Voice ID"
}
]
},
- "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": {
+ "description": "These are optional properties used to customize the conversation.",
"allOf": [
{
- "$ref": "#/components/schemas/ChunkPlan"
+ "$ref": "#/components/schemas/TavusConversationProperties"
}
]
},
- "fallbackPlan": {
- "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
"allOf": [
{
- "$ref": "#/components/schemas/FallbackPlan"
+ "$ref": "#/components/schemas/ChunkPlan"
}
]
}
@@ -22034,7 +27912,7 @@
"voiceId"
]
},
- "NeuphonicVoice": {
+ "FallbackVapiVoice": {
"type": "object",
"properties": {
"cachingEnabled": {
@@ -22047,42 +27925,295 @@
"type": "string",
"description": "This is the voice provider that will be used.",
"enum": [
- "neuphonic"
+ "vapi"
]
},
"voiceId": {
- "description": "This is the provider-specific ID that will be used.",
+ "type": "string",
+ "description": "The voices provided by Vapi",
+ "enum": [
+ "Clara",
+ "Godfrey",
+ "Elliot",
+ "Savannah",
+ "Nico",
+ "Kai",
+ "Emma",
+ "Sagar",
+ "Neil",
+ "Layla",
+ "Sid",
+ "Gustavo",
+ "Kylie",
+ "Rohan",
+ "Lily",
+ "Hana",
+ "Neha",
+ "Cole",
+ "Harry",
+ "Paige",
+ "Spencer",
+ "Naina",
+ "Leah",
+ "Tara",
+ "Jess",
+ "Leo",
+ "Dan",
+ "Mia",
+ "Zac",
+ "Zoe"
+ ]
+ },
+ "version": {
+ "description": "The Vapi voice routing generation. `latest` auto-updates to the newest generation; version 1 uses legacy mappings; version 2 can use xAI-backed voices when available. When omitted, Version 1 is used. Accepts the string channel ('latest', '1', '2'); legacy numeric values (1, 2) are also accepted and coerced to their string form.",
+ "enum": [
+ "1",
+ "2",
+ "latest"
+ ],
"oneOf": [
{
"type": "string",
- "enum": [],
- "title": "Preset Voice Options"
+ "enum": [
+ "1",
+ "2",
+ "latest"
+ ]
},
{
- "type": "string",
- "title": "Neuphonic Voice ID"
+ "type": "number",
+ "enum": [
+ 1,
+ 2
+ ]
+ }
+ ]
+ },
+ "speed": {
+ "type": "number",
+ "description": "This is the speed multiplier that will be used.\n\n@default 1",
+ "minimum": 0.25,
+ "maximum": 2,
+ "default": 1
+ },
+ "language": {
+ "type": "string",
+ "description": "Language for Vapi voice synthesis. For Version 2, omit this field or set `auto` for automatic language detection. Version 1 supports legacy Vapi language values.",
+ "enum": [
+ "en-US",
+ "en-GB",
+ "en-AU",
+ "en-CA",
+ "ja",
+ "zh",
+ "de",
+ "hi",
+ "fr-FR",
+ "fr-CA",
+ "ko",
+ "pt-BR",
+ "pt-PT",
+ "it",
+ "es-ES",
+ "es-MX",
+ "id",
+ "nl",
+ "tr",
+ "fil",
+ "pl",
+ "sv",
+ "bg",
+ "ro",
+ "ar-SA",
+ "ar-AE",
+ "cs",
+ "el",
+ "fi",
+ "hr",
+ "ms",
+ "sk",
+ "da",
+ "ta",
+ "uk",
+ "ru",
+ "hu",
+ "no",
+ "vi",
+ "auto",
+ "en",
+ "ar",
+ "ar-EG",
+ "bn",
+ "es",
+ "fr",
+ "gu",
+ "he",
+ "ka",
+ "kn",
+ "ml",
+ "mr",
+ "pa",
+ "pt",
+ "te",
+ "th",
+ "tl"
+ ]
+ },
+ "pronunciationDictionary": {
+ "description": "List of pronunciation dictionary locators for custom word pronunciations.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/VapiPronunciationDictionaryLocator"
+ }
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
}
]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "FallbackInworldVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "inworld"
+ ]
+ },
+ "voiceId": {
+ "type": "string",
+ "description": "Available voices by language:\n• 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\n• zh: Yichen, Xiaoyin, Xinyi, Jing\n• nl: Erik, Katrien, Lennart, Lore\n• fr: Alain, Hélène, Mathieu, Étienne\n• de: Johanna, Josef\n• it: Gianni, Orietta\n• ja: Asuka, Satoshi\n• ko: Hyunwoo, Minji, Seojun, Yoona\n• pl: Szymon, Wojciech\n• pt: Heitor, Maitê\n• es: Diego, Lupita, Miguel, Rafael\n• ru: Svetlana, Elena, Dmitry, Nikolai\n• hi: Riya, Manoj\n• he: Yael, Oren\n• ar: Nour, Omar",
+ "maxLength": 120,
+ "title": "Inworld Voice ID",
+ "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"
+ ],
+ "example": "Alex"
},
"model": {
"type": "string",
- "description": "This is the model that will be used. Defaults to 'neu_fast' if not specified.",
+ "description": "This is the model that will be used.",
"enum": [
- "neu_hq",
- "neu_fast"
+ "inworld-tts-1"
],
- "example": "neu_fast"
+ "default": "inworld-tts-1"
},
- "language": {
- "type": "object",
- "description": "This is the language (ISO 639-1) that is enforced for the model.",
- "example": "en"
+ "languageCode": {
+ "type": "string",
+ "description": "Language code for Inworld TTS synthesis",
+ "default": "en",
+ "enum": [
+ "en",
+ "zh",
+ "ko",
+ "nl",
+ "fr",
+ "es",
+ "ja",
+ "de",
+ "it",
+ "pl",
+ "pt",
+ "ru",
+ "hi",
+ "he",
+ "ar"
+ ]
},
- "speed": {
+ "temperature": {
"type": "number",
- "description": "This is the speed multiplier that will be used.",
- "minimum": 0.25,
+ "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.\nHigher values will make the output more random and can lead to more expressive results. Lower values will make it more deterministic.\nSee https://docs.inworld.ai/docs/tts/capabilities/generating-audio#additional-configurations for more details.",
+ "minimum": 0.1,
"maximum": 2,
+ "default": 1.1,
+ "example": null
+ },
+ "speakingRate": {
+ "type": "number",
+ "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.\nValues above 0.8 are recommended for higher quality.\nSee https://docs.inworld.ai/docs/tts/capabilities/generating-audio#additional-configurations for more details.",
+ "minimum": 0.5,
+ "maximum": 1.5,
+ "default": 1,
"example": null
},
"chunkPlan": {
@@ -22092,5111 +28223,6044 @@
"$ref": "#/components/schemas/ChunkPlan"
}
]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "FallbackXaiVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "xai"
+ ]
},
- "fallbackPlan": {
- "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
+ "voiceId": {
+ "type": "string",
+ "description": "Built-in voices: eve, ara, rex, sal, leo. Cloned voice IDs are also accepted.",
+ "maxLength": 120,
+ "title": "xAI Voice ID",
+ "enum": [
+ "eve",
+ "ara",
+ "rex",
+ "sal",
+ "leo"
+ ],
+ "example": "eve"
+ },
+ "language": {
+ "type": "string",
+ "description": "BCP-47 language code for xAI TTS synthesis.",
+ "enum": [
+ "auto",
+ "en",
+ "ar-EG",
+ "ar-SA",
+ "ar-AE",
+ "bn",
+ "zh",
+ "fr",
+ "de",
+ "hi",
+ "id",
+ "it",
+ "ja",
+ "ko",
+ "pt-BR",
+ "pt-PT",
+ "ru",
+ "es-MX",
+ "es-ES",
+ "tr",
+ "vi"
+ ],
+ "default": "en"
+ },
+ "speed": {
+ "type": "number",
+ "description": "Speed multiplier for xAI TTS synthesis.",
+ "minimum": 0.7,
+ "maximum": 1.5,
+ "default": 1.1
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
"allOf": [
{
- "$ref": "#/components/schemas/FallbackPlan"
+ "$ref": "#/components/schemas/ChunkPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "voiceId"
+ ]
+ },
+ "FallbackMicrosoftVoice": {
+ "type": "object",
+ "properties": {
+ "cachingEnabled": {
+ "type": "boolean",
+ "description": "This is the flag to toggle voice caching for the assistant.",
+ "example": true,
+ "default": true
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the voice provider that will be used.",
+ "enum": [
+ "microsoft"
+ ]
+ },
+ "voiceId": {
+ "type": "string",
+ "description": "MAI-Voice-2 voice ID. Built-in voices listed in enum.",
+ "enum": [
+ "de-DE-Klaus:MAI-Voice-2",
+ "de-DE-Mia:MAI-Voice-2",
+ "en-AU-Lisa:MAI-Voice-2",
+ "en-US-Ethan:MAI-Voice-2",
+ "en-US-Grant:MAI-Voice-2",
+ "en-US-Harper:MAI-Voice-2",
+ "en-US-Iris:MAI-Voice-2",
+ "en-US-Jasper:MAI-Voice-2",
+ "en-US-Olivia:MAI-Voice-2",
+ "es-ES-Marta:MAI-Voice-2",
+ "es-MX-Alejo:MAI-Voice-2",
+ "es-MX-Valeria:MAI-Voice-2",
+ "fr-FR-Marc:MAI-Voice-2",
+ "fr-FR-Soleil:MAI-Voice-2",
+ "hi-IN-Arjun:MAI-Voice-2",
+ "hi-IN-Dhruv:MAI-Voice-2",
+ "hi-IN-Kavya:MAI-Voice-2",
+ "hi-IN-Priya:MAI-Voice-2",
+ "hu-HU-Bence:MAI-Voice-2",
+ "hu-HU-Levente:MAI-Voice-2",
+ "hu-HU-Lilla:MAI-Voice-2",
+ "hu-HU-Réka:MAI-Voice-2",
+ "it-IT-Luca:MAI-Voice-2",
+ "it-IT-Rosa:MAI-Voice-2",
+ "ko-KR-Hana:MAI-Voice-2",
+ "ko-KR-Junho:MAI-Voice-2",
+ "nl-NL-Fleur:MAI-Voice-2",
+ "nl-NL-Sander:MAI-Voice-2",
+ "pt-BR-Caio:MAI-Voice-2",
+ "pt-BR-Luana:MAI-Voice-2",
+ "pt-BR-Pedro:MAI-Voice-2",
+ "pt-BR-Rafael:MAI-Voice-2",
+ "pt-PT-Rui:MAI-Voice-2",
+ "ro-RO-Andrei:MAI-Voice-2",
+ "ro-RO-Elena:MAI-Voice-2",
+ "ro-RO-Ioana:MAI-Voice-2",
+ "ro-RO-Radu:MAI-Voice-2",
+ "ru-RU-Lev:MAI-Voice-2",
+ "ru-RU-Masha:MAI-Voice-2",
+ "th-TH-Krit:MAI-Voice-2",
+ "th-TH-Nattapong:MAI-Voice-2",
+ "tr-TR-Aydin:MAI-Voice-2",
+ "tr-TR-Elif:MAI-Voice-2",
+ "zh-CN-Bo:MAI-Voice-2",
+ "zh-CN-Lan:MAI-Voice-2",
+ "zh-CN-Mei:MAI-Voice-2"
+ ],
+ "example": "en-US-Ethan:MAI-Voice-2"
+ },
+ "style": {
+ "type": "string",
+ "description": "Speaking style applied via mstts:express-as on every request. Unknown styles are ignored by Azure and fall back to neutral.",
+ "enum": [
+ "adventurous",
+ "angry",
+ "caring",
+ "cheerful",
+ "confused",
+ "curious",
+ "determined",
+ "disappointed",
+ "disgusted",
+ "embarrassed",
+ "empathy",
+ "encouraging",
+ "excited",
+ "fearful",
+ "friendly",
+ "happy",
+ "hopeful",
+ "jealous",
+ "joyful",
+ "nostalgic",
+ "reflective",
+ "regretful",
+ "relieved",
+ "sad",
+ "serious",
+ "shouting",
+ "softvoice",
+ "surprised",
+ "whispering"
+ ],
+ "example": "happy"
+ },
+ "styleDegree": {
+ "type": "number",
+ "description": "Style intensity (0.01–2). Default 1 = the predefined style strength. Only applies when `style` is set.",
+ "minimum": 0.01,
+ "maximum": 2,
+ "default": 1
+ },
+ "role": {
+ "type": "string",
+ "description": "Role-play (age/gender imitation). Requires `style` to be set; ignored otherwise.",
+ "enum": [
+ "Girl",
+ "Boy",
+ "YoungAdultFemale",
+ "YoungAdultMale",
+ "OlderAdultFemale",
+ "OlderAdultMale",
+ "SeniorFemale",
+ "SeniorMale"
+ ],
+ "example": "YoungAdultFemale"
+ },
+ "speed": {
+ "type": "number",
+ "description": "This is the speed multiplier that will be used.",
+ "minimum": 0.5,
+ "maximum": 2
+ },
+ "chunkPlan": {
+ "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ChunkPlan"
}
]
}
},
"required": [
"provider",
- "voiceId",
- "language"
+ "voiceId"
+ ]
+ },
+ "TransportConfigurationTwilio": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "twilio"
+ ]
+ },
+ "timeout": {
+ "type": "number",
+ "description": "The integer number of seconds that we should allow the phone to ring before assuming there is no answer.\nThe default is `60` seconds and the maximum is `600` seconds.\nFor some call flows, we will add a 5-second buffer to the timeout value you provide.\nFor this reason, a timeout value of 10 seconds could result in an actual timeout closer to 15 seconds.\nYou can set this to a short time, such as `15` seconds, to hang up before reaching an answering machine or voicemail.\n\n@default 60",
+ "minimum": 1,
+ "maximum": 600,
+ "example": 60
+ },
+ "record": {
+ "type": "boolean",
+ "description": "Whether to record the call.\nCan be `true` to record the phone call, or `false` to not.\nThe default is `false`.\n\n@default false",
+ "example": false
+ },
+ "recordingChannels": {
+ "type": "string",
+ "description": "The number of channels in the final recording.\nCan be: `mono` or `dual`.\nThe default is `mono`.\n`mono` records both legs of the call in a single channel of the recording file.\n`dual` records each leg to a separate channel of the recording file.\nThe first channel of a dual-channel recording contains the parent call and the second channel contains the child call.\n\n@default 'mono'",
+ "enum": [
+ "mono",
+ "dual"
+ ],
+ "example": "mono"
+ }
+ },
+ "required": [
+ "provider"
+ ]
+ },
+ "CreateAnthropicCredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "anthropic"
+ ]
+ },
+ "apiKey": {
+ "type": "string",
+ "maxLength": 10000,
+ "description": "This is not returned in the API."
+ },
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ },
+ "required": [
+ "provider",
+ "apiKey"
]
},
- "OpenAIVoice": {
+ "CreateAnthropicBedrockCredentialDTO": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
"provider": {
"type": "string",
- "description": "This is the voice provider that will be used.",
"enum": [
- "openai"
+ "anthropic-bedrock"
]
},
- "voiceId": {
- "description": "This is the provider-specific ID that will be used.\nPlease note that ash, ballad, coral, sage, and verse may only be used with realtime models.",
+ "region": {
+ "type": "string",
+ "description": "AWS region where Bedrock is configured.",
+ "enum": [
+ "us-east-1",
+ "us-west-2",
+ "eu-central-1",
+ "eu-west-1",
+ "eu-west-3",
+ "ap-northeast-1",
+ "ap-southeast-2"
+ ]
+ },
+ "authenticationPlan": {
+ "description": "Authentication method - either direct IAM credentials or cross-account role assumption.",
"oneOf": [
{
- "type": "string",
- "enum": [
- "alloy",
- "echo",
- "fable",
- "onyx",
- "nova",
- "shimmer",
- "marin",
- "cedar"
- ],
- "title": "Preset Voice Options"
+ "$ref": "#/components/schemas/AWSIAMCredentialsAuthenticationPlan"
},
{
- "type": "string",
- "title": "OpenAI Voice ID"
+ "$ref": "#/components/schemas/AWSStsAuthenticationPlan"
}
]
},
- "model": {
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ },
+ "required": [
+ "provider",
+ "region",
+ "authenticationPlan"
+ ]
+ },
+ "CreateAnyscaleCredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
"type": "string",
- "description": "This is the model that will be used for text-to-speech.",
"enum": [
- "tts-1",
- "tts-1-hd",
- "gpt-4o-mini-tts"
+ "anyscale"
]
},
- "instructions": {
+ "apiKey": {
"type": "string",
- "description": "This is a prompt that allows you to control the voice of your generated audio.\nDoes not work with 'tts-1' or 'tts-1-hd' models.",
- "maxLength": 10000
- },
- "speed": {
- "type": "number",
- "description": "This is the speed multiplier that will be used.",
- "minimum": 0.25,
- "maximum": 4,
- "example": null
- },
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
- {
- "$ref": "#/components/schemas/ChunkPlan"
- }
- ]
+ "maxLength": 10000,
+ "description": "This is not returned in the API."
},
- "fallbackPlan": {
- "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
- "allOf": [
- {
- "$ref": "#/components/schemas/FallbackPlan"
- }
- ]
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
}
},
"required": [
"provider",
- "voiceId"
+ "apiKey"
]
},
- "PlayHTVoice": {
+ "CreateAssemblyAICredentialDTO": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
"provider": {
"type": "string",
- "description": "This is the voice provider that will be used.",
"enum": [
- "playht"
+ "assembly-ai"
]
},
- "voiceId": {
- "description": "This is the provider-specific ID that will be used.",
- "oneOf": [
- {
- "type": "string",
- "enum": [
- "jennifer",
- "melissa",
- "will",
- "chris",
- "matt",
- "jack",
- "ruby",
- "davis",
- "donna",
- "michael"
- ],
- "title": "Preset Voice Options"
- },
- {
- "type": "string",
- "title": "PlayHT Voice ID"
- }
- ]
+ "apiKey": {
+ "type": "string",
+ "description": "This is not returned in the API."
},
- "speed": {
- "type": "number",
- "description": "This is the speed multiplier that will be used.",
- "minimum": 0.1,
- "maximum": 5,
- "example": null
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ },
+ "required": [
+ "provider",
+ "apiKey"
+ ]
+ },
+ "AzureBlobStorageBucketPlan": {
+ "type": "object",
+ "properties": {
+ "connectionString": {
+ "type": "string",
+ "description": "This is the blob storage connection string for the Azure resource."
},
- "temperature": {
- "type": "number",
- "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.",
- "minimum": 0.1,
- "maximum": 2,
- "example": null
+ "containerName": {
+ "type": "string",
+ "description": "This is the container name for the Azure blob storage."
},
- "emotion": {
+ "path": {
+ "type": "string",
+ "description": "This is the path where call artifacts will be stored.\n\nUsage:\n- To store call artifacts in a specific folder, set this to the full path. Eg. \"/folder-name1/folder-name2\".\n- To store call artifacts in the root of the bucket, leave this blank.\n\n@default \"/\""
+ }
+ },
+ "required": [
+ "connectionString",
+ "containerName"
+ ]
+ },
+ "CreateAzureCredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
"type": "string",
- "description": "An emotion to be applied to the speech.",
"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"
- ],
- "example": null
- },
- "voiceGuidance": {
- "type": "number",
- "description": "A number between 1 and 6. Use lower numbers to reduce how unique your chosen voice will be compared to other voices.",
- "minimum": 1,
- "maximum": 6,
- "example": null
- },
- "styleGuidance": {
- "type": "number",
- "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.",
- "minimum": 1,
- "maximum": 30,
- "example": null
- },
- "textGuidance": {
- "type": "number",
- "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.",
- "minimum": 1,
- "maximum": 2,
- "example": null
+ "azure"
+ ]
},
- "model": {
+ "service": {
"type": "string",
- "description": "Playht voice model/engine to use.",
+ "description": "This is the service being used in Azure.",
"enum": [
- "PlayHT2.0",
- "PlayHT2.0-turbo",
- "Play3.0-mini",
- "PlayDialog"
- ]
+ "speech",
+ "blob_storage"
+ ],
+ "default": "speech"
},
- "language": {
+ "region": {
"type": "string",
- "description": "The language to use for the speech.",
+ "description": "This is the region of the Azure resource.",
"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"
+ "australiaeast",
+ "canadaeast",
+ "canadacentral",
+ "centralus",
+ "eastus2",
+ "eastus",
+ "france",
+ "germanywestcentral",
+ "india",
+ "japaneast",
+ "japanwest",
+ "northcentralus",
+ "norway",
+ "polandcentral",
+ "southcentralus",
+ "spaincentral",
+ "swedencentral",
+ "switzerland",
+ "uaenorth",
+ "uk",
+ "westeurope",
+ "westus",
+ "westus3"
]
},
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
- {
- "$ref": "#/components/schemas/ChunkPlan"
- }
- ]
+ "apiKey": {
+ "type": "string",
+ "description": "This is not returned in the API.",
+ "maxLength": 10000
},
- "fallbackPlan": {
- "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
+ "fallbackIndex": {
+ "type": "number",
+ "minimum": 1,
+ "description": "This is the order in which this storage provider is tried during upload retries. Lower numbers are tried first in increasing order."
+ },
+ "bucketPlan": {
+ "description": "This is the bucket plan that can be provided to store call artifacts in Azure Blob Storage.",
"allOf": [
{
- "$ref": "#/components/schemas/FallbackPlan"
+ "$ref": "#/components/schemas/AzureBlobStorageBucketPlan"
}
]
+ },
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
}
},
"required": [
"provider",
- "voiceId"
+ "service"
]
},
- "RimeAIVoice": {
+ "CreateAzureOpenAICredentialDTO": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
"provider": {
"type": "string",
- "description": "This is the voice provider that will be used.",
"enum": [
- "rime-ai"
+ "azure-openai"
]
},
- "voiceId": {
- "description": "This is the provider-specific ID that will be used.",
- "oneOf": [
- {
- "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"
- ],
- "title": "Suggested Voice Options",
- "description": "Popular Rime AI voices across mist, mistv2, and arcana models. Any valid Rime AI voice ID is accepted, not just these suggestions."
- },
- {
- "type": "string",
- "title": "Any Rime AI Voice ID",
- "description": "Any valid Rime AI voice ID. See https://docs.rime.ai/docs/voices for the full catalog."
- }
+ "region": {
+ "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"
]
},
- "model": {
+ "models": {
+ "type": "array",
+ "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",
+ "gpt-4o",
+ "gpt-4.1",
+ "gpt-5.4-mini-2026-03-17"
+ ],
+ "example": [
+ "gpt-4-0125-preview",
+ "gpt-4-0613"
+ ],
+ "items": {
+ "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",
+ "gpt-4o",
+ "gpt-4.1",
+ "gpt-5.4-mini-2026-03-17"
+ ]
+ }
+ },
+ "openAIKey": {
"type": "string",
- "description": "This is the model that will be used. Defaults to 'arcana' when not specified.",
- "enum": [
- "arcana",
- "mistv2",
- "mist"
- ],
- "example": "arcana"
+ "maxLength": 10000,
+ "description": "This is not returned in the API."
},
- "speed": {
+ "ocpApimSubscriptionKey": {
+ "type": "string",
+ "description": "This is not returned in the API."
+ },
+ "openAIEndpoint": {
+ "type": "string",
+ "maxLength": 10000
+ },
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ },
+ "required": [
+ "provider",
+ "region",
+ "models",
+ "openAIKey",
+ "openAIEndpoint"
+ ]
+ },
+ "SipTrunkGateway": {
+ "type": "object",
+ "properties": {
+ "ip": {
+ "type": "string",
+ "description": "This is the address of the gateway. Inbound gateways require an IPv4 address like 1.1.1.1. Outbound-only gateways can also use a fully qualified domain name like my-sip-trunk.pstn.twilio.com."
+ },
+ "port": {
"type": "number",
- "description": "This is the speed multiplier that will be used.",
- "minimum": 0.1,
- "example": null
+ "description": "This is the port number of the gateway. Default is 5060.\n\n@default 5060",
+ "minimum": 1,
+ "maximum": 65535
},
- "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.",
- "example": false
+ "netmask": {
+ "type": "number",
+ "description": "This is the netmask of the gateway. Defaults to 32.\n\n@default 32",
+ "minimum": 24,
+ "maximum": 32
},
- "phonemizeBetweenBrackets": {
+ "inboundEnabled": {
"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.",
- "example": false
+ "description": "This is whether inbound calls are allowed from this gateway. Default is true.\n\n@default true"
},
- "reduceLatency": {
+ "outboundEnabled": {
"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",
- "example": false
- },
- "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",
- "example": null
+ "description": "This is whether outbound calls should be sent to this gateway. Default is true.\n\nNote, if netmask is less than 32, it doesn't affect the outbound IPs that are tried. 1 attempt is made to `ip:port`.\n\n@default true"
},
- "language": {
+ "outboundProtocol": {
"type": "string",
- "description": "Language for speech synthesis. Uses ISO 639 codes. Supported: en, es, de, fr, ar, hi, ja, he, pt, ta, si.",
+ "description": "This is the protocol to use for SIP signaling outbound calls. Default is udp.\n\n@default udp",
"enum": [
- "en",
- "es",
- "de",
- "fr",
- "ar",
- "hi",
- "ja",
- "he",
- "pt",
- "ta",
- "si"
- ],
- "example": "en"
- },
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
- {
- "$ref": "#/components/schemas/ChunkPlan"
- }
+ "tls/srtp",
+ "tcp",
+ "tls",
+ "udp"
]
},
- "fallbackPlan": {
- "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
- "allOf": [
- {
- "$ref": "#/components/schemas/FallbackPlan"
- }
- ]
+ "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.\n\nThis 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.\n\n@default false"
}
},
"required": [
- "provider",
- "voiceId"
+ "ip"
]
},
- "SesameVoice": {
+ "SipTrunkOutboundSipRegisterPlan": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
+ "domain": {
+ "type": "string"
},
- "provider": {
- "type": "string",
- "description": "This is the voice provider that will be used.",
- "enum": [
- "sesame"
- ]
+ "username": {
+ "type": "string"
},
- "voiceId": {
+ "realm": {
+ "type": "string"
+ }
+ }
+ },
+ "SipTrunkOutboundAuthenticationPlan": {
+ "type": "object",
+ "properties": {
+ "authPassword": {
"type": "string",
- "description": "This is the provider-specific ID that will be used.",
- "title": "Sesame Voice ID. This should be either a name (a built-in voice) or a UUID (a custom voice)."
+ "description": "This is not returned in the API."
},
- "model": {
- "type": "string",
- "description": "This is the model that will be used.",
- "enum": [
- "csm-1b"
- ]
+ "authUsername": {
+ "type": "string"
},
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "sipRegisterPlan": {
+ "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.",
"allOf": [
{
- "$ref": "#/components/schemas/ChunkPlan"
+ "$ref": "#/components/schemas/SipTrunkOutboundSipRegisterPlan"
}
]
+ }
+ }
+ },
+ "CreateByoSipTrunkCredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "type": "string",
+ "description": "This can be used to bring your own SIP trunks or to connect to a Carrier.",
+ "enum": [
+ "byo-sip-trunk"
+ ]
},
- "fallbackPlan": {
- "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
+ "gateways": {
+ "description": "This is the list of SIP trunk's gateways.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/SipTrunkGateway"
+ }
+ },
+ "outboundAuthenticationPlan": {
+ "description": "This can be used to configure the outbound authentication if required by the SIP trunk.",
"allOf": [
{
- "$ref": "#/components/schemas/FallbackPlan"
+ "$ref": "#/components/schemas/SipTrunkOutboundAuthenticationPlan"
}
]
+ },
+ "outboundLeadingPlusEnabled": {
+ "type": "boolean",
+ "description": "This ensures the outbound origination attempts have a leading plus. Defaults to false to match conventional telecom behavior.\n\nUsage:\n- Vonage/Twilio requires leading plus for all outbound calls. Set this to true.\n\n@default false"
+ },
+ "techPrefix": {
+ "type": "string",
+ "description": "This can be used to configure the tech prefix on outbound calls. This is an advanced property.",
+ "maxLength": 10000
+ },
+ "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.",
+ "maxLength": 10000
+ },
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
}
},
"required": [
- "provider",
- "voiceId",
- "model"
+ "gateways"
]
},
- "SmallestAIVoice": {
+ "CreateCartesiaCredentialDTO": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
"provider": {
"type": "string",
- "description": "This is the voice provider that will be used.",
"enum": [
- "smallest-ai"
- ]
- },
- "voiceId": {
- "description": "This is the provider-specific ID that will be used.",
- "oneOf": [
- {
- "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": "Preset Voice Options"
- },
- {
- "type": "string",
- "title": "Smallest AI Voice ID"
- }
+ "cartesia"
]
},
- "model": {
+ "apiKey": {
"type": "string",
- "description": "Smallest AI voice model to use. Defaults to 'lightning' when not specified.",
- "enum": [
- "lightning"
- ]
- },
- "speed": {
- "type": "number",
- "description": "This is the speed multiplier that will be used.",
- "example": null
+ "description": "This is not returned in the API."
},
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
- {
- "$ref": "#/components/schemas/ChunkPlan"
- }
- ]
+ "apiUrl": {
+ "type": "string",
+ "description": "This can be used to point to an onprem Cartesia instance. Defaults to api.cartesia.ai."
},
- "fallbackPlan": {
- "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
- "allOf": [
- {
- "$ref": "#/components/schemas/FallbackPlan"
- }
- ]
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
}
},
"required": [
"provider",
- "voiceId"
+ "apiKey"
]
},
- "TavusConversationProperties": {
+ "CloudflareR2BucketPlan": {
"type": "object",
"properties": {
- "maxCallDuration": {
- "type": "number",
- "description": "The maximum duration of the call in seconds. The default `maxCallDuration` is 3600 seconds (1 hour).\nOnce the time limit specified by this parameter has been reached, the conversation will automatically shut down."
- },
- "participantLeftTimeout": {
- "type": "number",
- "description": "The duration in seconds after which the call will be automatically shut down once the last participant leaves."
- },
- "participantAbsentTimeout": {
- "type": "number",
- "description": "Starting from conversation creation, the duration in seconds after which the call will be automatically shut down if no participant joins the call.\nDefault 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.\nYou can find more instructions on displaying transcriptions if you are using your custom DailyJS components here.\nYou 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]`).\nYou can use WebGL on the frontend to make the greenscreen transparent or change its color."
+ "accessKeyId": {
+ "type": "string",
+ "description": "Cloudflare R2 Access key ID."
},
- "language": {
+ "secretAccessKey": {
"type": "string",
- "description": "The language of the conversation. Please provide the **full language name**, not the two-letter code.\nIf you are using your own TTS voice, please ensure it supports the language you provide.\nIf you are using a stock replica or default persona, please note that only ElevenLabs and Cartesia supported languages are available.\nYou can find a full list of supported languages for Cartesia here, for ElevenLabs here, and for PlayHT here."
+ "description": "Cloudflare R2 access key secret. This is not returned in the API."
},
- "recordingS3BucketName": {
+ "url": {
"type": "string",
- "description": "The name of the S3 bucket where the recording will be stored."
+ "description": "Cloudflare R2 base url."
},
- "recordingS3BucketRegion": {
+ "name": {
"type": "string",
- "description": "The region of the S3 bucket where the recording will be stored."
+ "description": "This is the name of the bucket."
},
- "awsAssumeRoleArn": {
+ "path": {
"type": "string",
- "description": "The ARN of the role that will be assumed to access the S3 bucket."
+ "description": "This is the path where call artifacts will be stored.\n\nUsage:\n- To store call artifacts in a specific folder, set this to the full path. Eg. \"/folder-name1/folder-name2\".\n- To store call artifacts in the root of the bucket, leave this blank.\n\n@default \"/\""
}
- }
+ },
+ "required": [
+ "name"
+ ]
},
- "TavusVoice": {
+ "CreateCloudflareCredentialDTO": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
"provider": {
"type": "string",
- "description": "This is the voice provider that will be used.",
"enum": [
- "tavus"
- ]
- },
- "voiceId": {
- "description": "This is the provider-specific ID that will be used.",
- "oneOf": [
- {
- "type": "string",
- "enum": [
- "r52da2535a"
- ],
- "title": "Preset Voice Options"
- },
- {
- "type": "string",
- "title": "Tavus Voice ID"
- }
- ]
- },
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
- {
- "$ref": "#/components/schemas/ChunkPlan"
- }
- ]
- },
- "personaId": {
- "type": "string",
- "description": "This is the unique identifier for the persona that the replica will use in the conversation."
+ "cloudflare"
+ ],
+ "description": "Credential provider. Only allowed value is cloudflare"
},
- "callbackUrl": {
+ "accountId": {
"type": "string",
- "description": "This is the url that will receive webhooks with updates regarding the conversation state."
+ "description": "Cloudflare Account Id."
},
- "conversationName": {
+ "apiKey": {
"type": "string",
- "description": "This is the name for the conversation."
+ "description": "Cloudflare API Key / Token."
},
- "conversationalContext": {
+ "accountEmail": {
"type": "string",
- "description": "This is the context that will be appended to any context provided in the persona, if one is provided."
+ "description": "Cloudflare Account Email."
},
- "customGreeting": {
- "type": "string",
- "description": "This is the custom greeting that the replica will give once a participant joines the conversation."
+ "fallbackIndex": {
+ "type": "number",
+ "description": "This is the order in which this storage provider is tried during upload retries. Lower numbers are tried first in increasing order.",
+ "minimum": 1
},
- "properties": {
- "description": "These are optional properties used to customize the conversation.",
+ "bucketPlan": {
+ "description": "This is the bucket plan that can be provided to store call artifacts in R2",
"allOf": [
{
- "$ref": "#/components/schemas/TavusConversationProperties"
+ "$ref": "#/components/schemas/CloudflareR2BucketPlan"
}
]
},
- "fallbackPlan": {
- "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
- "allOf": [
- {
- "$ref": "#/components/schemas/FallbackPlan"
- }
- ]
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
}
},
"required": [
- "provider",
- "voiceId"
+ "provider"
]
},
- "VapiPronunciationDictionaryLocator": {
+ "OAuth2AuthenticationPlan": {
"type": "object",
"properties": {
- "pronunciationDictId": {
+ "type": {
"type": "string",
- "description": "The pronunciation dictionary ID",
- "example": "pdict_abc123"
+ "enum": [
+ "oauth2"
+ ]
},
- "versionId": {
+ "url": {
"type": "string",
- "description": "Version ID (only required for ElevenLabs, ignored for Cartesia)",
- "example": "ver_abc123"
+ "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.",
+ "maxLength": 1000
}
},
"required": [
- "pronunciationDictId"
+ "type",
+ "url",
+ "clientId",
+ "clientSecret"
]
},
- "VapiVoice": {
+ "CreateCustomLLMCredentialDTO": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
"provider": {
"type": "string",
- "description": "This is the voice provider that will be used.",
- "enum": [
- "vapi"
- ]
- },
- "voiceId": {
- "type": "string",
- "description": "The voices provided by Vapi",
"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"
- ]
- },
- "speed": {
- "type": "number",
- "description": "This is the speed multiplier that will be used.\n\n@default 1",
- "minimum": 0.25,
- "maximum": 2,
- "default": 1
+ "custom-llm"
+ ]
},
- "pronunciationDictionary": {
- "description": "List of pronunciation dictionary locators for custom word pronunciations.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/VapiPronunciationDictionaryLocator"
- }
+ "apiKey": {
+ "type": "string",
+ "maxLength": 10000,
+ "description": "This is not returned in the API."
},
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "authenticationPlan": {
+ "description": "This is the authentication plan. Currently supports OAuth2 RFC 6749. To use Bearer authentication, use apiKey",
"allOf": [
{
- "$ref": "#/components/schemas/ChunkPlan"
+ "$ref": "#/components/schemas/OAuth2AuthenticationPlan"
}
]
},
- "fallbackPlan": {
- "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
- "allOf": [
- {
- "$ref": "#/components/schemas/FallbackPlan"
- }
- ]
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
}
},
"required": [
"provider",
- "voiceId"
+ "apiKey"
]
},
- "InworldVoice": {
+ "CreateDeepgramCredentialDTO": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
"provider": {
"type": "string",
- "description": "This is the voice provider that will be used.",
"enum": [
- "inworld"
+ "deepgram"
]
},
- "voiceId": {
+ "apiKey": {
"type": "string",
- "description": "Available voices by language:\n• 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\n• zh: Yichen, Xiaoyin, Xinyi, Jing\n• nl: Erik, Katrien, Lennart, Lore\n• fr: Alain, Hélène, Mathieu, Étienne\n• de: Johanna, Josef\n• it: Gianni, Orietta\n• ja: Asuka, Satoshi\n• ko: Hyunwoo, Minji, Seojun, Yoona\n• pl: Szymon, Wojciech\n• pt: Heitor, Maitê\n• es: Diego, Lupita, Miguel, Rafael\n• ru: Svetlana, Elena, Dmitry, Nikolai\n• hi: Riya, Manoj\n• he: Yael, Oren\n• ar: Nour, Omar",
- "maxLength": 120,
- "title": "Inworld Voice ID",
- "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"
- ],
- "example": "Alex"
+ "description": "This is not returned in the API."
},
- "model": {
+ "apiUrl": {
"type": "string",
- "description": "This is the model that will be used.",
- "enum": [
- "inworld-tts-1"
- ],
- "default": "inworld-tts-1"
+ "description": "This can be used to point to an onprem Deepgram instance. Defaults to api.deepgram.com."
},
- "languageCode": {
+ "name": {
"type": "string",
- "description": "Language code for Inworld TTS synthesis",
- "default": "en",
- "enum": [
- "en",
- "zh",
- "ko",
- "nl",
- "fr",
- "es",
- "ja",
- "de",
- "it",
- "pl",
- "pt",
- "ru",
- "hi",
- "he",
- "ar"
- ]
- },
- "temperature": {
- "type": "number",
- "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.\nHigher values will make the output more random and can lead to more expressive results. Lower values will make it more deterministic.\nSee https://docs.inworld.ai/docs/tts/capabilities/generating-audio#additional-configurations for more details.",
- "minimum": 0.1,
- "maximum": 2,
- "default": 1.1,
- "example": null
- },
- "speakingRate": {
- "type": "number",
- "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.\nValues above 0.8 are recommended for higher quality.\nSee https://docs.inworld.ai/docs/tts/capabilities/generating-audio#additional-configurations for more details.",
- "minimum": 0.5,
- "maximum": 1.5,
- "default": 1,
- "example": null
- },
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
- {
- "$ref": "#/components/schemas/ChunkPlan"
- }
- ]
- },
- "fallbackPlan": {
- "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
- "allOf": [
- {
- "$ref": "#/components/schemas/FallbackPlan"
- }
- ]
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
}
},
"required": [
"provider",
- "voiceId"
+ "apiKey"
]
},
- "MinimaxVoice": {
+ "CreateDeepInfraCredentialDTO": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
"provider": {
"type": "string",
- "description": "This is the voice provider that will be used.",
"enum": [
- "minimax"
+ "deepinfra"
]
},
- "voiceId": {
+ "apiKey": {
"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.",
- "title": "This is the Minimax Voice ID"
+ "description": "This is not returned in the API."
},
- "model": {
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ },
+ "required": [
+ "provider",
+ "apiKey"
+ ]
+ },
+ "CreateDeepSeekCredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
"type": "string",
- "description": "This is the model that will be used. Options are 'speech-02-hd' and 'speech-02-turbo'.\nspeech-02-hd is optimized for high-fidelity applications like voiceovers and audiobooks.\nspeech-02-turbo is designed for real-time applications with low latency.\n\n@default \"speech-02-turbo\"",
"enum": [
- "speech-02-hd",
- "speech-02-turbo",
- "speech-2.5-turbo-preview"
- ],
- "example": "speech-02-turbo",
- "default": "speech-02-turbo"
+ "deep-seek"
+ ]
},
- "emotion": {
+ "apiKey": {
"type": "string",
- "description": "The emotion to use for the voice. If not provided, will use auto-detect mode.\nOptions include: 'happy', 'sad', 'angry', 'fearful', 'surprised', 'disgusted', 'neutral'",
- "example": "happy"
+ "description": "This is not returned in the API."
},
- "subtitleType": {
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ },
+ "required": [
+ "provider",
+ "apiKey"
+ ]
+ },
+ "CreateElevenLabsCredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
"type": "string",
- "description": "Controls the granularity of subtitle/timing data returned by Minimax\nduring synthesis. Set to 'word' to receive per-word timestamps in\nassistant.speechStarted events for karaoke-style caption rendering.\n\n@default \"sentence\"",
"enum": [
- "word",
- "sentence"
- ],
- "default": "sentence"
- },
- "pitch": {
- "type": "number",
- "description": "Voice pitch adjustment. Range from -12 to 12 semitones.\n@default 0",
- "minimum": -12,
- "maximum": 12,
- "example": 0,
- "default": 0
- },
- "speed": {
- "type": "number",
- "description": "Voice speed adjustment. Range from 0.5 to 2.0.\n@default 1.0",
- "minimum": 0.5,
- "maximum": 2,
- "example": 1,
- "default": 1
+ "11labs"
+ ]
},
- "volume": {
- "type": "number",
- "description": "Voice volume adjustment. Range from 0.5 to 2.0.\n@default 1.0",
- "minimum": 0.5,
- "maximum": 2,
- "example": 1,
- "default": 1
+ "apiKey": {
+ "type": "string",
+ "maxLength": 10000,
+ "description": "This is not returned in the API."
},
- "region": {
+ "apiUrl": {
"type": "string",
- "description": "The region for Minimax API. Defaults to \"worldwide\".",
"enum": [
- "worldwide",
- "china"
+ "https://api.elevenlabs.io",
+ "https://api.eu.residency.elevenlabs.io"
],
- "default": "worldwide"
+ "description": "ElevenLabs-only API environment for this key: the global endpoint or the EU data residency endpoint. If omitted on create, Vapi detects it automatically. If set to null on update, Vapi clears the saved endpoint and re-detects it with the saved API key.",
+ "nullable": true
},
- "languageBoost": {
+ "name": {
"type": "string",
- "description": "Language hint for MiniMax T2A. Example: yue (Cantonese), zh (Chinese), en (English).",
- "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"
- ]
- },
- "textNormalizationEnabled": {
- "type": "boolean",
- "description": "Enable MiniMax text normalization to improve number reading and formatting.",
- "default": true
- },
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
- {
- "$ref": "#/components/schemas/ChunkPlan"
- }
- ]
- },
- "fallbackPlan": {
- "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.",
- "allOf": [
- {
- "$ref": "#/components/schemas/FallbackPlan"
- }
- ]
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
}
},
"required": [
"provider",
- "voiceId"
+ "apiKey"
]
},
- "FallbackMinimaxVoice": {
+ "GcpKey": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
+ "type": {
+ "type": "string",
+ "description": "This is the type of the key. Most likely, this is \"service_account\"."
},
- "provider": {
+ "projectId": {
"type": "string",
- "description": "This is the voice provider that will be used.",
- "enum": [
- "minimax"
- ]
+ "description": "This is the ID of the Google Cloud project associated with this key."
},
- "voiceId": {
+ "privateKeyId": {
"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.",
- "title": "This is the Minimax Voice ID"
+ "description": "This is the unique identifier for the private key."
},
- "model": {
+ "privateKey": {
"type": "string",
- "description": "This is the model that will be used. Options are 'speech-02-hd' and 'speech-02-turbo'.\nspeech-02-hd is optimized for high-fidelity applications like voiceovers and audiobooks.\nspeech-02-turbo is designed for real-time applications with low latency.\n\n@default \"speech-02-turbo\"",
- "enum": [
- "speech-02-hd",
- "speech-02-turbo",
- "speech-2.5-turbo-preview"
- ],
- "example": "speech-02-turbo",
- "default": "speech-02-turbo"
+ "description": "This is the private key in PEM format.\n\nNote: This is not returned in the API."
},
- "emotion": {
+ "clientEmail": {
"type": "string",
- "description": "The emotion to use for the voice. If not provided, will use auto-detect mode.\nOptions include: 'happy', 'sad', 'angry', 'fearful', 'surprised', 'disgusted', 'neutral'",
- "example": "happy"
+ "description": "This is the email address associated with the service account."
},
- "subtitleType": {
+ "clientId": {
"type": "string",
- "description": "Controls the granularity of subtitle/timing data returned by Minimax\nduring synthesis. Set to 'word' to receive per-word timestamps in\nassistant.speechStarted events for karaoke-style caption rendering.\n\n@default \"sentence\"",
- "enum": [
- "word",
- "sentence"
- ],
- "default": "sentence"
+ "description": "This is the unique identifier for the client."
},
- "pitch": {
- "type": "number",
- "description": "Voice pitch adjustment. Range from -12 to 12 semitones.\n@default 0",
- "minimum": -12,
- "maximum": 12,
- "example": 0,
- "default": 0
+ "authUri": {
+ "type": "string",
+ "description": "This is the URI for the auth provider's authorization endpoint."
},
- "speed": {
- "type": "number",
- "description": "Voice speed adjustment. Range from 0.5 to 2.0.\n@default 1.0",
- "minimum": 0.5,
- "maximum": 2,
- "example": 1,
- "default": 1
+ "tokenUri": {
+ "type": "string",
+ "description": "This is the URI for the auth provider's token endpoint."
},
- "volume": {
- "type": "number",
- "description": "Voice volume adjustment. Range from 0.5 to 2.0.\n@default 1.0",
- "minimum": 0.5,
- "maximum": 2,
- "example": 1,
- "default": 1
+ "authProviderX509CertUrl": {
+ "type": "string",
+ "description": "This is the URL of the public x509 certificate for the auth provider."
},
- "region": {
+ "clientX509CertUrl": {
"type": "string",
- "description": "The region for Minimax API. Defaults to \"worldwide\".",
- "enum": [
- "worldwide",
- "china"
- ],
- "default": "worldwide"
+ "description": "This is the URL of the public x509 certificate for the client."
},
- "languageBoost": {
+ "universeDomain": {
"type": "string",
- "description": "Language hint for MiniMax T2A. Example: yue (Cantonese), zh (Chinese), en (English).",
- "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": "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"
+ ]
+ },
+ "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.\n\nUsage:\n- If `credential.type` is `aws`, then this is required.\n- 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\n\nThis overrides the `credential.region` field if it is provided."
+ },
+ "path": {
+ "type": "string",
+ "description": "This is the path where call artifacts will be stored.\n\nUsage:\n- To store call artifacts in a specific folder, set this to the full path. Eg. \"/folder-name1/folder-name2\".\n- To store call artifacts in the root of the bucket, leave this blank.\n\n@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\n\nUsage:\n- If `credential.type` is `gcp`, then this is required.\n- 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\n\nUsage:\n- If `credential.type` is `gcp`, then this is required.\n- If `credential.type` is `aws`, then this is not required since credential.awsSecretAccessKey is used instead.\n\nNote: This is not returned in the API."
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "CreateGcpCredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "gcp"
]
},
- "textNormalizationEnabled": {
- "type": "boolean",
- "description": "Enable MiniMax text normalization to improve number reading and formatting.",
- "default": true
+ "fallbackIndex": {
+ "type": "number",
+ "description": "This is the order in which this storage provider is tried during upload retries. Lower numbers are tried first in increasing order.",
+ "minimum": 1
},
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "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//keys.\n\nThe schema is identical to the JSON that GCP outputs.",
"allOf": [
{
- "$ref": "#/components/schemas/ChunkPlan"
+ "$ref": "#/components/schemas/GcpKey"
}
]
+ },
+ "region": {
+ "type": "string",
+ "description": "This is the region of the GCP resource.",
+ "maxLength": 40
+ },
+ "bucketPlan": {
+ "$ref": "#/components/schemas/BucketPlan"
+ },
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
}
},
"required": [
"provider",
- "voiceId"
+ "gcpKey"
]
},
- "FallbackWellSaidVoice": {
+ "CreateGladiaCredentialDTO": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
"provider": {
"type": "string",
- "description": "This is the voice provider that will be used.",
"enum": [
- "wellsaid"
+ "gladia"
]
},
- "voiceId": {
+ "apiKey": {
"type": "string",
- "description": "The WellSaid speaker ID to synthesize."
+ "description": "This is not returned in the API."
},
- "model": {
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ },
+ "required": [
+ "provider",
+ "apiKey"
+ ]
+ },
+ "CreateGoHighLevelCredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
"type": "string",
- "description": "This is the model that will be used.",
"enum": [
- "caruso",
- "legacy"
+ "gohighlevel"
]
},
- "enableSsml": {
- "type": "boolean",
- "description": "Enables limited SSML translation for input text."
- },
- "libraryIds": {
- "description": "Array of library IDs to use for voice synthesis.",
- "type": "array",
- "items": {
- "type": "string"
- }
+ "apiKey": {
+ "type": "string",
+ "description": "This is not returned in the API."
},
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
- {
- "$ref": "#/components/schemas/ChunkPlan"
- }
- ]
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
}
},
"required": [
"provider",
- "voiceId"
+ "apiKey"
]
},
- "FallbackAzureVoice": {
+ "CreateGroqCredentialDTO": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
"provider": {
"type": "string",
- "description": "This is the voice provider that will be used.",
"enum": [
- "azure"
- ]
- },
- "voiceId": {
- "description": "This is the provider-specific ID that will be used.",
- "oneOf": [
- {
- "type": "string",
- "enum": [
- "andrew",
- "brian",
- "emma"
- ],
- "title": "Preset Voice Options"
- },
- {
- "type": "string",
- "title": "Azure Voice ID"
- }
+ "groq"
]
},
- "speed": {
- "type": "number",
- "description": "This is the speed multiplier that will be used.",
- "minimum": 0.5,
- "maximum": 2
+ "apiKey": {
+ "type": "string",
+ "description": "This is not returned in the API."
},
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
- {
- "$ref": "#/components/schemas/ChunkPlan"
- }
- ]
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
}
},
"required": [
"provider",
- "voiceId"
+ "apiKey"
]
},
- "FallbackCartesiaVoice": {
+ "CreateLangfuseCredentialDTO": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
"provider": {
"type": "string",
- "description": "This is the voice provider that will be used.",
"enum": [
- "cartesia"
+ "langfuse"
]
},
- "voiceId": {
+ "publicKey": {
"type": "string",
- "description": "The ID of the particular voice you want to use."
+ "description": "The public key for Langfuse project. Eg: pk-lf-..."
},
- "model": {
+ "apiKey": {
"type": "string",
- "description": "This is the model that will be used. This is optional and will default to the correct model for the voiceId.",
- "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"
- ],
- "example": "sonic-english"
+ "description": "The secret key for Langfuse project. Eg: sk-lf-... .This is not returned in the API."
},
- "language": {
+ "apiUrl": {
"type": "string",
- "description": "This is the language that will be used. This is optional and will default to the correct language for the voiceId.",
- "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"
- ],
- "example": "en"
- },
- "experimentalControls": {
- "description": "Experimental controls for Cartesia voice generation",
- "allOf": [
- {
- "$ref": "#/components/schemas/CartesiaExperimentalControls"
- }
- ]
+ "description": "The host URL for Langfuse project. Eg: https://cloud.langfuse.com"
},
- "generationConfig": {
- "description": "Generation config for fine-grained control of sonic-3 voice output (speed, volume, and experimental controls). Only available for sonic-3 model.",
- "allOf": [
- {
- "$ref": "#/components/schemas/CartesiaGenerationConfig"
- }
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ },
+ "required": [
+ "provider",
+ "publicKey",
+ "apiKey",
+ "apiUrl"
+ ]
+ },
+ "CreateLmntCredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "lmnt"
]
},
- "pronunciationDictId": {
+ "apiKey": {
"type": "string",
- "description": "Pronunciation dictionary ID for sonic-3. Allows custom pronunciations for specific words. Only available for sonic-3 model.",
- "example": "dict_abc123"
+ "description": "This is not returned in the API."
},
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
- {
- "$ref": "#/components/schemas/ChunkPlan"
- }
- ]
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
}
},
"required": [
"provider",
- "voiceId"
+ "apiKey"
]
},
- "FallbackCustomVoice": {
+ "CreateMakeCredentialDTO": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
"provider": {
"type": "string",
- "description": "This is the voice provider that will be used. Use `custom-voice` for providers that are not natively supported.",
"enum": [
- "custom-voice"
+ "make"
]
},
- "voiceId": {
+ "teamId": {
"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."
+ "description": "Team ID"
},
- "server": {
- "description": "This is where the voice request will be sent.\n\nRequest Example:\n\nPOST https://{server.url}\nContent-Type: application/json\n\n{\n \"message\": {\n \"type\": \"voice-request\",\n \"text\": \"Hello, world!\",\n \"sampleRate\": 24000,\n ...other metadata about the call...\n }\n}\n\nResponse 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:\n```\nresponse.on('data', (chunk: Buffer) => {\n outputStream.write(chunk);\n});\n```",
- "allOf": [
- {
- "$ref": "#/components/schemas/Server"
- }
- ]
+ "region": {
+ "type": "string",
+ "description": "Region of your application. For example: eu1, eu2, us1, us2"
},
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
- {
- "$ref": "#/components/schemas/ChunkPlan"
- }
- ]
+ "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.",
+ "minLength": 1,
+ "maxLength": 40
}
},
"required": [
"provider",
- "server"
+ "teamId",
+ "region",
+ "apiKey"
]
},
- "FallbackDeepgramVoice": {
+ "CreateOpenAICredentialDTO": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
"provider": {
"type": "string",
- "description": "This is the voice provider that will be used.",
"enum": [
- "deepgram"
+ "openai"
]
},
- "voiceId": {
+ "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.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ },
+ "required": [
+ "provider",
+ "apiKey"
+ ]
+ },
+ "CreateOpenRouterCredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
"type": "string",
- "description": "This is the provider-specific ID that will be used.",
"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"
- ],
- "title": "This is the Deepgram Voice ID"
+ "openrouter"
+ ]
},
- "model": {
+ "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.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ },
+ "required": [
+ "provider",
+ "apiKey"
+ ]
+ },
+ "CreatePerplexityAICredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
"type": "string",
- "description": "This is the model that will be used. Defaults to 'aura-2' when not specified.",
"enum": [
- "aura",
- "aura-2"
- ],
- "example": "aura-2"
+ "perplexity-ai"
+ ]
},
- "mipOptOut": {
- "type": "boolean",
- "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\n\nThis will only be used if you are using your own Deepgram API key.\n\n@default false",
- "example": false,
- "default": false
+ "apiKey": {
+ "type": "string",
+ "description": "This is not returned in the API."
},
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
- {
- "$ref": "#/components/schemas/ChunkPlan"
- }
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ },
+ "required": [
+ "provider",
+ "apiKey"
+ ]
+ },
+ "CreatePlayHTCredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "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.",
+ "minLength": 1,
+ "maxLength": 40
}
},
"required": [
"provider",
- "voiceId"
+ "apiKey",
+ "userId"
]
},
- "FallbackElevenLabsVoice": {
+ "CreateRimeAICredentialDTO": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
"provider": {
"type": "string",
- "description": "This is the voice provider that will be used.",
"enum": [
- "11labs"
- ]
- },
- "voiceId": {
- "description": "This is the provider-specific ID that will be used. Ensure the Voice is present in your 11Labs Voice Library.",
- "oneOf": [
- {
- "type": "string",
- "enum": [
- "burt",
- "marissa",
- "andrea",
- "sarah",
- "phillip",
- "steve",
- "joseph",
- "myra",
- "paula",
- "ryan",
- "drew",
- "paul",
- "mrb",
- "matilda",
- "mark"
- ],
- "title": "Preset Voice Options"
- },
- {
- "type": "string",
- "title": "11Labs Voice ID"
- }
+ "rime-ai"
]
},
- "stability": {
- "type": "number",
- "description": "Defines the stability for voice settings.",
- "minimum": 0,
- "maximum": 1,
- "example": 0.5
- },
- "similarityBoost": {
- "type": "number",
- "description": "Defines the similarity boost for voice settings.",
- "minimum": 0,
- "maximum": 1,
- "example": 0.75
- },
- "style": {
- "type": "number",
- "description": "Defines the style for voice settings.",
- "minimum": 0,
- "maximum": 1,
- "example": 0
- },
- "useSpeakerBoost": {
- "type": "boolean",
- "description": "Defines the use speaker boost for voice settings.",
- "example": false
- },
- "speed": {
- "type": "number",
- "description": "Defines the speed for voice settings.",
- "minimum": 0.7,
- "maximum": 1.2,
- "example": 0.9
- },
- "optimizeStreamingLatency": {
- "type": "number",
- "description": "Defines the optimize streaming latency for voice settings. Defaults to 3.",
- "minimum": 0,
- "maximum": 4,
- "example": 3
- },
- "enableSsmlParsing": {
- "type": "boolean",
- "description": "This enables the use of https://elevenlabs.io/docs/speech-synthesis/prompting#pronunciation. Defaults to false to save latency.\n\n@default false",
- "example": false
- },
- "autoMode": {
- "type": "boolean",
- "description": "Defines the auto mode for voice settings. Defaults to false.",
- "example": false
- },
- "model": {
+ "apiKey": {
"type": "string",
- "description": "This is the model that will be used. Defaults to 'eleven_turbo_v2' if not specified.",
- "enum": [
- "eleven_multilingual_v2",
- "eleven_turbo_v2",
- "eleven_turbo_v2_5",
- "eleven_flash_v2",
- "eleven_flash_v2_5",
- "eleven_monolingual_v1",
- "eleven_v3"
- ],
- "example": "eleven_turbo_v2_5"
+ "description": "This is not returned in the API."
},
- "language": {
+ "name": {
"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": {
- "description": "This is the pronunciation dictionary locators to use.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/ElevenLabsPronunciationDictionaryLocator"
- }
- },
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
- {
- "$ref": "#/components/schemas/ChunkPlan"
- }
- ]
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
}
},
"required": [
"provider",
- "voiceId"
+ "apiKey"
]
},
- "FallbackHumeVoice": {
+ "CreateRunpodCredentialDTO": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
"provider": {
"type": "string",
- "description": "This is the voice provider that will be used.",
"enum": [
- "hume"
+ "runpod"
]
},
- "model": {
+ "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.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ },
+ "required": [
+ "provider",
+ "apiKey"
+ ]
+ },
+ "CreateS3CredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
"type": "string",
- "description": "This is the model that will be used.",
"enum": [
- "octave",
- "octave2"
+ "s3"
],
- "example": "octave2"
+ "description": "Credential provider. Only allowed value is s3"
},
- "voiceId": {
+ "awsAccessKeyId": {
"type": "string",
- "description": "The ID of the particular voice you want to use."
+ "description": "AWS access key ID."
},
- "isCustomHumeVoice": {
- "type": "boolean",
- "description": "Indicates whether the chosen voice is a preset Hume AI voice or a custom voice.",
- "example": false
+ "awsSecretAccessKey": {
+ "type": "string",
+ "description": "AWS access key secret. This is not returned in the API."
},
- "description": {
+ "region": {
"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').\n\nIf a Voice is specified in the request, this description serves as acting instructions.\nIf no Voice is specified, a new voice is generated based on this description."
+ "description": "AWS region in which the S3 bucket is located."
},
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
- {
- "$ref": "#/components/schemas/ChunkPlan"
- }
- ]
+ "s3BucketName": {
+ "type": "string",
+ "description": "AWS S3 bucket name."
+ },
+ "s3PathPrefix": {
+ "type": "string",
+ "description": "The path prefix for the uploaded recording. Ex. \"recordings/\""
+ },
+ "fallbackIndex": {
+ "type": "number",
+ "minimum": 1,
+ "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.",
+ "minLength": 1,
+ "maxLength": 40
}
},
"required": [
"provider",
- "voiceId"
+ "awsAccessKeyId",
+ "awsSecretAccessKey",
+ "region",
+ "s3BucketName",
+ "s3PathPrefix"
]
},
- "FallbackLMNTVoice": {
+ "SupabaseBucketPlan": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
- "provider": {
+ "region": {
"type": "string",
- "description": "This is the voice provider that will be used.",
+ "description": "This is the S3 Region. It should look like us-east-1\nIt should be one of the supabase regions defined in the SUPABASE_REGION enum\nCheck https://supabase.com/docs/guides/platform/regions for up to date regions",
"enum": [
- "lmnt"
- ]
- },
- "voiceId": {
- "description": "This is the provider-specific ID that will be used.",
- "oneOf": [
- {
- "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": "Preset Voice Options"
- },
- {
- "type": "string",
- "title": "LMNT Voice ID"
- }
+ "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"
]
},
- "speed": {
- "type": "number",
- "description": "This is the speed multiplier that will be used.",
- "minimum": 0.25,
- "maximum": 2,
- "example": null
- },
- "language": {
- "description": "Two letter ISO 639-1 language code. Use \"auto\" for auto-detection.",
- "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"
+ "url": {
+ "type": "string",
+ "description": "This is the S3 compatible URL for Supabase S3\nThis should look like https://.supabase.co/storage/v1/s3"
+ },
+ "accessKeyId": {
+ "type": "string",
+ "description": "This is the Supabase S3 Access Key ID.\nThe user creates this in the Supabase project Storage settings"
+ },
+ "secretAccessKey": {
+ "type": "string",
+ "description": "This is the Supabase S3 Secret Access Key.\nThe 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.\nThe user must create this in Supabase under Storage > Buckets\nA 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.\nThe user can create this in Supabase under Storage > Buckets\nA path that does not exist will not be checked now, but file uploads will fail\nA Path is like a folder in the bucket\nEg. 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"
+ ]
+ },
+ "CreateSupabaseCredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "supabase"
],
- "example": "en",
- "oneOf": [
- {
- "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": "ISO 639-1 Language Code"
- },
- {
- "type": "string",
- "enum": [
- "auto"
- ],
- "title": "Auto-detect"
- }
+ "description": "This is for supabase storage."
+ },
+ "fallbackIndex": {
+ "type": "number",
+ "minimum": 1,
+ "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.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ },
+ "required": [
+ "provider"
+ ]
+ },
+ "CreateSmallestAICredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "smallest-ai"
]
},
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
- {
- "$ref": "#/components/schemas/ChunkPlan"
- }
+ "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.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ },
+ "required": [
+ "provider",
+ "apiKey"
+ ]
+ },
+ "CreateTavusCredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "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.",
+ "minLength": 1,
+ "maxLength": 40
}
},
"required": [
"provider",
- "voiceId"
+ "apiKey"
]
},
- "FallbackNeuphonicVoice": {
+ "CreateTogetherAICredentialDTO": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
+ "provider": {
+ "type": "string",
+ "enum": [
+ "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.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ },
+ "required": [
+ "provider",
+ "apiKey"
+ ]
+ },
+ "CreateTwilioCredentialDTO": {
+ "type": "object",
+ "properties": {
"provider": {
"type": "string",
- "description": "This is the voice provider that will be used.",
"enum": [
- "neuphonic"
+ "twilio"
]
},
- "voiceId": {
- "description": "This is the provider-specific ID that will be used.",
+ "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.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ },
+ "required": [
+ "provider",
+ "accountSid"
+ ]
+ },
+ "CreateVonageCredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "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.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ },
+ "required": [
+ "provider",
+ "apiSecret",
+ "apiKey"
+ ]
+ },
+ "CreateWebhookCredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "webhook"
+ ]
+ },
+ "authenticationPlan": {
+ "description": "This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication.",
"oneOf": [
{
- "type": "string",
- "enum": [],
- "title": "Preset Voice Options"
+ "$ref": "#/components/schemas/OAuth2AuthenticationPlan"
},
{
- "type": "string",
- "title": "Neuphonic Voice ID"
+ "$ref": "#/components/schemas/HMACAuthenticationPlan"
+ },
+ {
+ "$ref": "#/components/schemas/BearerAuthenticationPlan"
}
- ]
+ ],
+ "discriminator": {
+ "propertyName": "type",
+ "mapping": {
+ "oauth2": "#/components/schemas/OAuth2AuthenticationPlan",
+ "hmac": "#/components/schemas/HMACAuthenticationPlan",
+ "bearer": "#/components/schemas/BearerAuthenticationPlan"
+ }
+ }
},
- "model": {
+ "name": {
"type": "string",
- "description": "This is the model that will be used. Defaults to 'neu_fast' if not specified.",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ },
+ "required": [
+ "provider",
+ "authenticationPlan"
+ ]
+ },
+ "CreateXAiCredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "type": "string",
+ "description": "This is the api key for Grok in XAi's console. Get it from here: https://console.x.ai",
"enum": [
- "neu_hq",
- "neu_fast"
- ],
- "example": "neu_fast"
+ "xai"
+ ]
},
- "language": {
- "type": "object",
- "description": "This is the language (ISO 639-1) that is enforced for the model.",
- "example": "en"
+ "apiKey": {
+ "type": "string",
+ "maxLength": 10000,
+ "description": "This is not returned in the API."
},
- "speed": {
- "type": "number",
- "description": "This is the speed multiplier that will be used.",
- "minimum": 0.25,
- "maximum": 2,
- "example": null
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ },
+ "required": [
+ "provider",
+ "apiKey"
+ ]
+ },
+ "CreateGoogleCalendarOAuth2ClientCredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "google.calendar.oauth2-client"
+ ]
},
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
- {
- "$ref": "#/components/schemas/ChunkPlan"
- }
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ },
+ "required": [
+ "provider"
+ ]
+ },
+ "CreateGoogleCalendarOAuth2AuthorizationCredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "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.",
+ "minLength": 1,
+ "maxLength": 40
}
},
"required": [
"provider",
- "voiceId",
- "language"
+ "authorizationId"
]
},
- "FallbackOpenAIVoice": {
+ "CreateGoogleSheetsOAuth2AuthorizationCredentialDTO": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
"provider": {
"type": "string",
- "description": "This is the voice provider that will be used.",
"enum": [
- "openai"
+ "google.sheets.oauth2-authorization"
]
},
- "voiceId": {
- "description": "This is the provider-specific ID that will be used.\nPlease note that ash, ballad, coral, sage, and verse may only be used with realtime models.",
- "oneOf": [
- {
- "type": "string",
- "enum": [
- "alloy",
- "echo",
- "fable",
- "onyx",
- "nova",
- "shimmer",
- "marin",
- "cedar"
- ],
- "title": "Preset Voice Options"
- },
- {
- "type": "string",
- "title": "OpenAI Voice ID"
- }
- ]
+ "authorizationId": {
+ "type": "string",
+ "description": "The authorization ID for the OAuth2 authorization"
},
- "model": {
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ },
+ "required": [
+ "provider",
+ "authorizationId"
+ ]
+ },
+ "CreateSlackOAuth2AuthorizationCredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
"type": "string",
- "description": "This is the model that will be used for text-to-speech.",
"enum": [
- "tts-1",
- "tts-1-hd",
- "gpt-4o-mini-tts"
+ "slack.oauth2-authorization"
]
},
- "instructions": {
+ "authorizationId": {
"type": "string",
- "description": "This is a prompt that allows you to control the voice of your generated audio.\nDoes not work with 'tts-1' or 'tts-1-hd' models.",
- "maxLength": 10000
- },
- "speed": {
- "type": "number",
- "description": "This is the speed multiplier that will be used.",
- "minimum": 0.25,
- "maximum": 4,
- "example": null
+ "description": "The authorization ID for the OAuth2 authorization"
},
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
- {
- "$ref": "#/components/schemas/ChunkPlan"
- }
- ]
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
}
},
"required": [
"provider",
- "voiceId"
+ "authorizationId"
]
},
- "FallbackPlayHTVoice": {
+ "CreateMinimaxCredentialDTO": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
"provider": {
"type": "string",
- "description": "This is the voice provider that will be used.",
"enum": [
- "playht"
- ]
- },
- "voiceId": {
- "description": "This is the provider-specific ID that will be used.",
- "oneOf": [
- {
- "type": "string",
- "enum": [
- "jennifer",
- "melissa",
- "will",
- "chris",
- "matt",
- "jack",
- "ruby",
- "davis",
- "donna",
- "michael"
- ],
- "title": "Preset Voice Options"
- },
- {
- "type": "string",
- "title": "PlayHT Voice ID"
- }
+ "minimax"
]
},
- "speed": {
- "type": "number",
- "description": "This is the speed multiplier that will be used.",
- "minimum": 0.1,
- "maximum": 5,
- "example": null
- },
- "temperature": {
- "type": "number",
- "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.",
- "minimum": 0.1,
- "maximum": 2,
- "example": null
- },
- "emotion": {
+ "apiKey": {
"type": "string",
- "description": "An emotion to be applied to the speech.",
- "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"
- ],
- "example": null
+ "description": "This is not returned in the API."
},
- "voiceGuidance": {
- "type": "number",
- "description": "A number between 1 and 6. Use lower numbers to reduce how unique your chosen voice will be compared to other voices.",
- "minimum": 1,
- "maximum": 6,
- "example": null
+ "groupId": {
+ "type": "string",
+ "description": "This is the Minimax Group ID."
},
- "styleGuidance": {
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ },
+ "required": [
+ "provider",
+ "apiKey",
+ "groupId"
+ ]
+ },
+ "EndpointedSpeechLowConfidenceOptions": {
+ "type": "object",
+ "properties": {
+ "confidenceMin": {
"type": "number",
- "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.",
- "minimum": 1,
- "maximum": 30,
- "example": null
+ "description": "This is the minimum confidence threshold.\nTranscripts with confidence below this value will be discarded.\n\n@default confidenceMax - 0.2",
+ "minimum": 0,
+ "maximum": 1
},
- "textGuidance": {
+ "confidenceMax": {
"type": "number",
- "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.",
- "minimum": 1,
- "maximum": 2,
- "example": null
- },
- "model": {
- "type": "string",
- "description": "Playht voice model/engine to use.",
- "enum": [
- "PlayHT2.0",
- "PlayHT2.0-turbo",
- "Play3.0-mini",
- "PlayDialog"
- ]
+ "description": "This is the maximum confidence threshold.\nTranscripts with confidence at or above this value will be processed normally.\n\n@default transcriber's confidenceThreshold",
+ "minimum": 0,
+ "maximum": 1
+ }
+ }
+ },
+ "CallHookTranscriberEndpointedSpeechLowConfidence": {
+ "type": "object",
+ "properties": {
+ "do": {
+ "type": "array",
+ "description": "This is the set of actions to perform when the hook triggers",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/SayHookAction",
+ "title": "SayHookAction"
+ },
+ {
+ "$ref": "#/components/schemas/ToolCallHookAction",
+ "title": "ToolCallHookAction"
+ },
+ {
+ "$ref": "#/components/schemas/MessageAddHookAction",
+ "title": "MessageAddHookAction"
+ }
+ ]
+ }
},
- "language": {
+ "on": {
"type": "string",
- "description": "The language to use for the speech.",
- "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": "This is the event that triggers this hook",
+ "maxLength": 1000
},
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "options": {
+ "description": "This is the options for the hook including confidence thresholds",
"allOf": [
{
- "$ref": "#/components/schemas/ChunkPlan"
+ "$ref": "#/components/schemas/EndpointedSpeechLowConfidenceOptions"
}
]
}
},
"required": [
- "provider",
- "voiceId"
+ "do",
+ "on"
]
},
- "FallbackRimeAIVoice": {
+ "SessionCreatedHook": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
- "provider": {
+ "on": {
"type": "string",
- "description": "This is the voice provider that will be used.",
+ "description": "This is the event that triggers this hook",
"enum": [
- "rime-ai"
- ]
+ "session.created"
+ ],
+ "maxLength": 1000
},
- "voiceId": {
- "description": "This is the provider-specific ID that will be used.",
- "oneOf": [
- {
- "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"
- ],
- "title": "Suggested Voice Options",
- "description": "Popular Rime AI voices across mist, mistv2, and arcana models. Any valid Rime AI voice ID is accepted, not just these suggestions."
- },
- {
- "type": "string",
- "title": "Any Rime AI Voice ID",
- "description": "Any valid Rime AI voice ID. See https://docs.rime.ai/docs/voices for the full catalog."
- }
- ]
+ "do": {
+ "type": "array",
+ "description": "This is the set of actions to perform when the hook triggers.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/ToolCallHookAction",
+ "title": "ToolCallHookAction"
+ }
+ ]
+ }
},
- "model": {
+ "name": {
"type": "string",
- "description": "This is the model that will be used. Defaults to 'arcana' when not specified.",
+ "description": "Optional name for this hook instance.\nIf no name is provided, the hook will be auto generated as UUID.\n\n@default UUID",
+ "maxLength": 1000
+ }
+ },
+ "required": [
+ "on",
+ "do"
+ ]
+ },
+ "SQLInjectionSecurityFilter": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "The type of security threat to filter.",
"enum": [
- "arcana",
- "mistv2",
- "mist"
- ],
- "example": "arcana"
- },
- "speed": {
- "type": "number",
- "description": "This is the speed multiplier that will be used.",
- "minimum": 0.1,
- "example": null
- },
- "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.",
- "example": false
- },
- "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.",
- "example": false
- },
- "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",
- "example": false
- },
- "inlineSpeedAlpha": {
+ "sql-injection"
+ ]
+ }
+ },
+ "required": [
+ "type"
+ ]
+ },
+ "XSSSecurityFilter": {
+ "type": "object",
+ "properties": {
+ "type": {
"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",
- "example": null
- },
- "language": {
+ "description": "The type of security threat to filter.",
+ "enum": [
+ "xss"
+ ]
+ }
+ },
+ "required": [
+ "type"
+ ]
+ },
+ "SSRFSecurityFilter": {
+ "type": "object",
+ "properties": {
+ "type": {
"type": "string",
- "description": "Language for speech synthesis. Uses ISO 639 codes. Supported: en, es, de, fr, ar, hi, ja, he, pt, ta, si.",
+ "description": "The type of security threat to filter.",
"enum": [
- "en",
- "es",
- "de",
- "fr",
- "ar",
- "hi",
- "ja",
- "he",
- "pt",
- "ta",
- "si"
- ],
- "example": "en"
- },
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
- {
- "$ref": "#/components/schemas/ChunkPlan"
- }
+ "ssrf"
+ ]
+ }
+ },
+ "required": [
+ "type"
+ ]
+ },
+ "RCESecurityFilter": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "The type of security threat to filter.",
+ "enum": [
+ "rce"
+ ]
+ }
+ },
+ "required": [
+ "type"
+ ]
+ },
+ "PromptInjectionSecurityFilter": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "The type of security threat to filter.",
+ "enum": [
+ "prompt-injection"
]
}
},
"required": [
- "provider",
- "voiceId"
+ "type"
]
},
- "FallbackSesameVoice": {
+ "RegexSecurityFilter": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
- "provider": {
+ "type": {
"type": "string",
- "description": "This is the voice provider that will be used.",
+ "description": "The type of security threat to filter.",
"enum": [
- "sesame"
+ "regex"
]
},
- "voiceId": {
- "type": "string",
- "description": "This is the provider-specific ID that will be used.",
- "title": "Sesame Voice ID. This should be either a name (a built-in voice) or a UUID (a custom voice)."
- },
- "model": {
+ "regex": {
"type": "string",
- "description": "This is the model that will be used.",
- "enum": [
- "csm-1b"
- ]
- },
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
- {
- "$ref": "#/components/schemas/ChunkPlan"
- }
- ]
+ "description": "The regex pattern to filter.",
+ "example": "badword1|badword2"
}
},
"required": [
- "provider",
- "voiceId",
- "model"
+ "type",
+ "regex"
]
},
- "FallbackSmallestAIVoice": {
+ "AssistantOverrides": {
"type": "object",
"properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
- },
- "provider": {
- "type": "string",
- "description": "This is the voice provider that will be used.",
- "enum": [
- "smallest-ai"
- ]
- },
- "voiceId": {
- "description": "This is the provider-specific ID that will be used.",
+ "transcriber": {
+ "description": "These are the options for the assistant's transcriber.",
"oneOf": [
{
- "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": "Preset Voice Options"
+ "$ref": "#/components/schemas/AssemblyAITranscriber",
+ "title": "AssemblyAITranscriber"
},
{
- "type": "string",
- "title": "Smallest AI Voice ID"
+ "$ref": "#/components/schemas/AzureSpeechTranscriber",
+ "title": "AzureSpeechTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/CustomTranscriber",
+ "title": "CustomTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/DeepgramTranscriber",
+ "title": "DeepgramTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/ElevenLabsTranscriber",
+ "title": "ElevenLabsTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/GladiaTranscriber",
+ "title": "GladiaTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/GoogleTranscriber",
+ "title": "GoogleTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/SpeechmaticsTranscriber",
+ "title": "SpeechmaticsTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/TalkscriberTranscriber",
+ "title": "TalkscriberTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAITranscriber",
+ "title": "OpenAITranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/CartesiaTranscriber",
+ "title": "CartesiaTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/SonioxTranscriber",
+ "title": "SonioxTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/XaiTranscriber",
+ "title": "XaiTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/VapiTranscriber",
+ "title": "VapiTranscriber"
}
]
},
"model": {
- "type": "string",
- "description": "Smallest AI voice model to use. Defaults to 'lightning' when not specified.",
- "enum": [
- "lightning"
+ "description": "These are the options for the assistant's LLM.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/AnthropicModel",
+ "title": "Anthropic"
+ },
+ {
+ "$ref": "#/components/schemas/AnthropicBedrockModel",
+ "title": "AnthropicBedrock"
+ },
+ {
+ "$ref": "#/components/schemas/AnyscaleModel",
+ "title": "Anyscale"
+ },
+ {
+ "$ref": "#/components/schemas/CerebrasModel",
+ "title": "Cerebras"
+ },
+ {
+ "$ref": "#/components/schemas/CustomLLMModel",
+ "title": "CustomLLM"
+ },
+ {
+ "$ref": "#/components/schemas/DeepInfraModel",
+ "title": "DeepInfra"
+ },
+ {
+ "$ref": "#/components/schemas/DeepSeekModel",
+ "title": "DeepSeek"
+ },
+ {
+ "$ref": "#/components/schemas/GoogleModel",
+ "title": "Google"
+ },
+ {
+ "$ref": "#/components/schemas/GroqModel",
+ "title": "Groq"
+ },
+ {
+ "$ref": "#/components/schemas/InflectionAIModel",
+ "title": "InflectionAI"
+ },
+ {
+ "$ref": "#/components/schemas/MinimaxLLMModel",
+ "title": "MiniMaxLLM"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAIModel",
+ "title": "OpenAI"
+ },
+ {
+ "$ref": "#/components/schemas/OpenRouterModel",
+ "title": "OpenRouter"
+ },
+ {
+ "$ref": "#/components/schemas/PerplexityAIModel",
+ "title": "PerplexityAI"
+ },
+ {
+ "$ref": "#/components/schemas/TogetherAIModel",
+ "title": "Together"
+ },
+ {
+ "$ref": "#/components/schemas/XaiModel",
+ "title": "XAI"
+ },
+ {
+ "$ref": "#/components/schemas/VapiModel",
+ "title": "Vapi"
+ }
]
},
- "speed": {
- "type": "number",
- "description": "This is the speed multiplier that will be used.",
- "example": null
- },
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
- "allOf": [
+ "voice": {
+ "description": "These are the options for the assistant's voice.",
+ "oneOf": [
{
- "$ref": "#/components/schemas/ChunkPlan"
+ "$ref": "#/components/schemas/AzureVoice",
+ "title": "AzureVoice"
+ },
+ {
+ "$ref": "#/components/schemas/CartesiaVoice",
+ "title": "CartesiaVoice"
+ },
+ {
+ "$ref": "#/components/schemas/CustomVoice",
+ "title": "CustomVoice"
+ },
+ {
+ "$ref": "#/components/schemas/DeepgramVoice",
+ "title": "DeepgramVoice"
+ },
+ {
+ "$ref": "#/components/schemas/ElevenLabsVoice",
+ "title": "ElevenLabsVoice"
+ },
+ {
+ "$ref": "#/components/schemas/HumeVoice",
+ "title": "HumeVoice"
+ },
+ {
+ "$ref": "#/components/schemas/LMNTVoice",
+ "title": "LMNTVoice"
+ },
+ {
+ "$ref": "#/components/schemas/NeuphonicVoice",
+ "title": "NeuphonicVoice"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAIVoice",
+ "title": "OpenAIVoice"
+ },
+ {
+ "$ref": "#/components/schemas/PlayHTVoice",
+ "title": "PlayHTVoice"
+ },
+ {
+ "$ref": "#/components/schemas/WellSaidVoice",
+ "title": "WellSaidVoice"
+ },
+ {
+ "$ref": "#/components/schemas/RimeAIVoice",
+ "title": "RimeAIVoice"
+ },
+ {
+ "$ref": "#/components/schemas/SmallestAIVoice",
+ "title": "SmallestAIVoice"
+ },
+ {
+ "$ref": "#/components/schemas/TavusVoice",
+ "title": "TavusVoice"
+ },
+ {
+ "$ref": "#/components/schemas/VapiVoice",
+ "title": "VapiVoice"
+ },
+ {
+ "$ref": "#/components/schemas/SesameVoice",
+ "title": "SesameVoice"
+ },
+ {
+ "$ref": "#/components/schemas/InworldVoice",
+ "title": "InworldVoice"
+ },
+ {
+ "$ref": "#/components/schemas/MinimaxVoice",
+ "title": "MinimaxVoice"
+ },
+ {
+ "$ref": "#/components/schemas/XaiVoice",
+ "title": "XaiVoice"
+ },
+ {
+ "$ref": "#/components/schemas/MicrosoftVoice",
+ "title": "MicrosoftVoice"
}
]
- }
- },
- "required": [
- "provider",
- "voiceId"
- ]
- },
- "FallbackTavusVoice": {
- "type": "object",
- "properties": {
- "cachingEnabled": {
+ },
+ "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.).\n\nIf unspecified, assistant will wait for user to speak and use the model to respond once they speak.",
+ "example": "Hello! How can I help you today?"
+ },
+ "firstMessageInterruptionsEnabled": {
"type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
+ "default": false
},
- "provider": {
+ "firstMessageMode": {
"type": "string",
- "description": "This is the voice provider that will be used.",
+ "description": "This is the mode for the first message. Default is 'assistant-speaks-first'.\n\nUse:\n- 'assistant-speaks-first' to have the assistant speak first.\n- 'assistant-waits-for-user' to have the assistant wait for the user to speak first.\n- '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).\n\n@default 'assistant-speaks-first'",
"enum": [
- "tavus"
+ "assistant-speaks-first",
+ "assistant-speaks-first-with-model-generated-message",
+ "assistant-waits-for-user"
+ ],
+ "example": "assistant-speaks-first"
+ },
+ "voicemailDetection": {
+ "description": "These are the settings to configure or disable voicemail detection. Alternatively, voicemail detection can be configured using the model.tools=[VoicemailTool].\nBy default, voicemail detection is disabled.",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "off"
+ ]
+ },
+ {
+ "$ref": "#/components/schemas/GoogleVoicemailDetectionPlan",
+ "title": "Google"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAIVoicemailDetectionPlan",
+ "title": "OpenAI"
+ },
+ {
+ "$ref": "#/components/schemas/TwilioVoicemailDetectionPlan",
+ "title": "Twilio"
+ },
+ {
+ "$ref": "#/components/schemas/VapiVoicemailDetectionPlan",
+ "title": "Vapi"
+ }
]
},
- "voiceId": {
- "description": "This is the provider-specific ID that will be used.",
+ "clientMessages": {
+ "type": "array",
+ "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"
+ ],
+ "example": [
+ "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"
+ ],
+ "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.",
+ "items": {
+ "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"
+ ]
+ }
+ },
+ "serverMessages": {
+ "type": "array",
+ "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"
+ ],
+ "example": [
+ "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"
+ ],
+ "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.",
+ "items": {
+ "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"
+ ]
+ }
+ },
+ "maxDurationSeconds": {
+ "type": "number",
+ "description": "This is the maximum number of seconds that the call will last. When the call reaches this duration, it will be ended.\n\n@default 600 (10 minutes)",
+ "minimum": 10,
+ "maximum": 43200,
+ "example": 600
+ },
+ "backgroundSound": {
+ "description": "This is the background sound in the call. Default for phone calls is 'office' and default for web calls is 'off'.\nYou can also provide a custom sound by providing a URL to an audio file.",
"oneOf": [
{
"type": "string",
"enum": [
- "r52da2535a"
+ "off",
+ "office"
],
- "title": "Preset Voice Options"
+ "example": "office"
},
{
"type": "string",
- "title": "Tavus Voice ID"
+ "format": "uri",
+ "example": "https://www.soundjay.com/ambient/sounds/people-in-lounge-1.mp3"
}
]
},
- "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."
+ "modelOutputInMessagesEnabled": {
+ "type": "boolean",
+ "description": "This determines whether the model's output is used in conversation history rather than the transcription of assistant's speech.\n\n@default false",
+ "example": false
},
- "customGreeting": {
- "type": "string",
- "description": "This is the custom greeting that the replica will give once a participant joines the conversation."
+ "transportConfigurations": {
+ "type": "array",
+ "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.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/TransportConfigurationTwilio",
+ "title": "Twilio"
+ }
+ ]
+ }
},
- "properties": {
- "description": "These are optional properties used to customize the conversation.",
- "allOf": [
+ "observabilityPlan": {
+ "description": "This is the plan for observability of assistant's calls.\n\nCurrently, only Langfuse is supported.",
+ "oneOf": [
{
- "$ref": "#/components/schemas/TavusConversationProperties"
+ "$ref": "#/components/schemas/LangfuseObservabilityPlan",
+ "title": "Langfuse"
}
- ]
- },
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ ],
"allOf": [
{
- "$ref": "#/components/schemas/ChunkPlan"
+ "$ref": "#/components/schemas/LangfuseObservabilityPlan"
}
]
- }
- },
- "required": [
- "provider",
- "voiceId"
- ]
- },
- "FallbackVapiVoice": {
- "type": "object",
- "properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
},
- "provider": {
+ "credentials": {
+ "type": "array",
+ "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.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CreateAnthropicCredentialDTO",
+ "title": "AnthropicCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAnthropicBedrockCredentialDTO",
+ "title": "AnthropicBedrockCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAnyscaleCredentialDTO",
+ "title": "AnyscaleCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAssemblyAICredentialDTO",
+ "title": "AssemblyAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAzureCredentialDTO",
+ "title": "AzureCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAzureOpenAICredentialDTO",
+ "title": "AzureOpenAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateByoSipTrunkCredentialDTO",
+ "title": "ByoSipTrunkCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCartesiaCredentialDTO",
+ "title": "CartesiaCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCerebrasCredentialDTO",
+ "title": "CerebrasCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCloudflareCredentialDTO",
+ "title": "CloudflareCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCustomLLMCredentialDTO",
+ "title": "CustomLLMCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateDeepgramCredentialDTO",
+ "title": "DeepgramCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateDeepInfraCredentialDTO",
+ "title": "DeepInfraCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateDeepSeekCredentialDTO",
+ "title": "DeepSeekCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateElevenLabsCredentialDTO",
+ "title": "ElevenLabsCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGcpCredentialDTO",
+ "title": "GcpCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGladiaCredentialDTO",
+ "title": "GladiaCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelCredentialDTO",
+ "title": "GhlCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCredentialDTO",
+ "title": "GoogleCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGroqCredentialDTO",
+ "title": "GroqCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateHumeCredentialDTO",
+ "title": "HumeCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateInflectionAICredentialDTO",
+ "title": "InflectionAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateLangfuseCredentialDTO",
+ "title": "LangfuseCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateLmntCredentialDTO",
+ "title": "LmntCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMakeCredentialDTO",
+ "title": "MakeCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMistralCredentialDTO",
+ "title": "MistralCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateNeuphonicCredentialDTO",
+ "title": "NeuphonicCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateOpenAICredentialDTO",
+ "title": "OpenAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateOpenRouterCredentialDTO",
+ "title": "OpenRouterCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreatePerplexityAICredentialDTO",
+ "title": "PerplexityAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreatePlayHTCredentialDTO",
+ "title": "PlayHTCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateRimeAICredentialDTO",
+ "title": "RimeAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateRunpodCredentialDTO",
+ "title": "RunpodCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateS3CredentialDTO",
+ "title": "S3Credential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateS3CompatibleCredentialDTO",
+ "title": "S3CompatibleStorageCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSmallestAICredentialDTO",
+ "title": "SmallestAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSpeechmaticsCredentialDTO",
+ "title": "SpeechmaticsCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSonioxCredentialDTO",
+ "title": "SonioxCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSupabaseCredentialDTO",
+ "title": "SupabaseCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTavusCredentialDTO",
+ "title": "TavusCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTogetherAICredentialDTO",
+ "title": "TogetherAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTwilioCredentialDTO",
+ "title": "TwilioCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateVonageCredentialDTO",
+ "title": "VonageCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateWebhookCredentialDTO",
+ "title": "WebhookCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCustomCredentialDTO",
+ "title": "CustomCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateXAiCredentialDTO",
+ "title": "XAiCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO",
+ "title": "MicrosoftCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
+ "title": "GoogleCalendarOAuth2ClientCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO",
+ "title": "GoogleCalendarOAuth2AuthorizationCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO",
+ "title": "GoogleSheetsOAuth2AuthorizationCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSlackOAuth2AuthorizationCredentialDTO",
+ "title": "SlackOAuth2AuthorizationCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelMCPCredentialDTO",
+ "title": "GoHighLevelMCPCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateInworldCredentialDTO",
+ "title": "InworldCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMinimaxCredentialDTO",
+ "title": "MinimaxCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateWellSaidCredentialDTO",
+ "title": "WellSaidCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateEmailCredentialDTO",
+ "title": "EmailCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSlackWebhookCredentialDTO",
+ "title": "SlackWebhookCredential"
+ }
+ ],
+ "discriminator": {
+ "propertyName": "provider",
+ "mapping": {
+ "11labs": "#/components/schemas/CreateElevenLabsCredentialDTO",
+ "anthropic": "#/components/schemas/CreateAnthropicCredentialDTO",
+ "anthropic-bedrock": "#/components/schemas/CreateAnthropicBedrockCredentialDTO",
+ "anyscale": "#/components/schemas/CreateAnyscaleCredentialDTO",
+ "assembly-ai": "#/components/schemas/CreateAssemblyAICredentialDTO",
+ "azure-openai": "#/components/schemas/CreateAzureOpenAICredentialDTO",
+ "azure": "#/components/schemas/CreateAzureCredentialDTO",
+ "byo-sip-trunk": "#/components/schemas/CreateByoSipTrunkCredentialDTO",
+ "cartesia": "#/components/schemas/CreateCartesiaCredentialDTO",
+ "cerebras": "#/components/schemas/CreateCerebrasCredentialDTO",
+ "cloudflare": "#/components/schemas/CreateCloudflareCredentialDTO",
+ "custom-llm": "#/components/schemas/CreateCustomLLMCredentialDTO",
+ "deepgram": "#/components/schemas/CreateDeepgramCredentialDTO",
+ "deepinfra": "#/components/schemas/CreateDeepInfraCredentialDTO",
+ "deep-seek": "#/components/schemas/CreateDeepSeekCredentialDTO",
+ "gcp": "#/components/schemas/CreateGcpCredentialDTO",
+ "gladia": "#/components/schemas/CreateGladiaCredentialDTO",
+ "gohighlevel": "#/components/schemas/CreateGoHighLevelCredentialDTO",
+ "google": "#/components/schemas/CreateGoogleCredentialDTO",
+ "groq": "#/components/schemas/CreateGroqCredentialDTO",
+ "inflection-ai": "#/components/schemas/CreateInflectionAICredentialDTO",
+ "langfuse": "#/components/schemas/CreateLangfuseCredentialDTO",
+ "lmnt": "#/components/schemas/CreateLmntCredentialDTO",
+ "make": "#/components/schemas/CreateMakeCredentialDTO",
+ "openai": "#/components/schemas/CreateOpenAICredentialDTO",
+ "openrouter": "#/components/schemas/CreateOpenRouterCredentialDTO",
+ "perplexity-ai": "#/components/schemas/CreatePerplexityAICredentialDTO",
+ "playht": "#/components/schemas/CreatePlayHTCredentialDTO",
+ "rime-ai": "#/components/schemas/CreateRimeAICredentialDTO",
+ "runpod": "#/components/schemas/CreateRunpodCredentialDTO",
+ "s3": "#/components/schemas/CreateS3CredentialDTO",
+ "s3-compatible": "#/components/schemas/CreateS3CompatibleCredentialDTO",
+ "supabase": "#/components/schemas/CreateSupabaseCredentialDTO",
+ "smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO",
+ "tavus": "#/components/schemas/CreateTavusCredentialDTO",
+ "together-ai": "#/components/schemas/CreateTogetherAICredentialDTO",
+ "twilio": "#/components/schemas/CreateTwilioCredentialDTO",
+ "vonage": "#/components/schemas/CreateVonageCredentialDTO",
+ "webhook": "#/components/schemas/CreateWebhookCredentialDTO",
+ "custom-credential": "#/components/schemas/CreateCustomCredentialDTO",
+ "xai": "#/components/schemas/CreateXAiCredentialDTO",
+ "microsoft": "#/components/schemas/CreateMicrosoftCredentialDTO",
+ "neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO",
+ "hume": "#/components/schemas/CreateHumeCredentialDTO",
+ "mistral": "#/components/schemas/CreateMistralCredentialDTO",
+ "speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO",
+ "soniox": "#/components/schemas/CreateSonioxCredentialDTO",
+ "google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
+ "google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO",
+ "google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO",
+ "slack.oauth2-authorization": "#/components/schemas/CreateSlackOAuth2AuthorizationCredentialDTO",
+ "ghl.oauth2-authorization": "#/components/schemas/CreateGoHighLevelMCPCredentialDTO",
+ "inworld": "#/components/schemas/CreateInworldCredentialDTO",
+ "minimax": "#/components/schemas/CreateMinimaxCredentialDTO",
+ "wellsaid": "#/components/schemas/CreateWellSaidCredentialDTO",
+ "email": "#/components/schemas/CreateEmailCredentialDTO",
+ "slack-webhook": "#/components/schemas/CreateSlackWebhookCredentialDTO"
+ }
+ }
+ }
+ },
+ "hooks": {
+ "type": "array",
+ "description": "This is a set of actions that will be performed on certain events.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CallHookCallEnding",
+ "title": "CallHookCallEnding"
+ },
+ {
+ "$ref": "#/components/schemas/CallHookAssistantSpeechInterrupted",
+ "title": "CallHookAssistantSpeechInterrupted"
+ },
+ {
+ "$ref": "#/components/schemas/CallHookCustomerSpeechInterrupted",
+ "title": "CallHookCustomerSpeechInterrupted"
+ },
+ {
+ "$ref": "#/components/schemas/CallHookCustomerSpeechTimeout",
+ "title": "CallHookCustomerSpeechTimeout"
+ },
+ {
+ "$ref": "#/components/schemas/SessionCreatedHook",
+ "title": "SessionCreatedHook"
+ }
+ ]
+ }
+ },
+ "tools:append": {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CreateApiRequestToolDTO",
+ "title": "ApiRequestTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateBashToolDTO",
+ "title": "BashTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCodeToolDTO",
+ "title": "CodeTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateComputerToolDTO",
+ "title": "ComputerTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateDtmfToolDTO",
+ "title": "DtmfTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateEndCallToolDTO",
+ "title": "EndCallTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateFunctionToolDTO",
+ "title": "FunctionTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO",
+ "title": "GoHighLevelCalendarAvailabilityTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO",
+ "title": "GoHighLevelCalendarEventCreateTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelContactCreateToolDTO",
+ "title": "GoHighLevelContactCreateTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelContactGetToolDTO",
+ "title": "GoHighLevelContactGetTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO",
+ "title": "GoogleCalendarCheckAvailabilityTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarCreateEventToolDTO",
+ "title": "GoogleCalendarCreateEventTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleSheetsRowAppendToolDTO",
+ "title": "GoogleSheetsRowAppendTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateHandoffToolDTO",
+ "title": "HandoffTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMcpToolDTO",
+ "title": "McpTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateQueryToolDTO",
+ "title": "QueryTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSlackSendMessageToolDTO",
+ "title": "SlackSendMessageTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSmsToolDTO",
+ "title": "SmsTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTextEditorToolDTO",
+ "title": "TextEditorTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTransferCallToolDTO",
+ "title": "TransferCallTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSipRequestToolDTO",
+ "title": "SipRequestTool"
+ },
+ {
+ "$ref": "#/components/schemas/CreateVoicemailToolDTO",
+ "title": "VoicemailTool"
+ }
+ ]
+ }
+ },
+ "variableValues": {
+ "type": "object",
+ "description": "These are values that will be used to replace the template variables in the assistant messages and other text-based fields.\nThis uses LiquidJS syntax. https://liquidjs.com/tutorials/intro-to-liquid.html\n\nSo for example, `{{ name }}` will be replaced with the value of `name` in `variableValues`.\n`{{\"now\" | date: \"%b %d, %Y, %I:%M %p\", \"America/New_York\"}}` will be replaced with the current date and time in New York.\n Some VAPI reserved defaults:\n - *customer* - the customer object"
+ },
+ "name": {
"type": "string",
- "description": "This is the voice provider that will be used.",
- "enum": [
- "vapi"
- ]
+ "description": "This is the name of the assistant.\n\nThis is required when you want to transfer between assistants in a call.",
+ "maxLength": 40
},
- "voiceId": {
+ "voicemailMessage": {
"type": "string",
- "description": "The voices provided by Vapi",
- "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": "This is the message that the assistant will say if the call is forwarded to voicemail.\n\nIf unspecified, it will hang up.",
+ "maxLength": 1000
},
- "speed": {
- "type": "number",
- "description": "This is the speed multiplier that will be used.\n\n@default 1",
- "minimum": 0.25,
- "maximum": 2,
- "default": 1
+ "endCallMessage": {
+ "type": "string",
+ "description": "This is the message that the assistant will say if it ends the call.\n\nIf unspecified, it will hang up without saying anything.",
+ "maxLength": 1000
},
- "pronunciationDictionary": {
- "description": "List of pronunciation dictionary locators for custom word pronunciations.",
+ "endCallPhrases": {
+ "description": "This list contains phrases that, if spoken by the assistant, will trigger the call to be hung up. Case insensitive.",
"type": "array",
"items": {
- "$ref": "#/components/schemas/VapiPronunciationDictionaryLocator"
+ "type": "string",
+ "maxLength": 140,
+ "minLength": 2
}
},
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "compliancePlan": {
+ "$ref": "#/components/schemas/CompliancePlan"
+ },
+ "metadata": {
+ "type": "object",
+ "description": "This is for metadata you want to store on the assistant."
+ },
+ "backgroundSpeechDenoisingPlan": {
+ "description": "This enables filtering of noise and background speech while the user is talking.\n\nFeatures:\n- Smart denoising using Krisp\n- Fourier denoising\n\nSmart denoising can be combined with or used independently of Fourier denoising.\n\nOrder of precedence:\n- Smart denoising\n- Fourier denoising",
"allOf": [
{
- "$ref": "#/components/schemas/ChunkPlan"
+ "$ref": "#/components/schemas/BackgroundSpeechDenoisingPlan"
}
]
- }
- },
- "required": [
- "provider",
- "voiceId"
- ]
- },
- "FallbackInworldVoice": {
- "type": "object",
- "properties": {
- "cachingEnabled": {
- "type": "boolean",
- "description": "This is the flag to toggle voice caching for the assistant.",
- "example": true,
- "default": true
},
- "provider": {
- "type": "string",
- "description": "This is the voice provider that will be used.",
- "enum": [
- "inworld"
+ "analysisPlan": {
+ "description": "This is the plan for analysis of assistant's calls. Stored in `call.analysis`.",
+ "deprecated": true,
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/AnalysisPlan"
+ }
]
},
- "voiceId": {
- "type": "string",
- "description": "Available voices by language:\n• 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\n• zh: Yichen, Xiaoyin, Xinyi, Jing\n• nl: Erik, Katrien, Lennart, Lore\n• fr: Alain, Hélène, Mathieu, Étienne\n• de: Johanna, Josef\n• it: Gianni, Orietta\n• ja: Asuka, Satoshi\n• ko: Hyunwoo, Minji, Seojun, Yoona\n• pl: Szymon, Wojciech\n• pt: Heitor, Maitê\n• es: Diego, Lupita, Miguel, Rafael\n• ru: Svetlana, Elena, Dmitry, Nikolai\n• hi: Riya, Manoj\n• he: Yael, Oren\n• ar: Nour, Omar",
- "maxLength": 120,
- "title": "Inworld Voice ID",
- "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"
- ],
- "example": "Alex"
- },
- "model": {
- "type": "string",
- "description": "This is the model that will be used.",
- "enum": [
- "inworld-tts-1"
- ],
- "default": "inworld-tts-1"
- },
- "languageCode": {
- "type": "string",
- "description": "Language code for Inworld TTS synthesis",
- "default": "en",
- "enum": [
- "en",
- "zh",
- "ko",
- "nl",
- "fr",
- "es",
- "ja",
- "de",
- "it",
- "pl",
- "pt",
- "ru",
- "hi",
- "he",
- "ar"
+ "artifactPlan": {
+ "description": "This is the plan for artifacts generated during assistant's calls. Stored in `call.artifact`.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ArtifactPlan"
+ }
]
},
- "temperature": {
- "type": "number",
- "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.\nHigher values will make the output more random and can lead to more expressive results. Lower values will make it more deterministic.\nSee https://docs.inworld.ai/docs/tts/capabilities/generating-audio#additional-configurations for more details.",
- "minimum": 0.1,
- "maximum": 2,
- "default": 1.1,
- "example": null
- },
- "speakingRate": {
- "type": "number",
- "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.\nValues above 0.8 are recommended for higher quality.\nSee https://docs.inworld.ai/docs/tts/capabilities/generating-audio#additional-configurations for more details.",
- "minimum": 0.5,
- "maximum": 1.5,
- "default": 1,
- "example": null
- },
- "chunkPlan": {
- "description": "This is the plan for chunking the model output before it is sent to the voice provider.",
+ "startSpeakingPlan": {
+ "description": "This is the plan for when the assistant should start talking.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to start talking after the customer is done speaking.\n- The assistant is too fast to start talking after the customer is done speaking.\n- The assistant is so fast that it's actually interrupting the customer.",
"allOf": [
{
- "$ref": "#/components/schemas/ChunkPlan"
+ "$ref": "#/components/schemas/StartSpeakingPlan"
}
]
- }
- },
- "required": [
- "provider",
- "voiceId"
- ]
- },
- "TransportConfigurationTwilio": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "twilio"
+ },
+ "stopSpeakingPlan": {
+ "description": "This is the plan for when assistant should stop talking on customer interruption.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to recognize customer's interruption.\n- The assistant is too fast to recognize customer's interruption.\n- The assistant is getting interrupted by phrases that are just acknowledgments.\n- The assistant is getting interrupted by background noises.\n- The assistant is not properly stopping -- it starts talking right after getting interrupted.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/StopSpeakingPlan"
+ }
]
},
- "timeout": {
- "type": "number",
- "description": "The integer number of seconds that we should allow the phone to ring before assuming there is no answer.\nThe default is `60` seconds and the maximum is `600` seconds.\nFor some call flows, we will add a 5-second buffer to the timeout value you provide.\nFor this reason, a timeout value of 10 seconds could result in an actual timeout closer to 15 seconds.\nYou can set this to a short time, such as `15` seconds, to hang up before reaching an answering machine or voicemail.\n\n@default 60",
- "minimum": 1,
- "maximum": 600,
- "example": 60
+ "monitorPlan": {
+ "description": "This is the plan for real-time monitoring of the assistant's calls.\n\nUsage:\n- To enable live listening of the assistant's calls, set `monitorPlan.listenEnabled` to `true`.\n- To enable live control of the assistant's calls, set `monitorPlan.controlEnabled` to `true`.\n- To attach monitors to the assistant, set `monitorPlan.monitorIds` to the set of monitor ids.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/MonitorPlan"
+ }
+ ]
},
- "record": {
- "type": "boolean",
- "description": "Whether to record the call.\nCan be `true` to record the phone call, or `false` to not.\nThe default is `false`.\n\n@default false",
- "example": false
+ "credentialIds": {
+ "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.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
},
- "recordingChannels": {
- "type": "string",
- "description": "The number of channels in the final recording.\nCan be: `mono` or `dual`.\nThe default is `mono`.\n`mono` records both legs of the call in a single channel of the recording file.\n`dual` records each leg to a separate channel of the recording file.\nThe first channel of a dual-channel recording contains the parent call and the second channel contains the child call.\n\n@default 'mono'",
- "enum": [
- "mono",
- "dual"
- ],
- "example": "mono"
- }
- },
- "required": [
- "provider"
- ]
- },
- "CreateAnthropicCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "anthropic"
+ "server": {
+ "description": "This is where Vapi will send webhooks. You can find all webhooks available along with their shape in ServerMessage schema.\n\nThe order of precedence is:\n\n1. assistant.server.url\n2. phoneNumber.serverUrl\n3. org.serverUrl",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Server"
+ }
]
},
- "apiKey": {
- "type": "string",
- "maxLength": 10000,
- "description": "This is not returned in the API."
- },
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
+ "keypadInputPlan": {
+ "$ref": "#/components/schemas/KeypadInputPlan"
}
- },
- "required": [
- "provider",
- "apiKey"
- ]
+ }
},
- "CreateAnthropicBedrockCredentialDTO": {
+ "CreateAssistantDTO": {
"type": "object",
"properties": {
- "provider": {
- "type": "string",
- "enum": [
- "anthropic-bedrock"
+ "transcriber": {
+ "description": "These are the options for the assistant's transcriber.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/AssemblyAITranscriber",
+ "title": "AssemblyAITranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/AzureSpeechTranscriber",
+ "title": "AzureSpeechTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/CustomTranscriber",
+ "title": "CustomTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/DeepgramTranscriber",
+ "title": "DeepgramTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/ElevenLabsTranscriber",
+ "title": "ElevenLabsTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/GladiaTranscriber",
+ "title": "GladiaTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/GoogleTranscriber",
+ "title": "GoogleTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/SpeechmaticsTranscriber",
+ "title": "SpeechmaticsTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/TalkscriberTranscriber",
+ "title": "TalkscriberTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAITranscriber",
+ "title": "OpenAITranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/CartesiaTranscriber",
+ "title": "CartesiaTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/SonioxTranscriber",
+ "title": "SonioxTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/XaiTranscriber",
+ "title": "XaiTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/VapiTranscriber",
+ "title": "VapiTranscriber"
+ }
]
},
- "region": {
- "type": "string",
- "description": "AWS region where Bedrock is configured.",
- "enum": [
- "us-east-1",
- "us-west-2",
- "eu-west-1",
- "eu-west-3",
- "ap-northeast-1",
- "ap-southeast-2"
+ "model": {
+ "description": "These are the options for the assistant's LLM.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/AnthropicModel",
+ "title": "Anthropic"
+ },
+ {
+ "$ref": "#/components/schemas/AnthropicBedrockModel",
+ "title": "AnthropicBedrock"
+ },
+ {
+ "$ref": "#/components/schemas/AnyscaleModel",
+ "title": "Anyscale"
+ },
+ {
+ "$ref": "#/components/schemas/CerebrasModel",
+ "title": "Cerebras"
+ },
+ {
+ "$ref": "#/components/schemas/CustomLLMModel",
+ "title": "CustomLLM"
+ },
+ {
+ "$ref": "#/components/schemas/DeepInfraModel",
+ "title": "DeepInfra"
+ },
+ {
+ "$ref": "#/components/schemas/DeepSeekModel",
+ "title": "DeepSeek"
+ },
+ {
+ "$ref": "#/components/schemas/GoogleModel",
+ "title": "Google"
+ },
+ {
+ "$ref": "#/components/schemas/GroqModel",
+ "title": "Groq"
+ },
+ {
+ "$ref": "#/components/schemas/InflectionAIModel",
+ "title": "InflectionAI"
+ },
+ {
+ "$ref": "#/components/schemas/MinimaxLLMModel",
+ "title": "MiniMaxLLM"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAIModel",
+ "title": "OpenAI"
+ },
+ {
+ "$ref": "#/components/schemas/OpenRouterModel",
+ "title": "OpenRouter"
+ },
+ {
+ "$ref": "#/components/schemas/PerplexityAIModel",
+ "title": "PerplexityAI"
+ },
+ {
+ "$ref": "#/components/schemas/TogetherAIModel",
+ "title": "Together"
+ },
+ {
+ "$ref": "#/components/schemas/XaiModel",
+ "title": "XAI"
+ },
+ {
+ "$ref": "#/components/schemas/VapiModel",
+ "title": "Vapi"
+ }
]
},
- "authenticationPlan": {
- "description": "Authentication method - either direct IAM credentials or cross-account role assumption.",
+ "voice": {
+ "description": "These are the options for the assistant's voice.",
"oneOf": [
{
- "$ref": "#/components/schemas/AWSIAMCredentialsAuthenticationPlan"
+ "$ref": "#/components/schemas/AzureVoice",
+ "title": "AzureVoice"
+ },
+ {
+ "$ref": "#/components/schemas/CartesiaVoice",
+ "title": "CartesiaVoice"
+ },
+ {
+ "$ref": "#/components/schemas/CustomVoice",
+ "title": "CustomVoice"
+ },
+ {
+ "$ref": "#/components/schemas/DeepgramVoice",
+ "title": "DeepgramVoice"
+ },
+ {
+ "$ref": "#/components/schemas/ElevenLabsVoice",
+ "title": "ElevenLabsVoice"
+ },
+ {
+ "$ref": "#/components/schemas/HumeVoice",
+ "title": "HumeVoice"
+ },
+ {
+ "$ref": "#/components/schemas/LMNTVoice",
+ "title": "LMNTVoice"
+ },
+ {
+ "$ref": "#/components/schemas/NeuphonicVoice",
+ "title": "NeuphonicVoice"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAIVoice",
+ "title": "OpenAIVoice"
+ },
+ {
+ "$ref": "#/components/schemas/PlayHTVoice",
+ "title": "PlayHTVoice"
+ },
+ {
+ "$ref": "#/components/schemas/WellSaidVoice",
+ "title": "WellSaidVoice"
+ },
+ {
+ "$ref": "#/components/schemas/RimeAIVoice",
+ "title": "RimeAIVoice"
+ },
+ {
+ "$ref": "#/components/schemas/SmallestAIVoice",
+ "title": "SmallestAIVoice"
+ },
+ {
+ "$ref": "#/components/schemas/TavusVoice",
+ "title": "TavusVoice"
+ },
+ {
+ "$ref": "#/components/schemas/VapiVoice",
+ "title": "VapiVoice"
},
{
- "$ref": "#/components/schemas/AWSStsAuthenticationPlan"
+ "$ref": "#/components/schemas/SesameVoice",
+ "title": "SesameVoice"
+ },
+ {
+ "$ref": "#/components/schemas/InworldVoice",
+ "title": "InworldVoice"
+ },
+ {
+ "$ref": "#/components/schemas/MinimaxVoice",
+ "title": "MinimaxVoice"
+ },
+ {
+ "$ref": "#/components/schemas/XaiVoice",
+ "title": "XaiVoice"
+ },
+ {
+ "$ref": "#/components/schemas/MicrosoftVoice",
+ "title": "MicrosoftVoice"
}
]
},
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "region",
- "authenticationPlan"
- ]
- },
- "CreateAnyscaleCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "anyscale"
- ]
- },
- "apiKey": {
- "type": "string",
- "maxLength": 10000,
- "description": "This is not returned in the API."
- },
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "apiKey"
- ]
- },
- "CreateAssemblyAICredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "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.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "apiKey"
- ]
- },
- "AzureBlobStorageBucketPlan": {
- "type": "object",
- "properties": {
- "connectionString": {
- "type": "string",
- "description": "This is the blob storage connection string for the Azure resource."
- },
- "containerName": {
+ "firstMessage": {
"type": "string",
- "description": "This is the container name for the Azure blob storage."
+ "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.).\n\nIf unspecified, assistant will wait for user to speak and use the model to respond once they speak.",
+ "example": "Hello! How can I help you today?"
},
- "path": {
- "type": "string",
- "description": "This is the path where call artifacts will be stored.\n\nUsage:\n- To store call artifacts in a specific folder, set this to the full path. Eg. \"/folder-name1/folder-name2\".\n- To store call artifacts in the root of the bucket, leave this blank.\n\n@default \"/\""
- }
- },
- "required": [
- "connectionString",
- "containerName"
- ]
- },
- "CreateAzureCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "azure"
- ]
+ "firstMessageInterruptionsEnabled": {
+ "type": "boolean",
+ "default": false
},
- "service": {
+ "firstMessageMode": {
"type": "string",
- "description": "This is the service being used in Azure.",
+ "description": "This is the mode for the first message. Default is 'assistant-speaks-first'.\n\nUse:\n- 'assistant-speaks-first' to have the assistant speak first.\n- 'assistant-waits-for-user' to have the assistant wait for the user to speak first.\n- '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).\n\n@default 'assistant-speaks-first'",
"enum": [
- "speech",
- "blob_storage"
+ "assistant-speaks-first",
+ "assistant-speaks-first-with-model-generated-message",
+ "assistant-waits-for-user"
],
- "default": "speech"
- },
- "region": {
- "type": "string",
- "description": "This is the region of the Azure resource.",
- "enum": [
- "australiaeast",
- "canadaeast",
- "canadacentral",
- "centralus",
- "eastus2",
- "eastus",
- "france",
- "germanywestcentral",
- "india",
- "japaneast",
- "japanwest",
- "northcentralus",
- "norway",
- "polandcentral",
- "southcentralus",
- "spaincentral",
- "swedencentral",
- "switzerland",
- "uaenorth",
- "uk",
- "westeurope",
- "westus",
- "westus3"
- ]
- },
- "apiKey": {
- "type": "string",
- "description": "This is not returned in the API.",
- "maxLength": 10000
- },
- "fallbackIndex": {
- "type": "number",
- "minimum": 1,
- "description": "This is the order in which this storage provider is tried during upload retries. Lower numbers are tried first in increasing order."
+ "example": "assistant-speaks-first"
},
- "bucketPlan": {
- "description": "This is the bucket plan that can be provided to store call artifacts in Azure Blob Storage.",
- "allOf": [
+ "voicemailDetection": {
+ "description": "These are the settings to configure or disable voicemail detection. Alternatively, voicemail detection can be configured using the model.tools=[VoicemailTool].\nBy default, voicemail detection is disabled.",
+ "oneOf": [
{
- "$ref": "#/components/schemas/AzureBlobStorageBucketPlan"
+ "type": "string",
+ "enum": [
+ "off"
+ ]
+ },
+ {
+ "$ref": "#/components/schemas/GoogleVoicemailDetectionPlan",
+ "title": "Google"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAIVoicemailDetectionPlan",
+ "title": "OpenAI"
+ },
+ {
+ "$ref": "#/components/schemas/TwilioVoicemailDetectionPlan",
+ "title": "Twilio"
+ },
+ {
+ "$ref": "#/components/schemas/VapiVoicemailDetectionPlan",
+ "title": "Vapi"
}
]
},
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "service"
- ]
- },
- "CreateAzureOpenAICredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "azure-openai"
- ]
- },
- "region": {
- "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"
- ]
- },
- "models": {
+ "clientMessages": {
"type": "array",
"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"
+ "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"
],
"example": [
- "gpt-4-0125-preview",
- "gpt-4-0613"
+ "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"
],
+ "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.",
"items": {
"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"
+ "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"
]
}
},
- "openAIKey": {
- "type": "string",
- "maxLength": 10000,
- "description": "This is not returned in the API."
- },
- "ocpApimSubscriptionKey": {
- "type": "string",
- "description": "This is not returned in the API."
- },
- "openAIEndpoint": {
- "type": "string",
- "maxLength": 10000
- },
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "region",
- "models",
- "openAIKey",
- "openAIEndpoint"
- ]
- },
- "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",
- "description": "This is the port number of the gateway. Default is 5060.\n\n@default 5060",
- "minimum": 1,
- "maximum": 65535
- },
- "netmask": {
- "type": "number",
- "description": "This is the netmask of the gateway. Defaults to 32.\n\n@default 32",
- "minimum": 24,
- "maximum": 32
- },
- "inboundEnabled": {
- "type": "boolean",
- "description": "This is whether inbound calls are allowed from this gateway. Default is true.\n\n@default true"
- },
- "outboundEnabled": {
- "type": "boolean",
- "description": "This is whether outbound calls should be sent to this gateway. Default is true.\n\nNote, if netmask is less than 32, it doesn't affect the outbound IPs that are tried. 1 attempt is made to `ip:port`.\n\n@default true"
- },
- "outboundProtocol": {
- "type": "string",
- "description": "This is the protocol to use for SIP signaling outbound calls. Default is udp.\n\n@default udp",
- "enum": [
- "tls/srtp",
- "tcp",
- "tls",
- "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.\n\nThis 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.\n\n@default false"
- }
- },
- "required": [
- "ip"
- ]
- },
- "SipTrunkOutboundSipRegisterPlan": {
- "type": "object",
- "properties": {
- "domain": {
- "type": "string"
- },
- "username": {
- "type": "string"
- },
- "realm": {
- "type": "string"
- }
- }
- },
- "SipTrunkOutboundAuthenticationPlan": {
- "type": "object",
- "properties": {
- "authPassword": {
- "type": "string",
- "description": "This is not returned in the API."
- },
- "authUsername": {
- "type": "string"
- },
- "sipRegisterPlan": {
- "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.",
- "allOf": [
- {
- "$ref": "#/components/schemas/SipTrunkOutboundSipRegisterPlan"
- }
- ]
- }
- }
- },
- "SbcConfiguration": {
- "type": "object",
- "properties": {}
- },
- "CreateByoSipTrunkCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "description": "This can be used to bring your own SIP trunks or to connect to a Carrier.",
- "enum": [
- "byo-sip-trunk"
- ]
- },
- "gateways": {
- "description": "This is the list of SIP trunk's gateways.",
+ "serverMessages": {
"type": "array",
+ "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"
+ ],
+ "example": [
+ "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"
+ ],
+ "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.",
"items": {
- "$ref": "#/components/schemas/SipTrunkGateway"
+ "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"
+ ]
}
},
- "outboundAuthenticationPlan": {
- "description": "This can be used to configure the outbound authentication if required by the SIP trunk.",
- "allOf": [
+ "maxDurationSeconds": {
+ "type": "number",
+ "description": "This is the maximum number of seconds that the call will last. When the call reaches this duration, it will be ended.\n\n@default 600 (10 minutes)",
+ "minimum": 10,
+ "maximum": 43200,
+ "example": 600
+ },
+ "backgroundSound": {
+ "description": "This is the background sound in the call. Default for phone calls is 'office' and default for web calls is 'off'.\nYou can also provide a custom sound by providing a URL to an audio file.",
+ "oneOf": [
{
- "$ref": "#/components/schemas/SipTrunkOutboundAuthenticationPlan"
+ "type": "string",
+ "enum": [
+ "off",
+ "office"
+ ],
+ "example": "office"
+ },
+ {
+ "type": "string",
+ "format": "uri",
+ "example": "https://www.soundjay.com/ambient/sounds/people-in-lounge-1.mp3"
}
]
},
- "outboundLeadingPlusEnabled": {
+ "modelOutputInMessagesEnabled": {
"type": "boolean",
- "description": "This ensures the outbound origination attempts have a leading plus. Defaults to false to match conventional telecom behavior.\n\nUsage:\n- Vonage/Twilio requires leading plus for all outbound calls. Set this to true.\n\n@default false"
- },
- "techPrefix": {
- "type": "string",
- "description": "This can be used to configure the tech prefix on outbound calls. This is an advanced property.",
- "maxLength": 10000
+ "description": "This determines whether the model's output is used in conversation history rather than the transcription of assistant's speech.\n\n@default false",
+ "example": false
},
- "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.",
- "maxLength": 10000
+ "transportConfigurations": {
+ "type": "array",
+ "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.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/TransportConfigurationTwilio",
+ "title": "Twilio"
+ }
+ ]
+ }
},
- "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.",
- "allOf": [
+ "observabilityPlan": {
+ "description": "This is the plan for observability of assistant's calls.\n\nCurrently, only Langfuse is supported.",
+ "oneOf": [
{
- "$ref": "#/components/schemas/SbcConfiguration"
+ "$ref": "#/components/schemas/LangfuseObservabilityPlan",
+ "title": "Langfuse"
}
- ]
- },
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "gateways"
- ]
- },
- "CreateCartesiaCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "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.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "apiKey"
- ]
- },
- "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.\n\nUsage:\n- To store call artifacts in a specific folder, set this to the full path. Eg. \"/folder-name1/folder-name2\".\n- To store call artifacts in the root of the bucket, leave this blank.\n\n@default \"/\""
- }
- },
- "required": [
- "name"
- ]
- },
- "CreateCloudflareCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "cloudflare"
],
- "description": "Credential provider. Only allowed value is 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",
- "description": "This is the order in which this storage provider is tried during upload retries. Lower numbers are tried first in increasing order.",
- "minimum": 1
- },
- "bucketPlan": {
- "description": "This is the bucket plan that can be provided to store call artifacts in R2",
"allOf": [
{
- "$ref": "#/components/schemas/CloudflareR2BucketPlan"
+ "$ref": "#/components/schemas/LangfuseObservabilityPlan"
}
]
},
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider"
- ]
- },
- "OAuth2AuthenticationPlan": {
- "type": "object",
- "properties": {
- "type": {
- "type": "string",
- "enum": [
- "oauth2"
- ]
+ "credentials": {
+ "type": "array",
+ "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.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CreateAnthropicCredentialDTO",
+ "title": "AnthropicCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAnthropicBedrockCredentialDTO",
+ "title": "AnthropicBedrockCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAnyscaleCredentialDTO",
+ "title": "AnyscaleCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAssemblyAICredentialDTO",
+ "title": "AssemblyAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAzureCredentialDTO",
+ "title": "AzureCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAzureOpenAICredentialDTO",
+ "title": "AzureOpenAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateByoSipTrunkCredentialDTO",
+ "title": "ByoSipTrunkCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCartesiaCredentialDTO",
+ "title": "CartesiaCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCerebrasCredentialDTO",
+ "title": "CerebrasCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCloudflareCredentialDTO",
+ "title": "CloudflareCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCustomLLMCredentialDTO",
+ "title": "CustomLLMCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateDeepgramCredentialDTO",
+ "title": "DeepgramCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateDeepInfraCredentialDTO",
+ "title": "DeepInfraCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateDeepSeekCredentialDTO",
+ "title": "DeepSeekCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateElevenLabsCredentialDTO",
+ "title": "ElevenLabsCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGcpCredentialDTO",
+ "title": "GcpCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGladiaCredentialDTO",
+ "title": "GladiaCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelCredentialDTO",
+ "title": "GhlCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCredentialDTO",
+ "title": "GoogleCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGroqCredentialDTO",
+ "title": "GroqCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateHumeCredentialDTO",
+ "title": "HumeCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateInflectionAICredentialDTO",
+ "title": "InflectionAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateLangfuseCredentialDTO",
+ "title": "LangfuseCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateLmntCredentialDTO",
+ "title": "LmntCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMakeCredentialDTO",
+ "title": "MakeCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMistralCredentialDTO",
+ "title": "MistralCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateNeuphonicCredentialDTO",
+ "title": "NeuphonicCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateOpenAICredentialDTO",
+ "title": "OpenAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateOpenRouterCredentialDTO",
+ "title": "OpenRouterCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreatePerplexityAICredentialDTO",
+ "title": "PerplexityAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreatePlayHTCredentialDTO",
+ "title": "PlayHTCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateRimeAICredentialDTO",
+ "title": "RimeAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateRunpodCredentialDTO",
+ "title": "RunpodCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateS3CredentialDTO",
+ "title": "S3Credential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateS3CompatibleCredentialDTO",
+ "title": "S3CompatibleStorageCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSmallestAICredentialDTO",
+ "title": "SmallestAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSpeechmaticsCredentialDTO",
+ "title": "SpeechmaticsCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSonioxCredentialDTO",
+ "title": "SonioxCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSupabaseCredentialDTO",
+ "title": "SupabaseCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTavusCredentialDTO",
+ "title": "TavusCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTogetherAICredentialDTO",
+ "title": "TogetherAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTwilioCredentialDTO",
+ "title": "TwilioCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateVonageCredentialDTO",
+ "title": "VonageCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateWebhookCredentialDTO",
+ "title": "WebhookCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCustomCredentialDTO",
+ "title": "CustomCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateXAiCredentialDTO",
+ "title": "XAiCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO",
+ "title": "MicrosoftCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
+ "title": "GoogleCalendarOAuth2ClientCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO",
+ "title": "GoogleCalendarOAuth2AuthorizationCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO",
+ "title": "GoogleSheetsOAuth2AuthorizationCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSlackOAuth2AuthorizationCredentialDTO",
+ "title": "SlackOAuth2AuthorizationCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelMCPCredentialDTO",
+ "title": "GoHighLevelMCPCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateInworldCredentialDTO",
+ "title": "InworldCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMinimaxCredentialDTO",
+ "title": "MinimaxCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateWellSaidCredentialDTO",
+ "title": "WellSaidCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateEmailCredentialDTO",
+ "title": "EmailCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSlackWebhookCredentialDTO",
+ "title": "SlackWebhookCredential"
+ }
+ ],
+ "discriminator": {
+ "propertyName": "provider",
+ "mapping": {
+ "11labs": "#/components/schemas/CreateElevenLabsCredentialDTO",
+ "anthropic": "#/components/schemas/CreateAnthropicCredentialDTO",
+ "anthropic-bedrock": "#/components/schemas/CreateAnthropicBedrockCredentialDTO",
+ "anyscale": "#/components/schemas/CreateAnyscaleCredentialDTO",
+ "assembly-ai": "#/components/schemas/CreateAssemblyAICredentialDTO",
+ "azure-openai": "#/components/schemas/CreateAzureOpenAICredentialDTO",
+ "azure": "#/components/schemas/CreateAzureCredentialDTO",
+ "byo-sip-trunk": "#/components/schemas/CreateByoSipTrunkCredentialDTO",
+ "cartesia": "#/components/schemas/CreateCartesiaCredentialDTO",
+ "cerebras": "#/components/schemas/CreateCerebrasCredentialDTO",
+ "cloudflare": "#/components/schemas/CreateCloudflareCredentialDTO",
+ "custom-llm": "#/components/schemas/CreateCustomLLMCredentialDTO",
+ "deepgram": "#/components/schemas/CreateDeepgramCredentialDTO",
+ "deepinfra": "#/components/schemas/CreateDeepInfraCredentialDTO",
+ "deep-seek": "#/components/schemas/CreateDeepSeekCredentialDTO",
+ "gcp": "#/components/schemas/CreateGcpCredentialDTO",
+ "gladia": "#/components/schemas/CreateGladiaCredentialDTO",
+ "gohighlevel": "#/components/schemas/CreateGoHighLevelCredentialDTO",
+ "google": "#/components/schemas/CreateGoogleCredentialDTO",
+ "groq": "#/components/schemas/CreateGroqCredentialDTO",
+ "inflection-ai": "#/components/schemas/CreateInflectionAICredentialDTO",
+ "langfuse": "#/components/schemas/CreateLangfuseCredentialDTO",
+ "lmnt": "#/components/schemas/CreateLmntCredentialDTO",
+ "make": "#/components/schemas/CreateMakeCredentialDTO",
+ "openai": "#/components/schemas/CreateOpenAICredentialDTO",
+ "openrouter": "#/components/schemas/CreateOpenRouterCredentialDTO",
+ "perplexity-ai": "#/components/schemas/CreatePerplexityAICredentialDTO",
+ "playht": "#/components/schemas/CreatePlayHTCredentialDTO",
+ "rime-ai": "#/components/schemas/CreateRimeAICredentialDTO",
+ "runpod": "#/components/schemas/CreateRunpodCredentialDTO",
+ "s3": "#/components/schemas/CreateS3CredentialDTO",
+ "s3-compatible": "#/components/schemas/CreateS3CompatibleCredentialDTO",
+ "supabase": "#/components/schemas/CreateSupabaseCredentialDTO",
+ "smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO",
+ "tavus": "#/components/schemas/CreateTavusCredentialDTO",
+ "together-ai": "#/components/schemas/CreateTogetherAICredentialDTO",
+ "twilio": "#/components/schemas/CreateTwilioCredentialDTO",
+ "vonage": "#/components/schemas/CreateVonageCredentialDTO",
+ "webhook": "#/components/schemas/CreateWebhookCredentialDTO",
+ "custom-credential": "#/components/schemas/CreateCustomCredentialDTO",
+ "xai": "#/components/schemas/CreateXAiCredentialDTO",
+ "microsoft": "#/components/schemas/CreateMicrosoftCredentialDTO",
+ "neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO",
+ "hume": "#/components/schemas/CreateHumeCredentialDTO",
+ "mistral": "#/components/schemas/CreateMistralCredentialDTO",
+ "speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO",
+ "soniox": "#/components/schemas/CreateSonioxCredentialDTO",
+ "google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
+ "google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO",
+ "google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO",
+ "slack.oauth2-authorization": "#/components/schemas/CreateSlackOAuth2AuthorizationCredentialDTO",
+ "ghl.oauth2-authorization": "#/components/schemas/CreateGoHighLevelMCPCredentialDTO",
+ "inworld": "#/components/schemas/CreateInworldCredentialDTO",
+ "minimax": "#/components/schemas/CreateMinimaxCredentialDTO",
+ "wellsaid": "#/components/schemas/CreateWellSaidCredentialDTO",
+ "email": "#/components/schemas/CreateEmailCredentialDTO",
+ "slack-webhook": "#/components/schemas/CreateSlackWebhookCredentialDTO"
+ }
+ }
+ }
},
- "url": {
- "type": "string",
- "description": "This is the OAuth2 URL."
+ "hooks": {
+ "type": "array",
+ "description": "This is a set of actions that will be performed on certain events.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CallHookCallEnding",
+ "title": "CallHookCallEnding"
+ },
+ {
+ "$ref": "#/components/schemas/CallHookAssistantSpeechInterrupted",
+ "title": "CallHookAssistantSpeechInterrupted"
+ },
+ {
+ "$ref": "#/components/schemas/CallHookCustomerSpeechInterrupted",
+ "title": "CallHookCustomerSpeechInterrupted"
+ },
+ {
+ "$ref": "#/components/schemas/CallHookCustomerSpeechTimeout",
+ "title": "CallHookCustomerSpeechTimeout"
+ },
+ {
+ "$ref": "#/components/schemas/SessionCreatedHook",
+ "title": "SessionCreatedHook"
+ }
+ ]
+ }
},
- "clientId": {
+ "name": {
"type": "string",
- "description": "This is the OAuth2 client ID."
+ "description": "This is the name of the assistant.\n\nThis is required when you want to transfer between assistants in a call.",
+ "maxLength": 40
},
- "clientSecret": {
+ "voicemailMessage": {
"type": "string",
- "description": "This is the OAuth2 client secret."
+ "description": "This is the message that the assistant will say if the call is forwarded to voicemail.\n\nIf unspecified, it will hang up.",
+ "maxLength": 1000
},
- "scope": {
+ "endCallMessage": {
"type": "string",
- "description": "This is the scope of the OAuth2 token.",
+ "description": "This is the message that the assistant will say if it ends the call.\n\nIf unspecified, it will hang up without saying anything.",
"maxLength": 1000
- }
- },
- "required": [
- "type",
- "url",
- "clientId",
- "clientSecret"
- ]
- },
- "CreateCustomLLMCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "custom-llm"
- ]
},
- "apiKey": {
- "type": "string",
- "maxLength": 10000,
- "description": "This is not returned in the API."
+ "endCallPhrases": {
+ "description": "This list contains phrases that, if spoken by the assistant, will trigger the call to be hung up. Case insensitive.",
+ "type": "array",
+ "items": {
+ "type": "string",
+ "maxLength": 140,
+ "minLength": 2
+ }
},
- "authenticationPlan": {
- "description": "This is the authentication plan. Currently supports OAuth2 RFC 6749. To use Bearer authentication, use apiKey",
+ "compliancePlan": {
+ "$ref": "#/components/schemas/CompliancePlan"
+ },
+ "metadata": {
+ "type": "object",
+ "description": "This is for metadata you want to store on the assistant."
+ },
+ "backgroundSpeechDenoisingPlan": {
+ "description": "This enables filtering of noise and background speech while the user is talking.\n\nFeatures:\n- Smart denoising using Krisp\n- Fourier denoising\n\nSmart denoising can be combined with or used independently of Fourier denoising.\n\nOrder of precedence:\n- Smart denoising\n- Fourier denoising",
"allOf": [
{
- "$ref": "#/components/schemas/OAuth2AuthenticationPlan"
+ "$ref": "#/components/schemas/BackgroundSpeechDenoisingPlan"
}
]
},
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "apiKey"
- ]
- },
- "CreateDeepgramCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "deepgram"
+ "analysisPlan": {
+ "description": "This is the plan for analysis of assistant's calls. Stored in `call.analysis`.",
+ "deprecated": true,
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/AnalysisPlan"
+ }
]
},
- "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."
+ "artifactPlan": {
+ "description": "This is the plan for artifacts generated during assistant's calls. Stored in `call.artifact`.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ArtifactPlan"
+ }
+ ]
},
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "apiKey"
- ]
- },
- "CreateDeepInfraCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "deepinfra"
+ "startSpeakingPlan": {
+ "description": "This is the plan for when the assistant should start talking.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to start talking after the customer is done speaking.\n- The assistant is too fast to start talking after the customer is done speaking.\n- The assistant is so fast that it's actually interrupting the customer.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/StartSpeakingPlan"
+ }
]
},
- "apiKey": {
- "type": "string",
- "description": "This is not returned in the API."
+ "stopSpeakingPlan": {
+ "description": "This is the plan for when assistant should stop talking on customer interruption.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to recognize customer's interruption.\n- The assistant is too fast to recognize customer's interruption.\n- The assistant is getting interrupted by phrases that are just acknowledgments.\n- The assistant is getting interrupted by background noises.\n- The assistant is not properly stopping -- it starts talking right after getting interrupted.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/StopSpeakingPlan"
+ }
+ ]
},
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "apiKey"
- ]
- },
- "CreateDeepSeekCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "deep-seek"
+ "monitorPlan": {
+ "description": "This is the plan for real-time monitoring of the assistant's calls.\n\nUsage:\n- To enable live listening of the assistant's calls, set `monitorPlan.listenEnabled` to `true`.\n- To enable live control of the assistant's calls, set `monitorPlan.controlEnabled` to `true`.\n- To attach monitors to the assistant, set `monitorPlan.monitorIds` to the set of monitor ids.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/MonitorPlan"
+ }
]
},
- "apiKey": {
- "type": "string",
- "description": "This is not returned in the API."
+ "credentialIds": {
+ "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.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
},
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "apiKey"
- ]
- },
- "CreateElevenLabsCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "11labs"
+ "server": {
+ "description": "This is where Vapi will send webhooks. You can find all webhooks available along with their shape in ServerMessage schema.\n\nThe order of precedence is:\n\n1. assistant.server.url\n2. phoneNumber.serverUrl\n3. org.serverUrl",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Server"
+ }
]
},
- "apiKey": {
- "type": "string",
- "maxLength": 10000,
- "description": "This is not returned in the API."
- },
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
+ "keypadInputPlan": {
+ "$ref": "#/components/schemas/KeypadInputPlan"
}
- },
- "required": [
- "provider",
- "apiKey"
- ]
+ }
},
- "GcpKey": {
+ "Assistant": {
"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.\n\nNote: This is not returned in the API."
- },
- "clientEmail": {
- "type": "string",
- "description": "This is the email address associated with the service account."
+ "transcriber": {
+ "description": "These are the options for the assistant's transcriber.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/AssemblyAITranscriber",
+ "title": "AssemblyAITranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/AzureSpeechTranscriber",
+ "title": "AzureSpeechTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/CustomTranscriber",
+ "title": "CustomTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/DeepgramTranscriber",
+ "title": "DeepgramTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/ElevenLabsTranscriber",
+ "title": "ElevenLabsTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/GladiaTranscriber",
+ "title": "GladiaTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/GoogleTranscriber",
+ "title": "GoogleTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/SpeechmaticsTranscriber",
+ "title": "SpeechmaticsTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/TalkscriberTranscriber",
+ "title": "TalkscriberTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAITranscriber",
+ "title": "OpenAITranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/CartesiaTranscriber",
+ "title": "CartesiaTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/SonioxTranscriber",
+ "title": "SonioxTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/XaiTranscriber",
+ "title": "XaiTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/VapiTranscriber",
+ "title": "VapiTranscriber"
+ }
+ ]
},
- "clientId": {
- "type": "string",
- "description": "This is the unique identifier for the client."
+ "model": {
+ "description": "These are the options for the assistant's LLM.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/AnthropicModel",
+ "title": "Anthropic"
+ },
+ {
+ "$ref": "#/components/schemas/AnthropicBedrockModel",
+ "title": "AnthropicBedrock"
+ },
+ {
+ "$ref": "#/components/schemas/AnyscaleModel",
+ "title": "Anyscale"
+ },
+ {
+ "$ref": "#/components/schemas/CerebrasModel",
+ "title": "Cerebras"
+ },
+ {
+ "$ref": "#/components/schemas/CustomLLMModel",
+ "title": "CustomLLM"
+ },
+ {
+ "$ref": "#/components/schemas/DeepInfraModel",
+ "title": "DeepInfra"
+ },
+ {
+ "$ref": "#/components/schemas/DeepSeekModel",
+ "title": "DeepSeek"
+ },
+ {
+ "$ref": "#/components/schemas/GoogleModel",
+ "title": "Google"
+ },
+ {
+ "$ref": "#/components/schemas/GroqModel",
+ "title": "Groq"
+ },
+ {
+ "$ref": "#/components/schemas/InflectionAIModel",
+ "title": "InflectionAI"
+ },
+ {
+ "$ref": "#/components/schemas/MinimaxLLMModel",
+ "title": "MiniMaxLLM"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAIModel",
+ "title": "OpenAI"
+ },
+ {
+ "$ref": "#/components/schemas/OpenRouterModel",
+ "title": "OpenRouter"
+ },
+ {
+ "$ref": "#/components/schemas/PerplexityAIModel",
+ "title": "PerplexityAI"
+ },
+ {
+ "$ref": "#/components/schemas/TogetherAIModel",
+ "title": "Together"
+ },
+ {
+ "$ref": "#/components/schemas/XaiModel",
+ "title": "XAI"
+ },
+ {
+ "$ref": "#/components/schemas/VapiModel",
+ "title": "Vapi"
+ }
+ ]
},
- "authUri": {
- "type": "string",
- "description": "This is the URI for the auth provider's authorization endpoint."
+ "voice": {
+ "description": "These are the options for the assistant's voice.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/AzureVoice",
+ "title": "AzureVoice"
+ },
+ {
+ "$ref": "#/components/schemas/CartesiaVoice",
+ "title": "CartesiaVoice"
+ },
+ {
+ "$ref": "#/components/schemas/CustomVoice",
+ "title": "CustomVoice"
+ },
+ {
+ "$ref": "#/components/schemas/DeepgramVoice",
+ "title": "DeepgramVoice"
+ },
+ {
+ "$ref": "#/components/schemas/ElevenLabsVoice",
+ "title": "ElevenLabsVoice"
+ },
+ {
+ "$ref": "#/components/schemas/HumeVoice",
+ "title": "HumeVoice"
+ },
+ {
+ "$ref": "#/components/schemas/LMNTVoice",
+ "title": "LMNTVoice"
+ },
+ {
+ "$ref": "#/components/schemas/NeuphonicVoice",
+ "title": "NeuphonicVoice"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAIVoice",
+ "title": "OpenAIVoice"
+ },
+ {
+ "$ref": "#/components/schemas/PlayHTVoice",
+ "title": "PlayHTVoice"
+ },
+ {
+ "$ref": "#/components/schemas/WellSaidVoice",
+ "title": "WellSaidVoice"
+ },
+ {
+ "$ref": "#/components/schemas/RimeAIVoice",
+ "title": "RimeAIVoice"
+ },
+ {
+ "$ref": "#/components/schemas/SmallestAIVoice",
+ "title": "SmallestAIVoice"
+ },
+ {
+ "$ref": "#/components/schemas/TavusVoice",
+ "title": "TavusVoice"
+ },
+ {
+ "$ref": "#/components/schemas/VapiVoice",
+ "title": "VapiVoice"
+ },
+ {
+ "$ref": "#/components/schemas/SesameVoice",
+ "title": "SesameVoice"
+ },
+ {
+ "$ref": "#/components/schemas/InworldVoice",
+ "title": "InworldVoice"
+ },
+ {
+ "$ref": "#/components/schemas/MinimaxVoice",
+ "title": "MinimaxVoice"
+ },
+ {
+ "$ref": "#/components/schemas/XaiVoice",
+ "title": "XaiVoice"
+ },
+ {
+ "$ref": "#/components/schemas/MicrosoftVoice",
+ "title": "MicrosoftVoice"
+ }
+ ]
},
- "tokenUri": {
+ "firstMessage": {
"type": "string",
- "description": "This is the URI for the auth provider's token endpoint."
+ "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.).\n\nIf unspecified, assistant will wait for user to speak and use the model to respond once they speak.",
+ "example": "Hello! How can I help you today?"
},
- "authProviderX509CertUrl": {
- "type": "string",
- "description": "This is the URL of the public x509 certificate for the auth provider."
+ "firstMessageInterruptionsEnabled": {
+ "type": "boolean",
+ "default": false
},
- "clientX509CertUrl": {
+ "firstMessageMode": {
"type": "string",
- "description": "This is the URL of the public x509 certificate for the client."
+ "description": "This is the mode for the first message. Default is 'assistant-speaks-first'.\n\nUse:\n- 'assistant-speaks-first' to have the assistant speak first.\n- 'assistant-waits-for-user' to have the assistant wait for the user to speak first.\n- '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).\n\n@default 'assistant-speaks-first'",
+ "enum": [
+ "assistant-speaks-first",
+ "assistant-speaks-first-with-model-generated-message",
+ "assistant-waits-for-user"
+ ],
+ "example": "assistant-speaks-first"
},
- "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"
- ]
- },
- "BucketPlan": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string",
- "description": "This is the name of the bucket."
+ "voicemailDetection": {
+ "description": "These are the settings to configure or disable voicemail detection. Alternatively, voicemail detection can be configured using the model.tools=[VoicemailTool].\nBy default, voicemail detection is disabled.",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "off"
+ ]
+ },
+ {
+ "$ref": "#/components/schemas/GoogleVoicemailDetectionPlan",
+ "title": "Google"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAIVoicemailDetectionPlan",
+ "title": "OpenAI"
+ },
+ {
+ "$ref": "#/components/schemas/TwilioVoicemailDetectionPlan",
+ "title": "Twilio"
+ },
+ {
+ "$ref": "#/components/schemas/VapiVoicemailDetectionPlan",
+ "title": "Vapi"
+ }
+ ]
},
- "region": {
- "type": "string",
- "description": "This is the region of the bucket.\n\nUsage:\n- If `credential.type` is `aws`, then this is required.\n- 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\n\nThis overrides the `credential.region` field if it is provided."
+ "clientMessages": {
+ "type": "array",
+ "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"
+ ],
+ "example": [
+ "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"
+ ],
+ "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.",
+ "items": {
+ "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"
+ ]
+ }
},
- "path": {
- "type": "string",
- "description": "This is the path where call artifacts will be stored.\n\nUsage:\n- To store call artifacts in a specific folder, set this to the full path. Eg. \"/folder-name1/folder-name2\".\n- To store call artifacts in the root of the bucket, leave this blank.\n\n@default \"/\""
+ "serverMessages": {
+ "type": "array",
+ "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"
+ ],
+ "example": [
+ "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"
+ ],
+ "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.",
+ "items": {
+ "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"
+ ]
+ }
},
- "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\n\nUsage:\n- If `credential.type` is `gcp`, then this is required.\n- If `credential.type` is `aws`, then this is not required since credential.awsAccessKeyId is used instead."
+ "maxDurationSeconds": {
+ "type": "number",
+ "description": "This is the maximum number of seconds that the call will last. When the call reaches this duration, it will be ended.\n\n@default 600 (10 minutes)",
+ "minimum": 10,
+ "maximum": 43200,
+ "example": 600
},
- "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\n\nUsage:\n- If `credential.type` is `gcp`, then this is required.\n- If `credential.type` is `aws`, then this is not required since credential.awsSecretAccessKey is used instead.\n\nNote: This is not returned in the API."
- }
- },
- "required": [
- "name"
- ]
- },
- "CreateGcpCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "gcp"
+ "backgroundSound": {
+ "description": "This is the background sound in the call. Default for phone calls is 'office' and default for web calls is 'off'.\nYou can also provide a custom sound by providing a URL to an audio file.",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "off",
+ "office"
+ ],
+ "example": "office"
+ },
+ {
+ "type": "string",
+ "format": "uri",
+ "example": "https://www.soundjay.com/ambient/sounds/people-in-lounge-1.mp3"
+ }
]
},
- "fallbackIndex": {
- "type": "number",
- "description": "This is the order in which this storage provider is tried during upload retries. Lower numbers are tried first in increasing order.",
- "minimum": 1
+ "modelOutputInMessagesEnabled": {
+ "type": "boolean",
+ "description": "This determines whether the model's output is used in conversation history rather than the transcription of assistant's speech.\n\n@default false",
+ "example": false
},
- "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//keys.\n\nThe schema is identical to the JSON that GCP outputs.",
+ "transportConfigurations": {
+ "type": "array",
+ "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.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/TransportConfigurationTwilio",
+ "title": "Twilio"
+ }
+ ]
+ }
+ },
+ "observabilityPlan": {
+ "description": "This is the plan for observability of assistant's calls.\n\nCurrently, only Langfuse is supported.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/LangfuseObservabilityPlan",
+ "title": "Langfuse"
+ }
+ ],
"allOf": [
{
- "$ref": "#/components/schemas/GcpKey"
+ "$ref": "#/components/schemas/LangfuseObservabilityPlan"
+ }
+ ]
+ },
+ "credentials": {
+ "type": "array",
+ "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.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CreateAnthropicCredentialDTO",
+ "title": "AnthropicCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAnthropicBedrockCredentialDTO",
+ "title": "AnthropicBedrockCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAnyscaleCredentialDTO",
+ "title": "AnyscaleCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAssemblyAICredentialDTO",
+ "title": "AssemblyAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAzureCredentialDTO",
+ "title": "AzureCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAzureOpenAICredentialDTO",
+ "title": "AzureOpenAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateByoSipTrunkCredentialDTO",
+ "title": "ByoSipTrunkCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCartesiaCredentialDTO",
+ "title": "CartesiaCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCerebrasCredentialDTO",
+ "title": "CerebrasCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCloudflareCredentialDTO",
+ "title": "CloudflareCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCustomLLMCredentialDTO",
+ "title": "CustomLLMCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateDeepgramCredentialDTO",
+ "title": "DeepgramCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateDeepInfraCredentialDTO",
+ "title": "DeepInfraCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateDeepSeekCredentialDTO",
+ "title": "DeepSeekCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateElevenLabsCredentialDTO",
+ "title": "ElevenLabsCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGcpCredentialDTO",
+ "title": "GcpCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGladiaCredentialDTO",
+ "title": "GladiaCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelCredentialDTO",
+ "title": "GhlCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCredentialDTO",
+ "title": "GoogleCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGroqCredentialDTO",
+ "title": "GroqCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateHumeCredentialDTO",
+ "title": "HumeCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateInflectionAICredentialDTO",
+ "title": "InflectionAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateLangfuseCredentialDTO",
+ "title": "LangfuseCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateLmntCredentialDTO",
+ "title": "LmntCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMakeCredentialDTO",
+ "title": "MakeCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMistralCredentialDTO",
+ "title": "MistralCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateNeuphonicCredentialDTO",
+ "title": "NeuphonicCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateOpenAICredentialDTO",
+ "title": "OpenAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateOpenRouterCredentialDTO",
+ "title": "OpenRouterCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreatePerplexityAICredentialDTO",
+ "title": "PerplexityAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreatePlayHTCredentialDTO",
+ "title": "PlayHTCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateRimeAICredentialDTO",
+ "title": "RimeAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateRunpodCredentialDTO",
+ "title": "RunpodCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateS3CredentialDTO",
+ "title": "S3Credential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateS3CompatibleCredentialDTO",
+ "title": "S3CompatibleStorageCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSmallestAICredentialDTO",
+ "title": "SmallestAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSpeechmaticsCredentialDTO",
+ "title": "SpeechmaticsCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSonioxCredentialDTO",
+ "title": "SonioxCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSupabaseCredentialDTO",
+ "title": "SupabaseCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTavusCredentialDTO",
+ "title": "TavusCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTogetherAICredentialDTO",
+ "title": "TogetherAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTwilioCredentialDTO",
+ "title": "TwilioCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateVonageCredentialDTO",
+ "title": "VonageCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateWebhookCredentialDTO",
+ "title": "WebhookCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCustomCredentialDTO",
+ "title": "CustomCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateXAiCredentialDTO",
+ "title": "XAiCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO",
+ "title": "MicrosoftCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
+ "title": "GoogleCalendarOAuth2ClientCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO",
+ "title": "GoogleCalendarOAuth2AuthorizationCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO",
+ "title": "GoogleSheetsOAuth2AuthorizationCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSlackOAuth2AuthorizationCredentialDTO",
+ "title": "SlackOAuth2AuthorizationCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelMCPCredentialDTO",
+ "title": "GoHighLevelMCPCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateInworldCredentialDTO",
+ "title": "InworldCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMinimaxCredentialDTO",
+ "title": "MinimaxCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateWellSaidCredentialDTO",
+ "title": "WellSaidCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateEmailCredentialDTO",
+ "title": "EmailCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSlackWebhookCredentialDTO",
+ "title": "SlackWebhookCredential"
+ }
+ ],
+ "discriminator": {
+ "propertyName": "provider",
+ "mapping": {
+ "11labs": "#/components/schemas/CreateElevenLabsCredentialDTO",
+ "anthropic": "#/components/schemas/CreateAnthropicCredentialDTO",
+ "anthropic-bedrock": "#/components/schemas/CreateAnthropicBedrockCredentialDTO",
+ "anyscale": "#/components/schemas/CreateAnyscaleCredentialDTO",
+ "assembly-ai": "#/components/schemas/CreateAssemblyAICredentialDTO",
+ "azure-openai": "#/components/schemas/CreateAzureOpenAICredentialDTO",
+ "azure": "#/components/schemas/CreateAzureCredentialDTO",
+ "byo-sip-trunk": "#/components/schemas/CreateByoSipTrunkCredentialDTO",
+ "cartesia": "#/components/schemas/CreateCartesiaCredentialDTO",
+ "cerebras": "#/components/schemas/CreateCerebrasCredentialDTO",
+ "cloudflare": "#/components/schemas/CreateCloudflareCredentialDTO",
+ "custom-llm": "#/components/schemas/CreateCustomLLMCredentialDTO",
+ "deepgram": "#/components/schemas/CreateDeepgramCredentialDTO",
+ "deepinfra": "#/components/schemas/CreateDeepInfraCredentialDTO",
+ "deep-seek": "#/components/schemas/CreateDeepSeekCredentialDTO",
+ "gcp": "#/components/schemas/CreateGcpCredentialDTO",
+ "gladia": "#/components/schemas/CreateGladiaCredentialDTO",
+ "gohighlevel": "#/components/schemas/CreateGoHighLevelCredentialDTO",
+ "google": "#/components/schemas/CreateGoogleCredentialDTO",
+ "groq": "#/components/schemas/CreateGroqCredentialDTO",
+ "inflection-ai": "#/components/schemas/CreateInflectionAICredentialDTO",
+ "langfuse": "#/components/schemas/CreateLangfuseCredentialDTO",
+ "lmnt": "#/components/schemas/CreateLmntCredentialDTO",
+ "make": "#/components/schemas/CreateMakeCredentialDTO",
+ "openai": "#/components/schemas/CreateOpenAICredentialDTO",
+ "openrouter": "#/components/schemas/CreateOpenRouterCredentialDTO",
+ "perplexity-ai": "#/components/schemas/CreatePerplexityAICredentialDTO",
+ "playht": "#/components/schemas/CreatePlayHTCredentialDTO",
+ "rime-ai": "#/components/schemas/CreateRimeAICredentialDTO",
+ "runpod": "#/components/schemas/CreateRunpodCredentialDTO",
+ "s3": "#/components/schemas/CreateS3CredentialDTO",
+ "s3-compatible": "#/components/schemas/CreateS3CompatibleCredentialDTO",
+ "supabase": "#/components/schemas/CreateSupabaseCredentialDTO",
+ "smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO",
+ "tavus": "#/components/schemas/CreateTavusCredentialDTO",
+ "together-ai": "#/components/schemas/CreateTogetherAICredentialDTO",
+ "twilio": "#/components/schemas/CreateTwilioCredentialDTO",
+ "vonage": "#/components/schemas/CreateVonageCredentialDTO",
+ "webhook": "#/components/schemas/CreateWebhookCredentialDTO",
+ "custom-credential": "#/components/schemas/CreateCustomCredentialDTO",
+ "xai": "#/components/schemas/CreateXAiCredentialDTO",
+ "microsoft": "#/components/schemas/CreateMicrosoftCredentialDTO",
+ "neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO",
+ "hume": "#/components/schemas/CreateHumeCredentialDTO",
+ "mistral": "#/components/schemas/CreateMistralCredentialDTO",
+ "speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO",
+ "soniox": "#/components/schemas/CreateSonioxCredentialDTO",
+ "google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
+ "google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO",
+ "google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO",
+ "slack.oauth2-authorization": "#/components/schemas/CreateSlackOAuth2AuthorizationCredentialDTO",
+ "ghl.oauth2-authorization": "#/components/schemas/CreateGoHighLevelMCPCredentialDTO",
+ "inworld": "#/components/schemas/CreateInworldCredentialDTO",
+ "minimax": "#/components/schemas/CreateMinimaxCredentialDTO",
+ "wellsaid": "#/components/schemas/CreateWellSaidCredentialDTO",
+ "email": "#/components/schemas/CreateEmailCredentialDTO",
+ "slack-webhook": "#/components/schemas/CreateSlackWebhookCredentialDTO"
+ }
}
- ]
- },
- "region": {
- "type": "string",
- "description": "This is the region of the GCP resource.",
- "maxLength": 40
- },
- "bucketPlan": {
- "$ref": "#/components/schemas/BucketPlan"
- },
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "gcpKey"
- ]
- },
- "CreateGladiaCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "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.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "apiKey"
- ]
- },
- "CreateGoHighLevelCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "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.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "apiKey"
- ]
- },
- "CreateGroqCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "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.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "apiKey"
- ]
- },
- "CreateLangfuseCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "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."
+ "hooks": {
+ "type": "array",
+ "description": "This is a set of actions that will be performed on certain events.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CallHookCallEnding",
+ "title": "CallHookCallEnding"
+ },
+ {
+ "$ref": "#/components/schemas/CallHookAssistantSpeechInterrupted",
+ "title": "CallHookAssistantSpeechInterrupted"
+ },
+ {
+ "$ref": "#/components/schemas/CallHookCustomerSpeechInterrupted",
+ "title": "CallHookCustomerSpeechInterrupted"
+ },
+ {
+ "$ref": "#/components/schemas/CallHookCustomerSpeechTimeout",
+ "title": "CallHookCustomerSpeechTimeout"
+ },
+ {
+ "$ref": "#/components/schemas/SessionCreatedHook",
+ "title": "SessionCreatedHook"
+ }
+ ]
+ }
},
- "apiUrl": {
+ "latestVersion": {
"type": "string",
- "description": "The host URL for Langfuse project. Eg: https://cloud.langfuse.com"
+ "nullable": true,
+ "description": "This is the latest version label (e.g. `v3`) of the assistant in the\nversion history. `null` while the org is not yet\nonboarded to versioning, or for assistants that have not yet been\npublished under it."
},
"name": {
"type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
+ "description": "This is the name of the assistant.\n\nThis is required when you want to transfer between assistants in a call.",
"maxLength": 40
- }
- },
- "required": [
- "provider",
- "publicKey",
- "apiKey",
- "apiUrl"
- ]
- },
- "CreateLmntCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "lmnt"
- ]
},
- "apiKey": {
+ "voicemailMessage": {
"type": "string",
- "description": "This is not returned in the API."
+ "description": "This is the message that the assistant will say if the call is forwarded to voicemail.\n\nIf unspecified, it will hang up.",
+ "maxLength": 1000
},
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "apiKey"
- ]
- },
- "CreateMakeCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
+ "endCallMessage": {
"type": "string",
- "enum": [
- "make"
- ]
+ "description": "This is the message that the assistant will say if it ends the call.\n\nIf unspecified, it will hang up without saying anything.",
+ "maxLength": 1000
},
- "teamId": {
- "type": "string",
- "description": "Team ID"
+ "endCallPhrases": {
+ "description": "This list contains phrases that, if spoken by the assistant, will trigger the call to be hung up. Case insensitive.",
+ "type": "array",
+ "items": {
+ "type": "string",
+ "maxLength": 140,
+ "minLength": 2
+ }
},
- "region": {
- "type": "string",
- "description": "Region of your application. For example: eu1, eu2, us1, us2"
+ "compliancePlan": {
+ "$ref": "#/components/schemas/CompliancePlan"
},
- "apiKey": {
- "type": "string",
- "description": "This is not returned in the API."
+ "metadata": {
+ "type": "object",
+ "description": "This is for metadata you want to store on the assistant."
},
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "teamId",
- "region",
- "apiKey"
- ]
- },
- "CreateOpenAICredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "openai"
+ "backgroundSpeechDenoisingPlan": {
+ "description": "This enables filtering of noise and background speech while the user is talking.\n\nFeatures:\n- Smart denoising using Krisp\n- Fourier denoising\n\nSmart denoising can be combined with or used independently of Fourier denoising.\n\nOrder of precedence:\n- Smart denoising\n- Fourier denoising",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BackgroundSpeechDenoisingPlan"
+ }
]
},
- "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.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "apiKey"
- ]
- },
- "CreateOpenRouterCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "openrouter"
+ "analysisPlan": {
+ "description": "This is the plan for analysis of assistant's calls. Stored in `call.analysis`.",
+ "deprecated": true,
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/AnalysisPlan"
+ }
]
},
- "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.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "apiKey"
- ]
- },
- "CreatePerplexityAICredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "perplexity-ai"
+ "artifactPlan": {
+ "description": "This is the plan for artifacts generated during assistant's calls. Stored in `call.artifact`.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ArtifactPlan"
+ }
]
},
- "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.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "apiKey"
- ]
- },
- "CreatePlayHTCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "playht"
+ "startSpeakingPlan": {
+ "description": "This is the plan for when the assistant should start talking.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to start talking after the customer is done speaking.\n- The assistant is too fast to start talking after the customer is done speaking.\n- The assistant is so fast that it's actually interrupting the customer.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/StartSpeakingPlan"
+ }
]
},
- "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.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "apiKey",
- "userId"
- ]
- },
- "CreateRimeAICredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "rime-ai"
+ "stopSpeakingPlan": {
+ "description": "This is the plan for when assistant should stop talking on customer interruption.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to recognize customer's interruption.\n- The assistant is too fast to recognize customer's interruption.\n- The assistant is getting interrupted by phrases that are just acknowledgments.\n- The assistant is getting interrupted by background noises.\n- The assistant is not properly stopping -- it starts talking right after getting interrupted.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/StopSpeakingPlan"
+ }
]
},
- "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.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "apiKey"
- ]
- },
- "CreateRunpodCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "runpod"
+ "monitorPlan": {
+ "description": "This is the plan for real-time monitoring of the assistant's calls.\n\nUsage:\n- To enable live listening of the assistant's calls, set `monitorPlan.listenEnabled` to `true`.\n- To enable live control of the assistant's calls, set `monitorPlan.controlEnabled` to `true`.\n- To attach monitors to the assistant, set `monitorPlan.monitorIds` to the set of monitor ids.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/MonitorPlan"
+ }
]
},
- "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.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "apiKey"
- ]
- },
- "CreateS3CredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "s3"
- ],
- "description": "Credential provider. Only allowed value is 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",
- "minimum": 1,
- "description": "This is the order in which this storage provider is tried during upload retries. Lower numbers are tried first in increasing order."
+ "credentialIds": {
+ "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.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
},
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "awsAccessKeyId",
- "awsSecretAccessKey",
- "region",
- "s3BucketName",
- "s3PathPrefix"
- ]
- },
- "SupabaseBucketPlan": {
- "type": "object",
- "properties": {
- "region": {
- "type": "string",
- "description": "This is the S3 Region. It should look like us-east-1\nIt should be one of the supabase regions defined in the SUPABASE_REGION enum\nCheck https://supabase.com/docs/guides/platform/regions for up to date regions",
- "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"
+ "server": {
+ "description": "This is where Vapi will send webhooks. You can find all webhooks available along with their shape in ServerMessage schema.\n\nThe order of precedence is:\n\n1. assistant.server.url\n2. phoneNumber.serverUrl\n3. org.serverUrl",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Server"
+ }
]
},
- "url": {
- "type": "string",
- "description": "This is the S3 compatible URL for Supabase S3\nThis should look like https://.supabase.co/storage/v1/s3"
+ "keypadInputPlan": {
+ "$ref": "#/components/schemas/KeypadInputPlan"
},
- "accessKeyId": {
+ "id": {
"type": "string",
- "description": "This is the Supabase S3 Access Key ID.\nThe user creates this in the Supabase project Storage settings"
+ "description": "This is the unique identifier for the assistant."
},
- "secretAccessKey": {
+ "orgId": {
"type": "string",
- "description": "This is the Supabase S3 Secret Access Key.\nThe user creates this in the Supabase project Storage settings along with the access key id"
+ "description": "This is the unique identifier for the org that this assistant belongs to."
},
- "name": {
+ "createdAt": {
+ "format": "date-time",
"type": "string",
- "description": "This is the Supabase S3 Bucket Name.\nThe user must create this in Supabase under Storage > Buckets\nA bucket that does not exist will not be checked now, but file uploads will fail"
+ "description": "This is the ISO 8601 date-time string of when the assistant was created."
},
- "path": {
+ "updatedAt": {
+ "format": "date-time",
"type": "string",
- "description": "This is the Supabase S3 Bucket Folder Path.\nThe user can create this in Supabase under Storage > Buckets\nA path that does not exist will not be checked now, but file uploads will fail\nA Path is like a folder in the bucket\nEg. If the bucket is called \"my-bucket\" and the path is \"my-folder\", the full path is \"my-bucket/my-folder\""
+ "description": "This is the ISO 8601 date-time string of when the assistant was last updated."
}
},
"required": [
- "region",
- "url",
- "accessKeyId",
- "secretAccessKey",
- "name"
+ "id",
+ "orgId",
+ "createdAt",
+ "updatedAt"
]
},
- "CreateSupabaseCredentialDTO": {
+ "PaginationMeta": {
"type": "object",
"properties": {
- "provider": {
- "type": "string",
- "enum": [
- "supabase"
- ],
- "description": "This is for supabase storage."
+ "itemsPerPage": {
+ "type": "number"
},
- "fallbackIndex": {
- "type": "number",
- "minimum": 1,
- "description": "This is the order in which this storage provider is tried during upload retries. Lower numbers are tried first in increasing order."
+ "totalItems": {
+ "type": "number"
},
- "bucketPlan": {
- "$ref": "#/components/schemas/SupabaseBucketPlan"
+ "currentPage": {
+ "type": "number"
},
- "name": {
+ "totalPages": {
+ "type": "number"
+ },
+ "hasNextPage": {
+ "type": "boolean"
+ },
+ "nextCursor": {
"type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider"
- ]
- },
- "CreateSmallestAICredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
+ "description": "Opaque cursor for the next page under keyset pagination (PRO-3163). Pass it\nback as the `cursor` query param to fetch the next page without an OFFSET\nscan. Present only when a further page likely exists."
+ },
+ "sortOrder": {
"type": "string",
"enum": [
- "smallest-ai"
+ "ASC",
+ "DESC"
]
},
- "apiKey": {
- "type": "string",
- "description": "This is not returned in the API."
+ "itemsBeyondRetention": {
+ "type": "boolean"
},
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
+ "createdAtLe": {
+ "format": "date-time",
+ "type": "string"
+ },
+ "createdAtGe": {
+ "format": "date-time",
+ "type": "string"
}
},
"required": [
- "provider",
- "apiKey"
+ "itemsPerPage",
+ "totalItems",
+ "currentPage"
]
},
- "CreateTavusCredentialDTO": {
+ "AssistantPaginatedResponse": {
"type": "object",
"properties": {
- "provider": {
- "type": "string",
- "enum": [
- "tavus"
- ]
- },
- "apiKey": {
- "type": "string",
- "description": "This is not returned in the API."
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Assistant"
+ }
},
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
+ "metadata": {
+ "$ref": "#/components/schemas/PaginationMeta"
}
},
"required": [
- "provider",
- "apiKey"
+ "results",
+ "metadata"
]
},
- "CreateTogetherAICredentialDTO": {
+ "AssistantDraft": {
"type": "object",
"properties": {
- "provider": {
- "type": "string",
- "enum": [
- "together-ai"
+ "transcriber": {
+ "description": "These are the options for the assistant's transcriber.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/AssemblyAITranscriber",
+ "title": "AssemblyAITranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/AzureSpeechTranscriber",
+ "title": "AzureSpeechTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/CustomTranscriber",
+ "title": "CustomTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/DeepgramTranscriber",
+ "title": "DeepgramTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/ElevenLabsTranscriber",
+ "title": "ElevenLabsTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/GladiaTranscriber",
+ "title": "GladiaTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/GoogleTranscriber",
+ "title": "GoogleTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/SpeechmaticsTranscriber",
+ "title": "SpeechmaticsTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/TalkscriberTranscriber",
+ "title": "TalkscriberTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAITranscriber",
+ "title": "OpenAITranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/CartesiaTranscriber",
+ "title": "CartesiaTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/SonioxTranscriber",
+ "title": "SonioxTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/XaiTranscriber",
+ "title": "XaiTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/VapiTranscriber",
+ "title": "VapiTranscriber"
+ }
]
},
- "apiKey": {
- "type": "string",
- "description": "This is not returned in the API."
+ "model": {
+ "description": "These are the options for the assistant's LLM.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/AnthropicModel",
+ "title": "Anthropic"
+ },
+ {
+ "$ref": "#/components/schemas/AnthropicBedrockModel",
+ "title": "AnthropicBedrock"
+ },
+ {
+ "$ref": "#/components/schemas/AnyscaleModel",
+ "title": "Anyscale"
+ },
+ {
+ "$ref": "#/components/schemas/CerebrasModel",
+ "title": "Cerebras"
+ },
+ {
+ "$ref": "#/components/schemas/CustomLLMModel",
+ "title": "CustomLLM"
+ },
+ {
+ "$ref": "#/components/schemas/DeepInfraModel",
+ "title": "DeepInfra"
+ },
+ {
+ "$ref": "#/components/schemas/DeepSeekModel",
+ "title": "DeepSeek"
+ },
+ {
+ "$ref": "#/components/schemas/GoogleModel",
+ "title": "Google"
+ },
+ {
+ "$ref": "#/components/schemas/GroqModel",
+ "title": "Groq"
+ },
+ {
+ "$ref": "#/components/schemas/InflectionAIModel",
+ "title": "InflectionAI"
+ },
+ {
+ "$ref": "#/components/schemas/MinimaxLLMModel",
+ "title": "MiniMaxLLM"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAIModel",
+ "title": "OpenAI"
+ },
+ {
+ "$ref": "#/components/schemas/OpenRouterModel",
+ "title": "OpenRouter"
+ },
+ {
+ "$ref": "#/components/schemas/PerplexityAIModel",
+ "title": "PerplexityAI"
+ },
+ {
+ "$ref": "#/components/schemas/TogetherAIModel",
+ "title": "Together"
+ },
+ {
+ "$ref": "#/components/schemas/XaiModel",
+ "title": "XAI"
+ },
+ {
+ "$ref": "#/components/schemas/VapiModel",
+ "title": "Vapi"
+ }
+ ]
},
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "apiKey"
- ]
- },
- "CreateTwilioCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "twilio"
+ "voice": {
+ "description": "These are the options for the assistant's voice.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/AzureVoice",
+ "title": "AzureVoice"
+ },
+ {
+ "$ref": "#/components/schemas/CartesiaVoice",
+ "title": "CartesiaVoice"
+ },
+ {
+ "$ref": "#/components/schemas/CustomVoice",
+ "title": "CustomVoice"
+ },
+ {
+ "$ref": "#/components/schemas/DeepgramVoice",
+ "title": "DeepgramVoice"
+ },
+ {
+ "$ref": "#/components/schemas/ElevenLabsVoice",
+ "title": "ElevenLabsVoice"
+ },
+ {
+ "$ref": "#/components/schemas/HumeVoice",
+ "title": "HumeVoice"
+ },
+ {
+ "$ref": "#/components/schemas/LMNTVoice",
+ "title": "LMNTVoice"
+ },
+ {
+ "$ref": "#/components/schemas/NeuphonicVoice",
+ "title": "NeuphonicVoice"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAIVoice",
+ "title": "OpenAIVoice"
+ },
+ {
+ "$ref": "#/components/schemas/PlayHTVoice",
+ "title": "PlayHTVoice"
+ },
+ {
+ "$ref": "#/components/schemas/WellSaidVoice",
+ "title": "WellSaidVoice"
+ },
+ {
+ "$ref": "#/components/schemas/RimeAIVoice",
+ "title": "RimeAIVoice"
+ },
+ {
+ "$ref": "#/components/schemas/SmallestAIVoice",
+ "title": "SmallestAIVoice"
+ },
+ {
+ "$ref": "#/components/schemas/TavusVoice",
+ "title": "TavusVoice"
+ },
+ {
+ "$ref": "#/components/schemas/VapiVoice",
+ "title": "VapiVoice"
+ },
+ {
+ "$ref": "#/components/schemas/SesameVoice",
+ "title": "SesameVoice"
+ },
+ {
+ "$ref": "#/components/schemas/InworldVoice",
+ "title": "InworldVoice"
+ },
+ {
+ "$ref": "#/components/schemas/MinimaxVoice",
+ "title": "MinimaxVoice"
+ },
+ {
+ "$ref": "#/components/schemas/XaiVoice",
+ "title": "XaiVoice"
+ },
+ {
+ "$ref": "#/components/schemas/MicrosoftVoice",
+ "title": "MicrosoftVoice"
+ }
]
},
- "authToken": {
+ "firstMessage": {
"type": "string",
- "description": "This is not returned in the API."
+ "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.).\n\nIf unspecified, assistant will wait for user to speak and use the model to respond once they speak.",
+ "example": "Hello! How can I help you today?"
},
- "apiKey": {
- "type": "string",
- "description": "This is not returned in the API."
+ "firstMessageInterruptionsEnabled": {
+ "type": "boolean",
+ "default": false
},
- "apiSecret": {
+ "firstMessageMode": {
"type": "string",
- "description": "This is not returned in the API."
+ "description": "This is the mode for the first message. Default is 'assistant-speaks-first'.\n\nUse:\n- 'assistant-speaks-first' to have the assistant speak first.\n- 'assistant-waits-for-user' to have the assistant wait for the user to speak first.\n- '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).\n\n@default 'assistant-speaks-first'",
+ "enum": [
+ "assistant-speaks-first",
+ "assistant-speaks-first-with-model-generated-message",
+ "assistant-waits-for-user"
+ ],
+ "example": "assistant-speaks-first"
+ },
+ "voicemailDetection": {
+ "description": "These are the settings to configure or disable voicemail detection. Alternatively, voicemail detection can be configured using the model.tools=[VoicemailTool].\nBy default, voicemail detection is disabled.",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "off"
+ ]
+ },
+ {
+ "$ref": "#/components/schemas/GoogleVoicemailDetectionPlan",
+ "title": "Google"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAIVoicemailDetectionPlan",
+ "title": "OpenAI"
+ },
+ {
+ "$ref": "#/components/schemas/TwilioVoicemailDetectionPlan",
+ "title": "Twilio"
+ },
+ {
+ "$ref": "#/components/schemas/VapiVoicemailDetectionPlan",
+ "title": "Vapi"
+ }
+ ]
+ },
+ "clientMessages": {
+ "type": "array",
+ "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"
+ ],
+ "example": [
+ "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"
+ ],
+ "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.",
+ "items": {
+ "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"
+ ]
+ }
+ },
+ "serverMessages": {
+ "type": "array",
+ "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"
+ ],
+ "example": [
+ "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"
+ ],
+ "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.",
+ "items": {
+ "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"
+ ]
+ }
},
- "accountSid": {
- "type": "string"
+ "maxDurationSeconds": {
+ "type": "number",
+ "description": "This is the maximum number of seconds that the call will last. When the call reaches this duration, it will be ended.\n\n@default 600 (10 minutes)",
+ "minimum": 10,
+ "maximum": 43200,
+ "example": 600
},
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "accountSid"
- ]
- },
- "CreateVonageCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "vonage"
+ "backgroundSound": {
+ "description": "This is the background sound in the call. Default for phone calls is 'office' and default for web calls is 'off'.\nYou can also provide a custom sound by providing a URL to an audio file.",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "off",
+ "office"
+ ],
+ "example": "office"
+ },
+ {
+ "type": "string",
+ "format": "uri",
+ "example": "https://www.soundjay.com/ambient/sounds/people-in-lounge-1.mp3"
+ }
]
},
- "apiSecret": {
- "type": "string",
- "description": "This is not returned in the API."
- },
- "apiKey": {
- "type": "string"
+ "modelOutputInMessagesEnabled": {
+ "type": "boolean",
+ "description": "This determines whether the model's output is used in conversation history rather than the transcription of assistant's speech.\n\n@default false",
+ "example": false
},
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "apiSecret",
- "apiKey"
- ]
- },
- "CreateWebhookCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "webhook"
- ]
+ "transportConfigurations": {
+ "type": "array",
+ "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.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/TransportConfigurationTwilio",
+ "title": "Twilio"
+ }
+ ]
+ }
},
- "authenticationPlan": {
- "description": "This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication.",
+ "observabilityPlan": {
+ "description": "This is the plan for observability of assistant's calls.\n\nCurrently, only Langfuse is supported.",
"oneOf": [
{
- "$ref": "#/components/schemas/OAuth2AuthenticationPlan"
- },
- {
- "$ref": "#/components/schemas/HMACAuthenticationPlan"
- },
- {
- "$ref": "#/components/schemas/BearerAuthenticationPlan"
+ "$ref": "#/components/schemas/LangfuseObservabilityPlan",
+ "title": "Langfuse"
}
],
- "discriminator": {
- "propertyName": "type",
- "mapping": {
- "oauth2": "#/components/schemas/OAuth2AuthenticationPlan",
- "hmac": "#/components/schemas/HMACAuthenticationPlan",
- "bearer": "#/components/schemas/BearerAuthenticationPlan"
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/LangfuseObservabilityPlan"
}
- }
- },
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "authenticationPlan"
- ]
- },
- "CreateXAiCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "description": "This is the api key for Grok in XAi's console. Get it from here: https://console.x.ai",
- "enum": [
- "xai"
- ]
- },
- "apiKey": {
- "type": "string",
- "maxLength": 10000,
- "description": "This is not returned in the API."
- },
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "apiKey"
- ]
- },
- "CreateGoogleCalendarOAuth2ClientCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "google.calendar.oauth2-client"
]
},
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider"
- ]
- },
- "CreateGoogleCalendarOAuth2AuthorizationCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "google.calendar.oauth2-authorization"
- ]
+ "credentials": {
+ "type": "array",
+ "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.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CreateAnthropicCredentialDTO",
+ "title": "AnthropicCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAnthropicBedrockCredentialDTO",
+ "title": "AnthropicBedrockCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAnyscaleCredentialDTO",
+ "title": "AnyscaleCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAssemblyAICredentialDTO",
+ "title": "AssemblyAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAzureCredentialDTO",
+ "title": "AzureCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateAzureOpenAICredentialDTO",
+ "title": "AzureOpenAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateByoSipTrunkCredentialDTO",
+ "title": "ByoSipTrunkCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCartesiaCredentialDTO",
+ "title": "CartesiaCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCerebrasCredentialDTO",
+ "title": "CerebrasCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCloudflareCredentialDTO",
+ "title": "CloudflareCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCustomLLMCredentialDTO",
+ "title": "CustomLLMCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateDeepgramCredentialDTO",
+ "title": "DeepgramCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateDeepInfraCredentialDTO",
+ "title": "DeepInfraCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateDeepSeekCredentialDTO",
+ "title": "DeepSeekCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateElevenLabsCredentialDTO",
+ "title": "ElevenLabsCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGcpCredentialDTO",
+ "title": "GcpCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGladiaCredentialDTO",
+ "title": "GladiaCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelCredentialDTO",
+ "title": "GhlCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCredentialDTO",
+ "title": "GoogleCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGroqCredentialDTO",
+ "title": "GroqCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateHumeCredentialDTO",
+ "title": "HumeCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateInflectionAICredentialDTO",
+ "title": "InflectionAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateLangfuseCredentialDTO",
+ "title": "LangfuseCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateLmntCredentialDTO",
+ "title": "LmntCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMakeCredentialDTO",
+ "title": "MakeCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMistralCredentialDTO",
+ "title": "MistralCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateNeuphonicCredentialDTO",
+ "title": "NeuphonicCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateOpenAICredentialDTO",
+ "title": "OpenAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateOpenRouterCredentialDTO",
+ "title": "OpenRouterCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreatePerplexityAICredentialDTO",
+ "title": "PerplexityAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreatePlayHTCredentialDTO",
+ "title": "PlayHTCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateRimeAICredentialDTO",
+ "title": "RimeAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateRunpodCredentialDTO",
+ "title": "RunpodCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateS3CredentialDTO",
+ "title": "S3Credential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateS3CompatibleCredentialDTO",
+ "title": "S3CompatibleStorageCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSmallestAICredentialDTO",
+ "title": "SmallestAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSpeechmaticsCredentialDTO",
+ "title": "SpeechmaticsCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSonioxCredentialDTO",
+ "title": "SonioxCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSupabaseCredentialDTO",
+ "title": "SupabaseCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTavusCredentialDTO",
+ "title": "TavusCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTogetherAICredentialDTO",
+ "title": "TogetherAICredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTwilioCredentialDTO",
+ "title": "TwilioCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateVonageCredentialDTO",
+ "title": "VonageCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateWebhookCredentialDTO",
+ "title": "WebhookCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateCustomCredentialDTO",
+ "title": "CustomCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateXAiCredentialDTO",
+ "title": "XAiCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO",
+ "title": "MicrosoftCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
+ "title": "GoogleCalendarOAuth2ClientCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO",
+ "title": "GoogleCalendarOAuth2AuthorizationCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO",
+ "title": "GoogleSheetsOAuth2AuthorizationCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSlackOAuth2AuthorizationCredentialDTO",
+ "title": "SlackOAuth2AuthorizationCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateGoHighLevelMCPCredentialDTO",
+ "title": "GoHighLevelMCPCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateInworldCredentialDTO",
+ "title": "InworldCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateMinimaxCredentialDTO",
+ "title": "MinimaxCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateWellSaidCredentialDTO",
+ "title": "WellSaidCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateEmailCredentialDTO",
+ "title": "EmailCredential"
+ },
+ {
+ "$ref": "#/components/schemas/CreateSlackWebhookCredentialDTO",
+ "title": "SlackWebhookCredential"
+ }
+ ],
+ "discriminator": {
+ "propertyName": "provider",
+ "mapping": {
+ "11labs": "#/components/schemas/CreateElevenLabsCredentialDTO",
+ "anthropic": "#/components/schemas/CreateAnthropicCredentialDTO",
+ "anthropic-bedrock": "#/components/schemas/CreateAnthropicBedrockCredentialDTO",
+ "anyscale": "#/components/schemas/CreateAnyscaleCredentialDTO",
+ "assembly-ai": "#/components/schemas/CreateAssemblyAICredentialDTO",
+ "azure-openai": "#/components/schemas/CreateAzureOpenAICredentialDTO",
+ "azure": "#/components/schemas/CreateAzureCredentialDTO",
+ "byo-sip-trunk": "#/components/schemas/CreateByoSipTrunkCredentialDTO",
+ "cartesia": "#/components/schemas/CreateCartesiaCredentialDTO",
+ "cerebras": "#/components/schemas/CreateCerebrasCredentialDTO",
+ "cloudflare": "#/components/schemas/CreateCloudflareCredentialDTO",
+ "custom-llm": "#/components/schemas/CreateCustomLLMCredentialDTO",
+ "deepgram": "#/components/schemas/CreateDeepgramCredentialDTO",
+ "deepinfra": "#/components/schemas/CreateDeepInfraCredentialDTO",
+ "deep-seek": "#/components/schemas/CreateDeepSeekCredentialDTO",
+ "gcp": "#/components/schemas/CreateGcpCredentialDTO",
+ "gladia": "#/components/schemas/CreateGladiaCredentialDTO",
+ "gohighlevel": "#/components/schemas/CreateGoHighLevelCredentialDTO",
+ "google": "#/components/schemas/CreateGoogleCredentialDTO",
+ "groq": "#/components/schemas/CreateGroqCredentialDTO",
+ "inflection-ai": "#/components/schemas/CreateInflectionAICredentialDTO",
+ "langfuse": "#/components/schemas/CreateLangfuseCredentialDTO",
+ "lmnt": "#/components/schemas/CreateLmntCredentialDTO",
+ "make": "#/components/schemas/CreateMakeCredentialDTO",
+ "openai": "#/components/schemas/CreateOpenAICredentialDTO",
+ "openrouter": "#/components/schemas/CreateOpenRouterCredentialDTO",
+ "perplexity-ai": "#/components/schemas/CreatePerplexityAICredentialDTO",
+ "playht": "#/components/schemas/CreatePlayHTCredentialDTO",
+ "rime-ai": "#/components/schemas/CreateRimeAICredentialDTO",
+ "runpod": "#/components/schemas/CreateRunpodCredentialDTO",
+ "s3": "#/components/schemas/CreateS3CredentialDTO",
+ "s3-compatible": "#/components/schemas/CreateS3CompatibleCredentialDTO",
+ "supabase": "#/components/schemas/CreateSupabaseCredentialDTO",
+ "smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO",
+ "tavus": "#/components/schemas/CreateTavusCredentialDTO",
+ "together-ai": "#/components/schemas/CreateTogetherAICredentialDTO",
+ "twilio": "#/components/schemas/CreateTwilioCredentialDTO",
+ "vonage": "#/components/schemas/CreateVonageCredentialDTO",
+ "webhook": "#/components/schemas/CreateWebhookCredentialDTO",
+ "custom-credential": "#/components/schemas/CreateCustomCredentialDTO",
+ "xai": "#/components/schemas/CreateXAiCredentialDTO",
+ "microsoft": "#/components/schemas/CreateMicrosoftCredentialDTO",
+ "neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO",
+ "hume": "#/components/schemas/CreateHumeCredentialDTO",
+ "mistral": "#/components/schemas/CreateMistralCredentialDTO",
+ "speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO",
+ "soniox": "#/components/schemas/CreateSonioxCredentialDTO",
+ "google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
+ "google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO",
+ "google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO",
+ "slack.oauth2-authorization": "#/components/schemas/CreateSlackOAuth2AuthorizationCredentialDTO",
+ "ghl.oauth2-authorization": "#/components/schemas/CreateGoHighLevelMCPCredentialDTO",
+ "inworld": "#/components/schemas/CreateInworldCredentialDTO",
+ "minimax": "#/components/schemas/CreateMinimaxCredentialDTO",
+ "wellsaid": "#/components/schemas/CreateWellSaidCredentialDTO",
+ "email": "#/components/schemas/CreateEmailCredentialDTO",
+ "slack-webhook": "#/components/schemas/CreateSlackWebhookCredentialDTO"
+ }
+ }
+ }
},
- "authorizationId": {
- "type": "string",
- "description": "The authorization ID for the OAuth2 authorization"
+ "hooks": {
+ "type": "array",
+ "description": "This is a set of actions that will be performed on certain events.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CallHookCallEnding",
+ "title": "CallHookCallEnding"
+ },
+ {
+ "$ref": "#/components/schemas/CallHookAssistantSpeechInterrupted",
+ "title": "CallHookAssistantSpeechInterrupted"
+ },
+ {
+ "$ref": "#/components/schemas/CallHookCustomerSpeechInterrupted",
+ "title": "CallHookCustomerSpeechInterrupted"
+ },
+ {
+ "$ref": "#/components/schemas/CallHookCustomerSpeechTimeout",
+ "title": "CallHookCustomerSpeechTimeout"
+ },
+ {
+ "$ref": "#/components/schemas/SessionCreatedHook",
+ "title": "SessionCreatedHook"
+ }
+ ]
+ }
},
"name": {
"type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
+ "description": "This is the name of the assistant.\n\nThis is required when you want to transfer between assistants in a call.",
"maxLength": 40
- }
- },
- "required": [
- "provider",
- "authorizationId"
- ]
- },
- "CreateGoogleSheetsOAuth2AuthorizationCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "google.sheets.oauth2-authorization"
- ]
},
- "authorizationId": {
+ "voicemailMessage": {
"type": "string",
- "description": "The authorization ID for the OAuth2 authorization"
+ "description": "This is the message that the assistant will say if the call is forwarded to voicemail.\n\nIf unspecified, it will hang up.",
+ "maxLength": 1000
},
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "authorizationId"
- ]
- },
- "CreateSlackOAuth2AuthorizationCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
+ "endCallMessage": {
"type": "string",
- "enum": [
- "slack.oauth2-authorization"
+ "description": "This is the message that the assistant will say if it ends the call.\n\nIf unspecified, it will hang up without saying anything.",
+ "maxLength": 1000
+ },
+ "endCallPhrases": {
+ "description": "This list contains phrases that, if spoken by the assistant, will trigger the call to be hung up. Case insensitive.",
+ "type": "array",
+ "items": {
+ "type": "string",
+ "maxLength": 140,
+ "minLength": 2
+ }
+ },
+ "compliancePlan": {
+ "$ref": "#/components/schemas/CompliancePlan"
+ },
+ "metadata": {
+ "type": "object",
+ "description": "This is for metadata you want to store on the assistant."
+ },
+ "backgroundSpeechDenoisingPlan": {
+ "description": "This enables filtering of noise and background speech while the user is talking.\n\nFeatures:\n- Smart denoising using Krisp\n- Fourier denoising\n\nSmart denoising can be combined with or used independently of Fourier denoising.\n\nOrder of precedence:\n- Smart denoising\n- Fourier denoising",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BackgroundSpeechDenoisingPlan"
+ }
]
},
- "authorizationId": {
- "type": "string",
- "description": "The authorization ID for the OAuth2 authorization"
+ "analysisPlan": {
+ "description": "This is the plan for analysis of assistant's calls. Stored in `call.analysis`.",
+ "deprecated": true,
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/AnalysisPlan"
+ }
+ ]
},
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "authorizationId"
- ]
- },
- "CreateMinimaxCredentialDTO": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "minimax"
+ "artifactPlan": {
+ "description": "This is the plan for artifacts generated during assistant's calls. Stored in `call.artifact`.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ArtifactPlan"
+ }
]
},
- "apiKey": {
- "type": "string",
- "description": "This is not returned in the API."
+ "startSpeakingPlan": {
+ "description": "This is the plan for when the assistant should start talking.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to start talking after the customer is done speaking.\n- The assistant is too fast to start talking after the customer is done speaking.\n- The assistant is so fast that it's actually interrupting the customer.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/StartSpeakingPlan"
+ }
+ ]
},
- "groupId": {
- "type": "string",
- "description": "This is the Minimax Group ID."
+ "stopSpeakingPlan": {
+ "description": "This is the plan for when assistant should stop talking on customer interruption.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to recognize customer's interruption.\n- The assistant is too fast to recognize customer's interruption.\n- The assistant is getting interrupted by phrases that are just acknowledgments.\n- The assistant is getting interrupted by background noises.\n- The assistant is not properly stopping -- it starts talking right after getting interrupted.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/StopSpeakingPlan"
+ }
+ ]
},
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "apiKey",
- "groupId"
- ]
- },
- "EndpointedSpeechLowConfidenceOptions": {
- "type": "object",
- "properties": {
- "confidenceMin": {
- "type": "number",
- "description": "This is the minimum confidence threshold.\nTranscripts with confidence below this value will be discarded.\n\n@default confidenceMax - 0.2",
- "minimum": 0,
- "maximum": 1
+ "monitorPlan": {
+ "description": "This is the plan for real-time monitoring of the assistant's calls.\n\nUsage:\n- To enable live listening of the assistant's calls, set `monitorPlan.listenEnabled` to `true`.\n- To enable live control of the assistant's calls, set `monitorPlan.controlEnabled` to `true`.\n- To attach monitors to the assistant, set `monitorPlan.monitorIds` to the set of monitor ids.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/MonitorPlan"
+ }
+ ]
},
- "confidenceMax": {
- "type": "number",
- "description": "This is the maximum confidence threshold.\nTranscripts with confidence at or above this value will be processed normally.\n\n@default transcriber's confidenceThreshold",
- "minimum": 0,
- "maximum": 1
- }
- }
- },
- "CallHookTranscriberEndpointedSpeechLowConfidence": {
- "type": "object",
- "properties": {
- "do": {
+ "credentialIds": {
+ "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.",
"type": "array",
- "description": "This is the set of actions to perform when the hook triggers",
"items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/SayHookAction",
- "title": "SayHookAction"
- },
- {
- "$ref": "#/components/schemas/ToolCallHookAction",
- "title": "ToolCallHookAction"
- },
- {
- "$ref": "#/components/schemas/MessageAddHookAction",
- "title": "MessageAddHookAction"
- }
- ]
+ "type": "string"
}
},
- "on": {
- "type": "string",
- "description": "This is the event that triggers this hook",
- "maxLength": 1000
- },
- "options": {
- "description": "This is the options for the hook including confidence thresholds",
+ "server": {
+ "description": "This is where Vapi will send webhooks. You can find all webhooks available along with their shape in ServerMessage schema.\n\nThe order of precedence is:\n\n1. assistant.server.url\n2. phoneNumber.serverUrl\n3. org.serverUrl",
"allOf": [
{
- "$ref": "#/components/schemas/EndpointedSpeechLowConfidenceOptions"
+ "$ref": "#/components/schemas/Server"
}
]
- }
- },
- "required": [
- "do",
- "on"
- ]
- },
- "SessionCreatedHook": {
- "type": "object",
- "properties": {
- "on": {
+ },
+ "keypadInputPlan": {
+ "$ref": "#/components/schemas/KeypadInputPlan"
+ },
+ "baseVersion": {
"type": "string",
- "description": "This is the event that triggers this hook",
- "enum": [
- "session.created"
- ],
- "maxLength": 1000
+ "description": "Server-resolved baseVersion (always set after POST)."
},
- "do": {
- "type": "array",
- "description": "This is the set of actions to perform when the hook triggers.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/ToolCallHookAction",
- "title": "ToolCallHookAction"
- }
- ]
- }
+ "id": {
+ "type": "string",
+ "description": "Surrogate key used as `draftId` in URLs."
},
- "name": {
+ "orgId": {
"type": "string",
- "description": "Optional name for this hook instance.\nIf no name is provided, the hook will be auto generated as UUID.\n\n@default UUID",
- "maxLength": 1000
- }
- },
- "required": [
- "on",
- "do"
- ]
- },
- "SQLInjectionSecurityFilter": {
- "type": "object",
- "properties": {
- "type": {
+ "description": "Org this draft belongs to."
+ },
+ "assistantId": {
"type": "string",
- "description": "The type of security threat to filter.",
- "enum": [
- "sql-injection"
- ]
- }
- },
- "required": [
- "type"
- ]
- },
- "XSSSecurityFilter": {
- "type": "object",
- "properties": {
- "type": {
+ "description": "Parent assistant the draft was forked from. FK to assistant.id ON DELETE CASCADE."
+ },
+ "createdBy": {
"type": "string",
- "description": "The type of security threat to filter.",
- "enum": [
- "xss"
- ]
+ "nullable": true,
+ "description": "Email when JWT, null when API or external JWT. Set on POST, never rewritten on PATCH."
+ },
+ "createdAt": {
+ "format": "date-time",
+ "type": "string"
+ },
+ "updatedAt": {
+ "format": "date-time",
+ "type": "string"
}
},
"required": [
- "type"
+ "baseVersion",
+ "id",
+ "orgId",
+ "assistantId",
+ "createdAt",
+ "updatedAt"
]
},
- "SSRFSecurityFilter": {
+ "AssistantDraftPaginatedMetadata": {
"type": "object",
"properties": {
- "type": {
+ "nextCursor": {
"type": "string",
- "description": "The type of security threat to filter.",
- "enum": [
- "ssrf"
- ]
+ "nullable": true
+ },
+ "hasNextPage": {
+ "type": "boolean"
+ },
+ "limit": {
+ "type": "number"
}
},
"required": [
- "type"
+ "nextCursor",
+ "hasNextPage",
+ "limit"
]
},
- "RCESecurityFilter": {
+ "AssistantDraftPaginatedResponse": {
"type": "object",
"properties": {
- "type": {
- "type": "string",
- "description": "The type of security threat to filter.",
- "enum": [
- "rce"
- ]
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/AssistantDraft"
+ }
+ },
+ "metadata": {
+ "$ref": "#/components/schemas/AssistantDraftPaginatedMetadata"
}
},
"required": [
- "type"
+ "results",
+ "metadata"
]
},
- "PromptInjectionSecurityFilter": {
+ "LegacyAssistantVersion": {
"type": "object",
"properties": {
- "type": {
- "type": "string",
- "description": "The type of security threat to filter.",
- "enum": [
- "prompt-injection"
- ]
+ "id": {
+ "type": "string"
+ },
+ "assistantId": {
+ "type": "string"
+ },
+ "orgId": {
+ "type": "string"
+ },
+ "data": {
+ "type": "string"
+ },
+ "createdAt": {
+ "format": "date-time",
+ "type": "string"
}
},
"required": [
- "type"
+ "id",
+ "assistantId",
+ "orgId",
+ "createdAt"
]
},
- "RegexSecurityFilter": {
+ "LegacyAssistantVersionPaginatedResponse": {
"type": "object",
"properties": {
- "type": {
- "type": "string",
- "description": "The type of security threat to filter.",
- "enum": [
- "regex"
- ]
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/LegacyAssistantVersion"
+ }
},
- "regex": {
- "type": "string",
- "description": "The regex pattern to filter.",
- "example": "badword1|badword2"
+ "metadata": {
+ "$ref": "#/components/schemas/PaginationMeta"
+ },
+ "nextPageState": {
+ "type": "string"
}
},
"required": [
- "type",
- "regex"
+ "results",
+ "metadata"
]
},
- "AssistantOverrides": {
+ "AssistantVersion": {
"type": "object",
"properties": {
"transcriber": {
@@ -27249,6 +34313,14 @@
{
"$ref": "#/components/schemas/SonioxTranscriber",
"title": "SonioxTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/XaiTranscriber",
+ "title": "XaiTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/VapiTranscriber",
+ "title": "VapiTranscriber"
}
]
},
@@ -27318,6 +34390,10 @@
{
"$ref": "#/components/schemas/XaiModel",
"title": "XAI"
+ },
+ {
+ "$ref": "#/components/schemas/VapiModel",
+ "title": "Vapi"
}
]
},
@@ -27395,6 +34471,14 @@
{
"$ref": "#/components/schemas/MinimaxVoice",
"title": "MinimaxVoice"
+ },
+ {
+ "$ref": "#/components/schemas/XaiVoice",
+ "title": "XaiVoice"
+ },
+ {
+ "$ref": "#/components/schemas/MicrosoftVoice",
+ "title": "MicrosoftVoice"
}
]
},
@@ -27783,6 +34867,10 @@
"$ref": "#/components/schemas/CreateS3CredentialDTO",
"title": "S3Credential"
},
+ {
+ "$ref": "#/components/schemas/CreateS3CompatibleCredentialDTO",
+ "title": "S3CompatibleStorageCredential"
+ },
{
"$ref": "#/components/schemas/CreateSmallestAICredentialDTO",
"title": "SmallestAICredential"
@@ -27807,10 +34895,6 @@
"$ref": "#/components/schemas/CreateTogetherAICredentialDTO",
"title": "TogetherAICredential"
},
- {
- "$ref": "#/components/schemas/CreateTrieveCredentialDTO",
- "title": "TrieveCredential"
- },
{
"$ref": "#/components/schemas/CreateTwilioCredentialDTO",
"title": "TwilioCredential"
@@ -27831,6 +34915,10 @@
"$ref": "#/components/schemas/CreateXAiCredentialDTO",
"title": "XAiCredential"
},
+ {
+ "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO",
+ "title": "MicrosoftCredential"
+ },
{
"$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
"title": "GoogleCalendarOAuth2ClientCredential"
@@ -27906,6 +34994,7 @@
"rime-ai": "#/components/schemas/CreateRimeAICredentialDTO",
"runpod": "#/components/schemas/CreateRunpodCredentialDTO",
"s3": "#/components/schemas/CreateS3CredentialDTO",
+ "s3-compatible": "#/components/schemas/CreateS3CompatibleCredentialDTO",
"supabase": "#/components/schemas/CreateSupabaseCredentialDTO",
"smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO",
"tavus": "#/components/schemas/CreateTavusCredentialDTO",
@@ -27915,12 +35004,12 @@
"webhook": "#/components/schemas/CreateWebhookCredentialDTO",
"custom-credential": "#/components/schemas/CreateCustomCredentialDTO",
"xai": "#/components/schemas/CreateXAiCredentialDTO",
+ "microsoft": "#/components/schemas/CreateMicrosoftCredentialDTO",
"neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO",
"hume": "#/components/schemas/CreateHumeCredentialDTO",
"mistral": "#/components/schemas/CreateMistralCredentialDTO",
"speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO",
"soniox": "#/components/schemas/CreateSonioxCredentialDTO",
- "trieve": "#/components/schemas/CreateTrieveCredentialDTO",
"google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
"google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO",
"google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO",
@@ -27963,108 +35052,62 @@
]
}
},
- "tools:append": {
- "type": "array",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/CreateApiRequestToolDTO",
- "title": "ApiRequestTool"
- },
- {
- "$ref": "#/components/schemas/CreateBashToolDTO",
- "title": "BashTool"
- },
- {
- "$ref": "#/components/schemas/CreateCodeToolDTO",
- "title": "CodeTool"
- },
- {
- "$ref": "#/components/schemas/CreateComputerToolDTO",
- "title": "ComputerTool"
- },
- {
- "$ref": "#/components/schemas/CreateDtmfToolDTO",
- "title": "DtmfTool"
- },
- {
- "$ref": "#/components/schemas/CreateEndCallToolDTO",
- "title": "EndCallTool"
- },
- {
- "$ref": "#/components/schemas/CreateFunctionToolDTO",
- "title": "FunctionTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO",
- "title": "GoHighLevelCalendarAvailabilityTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO",
- "title": "GoHighLevelCalendarEventCreateTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelContactCreateToolDTO",
- "title": "GoHighLevelContactCreateTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoHighLevelContactGetToolDTO",
- "title": "GoHighLevelContactGetTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO",
- "title": "GoogleCalendarCheckAvailabilityTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoogleCalendarCreateEventToolDTO",
- "title": "GoogleCalendarCreateEventTool"
- },
- {
- "$ref": "#/components/schemas/CreateGoogleSheetsRowAppendToolDTO",
- "title": "GoogleSheetsRowAppendTool"
- },
- {
- "$ref": "#/components/schemas/CreateHandoffToolDTO",
- "title": "HandoffTool"
- },
- {
- "$ref": "#/components/schemas/CreateMcpToolDTO",
- "title": "McpTool"
- },
- {
- "$ref": "#/components/schemas/CreateQueryToolDTO",
- "title": "QueryTool"
- },
- {
- "$ref": "#/components/schemas/CreateSlackSendMessageToolDTO",
- "title": "SlackSendMessageTool"
- },
- {
- "$ref": "#/components/schemas/CreateSmsToolDTO",
- "title": "SmsTool"
- },
- {
- "$ref": "#/components/schemas/CreateTextEditorToolDTO",
- "title": "TextEditorTool"
- },
- {
- "$ref": "#/components/schemas/CreateTransferCallToolDTO",
- "title": "TransferCallTool"
- },
- {
- "$ref": "#/components/schemas/CreateSipRequestToolDTO",
- "title": "SipRequestTool"
- },
- {
- "$ref": "#/components/schemas/CreateVoicemailToolDTO",
- "title": "VoicemailTool"
- }
- ]
- }
+ "versionName": {
+ "type": "string",
+ "nullable": true,
+ "description": "Optional human-readable label for this version. Pass `null` to clear.",
+ "maxLength": 80
},
- "variableValues": {
- "type": "object",
- "description": "These are values that will be used to replace the template variables in the assistant messages and other text-based fields.\nThis uses LiquidJS syntax. https://liquidjs.com/tutorials/intro-to-liquid.html\n\nSo for example, `{{ name }}` will be replaced with the value of `name` in `variableValues`.\n`{{\"now\" | date: \"%b %d, %Y, %I:%M %p\", \"America/New_York\"}}` will be replaced with the current date and time in New York.\n Some VAPI reserved defaults:\n - *customer* - the customer object"
+ "versionDescription": {
+ "type": "string",
+ "nullable": true,
+ "description": "Optional description for this version. Pass `null` to clear.",
+ "maxLength": 500
+ },
+ "id": {
+ "type": "string",
+ "description": "This is the unique identifier for the version row.",
+ "format": "uuid"
+ },
+ "orgId": {
+ "type": "string",
+ "description": "This is the unique identifier for the org that owns this version.",
+ "format": "uuid"
+ },
+ "assistantId": {
+ "type": "string",
+ "description": "This is the unique identifier for the assistant this version was snapshotted from.",
+ "format": "uuid"
+ },
+ "version": {
+ "type": "string",
+ "description": "This is the public monotonic version label, e.g. \"v1\".\nSystem-owned and incremented per assistant; never user-supplied.",
+ "example": "v1"
+ },
+ "configHash": {
+ "type": "string",
+ "description": "This is the SHA-256 hex of the snapshotted content used for no-op detection."
+ },
+ "parentVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the prior version label (vN-1). Null on v1 or for branch roots."
+ },
+ "createdBy": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the actor that wrote this version. Email when created via JWT, null when created via API."
+ },
+ "deletedAt": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the soft-delete timestamp. Null when active.",
+ "format": "date-time"
+ },
+ "createdAt": {
+ "type": "string",
+ "description": "This is the ISO 8601 date-time string of when the version was created.",
+ "format": "date-time"
},
"name": {
"type": "string",
@@ -28164,9 +35207,121 @@
"keypadInputPlan": {
"$ref": "#/components/schemas/KeypadInputPlan"
}
+ },
+ "required": [
+ "id",
+ "orgId",
+ "assistantId",
+ "version",
+ "configHash",
+ "createdAt"
+ ]
+ },
+ "AssistantVersionPaginatedMetadata": {
+ "type": "object",
+ "properties": {
+ "nextCursor": {
+ "type": "string",
+ "nullable": true
+ },
+ "hasNextPage": {
+ "type": "boolean"
+ },
+ "limit": {
+ "type": "number"
+ }
+ },
+ "required": [
+ "hasNextPage",
+ "limit"
+ ]
+ },
+ "AssistantVersionPaginatedResponse": {
+ "type": "object",
+ "properties": {
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/AssistantVersion"
+ }
+ },
+ "metadata": {
+ "$ref": "#/components/schemas/AssistantVersionPaginatedMetadata"
+ }
+ },
+ "required": [
+ "results",
+ "metadata"
+ ]
+ },
+ "UpdateAssistantVersionMetadataDTO": {
+ "type": "object",
+ "properties": {
+ "versionName": {
+ "type": "string",
+ "nullable": true,
+ "description": "Optional human-readable label for this version. Pass `null` to clear.",
+ "maxLength": 80
+ },
+ "versionDescription": {
+ "type": "string",
+ "nullable": true,
+ "description": "Optional description for this version. Pass `null` to clear.",
+ "maxLength": 500
+ }
}
},
- "CreateAssistantDTO": {
+ "VersionPinReference": {
+ "type": "object",
+ "properties": {
+ "sourceType": {
+ "type": "string",
+ "enum": [
+ "assistant_version",
+ "squad",
+ "tool_version"
+ ],
+ "description": "Kind of source row the pin originates from."
+ },
+ "sourceId": {
+ "type": "string",
+ "format": "uuid",
+ "description": "UUID of the source row (polymorphic, not FK-enforced)."
+ }
+ },
+ "required": [
+ "sourceType",
+ "sourceId"
+ ]
+ },
+ "VersionPinConflictResponseDTO": {
+ "type": "object",
+ "properties": {
+ "error": {
+ "type": "string",
+ "enum": [
+ "version_pinned"
+ ]
+ },
+ "message": {
+ "type": "string",
+ "description": "Human-readable reason the delete was rejected."
+ },
+ "pinnedBy": {
+ "description": "Pins that block the delete.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/VersionPinReference"
+ }
+ }
+ },
+ "required": [
+ "error",
+ "message",
+ "pinnedBy"
+ ]
+ },
+ "CreateAssistantDraftDTO": {
"type": "object",
"properties": {
"transcriber": {
@@ -28219,6 +35374,14 @@
{
"$ref": "#/components/schemas/SonioxTranscriber",
"title": "SonioxTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/XaiTranscriber",
+ "title": "XaiTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/VapiTranscriber",
+ "title": "VapiTranscriber"
}
]
},
@@ -28288,6 +35451,10 @@
{
"$ref": "#/components/schemas/XaiModel",
"title": "XAI"
+ },
+ {
+ "$ref": "#/components/schemas/VapiModel",
+ "title": "Vapi"
}
]
},
@@ -28365,6 +35532,14 @@
{
"$ref": "#/components/schemas/MinimaxVoice",
"title": "MinimaxVoice"
+ },
+ {
+ "$ref": "#/components/schemas/XaiVoice",
+ "title": "XaiVoice"
+ },
+ {
+ "$ref": "#/components/schemas/MicrosoftVoice",
+ "title": "MicrosoftVoice"
}
]
},
@@ -28753,6 +35928,10 @@
"$ref": "#/components/schemas/CreateS3CredentialDTO",
"title": "S3Credential"
},
+ {
+ "$ref": "#/components/schemas/CreateS3CompatibleCredentialDTO",
+ "title": "S3CompatibleStorageCredential"
+ },
{
"$ref": "#/components/schemas/CreateSmallestAICredentialDTO",
"title": "SmallestAICredential"
@@ -28777,10 +35956,6 @@
"$ref": "#/components/schemas/CreateTogetherAICredentialDTO",
"title": "TogetherAICredential"
},
- {
- "$ref": "#/components/schemas/CreateTrieveCredentialDTO",
- "title": "TrieveCredential"
- },
{
"$ref": "#/components/schemas/CreateTwilioCredentialDTO",
"title": "TwilioCredential"
@@ -28801,6 +35976,10 @@
"$ref": "#/components/schemas/CreateXAiCredentialDTO",
"title": "XAiCredential"
},
+ {
+ "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO",
+ "title": "MicrosoftCredential"
+ },
{
"$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
"title": "GoogleCalendarOAuth2ClientCredential"
@@ -28876,6 +36055,7 @@
"rime-ai": "#/components/schemas/CreateRimeAICredentialDTO",
"runpod": "#/components/schemas/CreateRunpodCredentialDTO",
"s3": "#/components/schemas/CreateS3CredentialDTO",
+ "s3-compatible": "#/components/schemas/CreateS3CompatibleCredentialDTO",
"supabase": "#/components/schemas/CreateSupabaseCredentialDTO",
"smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO",
"tavus": "#/components/schemas/CreateTavusCredentialDTO",
@@ -28885,12 +36065,12 @@
"webhook": "#/components/schemas/CreateWebhookCredentialDTO",
"custom-credential": "#/components/schemas/CreateCustomCredentialDTO",
"xai": "#/components/schemas/CreateXAiCredentialDTO",
+ "microsoft": "#/components/schemas/CreateMicrosoftCredentialDTO",
"neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO",
"hume": "#/components/schemas/CreateHumeCredentialDTO",
"mistral": "#/components/schemas/CreateMistralCredentialDTO",
"speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO",
"soniox": "#/components/schemas/CreateSonioxCredentialDTO",
- "trieve": "#/components/schemas/CreateTrieveCredentialDTO",
"google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
"google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO",
"google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO",
@@ -29030,10 +36210,34 @@
},
"keypadInputPlan": {
"$ref": "#/components/schemas/KeypadInputPlan"
+ },
+ "baseVersion": {
+ "type": "string",
+ "description": "Optional pointer to the published version this draft was forked from.\nWhen omitted on `POST /assistant/:id/draft`, defaults server-side to the\nparent assistant's current `latestVersion` (which is lazy-created via\n`assistantBaselineVersionEnsureInTx` if the parent has never been\nversioned). Immutable for the lifetime of the draft."
}
}
},
- "Assistant": {
+ "AssistantDraftConflictResponseDTO": {
+ "type": "object",
+ "properties": {
+ "existingDraftId": {
+ "type": "string",
+ "nullable": true
+ },
+ "error": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "existingDraftId",
+ "error",
+ "message"
+ ]
+ },
+ "UpdateAssistantDraftDTO": {
"type": "object",
"properties": {
"transcriber": {
@@ -29086,6 +36290,14 @@
{
"$ref": "#/components/schemas/SonioxTranscriber",
"title": "SonioxTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/XaiTranscriber",
+ "title": "XaiTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/VapiTranscriber",
+ "title": "VapiTranscriber"
}
]
},
@@ -29155,6 +36367,10 @@
{
"$ref": "#/components/schemas/XaiModel",
"title": "XAI"
+ },
+ {
+ "$ref": "#/components/schemas/VapiModel",
+ "title": "Vapi"
}
]
},
@@ -29232,6 +36448,14 @@
{
"$ref": "#/components/schemas/MinimaxVoice",
"title": "MinimaxVoice"
+ },
+ {
+ "$ref": "#/components/schemas/XaiVoice",
+ "title": "XaiVoice"
+ },
+ {
+ "$ref": "#/components/schemas/MicrosoftVoice",
+ "title": "MicrosoftVoice"
}
]
},
@@ -29620,6 +36844,10 @@
"$ref": "#/components/schemas/CreateS3CredentialDTO",
"title": "S3Credential"
},
+ {
+ "$ref": "#/components/schemas/CreateS3CompatibleCredentialDTO",
+ "title": "S3CompatibleStorageCredential"
+ },
{
"$ref": "#/components/schemas/CreateSmallestAICredentialDTO",
"title": "SmallestAICredential"
@@ -29644,10 +36872,6 @@
"$ref": "#/components/schemas/CreateTogetherAICredentialDTO",
"title": "TogetherAICredential"
},
- {
- "$ref": "#/components/schemas/CreateTrieveCredentialDTO",
- "title": "TrieveCredential"
- },
{
"$ref": "#/components/schemas/CreateTwilioCredentialDTO",
"title": "TwilioCredential"
@@ -29668,6 +36892,10 @@
"$ref": "#/components/schemas/CreateXAiCredentialDTO",
"title": "XAiCredential"
},
+ {
+ "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO",
+ "title": "MicrosoftCredential"
+ },
{
"$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
"title": "GoogleCalendarOAuth2ClientCredential"
@@ -29743,6 +36971,7 @@
"rime-ai": "#/components/schemas/CreateRimeAICredentialDTO",
"runpod": "#/components/schemas/CreateRunpodCredentialDTO",
"s3": "#/components/schemas/CreateS3CredentialDTO",
+ "s3-compatible": "#/components/schemas/CreateS3CompatibleCredentialDTO",
"supabase": "#/components/schemas/CreateSupabaseCredentialDTO",
"smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO",
"tavus": "#/components/schemas/CreateTavusCredentialDTO",
@@ -29752,12 +36981,12 @@
"webhook": "#/components/schemas/CreateWebhookCredentialDTO",
"custom-credential": "#/components/schemas/CreateCustomCredentialDTO",
"xai": "#/components/schemas/CreateXAiCredentialDTO",
+ "microsoft": "#/components/schemas/CreateMicrosoftCredentialDTO",
"neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO",
"hume": "#/components/schemas/CreateHumeCredentialDTO",
"mistral": "#/components/schemas/CreateMistralCredentialDTO",
"speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO",
"soniox": "#/components/schemas/CreateSonioxCredentialDTO",
- "trieve": "#/components/schemas/CreateTrieveCredentialDTO",
"google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
"google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO",
"google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO",
@@ -29897,98 +37126,8 @@
},
"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": {
- "format": "date-time",
- "type": "string",
- "description": "This is the ISO 8601 date-time string of when the assistant was created."
- },
- "updatedAt": {
- "format": "date-time",
- "type": "string",
- "description": "This is the ISO 8601 date-time string of when the assistant was last updated."
- }
- },
- "required": [
- "id",
- "orgId",
- "createdAt",
- "updatedAt"
- ]
- },
- "PaginationMeta": {
- "type": "object",
- "properties": {
- "itemsPerPage": {
- "type": "number"
- },
- "totalItems": {
- "type": "number"
- },
- "currentPage": {
- "type": "number"
- },
- "itemsBeyondRetention": {
- "type": "boolean"
- },
- "createdAtLe": {
- "format": "date-time",
- "type": "string"
- },
- "createdAtGe": {
- "format": "date-time",
- "type": "string"
- }
- },
- "required": [
- "itemsPerPage",
- "totalItems",
- "currentPage"
- ]
- },
- "AssistantPaginatedResponse": {
- "type": "object",
- "properties": {
- "results": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/Assistant"
- }
- },
- "metadata": {
- "$ref": "#/components/schemas/PaginationMeta"
- }
- },
- "required": [
- "results",
- "metadata"
- ]
- },
- "AssistantVersionPaginatedResponse": {
- "type": "object",
- "properties": {
- "results": {
- "type": "array"
- },
- "metadata": {
- "$ref": "#/components/schemas/PaginationMeta"
- },
- "nextPageState": {
- "type": "string"
}
- },
- "required": [
- "results",
- "metadata"
- ]
+ }
},
"UpdateAssistantDTO": {
"type": "object",
@@ -30043,6 +37182,14 @@
{
"$ref": "#/components/schemas/SonioxTranscriber",
"title": "SonioxTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/XaiTranscriber",
+ "title": "XaiTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/VapiTranscriber",
+ "title": "VapiTranscriber"
}
]
},
@@ -30112,6 +37259,10 @@
{
"$ref": "#/components/schemas/XaiModel",
"title": "XAI"
+ },
+ {
+ "$ref": "#/components/schemas/VapiModel",
+ "title": "Vapi"
}
]
},
@@ -30189,6 +37340,14 @@
{
"$ref": "#/components/schemas/MinimaxVoice",
"title": "MinimaxVoice"
+ },
+ {
+ "$ref": "#/components/schemas/XaiVoice",
+ "title": "XaiVoice"
+ },
+ {
+ "$ref": "#/components/schemas/MicrosoftVoice",
+ "title": "MicrosoftVoice"
}
]
},
@@ -30577,6 +37736,10 @@
"$ref": "#/components/schemas/CreateS3CredentialDTO",
"title": "S3Credential"
},
+ {
+ "$ref": "#/components/schemas/CreateS3CompatibleCredentialDTO",
+ "title": "S3CompatibleStorageCredential"
+ },
{
"$ref": "#/components/schemas/CreateSmallestAICredentialDTO",
"title": "SmallestAICredential"
@@ -30601,10 +37764,6 @@
"$ref": "#/components/schemas/CreateTogetherAICredentialDTO",
"title": "TogetherAICredential"
},
- {
- "$ref": "#/components/schemas/CreateTrieveCredentialDTO",
- "title": "TrieveCredential"
- },
{
"$ref": "#/components/schemas/CreateTwilioCredentialDTO",
"title": "TwilioCredential"
@@ -30625,6 +37784,10 @@
"$ref": "#/components/schemas/CreateXAiCredentialDTO",
"title": "XAiCredential"
},
+ {
+ "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO",
+ "title": "MicrosoftCredential"
+ },
{
"$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
"title": "GoogleCalendarOAuth2ClientCredential"
@@ -30700,6 +37863,7 @@
"rime-ai": "#/components/schemas/CreateRimeAICredentialDTO",
"runpod": "#/components/schemas/CreateRunpodCredentialDTO",
"s3": "#/components/schemas/CreateS3CredentialDTO",
+ "s3-compatible": "#/components/schemas/CreateS3CompatibleCredentialDTO",
"supabase": "#/components/schemas/CreateSupabaseCredentialDTO",
"smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO",
"tavus": "#/components/schemas/CreateTavusCredentialDTO",
@@ -30709,12 +37873,12 @@
"webhook": "#/components/schemas/CreateWebhookCredentialDTO",
"custom-credential": "#/components/schemas/CreateCustomCredentialDTO",
"xai": "#/components/schemas/CreateXAiCredentialDTO",
+ "microsoft": "#/components/schemas/CreateMicrosoftCredentialDTO",
"neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO",
"hume": "#/components/schemas/CreateHumeCredentialDTO",
"mistral": "#/components/schemas/CreateMistralCredentialDTO",
"speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO",
"soniox": "#/components/schemas/CreateSonioxCredentialDTO",
- "trieve": "#/components/schemas/CreateTrieveCredentialDTO",
"google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
"google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO",
"google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO",
@@ -30857,6 +38021,25 @@
}
}
},
+ "AssistantPinnedConflictResponseDTO": {
+ "type": "object",
+ "properties": {
+ "error": {
+ "type": "string",
+ "enum": [
+ "assistant_pinned"
+ ]
+ },
+ "message": {
+ "type": "string",
+ "description": "Human-readable reason the parent-assistant delete was rejected."
+ }
+ },
+ "required": [
+ "error",
+ "message"
+ ]
+ },
"Squad": {
"type": "object",
"properties": {
@@ -31026,6 +38209,14 @@
{
"$ref": "#/components/schemas/SonioxTranscriber",
"title": "SonioxTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/XaiTranscriber",
+ "title": "XaiTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/VapiTranscriber",
+ "title": "VapiTranscriber"
}
]
},
@@ -31103,6 +38294,14 @@
{
"$ref": "#/components/schemas/MinimaxVoice",
"title": "MinimaxVoice"
+ },
+ {
+ "$ref": "#/components/schemas/XaiVoice",
+ "title": "XaiVoice"
+ },
+ {
+ "$ref": "#/components/schemas/MicrosoftVoice",
+ "title": "MicrosoftVoice"
}
]
},
@@ -31124,7 +38323,7 @@
"description": "This is the background sound in the call. Default for phone calls is 'office' and default for web calls is 'off'.\nYou can also provide a custom sound by providing a URL to an audio file.",
"oneOf": [
{
- "type": "enum",
+ "type": "string",
"enum": [
"off",
"office"
@@ -31307,6 +38506,10 @@
"$ref": "#/components/schemas/CreateS3CredentialDTO",
"title": "S3Credential"
},
+ {
+ "$ref": "#/components/schemas/CreateS3CompatibleCredentialDTO",
+ "title": "S3CompatibleStorageCredential"
+ },
{
"$ref": "#/components/schemas/CreateSmallestAICredentialDTO",
"title": "SmallestAICredential"
@@ -31331,10 +38534,6 @@
"$ref": "#/components/schemas/CreateTogetherAICredentialDTO",
"title": "TogetherAICredential"
},
- {
- "$ref": "#/components/schemas/CreateTrieveCredentialDTO",
- "title": "TrieveCredential"
- },
{
"$ref": "#/components/schemas/CreateTwilioCredentialDTO",
"title": "TwilioCredential"
@@ -31355,6 +38554,10 @@
"$ref": "#/components/schemas/CreateXAiCredentialDTO",
"title": "XAiCredential"
},
+ {
+ "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO",
+ "title": "MicrosoftCredential"
+ },
{
"$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
"title": "GoogleCalendarOAuth2ClientCredential"
@@ -31430,6 +38633,7 @@
"rime-ai": "#/components/schemas/CreateRimeAICredentialDTO",
"runpod": "#/components/schemas/CreateRunpodCredentialDTO",
"s3": "#/components/schemas/CreateS3CredentialDTO",
+ "s3-compatible": "#/components/schemas/CreateS3CompatibleCredentialDTO",
"supabase": "#/components/schemas/CreateSupabaseCredentialDTO",
"smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO",
"tavus": "#/components/schemas/CreateTavusCredentialDTO",
@@ -31439,12 +38643,12 @@
"webhook": "#/components/schemas/CreateWebhookCredentialDTO",
"custom-credential": "#/components/schemas/CreateCustomCredentialDTO",
"xai": "#/components/schemas/CreateXAiCredentialDTO",
+ "microsoft": "#/components/schemas/CreateMicrosoftCredentialDTO",
"neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO",
"hume": "#/components/schemas/CreateHumeCredentialDTO",
"mistral": "#/components/schemas/CreateMistralCredentialDTO",
"speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO",
"soniox": "#/components/schemas/CreateSonioxCredentialDTO",
- "trieve": "#/components/schemas/CreateTrieveCredentialDTO",
"google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
"google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO",
"google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO",
@@ -31709,6 +38913,14 @@
{
"$ref": "#/components/schemas/SonioxTranscriber",
"title": "SonioxTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/XaiTranscriber",
+ "title": "XaiTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/VapiTranscriber",
+ "title": "VapiTranscriber"
}
]
},
@@ -31786,6 +38998,14 @@
{
"$ref": "#/components/schemas/MinimaxVoice",
"title": "MinimaxVoice"
+ },
+ {
+ "$ref": "#/components/schemas/XaiVoice",
+ "title": "XaiVoice"
+ },
+ {
+ "$ref": "#/components/schemas/MicrosoftVoice",
+ "title": "MicrosoftVoice"
}
]
},
@@ -31807,7 +39027,7 @@
"description": "This is the background sound in the call. Default for phone calls is 'office' and default for web calls is 'off'.\nYou can also provide a custom sound by providing a URL to an audio file.",
"oneOf": [
{
- "type": "enum",
+ "type": "string",
"enum": [
"off",
"office"
@@ -31990,6 +39210,10 @@
"$ref": "#/components/schemas/CreateS3CredentialDTO",
"title": "S3Credential"
},
+ {
+ "$ref": "#/components/schemas/CreateS3CompatibleCredentialDTO",
+ "title": "S3CompatibleStorageCredential"
+ },
{
"$ref": "#/components/schemas/CreateSmallestAICredentialDTO",
"title": "SmallestAICredential"
@@ -32012,11 +39236,7 @@
},
{
"$ref": "#/components/schemas/CreateTogetherAICredentialDTO",
- "title": "TogetherAICredential"
- },
- {
- "$ref": "#/components/schemas/CreateTrieveCredentialDTO",
- "title": "TrieveCredential"
+ "title": "TogetherAICredential"
},
{
"$ref": "#/components/schemas/CreateTwilioCredentialDTO",
@@ -32038,6 +39258,10 @@
"$ref": "#/components/schemas/CreateXAiCredentialDTO",
"title": "XAiCredential"
},
+ {
+ "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO",
+ "title": "MicrosoftCredential"
+ },
{
"$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
"title": "GoogleCalendarOAuth2ClientCredential"
@@ -32113,6 +39337,7 @@
"rime-ai": "#/components/schemas/CreateRimeAICredentialDTO",
"runpod": "#/components/schemas/CreateRunpodCredentialDTO",
"s3": "#/components/schemas/CreateS3CredentialDTO",
+ "s3-compatible": "#/components/schemas/CreateS3CompatibleCredentialDTO",
"supabase": "#/components/schemas/CreateSupabaseCredentialDTO",
"smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO",
"tavus": "#/components/schemas/CreateTavusCredentialDTO",
@@ -32122,12 +39347,12 @@
"webhook": "#/components/schemas/CreateWebhookCredentialDTO",
"custom-credential": "#/components/schemas/CreateCustomCredentialDTO",
"xai": "#/components/schemas/CreateXAiCredentialDTO",
+ "microsoft": "#/components/schemas/CreateMicrosoftCredentialDTO",
"neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO",
"hume": "#/components/schemas/CreateHumeCredentialDTO",
"mistral": "#/components/schemas/CreateMistralCredentialDTO",
"speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO",
"soniox": "#/components/schemas/CreateSonioxCredentialDTO",
- "trieve": "#/components/schemas/CreateTrieveCredentialDTO",
"google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
"google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO",
"google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO",
@@ -32374,6 +39599,14 @@
{
"$ref": "#/components/schemas/SonioxTranscriber",
"title": "SonioxTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/XaiTranscriber",
+ "title": "XaiTranscriber"
+ },
+ {
+ "$ref": "#/components/schemas/VapiTranscriber",
+ "title": "VapiTranscriber"
}
]
},
@@ -32451,6 +39684,14 @@
{
"$ref": "#/components/schemas/MinimaxVoice",
"title": "MinimaxVoice"
+ },
+ {
+ "$ref": "#/components/schemas/XaiVoice",
+ "title": "XaiVoice"
+ },
+ {
+ "$ref": "#/components/schemas/MicrosoftVoice",
+ "title": "MicrosoftVoice"
}
]
},
@@ -32472,7 +39713,7 @@
"description": "This is the background sound in the call. Default for phone calls is 'office' and default for web calls is 'off'.\nYou can also provide a custom sound by providing a URL to an audio file.",
"oneOf": [
{
- "type": "enum",
+ "type": "string",
"enum": [
"off",
"office"
@@ -32655,6 +39896,10 @@
"$ref": "#/components/schemas/CreateS3CredentialDTO",
"title": "S3Credential"
},
+ {
+ "$ref": "#/components/schemas/CreateS3CompatibleCredentialDTO",
+ "title": "S3CompatibleStorageCredential"
+ },
{
"$ref": "#/components/schemas/CreateSmallestAICredentialDTO",
"title": "SmallestAICredential"
@@ -32679,10 +39924,6 @@
"$ref": "#/components/schemas/CreateTogetherAICredentialDTO",
"title": "TogetherAICredential"
},
- {
- "$ref": "#/components/schemas/CreateTrieveCredentialDTO",
- "title": "TrieveCredential"
- },
{
"$ref": "#/components/schemas/CreateTwilioCredentialDTO",
"title": "TwilioCredential"
@@ -32703,6 +39944,10 @@
"$ref": "#/components/schemas/CreateXAiCredentialDTO",
"title": "XAiCredential"
},
+ {
+ "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO",
+ "title": "MicrosoftCredential"
+ },
{
"$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
"title": "GoogleCalendarOAuth2ClientCredential"
@@ -32778,6 +40023,7 @@
"rime-ai": "#/components/schemas/CreateRimeAICredentialDTO",
"runpod": "#/components/schemas/CreateRunpodCredentialDTO",
"s3": "#/components/schemas/CreateS3CredentialDTO",
+ "s3-compatible": "#/components/schemas/CreateS3CompatibleCredentialDTO",
"supabase": "#/components/schemas/CreateSupabaseCredentialDTO",
"smallest-ai": "#/components/schemas/CreateSmallestAICredentialDTO",
"tavus": "#/components/schemas/CreateTavusCredentialDTO",
@@ -32787,12 +40033,12 @@
"webhook": "#/components/schemas/CreateWebhookCredentialDTO",
"custom-credential": "#/components/schemas/CreateCustomCredentialDTO",
"xai": "#/components/schemas/CreateXAiCredentialDTO",
+ "microsoft": "#/components/schemas/CreateMicrosoftCredentialDTO",
"neuphonic": "#/components/schemas/CreateNeuphonicCredentialDTO",
"hume": "#/components/schemas/CreateHumeCredentialDTO",
"mistral": "#/components/schemas/CreateMistralCredentialDTO",
"speechmatics": "#/components/schemas/CreateSpeechmaticsCredentialDTO",
"soniox": "#/components/schemas/CreateSonioxCredentialDTO",
- "trieve": "#/components/schemas/CreateTrieveCredentialDTO",
"google.calendar.oauth2-client": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO",
"google.calendar.oauth2-authorization": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO",
"google.sheets.oauth2-authorization": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO",
@@ -32807,157 +40053,935 @@
}
}
},
- "voicemailDetection": {
- "description": "This is the voicemail detection plan for the workflow.",
- "oneOf": [
- {
- "type": "string",
- "enum": [
- "off"
- ]
- },
- {
- "$ref": "#/components/schemas/GoogleVoicemailDetectionPlan",
- "title": "Google"
- },
- {
- "$ref": "#/components/schemas/OpenAIVoicemailDetectionPlan",
- "title": "OpenAI"
- },
- {
- "$ref": "#/components/schemas/TwilioVoicemailDetectionPlan",
- "title": "Twilio"
- },
- {
- "$ref": "#/components/schemas/VapiVoicemailDetectionPlan",
- "title": "Vapi"
- }
+ "voicemailDetection": {
+ "description": "This is the voicemail detection plan for the workflow.",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "off"
+ ]
+ },
+ {
+ "$ref": "#/components/schemas/GoogleVoicemailDetectionPlan",
+ "title": "Google"
+ },
+ {
+ "$ref": "#/components/schemas/OpenAIVoicemailDetectionPlan",
+ "title": "OpenAI"
+ },
+ {
+ "$ref": "#/components/schemas/TwilioVoicemailDetectionPlan",
+ "title": "Twilio"
+ },
+ {
+ "$ref": "#/components/schemas/VapiVoicemailDetectionPlan",
+ "title": "Vapi"
+ }
+ ]
+ },
+ "maxDurationSeconds": {
+ "type": "number",
+ "description": "This is the maximum duration of the call in seconds.\n\nAfter this duration, the call will automatically end.\n\nDefault is 1800 (30 minutes), max is 43200 (12 hours), and min is 10 seconds.",
+ "minimum": 10,
+ "maximum": 43200,
+ "example": 600
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 80
+ },
+ "edges": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Edge"
+ }
+ },
+ "globalPrompt": {
+ "type": "string",
+ "maxLength": 5000
+ },
+ "server": {
+ "description": "This is where Vapi will send webhooks. You can find all webhooks available along with their shape in ServerMessage schema.\n\nThe order of precedence is:\n\n1. tool.server\n2. workflow.server / assistant.server\n3. phoneNumber.server\n4. org.server",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Server"
+ }
+ ]
+ },
+ "compliancePlan": {
+ "description": "This is the compliance plan for the workflow. It allows you to configure HIPAA and other compliance settings.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/CompliancePlan"
+ }
+ ]
+ },
+ "analysisPlan": {
+ "description": "This is the plan for analysis of workflow's calls. Stored in `call.analysis`.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/AnalysisPlan"
+ }
+ ]
+ },
+ "artifactPlan": {
+ "description": "This is the plan for artifacts generated during workflow's calls. Stored in `call.artifact`.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ArtifactPlan"
+ }
+ ]
+ },
+ "startSpeakingPlan": {
+ "description": "This is the plan for when the workflow nodes should start talking.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to start talking after the customer is done speaking.\n- The assistant is too fast to start talking after the customer is done speaking.\n- The assistant is so fast that it's actually interrupting the customer.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/StartSpeakingPlan"
+ }
+ ]
+ },
+ "stopSpeakingPlan": {
+ "description": "This is the plan for when workflow nodes should stop talking on customer interruption.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to recognize customer's interruption.\n- The assistant is too fast to recognize customer's interruption.\n- The assistant is getting interrupted by phrases that are just acknowledgments.\n- The assistant is getting interrupted by background noises.\n- The assistant is not properly stopping -- it starts talking right after getting interrupted.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/StopSpeakingPlan"
+ }
+ ]
+ },
+ "monitorPlan": {
+ "description": "This is the plan for real-time monitoring of the workflow's calls.\n\nUsage:\n- To enable live listening of the workflow's calls, set `monitorPlan.listenEnabled` to `true`.\n- To enable live control of the workflow's calls, set `monitorPlan.controlEnabled` to `true`.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/MonitorPlan"
+ }
+ ]
+ },
+ "backgroundSpeechDenoisingPlan": {
+ "description": "This enables filtering of noise and background speech while the user is talking.\n\nFeatures:\n- Smart denoising using Krisp\n- Fourier denoising\n\nBoth can be used together. Order of precedence:\n- Smart denoising\n- Fourier denoising",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BackgroundSpeechDenoisingPlan"
+ }
+ ]
+ },
+ "credentialIds": {
+ "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.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "keypadInputPlan": {
+ "description": "This is the plan for keypad input handling during workflow calls.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/KeypadInputPlan"
+ }
+ ]
+ },
+ "voicemailMessage": {
+ "type": "string",
+ "description": "This is the message that the assistant will say if the call is forwarded to voicemail.\n\nIf unspecified, it will hang up.",
+ "maxLength": 1000
+ }
+ }
+ },
+ "SubscriptionLimits": {
+ "type": "object",
+ "properties": {
+ "concurrencyBlocked": {
+ "type": "boolean",
+ "description": "True if this call was blocked by the Call Concurrency limit",
+ "default": false
+ },
+ "concurrencyLimit": {
+ "type": "number",
+ "description": "Account Call Concurrency limit"
+ },
+ "remainingConcurrentCalls": {
+ "type": "number",
+ "description": "Incremental number of concurrent calls that will be allowed, including this call"
+ }
+ }
+ },
+ "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",
+ "description": "The timestamp when the message was sent."
+ },
+ "endTime": {
+ "type": "number",
+ "description": "The timestamp when the message ended."
+ },
+ "secondsFromStart": {
+ "type": "number",
+ "description": "The number of seconds from the start of the conversation."
+ },
+ "duration": {
+ "type": "number",
+ "description": "The duration of the message in seconds."
+ },
+ "isFiltered": {
+ "type": "boolean",
+ "description": "Indicates if the message was filtered for security reasons."
+ },
+ "detectedThreats": {
+ "description": "List of detected security threats if the message was filtered.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "originalMessage": {
+ "type": "string",
+ "description": "The original message before filtering (only included if content was filtered)."
+ },
+ "metadata": {
+ "type": "object",
+ "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"
+ ]
+ },
+ "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",
+ "description": "The timestamp when the message was sent."
+ },
+ "secondsFromStart": {
+ "type": "number",
+ "description": "The number of seconds from the start of the conversation."
+ }
+ },
+ "required": [
+ "role",
+ "message",
+ "time",
+ "secondsFromStart"
+ ]
+ },
+ "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",
+ "description": "The timestamp when the message was sent."
+ },
+ "endTime": {
+ "type": "number",
+ "description": "The timestamp when the message ended."
+ },
+ "secondsFromStart": {
+ "type": "number",
+ "description": "The number of seconds from the start of the conversation."
+ },
+ "source": {
+ "type": "string",
+ "description": "The source of the message."
+ },
+ "duration": {
+ "type": "number",
+ "description": "The duration of the message in seconds."
+ },
+ "assistantName": {
+ "type": "string",
+ "description": "The name of the assistant that produced this message. In a squad or\nhandoff call this is the specific sub-agent active when the message was\nspoken, letting the transcript label each message by speaker."
+ },
+ "assistantId": {
+ "type": "string",
+ "description": "The ID of the assistant that produced this message. Stable reference for\nthe assistant named in `assistantName`."
+ }
+ },
+ "required": [
+ "role",
+ "message",
+ "time",
+ "endTime",
+ "secondsFromStart"
+ ]
+ },
+ "ToolCallMessage": {
+ "type": "object",
+ "properties": {
+ "role": {
+ "type": "string",
+ "description": "The role of the tool call in the conversation."
+ },
+ "toolCalls": {
+ "description": "The list of tool calls made during the conversation.",
+ "type": "array",
+ "items": {
+ "type": "object"
+ }
+ },
+ "message": {
+ "type": "string",
+ "description": "The message content for the tool call."
+ },
+ "time": {
+ "type": "number",
+ "description": "The timestamp when the message was sent."
+ },
+ "secondsFromStart": {
+ "type": "number",
+ "description": "The number of seconds from the start of the conversation."
+ }
+ },
+ "required": [
+ "role",
+ "toolCalls",
+ "message",
+ "time",
+ "secondsFromStart"
+ ]
+ },
+ "ToolCallResultMessageWarning": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "The kind of warning. Currently:\n- `oversized-tool-response`: the tool's serialized response exceeded the\n recommended size and is likely to bloat the model context, increasing\n latency and risking truncation of earlier instructions.",
+ "enum": [
+ "oversized-tool-response"
+ ]
+ },
+ "tokenCount": {
+ "type": "number",
+ "description": "The estimated number of tokens in the serialized tool response."
+ },
+ "threshold": {
+ "type": "number",
+ "description": "The threshold (in tokens) above which the warning is raised."
+ }
+ },
+ "required": [
+ "type",
+ "tokenCount",
+ "threshold"
+ ]
+ },
+ "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",
+ "description": "The timestamp when the message was sent."
+ },
+ "secondsFromStart": {
+ "type": "number",
+ "description": "The number of seconds from the start of the conversation."
+ },
+ "metadata": {
+ "type": "object",
+ "description": "The metadata for the tool call result."
+ },
+ "warnings": {
+ "description": "Warnings raised for this tool call result, e.g. when the response is\nlarger than recommended for voice AI context windows.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolCallResultMessageWarning"
+ }
+ }
+ },
+ "required": [
+ "role",
+ "toolCallId",
+ "name",
+ "result",
+ "time",
+ "secondsFromStart"
+ ]
+ },
+ "TransportCost": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "This is the type of cost, always 'transport' for this class.",
+ "enum": [
+ "transport"
+ ]
+ },
+ "provider": {
+ "type": "string",
+ "enum": [
+ "daily",
+ "vapi.websocket",
+ "twilio",
+ "vonage",
+ "telnyx",
+ "vapi.sip"
+ ]
+ },
+ "minutes": {
+ "type": "number",
+ "description": "This is the minutes of `transport` usage. This should match `call.endedAt` - `call.startedAt`."
+ },
+ "cost": {
+ "type": "number",
+ "description": "This is the cost of the component in USD."
+ }
+ },
+ "required": [
+ "type",
+ "minutes",
+ "cost"
+ ]
+ },
+ "TranscriberCost": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "This is the type of cost, always 'transcriber' for this class.",
+ "enum": [
+ "transcriber"
+ ]
+ },
+ "transcriber": {
+ "type": "object",
+ "description": "This is the transcriber that was used during the call.\n\nThis matches one of the below:\n- `call.assistant.transcriber`,\n- `call.assistantId->transcriber`,\n- `call.squad[n].assistant.transcriber`,\n- `call.squad[n].assistantId->transcriber`,\n- `call.squadId->[n].assistant.transcriber`,\n- `call.squadId->[n].assistantId->transcriber`."
+ },
+ "minutes": {
+ "type": "number",
+ "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",
+ "description": "This is the cost of the component in USD."
+ }
+ },
+ "required": [
+ "type",
+ "transcriber",
+ "minutes",
+ "cost"
+ ]
+ },
+ "ModelCost": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "This is the type of cost, always 'model' for this class.",
+ "enum": [
+ "model"
+ ]
+ },
+ "model": {
+ "type": "object",
+ "description": "This is the model that was used during the call.\n\nThis matches one of the following:\n- `call.assistant.model`,\n- `call.assistantId->model`,\n- `call.squad[n].assistant.model`,\n- `call.squad[n].assistantId->model`,\n- `call.squadId->[n].assistant.model`,\n- `call.squadId->[n].assistantId->model`."
+ },
+ "promptTokens": {
+ "type": "number",
+ "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",
+ "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",
+ "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",
+ "description": "This is the cost of the component in USD."
+ }
+ },
+ "required": [
+ "type",
+ "model",
+ "promptTokens",
+ "completionTokens",
+ "cost"
+ ]
+ },
+ "VoiceCost": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "This is the type of cost, always 'voice' for this class.",
+ "enum": [
+ "voice"
+ ]
+ },
+ "voice": {
+ "type": "object",
+ "description": "This is the voice that was used during the call.\n\nThis matches one of the following:\n- `call.assistant.voice`,\n- `call.assistantId->voice`,\n- `call.squad[n].assistant.voice`,\n- `call.squad[n].assistantId->voice`,\n- `call.squadId->[n].assistant.voice`,\n- `call.squadId->[n].assistantId->voice`."
+ },
+ "characters": {
+ "type": "number",
+ "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",
+ "description": "This is the cost of the component in USD."
+ }
+ },
+ "required": [
+ "type",
+ "voice",
+ "characters",
+ "cost"
+ ]
+ },
+ "ChatCost": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "This is the type of cost, always 'chat' for this class.",
+ "enum": [
+ "chat"
]
},
- "maxDurationSeconds": {
+ "cost": {
"type": "number",
- "description": "This is the maximum duration of the call in seconds.\n\nAfter this duration, the call will automatically end.\n\nDefault is 1800 (30 minutes), max is 43200 (12 hours), and min is 10 seconds.",
- "minimum": 10,
- "maximum": 43200,
- "example": 600
+ "description": "This is the cost of the component in USD."
+ }
+ },
+ "required": [
+ "type",
+ "cost"
+ ]
+ },
+ "VapiCost": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "This is the type of cost, always 'vapi' for this class.",
+ "enum": [
+ "vapi"
+ ]
},
- "name": {
+ "subType": {
"type": "string",
- "maxLength": 80
+ "description": "This is the sub type of the cost.",
+ "enum": [
+ "normal",
+ "overage"
+ ]
},
- "edges": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/Edge"
- }
+ "minutes": {
+ "type": "number",
+ "description": "This is the minutes of Vapi usage. This should match `call.endedAt` - `call.startedAt`."
},
- "globalPrompt": {
+ "cost": {
+ "type": "number",
+ "description": "This is the cost of the component in USD."
+ }
+ },
+ "required": [
+ "type",
+ "subType",
+ "minutes",
+ "cost"
+ ]
+ },
+ "VoicemailDetectionCost": {
+ "type": "object",
+ "properties": {
+ "type": {
"type": "string",
- "maxLength": 5000
+ "description": "This is the type of cost, always 'voicemail-detection' for this class.",
+ "enum": [
+ "voicemail-detection"
+ ]
},
- "server": {
- "description": "This is where Vapi will send webhooks. You can find all webhooks available along with their shape in ServerMessage schema.\n\nThe order of precedence is:\n\n1. tool.server\n2. workflow.server / assistant.server\n3. phoneNumber.server\n4. org.server",
- "allOf": [
- {
- "$ref": "#/components/schemas/Server"
- }
+ "model": {
+ "type": "object",
+ "description": "This is the model that was used to perform the analysis."
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is the provider that was used to detect the voicemail.",
+ "enum": [
+ "twilio",
+ "google",
+ "openai",
+ "vapi"
]
},
- "compliancePlan": {
- "description": "This is the compliance plan for the workflow. It allows you to configure HIPAA and other compliance settings.",
- "allOf": [
- {
- "$ref": "#/components/schemas/CompliancePlan"
- }
+ "promptTextTokens": {
+ "type": "number",
+ "description": "This is the number of prompt text tokens used in the voicemail detection."
+ },
+ "promptAudioTokens": {
+ "type": "number",
+ "description": "This is the number of prompt audio tokens used in the voicemail detection."
+ },
+ "completionTextTokens": {
+ "type": "number",
+ "description": "This is the number of completion text tokens used in the voicemail detection."
+ },
+ "completionAudioTokens": {
+ "type": "number",
+ "description": "This is the number of completion audio tokens used in the voicemail detection."
+ },
+ "cost": {
+ "type": "number",
+ "description": "This is the cost of the component in USD."
+ }
+ },
+ "required": [
+ "type",
+ "model",
+ "provider",
+ "promptTextTokens",
+ "promptAudioTokens",
+ "completionTextTokens",
+ "completionAudioTokens",
+ "cost"
+ ]
+ },
+ "AnalysisCost": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "This is the type of cost, always 'analysis' for this class.",
+ "enum": [
+ "analysis"
]
},
- "analysisPlan": {
- "description": "This is the plan for analysis of workflow's calls. Stored in `call.analysis`.",
- "allOf": [
- {
- "$ref": "#/components/schemas/AnalysisPlan"
- }
+ "analysisType": {
+ "type": "string",
+ "description": "This is the type of analysis performed.",
+ "enum": [
+ "summary",
+ "structuredData",
+ "successEvaluation",
+ "structuredOutput"
]
},
- "artifactPlan": {
- "description": "This is the plan for artifacts generated during workflow's calls. Stored in `call.artifact`.",
- "allOf": [
- {
- "$ref": "#/components/schemas/ArtifactPlan"
- }
+ "model": {
+ "type": "object",
+ "description": "This is the model that was used to perform the analysis."
+ },
+ "promptTokens": {
+ "type": "number",
+ "description": "This is the number of prompt tokens used in the analysis."
+ },
+ "completionTokens": {
+ "type": "number",
+ "description": "This is the number of completion tokens generated in the analysis."
+ },
+ "cachedPromptTokens": {
+ "type": "number",
+ "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",
+ "description": "This is the cost of the component in USD."
+ }
+ },
+ "required": [
+ "type",
+ "analysisType",
+ "model",
+ "promptTokens",
+ "completionTokens",
+ "cost"
+ ]
+ },
+ "AudioFormat": {
+ "type": "object",
+ "properties": {
+ "sampleRate": {
+ "type": "number",
+ "description": "This is the sample rate of the call.\n\n@default 16000",
+ "minimum": 0,
+ "maximum": 192000
+ },
+ "format": {
+ "type": "object",
+ "description": "This is the audio format of the call.\n\n@default 'pcm_s16le'",
+ "enum": [
+ "pcm_s16le",
+ "mulaw"
]
},
- "startSpeakingPlan": {
- "description": "This is the plan for when the workflow nodes should start talking.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to start talking after the customer is done speaking.\n- The assistant is too fast to start talking after the customer is done speaking.\n- The assistant is so fast that it's actually interrupting the customer.",
- "allOf": [
- {
- "$ref": "#/components/schemas/StartSpeakingPlan"
- }
+ "container": {
+ "type": "string",
+ "description": "This is the container format of the call.\n\n@default 'raw'",
+ "enum": [
+ "raw"
+ ]
+ }
+ },
+ "required": [
+ "sampleRate",
+ "format"
+ ]
+ },
+ "VapiWebsocketTransport": {
+ "type": "object",
+ "properties": {
+ "conversationType": {
+ "type": "string",
+ "description": "This is the conversation type of the call (ie, voice or chat).",
+ "default": "voice",
+ "enum": [
+ "voice"
]
},
- "stopSpeakingPlan": {
- "description": "This is the plan for when workflow nodes should stop talking on customer interruption.\n\nYou should configure this if you're running into these issues:\n- The assistant is too slow to recognize customer's interruption.\n- The assistant is too fast to recognize customer's interruption.\n- The assistant is getting interrupted by phrases that are just acknowledgments.\n- The assistant is getting interrupted by background noises.\n- The assistant is not properly stopping -- it starts talking right after getting interrupted.",
- "allOf": [
- {
- "$ref": "#/components/schemas/StopSpeakingPlan"
- }
+ "provider": {
+ "type": "string",
+ "description": "Vapi websocket transport provider",
+ "enum": [
+ "vapi.websocket"
]
},
- "monitorPlan": {
- "description": "This is the plan for real-time monitoring of the workflow's calls.\n\nUsage:\n- To enable live listening of the workflow's calls, set `monitorPlan.listenEnabled` to `true`.\n- To enable live control of the workflow's calls, set `monitorPlan.controlEnabled` to `true`.",
+ "audioFormat": {
+ "description": "This is the audio format of the call. Defaults to 16KHz raw pcm_s16le",
"allOf": [
{
- "$ref": "#/components/schemas/MonitorPlan"
+ "$ref": "#/components/schemas/AudioFormat"
}
]
+ }
+ },
+ "required": [
+ "provider"
+ ]
+ },
+ "VapiWebCallTransport": {
+ "type": "object",
+ "properties": {
+ "conversationType": {
+ "type": "string",
+ "description": "This is the conversation type of the call (ie, voice or chat).",
+ "default": "voice",
+ "enum": [
+ "voice"
+ ]
},
- "backgroundSpeechDenoisingPlan": {
- "description": "This enables filtering of noise and background speech while the user is talking.\n\nFeatures:\n- Smart denoising using Krisp\n- Fourier denoising\n\nBoth can be used together. Order of precedence:\n- Smart denoising\n- Fourier denoising",
- "allOf": [
- {
- "$ref": "#/components/schemas/BackgroundSpeechDenoisingPlan"
- }
+ "provider": {
+ "type": "string",
+ "description": "Vapi web call transport provider",
+ "enum": [
+ "daily"
]
},
- "credentialIds": {
- "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.",
- "type": "array",
- "items": {
- "type": "string"
- }
+ "roomDeleteOnUserLeaveEnabled": {
+ "type": "boolean",
+ "description": "This determines whether the daily room will be deleted and all participants will be kicked once the user leaves the room.\nIf set to `false`, the room will be kept alive even after the user leaves, allowing clients to reconnect to the same room.\nIf set to `true`, the room will be deleted and reconnection will not be allowed.\n\nDefaults to `true`.",
+ "example": true,
+ "default": true
},
- "keypadInputPlan": {
- "description": "This is the plan for keypad input handling during workflow calls.",
- "allOf": [
- {
- "$ref": "#/components/schemas/KeypadInputPlan"
- }
+ "callUrl": {
+ "type": "string",
+ "description": "This is the URL of the web call."
+ },
+ "callSipUri": {
+ "type": "string",
+ "description": "This is the SIP URI of the web call."
+ }
+ },
+ "required": [
+ "provider"
+ ]
+ },
+ "TwilioTransport": {
+ "type": "object",
+ "properties": {
+ "conversationType": {
+ "type": "string",
+ "description": "This is the conversation type of the call (ie, voice or chat).",
+ "default": "voice",
+ "enum": [
+ "voice"
]
},
- "voicemailMessage": {
+ "provider": {
"type": "string",
- "description": "This is the message that the assistant will say if the call is forwarded to voicemail.\n\nIf unspecified, it will hang up.",
- "maxLength": 1000
+ "description": "Twilio transport provider",
+ "enum": [
+ "twilio"
+ ]
+ },
+ "accountSid": {
+ "type": "string",
+ "description": "This is the account SID of the Twilio account."
+ },
+ "callSid": {
+ "type": "string",
+ "description": "This is the call SID of the Twilio call."
+ },
+ "callToken": {
+ "type": "string",
+ "description": "This is the call token of the Twilio call."
+ },
+ "forwardedFrom": {
+ "type": "string",
+ "description": "This is the phone number from which the call was forwarded.\nUndefined if the call was not forwarded."
}
- }
+ },
+ "required": [
+ "provider"
+ ]
},
- "SubscriptionLimits": {
+ "TelnyxTransport": {
"type": "object",
"properties": {
- "concurrencyBlocked": {
- "type": "boolean",
- "description": "True if this call was blocked by the Call Concurrency limit",
- "default": false
+ "conversationType": {
+ "type": "string",
+ "description": "This is the conversation type of the call (ie, voice or chat).",
+ "default": "voice",
+ "enum": [
+ "voice"
+ ]
},
- "concurrencyLimit": {
- "type": "number",
- "description": "Account Call Concurrency limit"
+ "provider": {
+ "type": "string",
+ "description": "Telnyx transport provider",
+ "enum": [
+ "telnyx"
+ ]
},
- "remainingConcurrentCalls": {
+ "callControlId": {
+ "type": "string",
+ "description": "This is the call control ID of the Telnyx call."
+ },
+ "callLegId": {
+ "type": "string",
+ "description": "This is the call leg ID of the Telnyx call."
+ },
+ "callSessionId": {
+ "type": "string",
+ "description": "This is the call session ID of the Telnyx call."
+ }
+ },
+ "required": [
+ "provider"
+ ]
+ },
+ "VapiSipTransport": {
+ "type": "object",
+ "properties": {
+ "conversationType": {
+ "type": "string",
+ "description": "This is the conversation type of the call (ie, voice or chat).",
+ "default": "voice",
+ "enum": [
+ "voice"
+ ]
+ },
+ "provider": {
+ "type": "string",
+ "description": "Vapi SIP transport provider",
+ "enum": [
+ "vapi.sip"
+ ]
+ },
+ "dialTimeout": {
"type": "number",
- "description": "Incremental number of concurrent calls that will be allowed, including this call"
+ "description": "This sets the timeout for outbound dial operations in seconds. This is the duration the call will ring before timing out.\n\n@default 60",
+ "minimum": 1,
+ "maximum": 600,
+ "default": 60
+ },
+ "sbcCallSid": {
+ "type": "string",
+ "description": "This is the call SID of the Vapi SIP call."
+ },
+ "callSid": {
+ "type": "string",
+ "description": "This is the call ID of the Vapi SIP call."
}
- }
+ },
+ "required": [
+ "provider"
+ ]
+ },
+ "VonageTransport": {
+ "type": "object",
+ "properties": {
+ "conversationType": {
+ "type": "string",
+ "description": "This is the conversation type of the call (ie, voice or chat).",
+ "default": "voice",
+ "enum": [
+ "voice"
+ ]
+ },
+ "provider": {
+ "type": "string",
+ "description": "Vonage transport provider",
+ "enum": [
+ "vonage"
+ ]
+ },
+ "conversationUUID": {
+ "type": "string",
+ "description": "This is the conversation UUID of the Vonage call."
+ },
+ "callUUID": {
+ "type": "string",
+ "description": "This is the call ID of the Vonage call."
+ }
+ },
+ "required": [
+ "provider"
+ ]
},
"AnalysisCostBreakdown": {
"type": "object",
@@ -33143,6 +41167,86 @@
}
}
},
+ "TransferArtifact": {
+ "type": "object",
+ "properties": {
+ "destination": {
+ "description": "The transfer destination (phone number or SIP URI).",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/TransferDestinationNumber",
+ "title": "Number"
+ },
+ {
+ "$ref": "#/components/schemas/TransferDestinationSip",
+ "title": "Sip"
+ }
+ ]
+ },
+ "mode": {
+ "type": "string",
+ "description": "The transfer mode (e.g. warm-transfer-experimental, blind-transfer).",
+ "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"
+ ]
+ },
+ "transcript": {
+ "type": "string",
+ "description": "Flat-text transcript / announcement preview of the transfer."
+ },
+ "status": {
+ "type": "string",
+ "description": "The terminal status of the transfer, rendered as the status line.",
+ "enum": [
+ "connected",
+ "no-answer",
+ "busy",
+ "voicemail",
+ "failed",
+ "completed",
+ "cancelled"
+ ]
+ },
+ "messages": {
+ "type": "array",
+ "description": "The agent↔operator conversation captured during a\nwarm-transfer-experimental, rendered as bubbles.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/UserMessage",
+ "title": "UserMessage"
+ },
+ {
+ "$ref": "#/components/schemas/SystemMessage",
+ "title": "SystemMessage"
+ },
+ {
+ "$ref": "#/components/schemas/BotMessage",
+ "title": "BotMessage"
+ },
+ {
+ "$ref": "#/components/schemas/ToolCallMessage",
+ "title": "ToolCallMessage"
+ },
+ {
+ "$ref": "#/components/schemas/ToolCallResultMessage",
+ "title": "ToolCallResultMessage"
+ }
+ ]
+ }
+ }
+ },
+ "required": [
+ "destination"
+ ]
+ },
"Mono": {
"type": "object",
"properties": {
@@ -33229,6 +41333,11 @@
"AssistantActivation": {
"type": "object",
"properties": {
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant active when\nthe activation row was recorded. `null` for inline assistants,\norgs not on assistant versioning, and parent assistants that have\nnot yet been published under it."
+ },
"assistantName": {
"type": "string",
"description": "This is the name of the assistant that was active during the call."
@@ -33353,6 +41462,13 @@
"$ref": "#/components/schemas/OpenAIMessage"
}
},
+ "transfers": {
+ "description": "These are the transfer records from warm transfers, including destinations, transcripts, and status.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/TransferArtifact"
+ }
+ },
"recordingUrl": {
"type": "string",
"description": "This is the recording url for the call. To enable, set `assistant.artifactPlan.recordingEnabled`.",
@@ -33427,17 +41543,42 @@
"type": "object",
"description": "These are the scorecards that have been evaluated based on the structured outputs extracted during the call.\nTo enable, set `assistant.artifactPlan.scorecardIds` or `assistant.artifactPlan.scorecards` with the IDs or objects of the scorecards you want to evaluate."
},
- "transfers": {
- "description": "These are the transfer records from warm transfers, including destinations, transcripts, and status.",
- "type": "array",
- "items": {
- "type": "string"
- }
- },
"structuredOutputsLastUpdatedAt": {
"format": "date-time",
"type": "string",
"description": "This is when the structured outputs were last updated"
+ },
+ "presignedMonoUrl": {
+ "type": "string",
+ "description": "This is a presigned URL to download the mono recording without\nauthentication. Populated on API responses and server messages; never\nstored. Expires at `presignedUrlsExpiresAt` — after that, use\n`GET /call/{id}/mono-recording`."
+ },
+ "presignedStereoUrl": {
+ "type": "string",
+ "description": "This is a presigned URL to download the stereo recording without\nauthentication. Expires at `presignedUrlsExpiresAt` — after that, use\n`GET /call/{id}/stereo-recording`."
+ },
+ "presignedVideoUrl": {
+ "type": "string",
+ "description": "This is a presigned URL to download the video recording without\nauthentication. Expires at `presignedUrlsExpiresAt` — after that, use\n`GET /call/{id}/video-recording`."
+ },
+ "presignedAssistantUrl": {
+ "type": "string",
+ "description": "This is a presigned URL to download the assistant-channel mono recording\nwithout authentication. Expires at `presignedUrlsExpiresAt`."
+ },
+ "presignedCustomerUrl": {
+ "type": "string",
+ "description": "This is a presigned URL to download the customer-channel mono recording\nwithout authentication. Expires at `presignedUrlsExpiresAt`."
+ },
+ "presignedPcapUrl": {
+ "type": "string",
+ "description": "This is a presigned URL to download the packet capture without\nauthentication. Expires at `presignedUrlsExpiresAt`."
+ },
+ "presignedLogUrl": {
+ "type": "string",
+ "description": "This is a presigned URL to download the call logs without\nauthentication. Expires at `presignedUrlsExpiresAt`."
+ },
+ "presignedUrlsExpiresAt": {
+ "type": "string",
+ "description": "This is when the presigned URLs above expire, as an ISO 8601 timestamp.\nThe raw `*Url` fields remain the stable identifiers and do not expire.\nPresigned URLs are regenerated per response and per webhook delivery, so\nvalues differ across retries."
}
}
},
@@ -33445,8 +41586,12 @@
"type": "object",
"properties": {
"type": {
- "type": "object",
- "description": "This is the type of recording consent."
+ "type": "string",
+ "description": "This is the type of recording consent.",
+ "enum": [
+ "stay-on-line",
+ "verbal"
+ ]
},
"grantedAt": {
"format": "date-time",
@@ -33805,6 +41950,14 @@
}
]
},
+ "squadOverrides": {
+ "description": "These are the overrides applied when the call targets a `squadId`. Mirrors\nthe call-level `squadOverrides` — use this instead of `assistantOverrides`\nwhen the campaign or call is squad-based.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/AssistantOverrides"
+ }
+ ]
+ },
"number": {
"type": "string",
"description": "This is the number of the customer.",
@@ -33991,6 +42144,7 @@
"call.start.error-subscription-upgrade-failed",
"call.start.error-subscription-concurrency-limit-reached",
"call.start.error-enterprise-feature-not-available-recording-consent",
+ "call.start.assistant-version-error-validation",
"assistant-not-valid",
"call.start.error-vapifault-database-error",
"assistant-not-found",
@@ -34010,6 +42164,9 @@
"pipeline-error-inworld-voice-failed",
"pipeline-error-minimax-voice-failed",
"pipeline-error-wellsaid-voice-failed",
+ "pipeline-error-xai-voice-failed",
+ "pipeline-error-microsoft-voice-failed",
+ "pipeline-error-microsoft-voice-request-canceled",
"pipeline-error-tavus-video-failed",
"call.in-progress.error-vapifault-openai-voice-failed",
"call.in-progress.error-vapifault-cartesia-voice-failed",
@@ -34027,6 +42184,8 @@
"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-xai-voice-failed",
+ "call.in-progress.error-vapifault-microsoft-voice-failed",
"call.in-progress.error-vapifault-tavus-video-failed",
"pipeline-error-vapi-llm-failed",
"pipeline-error-vapi-400-bad-request-validation-failed",
@@ -34036,12 +42195,17 @@
"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-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-vapi-transcriber-failed",
+ "call.in-progress.error-vapifault-vapi-transcriber-failed",
+ "call.in-progress.error-providerfault-vapi-transcriber-failed",
+ "call.in-progress.error-providerfault-vapi-voice-failed",
"pipeline-error-deepgram-transcriber-failed",
"pipeline-error-deepgram-transcriber-api-key-missing",
"call.in-progress.error-vapifault-deepgram-transcriber-failed",
@@ -34081,6 +42245,18 @@
"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",
+ "pipeline-error-xai-transcriber-auth-failed",
+ "pipeline-error-xai-transcriber-rate-limited",
+ "pipeline-error-xai-transcriber-invalid-config",
+ "pipeline-error-xai-transcriber-server-error",
+ "pipeline-error-xai-transcriber-failed",
+ "call.in-progress.error-vapifault-xai-transcriber-auth-failed",
+ "call.in-progress.error-vapifault-xai-transcriber-rate-limited",
+ "call.in-progress.error-vapifault-xai-transcriber-invalid-config",
+ "call.in-progress.error-vapifault-xai-transcriber-server-error",
+ "call.in-progress.error-vapifault-xai-transcriber-failed",
+ "pipeline-error-cartesia-transcriber-failed",
+ "call.in-progress.error-vapifault-cartesia-transcriber-failed",
"call.in-progress.error-pipeline-no-available-llm-model",
"worker-shutdown",
"vonage-disconnected",
@@ -34516,6 +42692,18 @@
"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",
+ "pipeline-error-xai-transcriber-auth-failed",
+ "pipeline-error-xai-transcriber-rate-limited",
+ "pipeline-error-xai-transcriber-invalid-config",
+ "pipeline-error-xai-transcriber-server-error",
+ "pipeline-error-xai-transcriber-failed",
+ "call.in-progress.error-vapifault-xai-transcriber-auth-failed",
+ "call.in-progress.error-vapifault-xai-transcriber-rate-limited",
+ "call.in-progress.error-vapifault-xai-transcriber-invalid-config",
+ "call.in-progress.error-vapifault-xai-transcriber-server-error",
+ "call.in-progress.error-vapifault-xai-transcriber-failed",
+ "pipeline-error-cartesia-transcriber-failed",
+ "call.in-progress.error-vapifault-cartesia-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",
@@ -34577,6 +42765,40 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the assistant version to use for this call. Supported only with\ndirect `assistantId`. Omit to follow the latest version."
+ },
+ "transport": {
+ "description": "This is the transport of the call.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/VapiWebsocketTransport",
+ "title": "VapiWebsocketTransport"
+ },
+ {
+ "$ref": "#/components/schemas/VonageTransport",
+ "title": "VonageTransport"
+ },
+ {
+ "$ref": "#/components/schemas/TwilioTransport",
+ "title": "TwilioTransport"
+ },
+ {
+ "$ref": "#/components/schemas/VapiSipTransport",
+ "title": "VapiSipTransport"
+ },
+ {
+ "$ref": "#/components/schemas/TelnyxTransport",
+ "title": "TelnyxTransport"
+ },
+ {
+ "$ref": "#/components/schemas/VapiWebCallTransport",
+ "title": "VapiWebCallTransport"
+ }
+ ]
+ },
"id": {
"type": "string",
"description": "This is the unique identifier for the call."
@@ -34762,18 +42984,6 @@
"$ref": "#/components/schemas/SchedulePlan"
}
]
- },
- "transport": {
- "type": "object",
- "description": "This is the transport of the call."
- },
- "subscriptionLimits": {
- "description": "These are the subscription limits for the org at the time of the call. Includes concurrency limit information.",
- "allOf": [
- {
- "$ref": "#/components/schemas/SubscriptionLimits"
- }
- ]
}
},
"required": [
@@ -34933,6 +43143,40 @@
"CreateCallDTO": {
"type": "object",
"properties": {
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the assistant version to use for this call. Supported only with\ndirect `assistantId`. Omit to follow the latest version."
+ },
+ "transport": {
+ "description": "This is the transport of the call.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/VapiWebsocketTransport",
+ "title": "VapiWebsocketTransport"
+ },
+ {
+ "$ref": "#/components/schemas/VonageTransport",
+ "title": "VonageTransport"
+ },
+ {
+ "$ref": "#/components/schemas/TwilioTransport",
+ "title": "TwilioTransport"
+ },
+ {
+ "$ref": "#/components/schemas/VapiSipTransport",
+ "title": "VapiSipTransport"
+ },
+ {
+ "$ref": "#/components/schemas/TelnyxTransport",
+ "title": "TelnyxTransport"
+ },
+ {
+ "$ref": "#/components/schemas/VapiWebCallTransport",
+ "title": "VapiWebCallTransport"
+ }
+ ]
+ },
"customers": {
"description": "This is used to issue batch calls to multiple customers.\n\nOnly relevant for `outboundPhoneCall`. To call a single customer, use `customer` instead.",
"type": "array",
@@ -34953,10 +43197,6 @@
}
]
},
- "transport": {
- "type": "object",
- "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.\n\nTo start a call with:\n- Assistant, use `assistantId` or `assistant`\n- Squad, use `squadId` or `squad`\n- Workflow, use `workflowId` or `workflow`"
@@ -35101,6 +43341,40 @@
"CreateOutboundCallDTO": {
"type": "object",
"properties": {
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the assistant version to use for this call. Supported only with\ndirect `assistantId`. Omit to follow the latest version."
+ },
+ "transport": {
+ "description": "This is the transport of the call.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/VapiWebsocketTransport",
+ "title": "VapiWebsocketTransport"
+ },
+ {
+ "$ref": "#/components/schemas/VonageTransport",
+ "title": "VonageTransport"
+ },
+ {
+ "$ref": "#/components/schemas/TwilioTransport",
+ "title": "TwilioTransport"
+ },
+ {
+ "$ref": "#/components/schemas/VapiSipTransport",
+ "title": "VapiSipTransport"
+ },
+ {
+ "$ref": "#/components/schemas/TelnyxTransport",
+ "title": "TelnyxTransport"
+ },
+ {
+ "$ref": "#/components/schemas/VapiWebCallTransport",
+ "title": "VapiWebCallTransport"
+ }
+ ]
+ },
"customers": {
"description": "This is used to issue batch calls to multiple customers.\n\nOnly relevant for `outboundPhoneCall`. To call a single customer, use `customer` instead.",
"type": "array",
@@ -35121,10 +43395,6 @@
}
]
},
- "transport": {
- "type": "object",
- "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.\n\nTo start a call with:\n- Assistant, use `assistantId` or `assistant`\n- Squad, use `squadId` or `squad`\n- Workflow, use `workflowId` or `workflow`"
@@ -35214,6 +43484,11 @@
"CreateWebCallDTO": {
"type": "object",
"properties": {
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the assistant version to use for this call. Supported only with\ndirect `assistantId`. Omit to follow the latest version."
+ },
"roomDeleteOnUserLeaveEnabled": {
"type": "boolean",
"default": true
@@ -35333,92 +43608,6 @@
"content"
]
},
- "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",
- "description": "The timestamp when the message was sent."
- },
- "secondsFromStart": {
- "type": "number",
- "description": "The number of seconds from the start of the conversation."
- }
- },
- "required": [
- "role",
- "message",
- "time",
- "secondsFromStart"
- ]
- },
- "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",
- "description": "The timestamp when the message was sent."
- },
- "endTime": {
- "type": "number",
- "description": "The timestamp when the message ended."
- },
- "secondsFromStart": {
- "type": "number",
- "description": "The number of seconds from the start of the conversation."
- },
- "duration": {
- "type": "number",
- "description": "The duration of the message in seconds."
- },
- "isFiltered": {
- "type": "boolean",
- "description": "Indicates if the message was filtered for security reasons."
- },
- "detectedThreats": {
- "description": "List of detected security threats if the message was filtered.",
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "originalMessage": {
- "type": "string",
- "description": "The original message before filtering (only included if content was filtered)."
- },
- "metadata": {
- "type": "object",
- "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"
- ]
- },
"ToolCallFunction": {
"type": "object",
"properties": {
@@ -35957,6 +44146,15 @@
"DESC"
]
},
+ "sortBy": {
+ "type": "string",
+ "description": "This is the column to sort by. Defaults to 'createdAt'.",
+ "enum": [
+ "createdAt",
+ "duration",
+ "cost"
+ ]
+ },
"limit": {
"type": "number",
"description": "This is the maximum number of items to return. Defaults to 100.",
@@ -36555,6 +44753,15 @@
"DESC"
]
},
+ "sortBy": {
+ "type": "string",
+ "description": "This is the column to sort by. Defaults to 'createdAt'.",
+ "enum": [
+ "createdAt",
+ "duration",
+ "cost"
+ ]
+ },
"limit": {
"type": "number",
"description": "This is the maximum number of items to return. Defaults to 100.",
@@ -36928,11 +45135,44 @@
]
},
"customers": {
- "description": "These are the customers that will be called in the campaign. Required if dialPlan is not provided.",
+ "description": "These are the customers that will be called in the campaign. Required if dialPlan is not provided. Maximum of 10000 customers per campaign.",
"type": "array",
"items": {
"$ref": "#/components/schemas/CreateCustomerDTO"
}
+ },
+ "maxConcurrency": {
+ "type": "number",
+ "minimum": 1,
+ "description": "This is the maximum number of concurrent calls that will be made for the campaign. Defaults to 10."
+ },
+ "assistantOverrides": {
+ "description": "These are the overrides for the assistant's settings and template variables for the campaign. Use this when the campaign targets an `assistantId`.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/AssistantOverrides"
+ }
+ ]
+ },
+ "squadOverrides": {
+ "description": "These are the overrides for the squad and template variables for the campaign. Use this when the campaign targets a `squadId`. Per-contact `squadOverrides` are deep-merged on top of this at dispatch time.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/AssistantOverrides"
+ }
+ ]
+ },
+ "server": {
+ "description": "This is the server (URL, auth headers, timeout, etc.) for the campaign webhooks.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Server"
+ }
+ ]
+ },
+ "duplicateFromCampaignId": {
+ "type": "string",
+ "description": "Optional campaign ID to duplicate config from. Provided fields in the request override the source. If `customers` is omitted, contacts are copied from the source."
}
},
"required": [
@@ -36948,7 +45188,9 @@
"enum": [
"scheduled",
"in-progress",
- "ended"
+ "ended",
+ "cancelled",
+ "archived"
]
},
"endedReason": {
@@ -36997,12 +45239,41 @@
]
},
"customers": {
- "description": "These are the customers that will be called in the campaign. Required if dialPlan is not provided.",
+ "description": "These are the customers that will be called in the campaign. Required if dialPlan is not provided. Maximum of 10000 customers per campaign.",
"type": "array",
"items": {
"$ref": "#/components/schemas/CreateCustomerDTO"
}
},
+ "maxConcurrency": {
+ "type": "number",
+ "minimum": 1,
+ "description": "This is the maximum number of concurrent calls that will be made for the campaign. Defaults to 10."
+ },
+ "assistantOverrides": {
+ "description": "These are the overrides for the assistant's settings and template variables for the campaign. Use this when the campaign targets an `assistantId`.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/AssistantOverrides"
+ }
+ ]
+ },
+ "squadOverrides": {
+ "description": "These are the overrides for the squad and template variables for the campaign. Use this when the campaign targets a `squadId`. Per-contact `squadOverrides` are deep-merged on top of this at dispatch time.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/AssistantOverrides"
+ }
+ ]
+ },
+ "server": {
+ "description": "This is the server (URL, auth headers, timeout, etc.) for the campaign webhooks.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Server"
+ }
+ ]
+ },
"id": {
"type": "string",
"description": "This is the unique identifier for the campaign."
@@ -37119,9 +45390,10 @@
},
"status": {
"type": "string",
- "description": "This is the status of the campaign.\nCan only be updated to 'ended' if you want to end the campaign.\nWhen set to 'ended', it will delete all scheduled calls. Calls in progress will be allowed to complete.",
+ "description": "Set to 'cancelled' to stop the campaign ('ended' is a V1 alias). Scheduled\ncalls are deleted; in-progress calls are allowed to finish.",
"enum": [
- "ended"
+ "ended",
+ "cancelled"
]
}
}
@@ -37706,6 +45978,15 @@
"DESC"
]
},
+ "sortBy": {
+ "type": "string",
+ "description": "This is the column to sort by. Defaults to 'createdAt'.",
+ "enum": [
+ "createdAt",
+ "duration",
+ "cost"
+ ]
+ },
"limit": {
"type": "number",
"description": "This is the maximum number of items to return. Defaults to 100.",
@@ -37882,6 +46163,15 @@
"DESC"
]
},
+ "sortBy": {
+ "type": "string",
+ "description": "This is the column to sort by. Defaults to 'createdAt'.",
+ "enum": [
+ "createdAt",
+ "duration",
+ "cost"
+ ]
+ },
"limit": {
"type": "number",
"description": "This is the maximum number of items to return. Defaults to 100.",
@@ -38288,7 +46578,7 @@
"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."
+ "description": "This will be expected in the `realm` field of the `authorization` header of the SIP INVITE. Defaults to the SIP realm of the Vapi region serving the request (e.g. `sip.vapi.ai` for US, `sip.eu.vapi.ai` for EU)."
},
"username": {
"type": "string",
@@ -38721,7 +47011,498 @@
"twilioAccountSid"
]
},
- "CreateVonagePhoneNumberDTO": {
+ "CreateVonagePhoneNumberDTO": {
+ "type": "object",
+ "properties": {
+ "fallbackDestination": {
+ "description": "This is the fallback destination an inbound call will be transferred to if:\n1. `assistantId` is not set\n2. `squadId` is not set\n3. and, `assistant-request` message to the `serverUrl` fails\n\nIf this is not set and above conditions are met, the inbound call is hung up with an error message.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/TransferDestinationNumber",
+ "title": "NumberTransferDestination"
+ },
+ {
+ "$ref": "#/components/schemas/TransferDestinationSip",
+ "title": "SipTransferDestination"
+ }
+ ]
+ },
+ "hooks": {
+ "type": "array",
+ "description": "This is the hooks that will be used for incoming calls to this phone number.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/PhoneNumberHookCallRinging",
+ "title": "PhoneNumberHookCallRinging"
+ },
+ {
+ "$ref": "#/components/schemas/PhoneNumberHookCallEnding",
+ "title": "PhoneNumberHookCallEnding"
+ }
+ ]
+ }
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is to use numbers bought on Vonage.",
+ "enum": [
+ "vonage"
+ ]
+ },
+ "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.",
+ "maxLength": 40
+ },
+ "assistantId": {
+ "type": "string",
+ "description": "This is the assistant that will be used for incoming calls to this phone number.\n\nIf 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.\n\nIf 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.\n\nIf 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": {
+ "description": "This is where Vapi will send webhooks. You can find all webhooks available along with their shape in ServerMessage schema.\n\nThe order of precedence is:\n\n1. assistant.server\n2. phoneNumber.server\n3. org.server",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Server"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "number",
+ "credentialId"
+ ]
+ },
+ "CreateVapiPhoneNumberDTO": {
+ "type": "object",
+ "properties": {
+ "fallbackDestination": {
+ "description": "This is the fallback destination an inbound call will be transferred to if:\n1. `assistantId` is not set\n2. `squadId` is not set\n3. and, `assistant-request` message to the `serverUrl` fails\n\nIf this is not set and above conditions are met, the inbound call is hung up with an error message.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/TransferDestinationNumber",
+ "title": "NumberTransferDestination"
+ },
+ {
+ "$ref": "#/components/schemas/TransferDestinationSip",
+ "title": "SipTransferDestination"
+ }
+ ]
+ },
+ "hooks": {
+ "type": "array",
+ "description": "This is the hooks that will be used for incoming calls to this phone number.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/PhoneNumberHookCallRinging",
+ "title": "PhoneNumberHookCallRinging"
+ },
+ {
+ "$ref": "#/components/schemas/PhoneNumberHookCallEnding",
+ "title": "PhoneNumberHookCallEnding"
+ }
+ ]
+ }
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is to create free SIP phone numbers on Vapi.",
+ "enum": [
+ "vapi"
+ ]
+ },
+ "numberDesiredAreaCode": {
+ "type": "string",
+ "description": "This is the area code of the phone number to purchase.",
+ "minLength": 3,
+ "maxLength": 3
+ },
+ "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.\n\nThis is case-insensitive."
+ },
+ "authentication": {
+ "description": "This enables authentication for incoming SIP INVITE requests to the `sipUri`.\n\nIf not set, any username/password to the 401 challenge of the SIP INVITE will be accepted.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/SipAuthentication"
+ }
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "This is the name of the phone number. This is just for your own reference.",
+ "maxLength": 40
+ },
+ "assistantId": {
+ "type": "string",
+ "description": "This is the assistant that will be used for incoming calls to this phone number.\n\nIf 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.\n\nIf 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.\n\nIf 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": {
+ "description": "This is where Vapi will send webhooks. You can find all webhooks available along with their shape in ServerMessage schema.\n\nThe order of precedence is:\n\n1. assistant.server\n2. phoneNumber.server\n3. org.server",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Server"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider"
+ ]
+ },
+ "CreateTelnyxPhoneNumberDTO": {
+ "type": "object",
+ "properties": {
+ "fallbackDestination": {
+ "description": "This is the fallback destination an inbound call will be transferred to if:\n1. `assistantId` is not set\n2. `squadId` is not set\n3. and, `assistant-request` message to the `serverUrl` fails\n\nIf this is not set and above conditions are met, the inbound call is hung up with an error message.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/TransferDestinationNumber",
+ "title": "NumberTransferDestination"
+ },
+ {
+ "$ref": "#/components/schemas/TransferDestinationSip",
+ "title": "SipTransferDestination"
+ }
+ ]
+ },
+ "hooks": {
+ "type": "array",
+ "description": "This is the hooks that will be used for incoming calls to this phone number.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/PhoneNumberHookCallRinging",
+ "title": "PhoneNumberHookCallRinging"
+ },
+ {
+ "$ref": "#/components/schemas/PhoneNumberHookCallEnding",
+ "title": "PhoneNumberHookCallEnding"
+ }
+ ]
+ }
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is to use numbers bought on Telnyx.",
+ "enum": [
+ "telnyx"
+ ]
+ },
+ "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.",
+ "maxLength": 40
+ },
+ "assistantId": {
+ "type": "string",
+ "description": "This is the assistant that will be used for incoming calls to this phone number.\n\nIf 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.\n\nIf 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.\n\nIf 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": {
+ "description": "This is where Vapi will send webhooks. You can find all webhooks available along with their shape in ServerMessage schema.\n\nThe order of precedence is:\n\n1. assistant.server\n2. phoneNumber.server\n3. org.server",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Server"
+ }
+ ]
+ }
+ },
+ "required": [
+ "provider",
+ "number",
+ "credentialId"
+ ]
+ },
+ "UpdateByoPhoneNumberDTO": {
+ "type": "object",
+ "properties": {
+ "fallbackDestination": {
+ "description": "This is the fallback destination an inbound call will be transferred to if:\n1. `assistantId` is not set\n2. `squadId` is not set\n3. and, `assistant-request` message to the `serverUrl` fails\n\nIf this is not set and above conditions are met, the inbound call is hung up with an error message.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/TransferDestinationNumber",
+ "title": "NumberTransferDestination"
+ },
+ {
+ "$ref": "#/components/schemas/TransferDestinationSip",
+ "title": "SipTransferDestination"
+ }
+ ]
+ },
+ "hooks": {
+ "type": "array",
+ "description": "This is the hooks that will be used for incoming calls to this phone number.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/PhoneNumberHookCallRinging",
+ "title": "PhoneNumberHookCallRinging"
+ },
+ {
+ "$ref": "#/components/schemas/PhoneNumberHookCallEnding",
+ "title": "PhoneNumberHookCallEnding"
+ }
+ ]
+ }
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is to bring your own phone numbers from your own SIP trunks or Carriers.",
+ "enum": [
+ "byo-phone-number"
+ ]
+ },
+ "numberE164CheckEnabled": {
+ "type": "boolean",
+ "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.\n\nUse cases:\n- `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.\n- `true` (default): To allow only E164 numbers like `+14155551234`. This is standard for PSTN calls.\n\nIf `false`, the `number` is still required to only contain alphanumeric characters (regex: `/^\\+?[a-zA-Z0-9]+$/`).\n\n@default true (E164 check is enabled)",
+ "default": true
+ },
+ "name": {
+ "type": "string",
+ "description": "This is the name of the phone number. This is just for your own reference.",
+ "maxLength": 40
+ },
+ "assistantId": {
+ "type": "string",
+ "description": "This is the assistant that will be used for incoming calls to this phone number.\n\nIf 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.\n\nIf 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.\n\nIf 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": {
+ "description": "This is where Vapi will send webhooks. You can find all webhooks available along with their shape in ServerMessage schema.\n\nThe order of precedence is:\n\n1. assistant.server\n2. phoneNumber.server\n3. org.server",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Server"
+ }
+ ]
+ },
+ "number": {
+ "type": "string",
+ "description": "This is the number of the customer.",
+ "minLength": 3,
+ "maxLength": 40
+ },
+ "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.\n\nYou can add the SIP trunk or Carrier credential in the Provider Credentials page on the Dashboard to get the credentialId."
+ }
+ }
+ },
+ "UpdateTwilioPhoneNumberDTO": {
+ "type": "object",
+ "properties": {
+ "fallbackDestination": {
+ "description": "This is the fallback destination an inbound call will be transferred to if:\n1. `assistantId` is not set\n2. `squadId` is not set\n3. and, `assistant-request` message to the `serverUrl` fails\n\nIf this is not set and above conditions are met, the inbound call is hung up with an error message.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/TransferDestinationNumber",
+ "title": "NumberTransferDestination"
+ },
+ {
+ "$ref": "#/components/schemas/TransferDestinationSip",
+ "title": "SipTransferDestination"
+ }
+ ]
+ },
+ "hooks": {
+ "type": "array",
+ "description": "This is the hooks that will be used for incoming calls to this phone number.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/PhoneNumberHookCallRinging",
+ "title": "PhoneNumberHookCallRinging"
+ },
+ {
+ "$ref": "#/components/schemas/PhoneNumberHookCallEnding",
+ "title": "PhoneNumberHookCallEnding"
+ }
+ ]
+ }
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is to use numbers bought on Twilio.",
+ "enum": [
+ "twilio"
+ ]
+ },
+ "smsEnabled": {
+ "type": "boolean",
+ "description": "Controls whether Vapi sets the messaging webhook URL on the Twilio number during import.\n\nIf set to `false`, Vapi will not update the Twilio messaging URL, leaving it as is.\nIf `true` or omitted (default), Vapi will configure both the voice and messaging URLs.\n\n@default true",
+ "default": true
+ },
+ "name": {
+ "type": "string",
+ "description": "This is the name of the phone number. This is just for your own reference.",
+ "maxLength": 40
+ },
+ "assistantId": {
+ "type": "string",
+ "description": "This is the assistant that will be used for incoming calls to this phone number.\n\nIf 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.\n\nIf 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.\n\nIf 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": {
+ "description": "This is where Vapi will send webhooks. You can find all webhooks available along with their shape in ServerMessage schema.\n\nThe order of precedence is:\n\n1. assistant.server\n2. phoneNumber.server\n3. org.server",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/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."
+ }
+ }
+ },
+ "UpdateVonagePhoneNumberDTO": {
+ "type": "object",
+ "properties": {
+ "fallbackDestination": {
+ "description": "This is the fallback destination an inbound call will be transferred to if:\n1. `assistantId` is not set\n2. `squadId` is not set\n3. and, `assistant-request` message to the `serverUrl` fails\n\nIf this is not set and above conditions are met, the inbound call is hung up with an error message.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/TransferDestinationNumber",
+ "title": "NumberTransferDestination"
+ },
+ {
+ "$ref": "#/components/schemas/TransferDestinationSip",
+ "title": "SipTransferDestination"
+ }
+ ]
+ },
+ "hooks": {
+ "type": "array",
+ "description": "This is the hooks that will be used for incoming calls to this phone number.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/PhoneNumberHookCallRinging",
+ "title": "PhoneNumberHookCallRinging"
+ },
+ {
+ "$ref": "#/components/schemas/PhoneNumberHookCallEnding",
+ "title": "PhoneNumberHookCallEnding"
+ }
+ ]
+ }
+ },
+ "provider": {
+ "type": "string",
+ "description": "This is to use numbers bought on Vonage.",
+ "enum": [
+ "vonage"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "This is the name of the phone number. This is just for your own reference.",
+ "maxLength": 40
+ },
+ "assistantId": {
+ "type": "string",
+ "description": "This is the assistant that will be used for incoming calls to this phone number.\n\nIf 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.\n\nIf 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.\n\nIf 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": {
+ "description": "This is where Vapi will send webhooks. You can find all webhooks available along with their shape in ServerMessage schema.\n\nThe order of precedence is:\n\n1. assistant.server\n2. phoneNumber.server\n3. org.server",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/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."
+ }
+ }
+ },
+ "UpdateVapiPhoneNumberDTO": {
"type": "object",
"properties": {
"fallbackDestination": {
@@ -38755,19 +47536,10 @@
},
"provider": {
"type": "string",
- "description": "This is to use numbers bought on Vonage.",
"enum": [
- "vonage"
+ "vapi"
]
},
- "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.",
@@ -38792,15 +47564,22 @@
"$ref": "#/components/schemas/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.\n\nThis is case-insensitive."
+ },
+ "authentication": {
+ "description": "This enables authentication for incoming SIP INVITE requests to the `sipUri`.\n\nIf not set, any username/password to the 401 challenge of the SIP INVITE will be accepted.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/SipAuthentication"
+ }
+ ]
}
- },
- "required": [
- "provider",
- "number",
- "credentialId"
- ]
+ }
},
- "CreateVapiPhoneNumberDTO": {
+ "UpdateTelnyxPhoneNumberDTO": {
"type": "object",
"properties": {
"fallbackDestination": {
@@ -38834,27 +47613,9 @@
},
"provider": {
"type": "string",
- "description": "This is to create free SIP phone numbers on Vapi.",
+ "description": "This is to use numbers bought on Telnyx.",
"enum": [
- "vapi"
- ]
- },
- "numberDesiredAreaCode": {
- "type": "string",
- "description": "This is the area code of the phone number to purchase.",
- "minLength": 3,
- "maxLength": 3
- },
- "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.\n\nThis is case-insensitive."
- },
- "authentication": {
- "description": "This enables authentication for incoming SIP INVITE requests to the `sipUri`.\n\nIf not set, any username/password to the 401 challenge of the SIP INVITE will be accepted.",
- "allOf": [
- {
- "$ref": "#/components/schemas/SipAuthentication"
- }
+ "telnyx"
]
},
"name": {
@@ -38881,13 +47642,18 @@
"$ref": "#/components/schemas/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"
- ]
+ }
},
- "CreateTelnyxPhoneNumberDTO": {
+ "ImportVonagePhoneNumberDTO": {
"type": "object",
"properties": {
"fallbackDestination": {
@@ -38919,16 +47685,10 @@
]
}
},
- "provider": {
- "type": "string",
- "description": "This is to use numbers bought on Telnyx.",
- "enum": [
- "telnyx"
- ]
- },
- "number": {
+ "vonagePhoneNumber": {
"type": "string",
- "description": "These are the digits of the phone number you own on your Telnyx."
+ "description": "These are the digits of the phone number you own on your Vonage.",
+ "deprecated": true
},
"credentialId": {
"type": "string",
@@ -38961,492 +47721,780 @@
}
},
"required": [
- "provider",
- "number",
+ "vonagePhoneNumber",
"credentialId"
]
},
- "UpdateByoPhoneNumberDTO": {
+ "PhoneNumberPaginatedResponse": {
"type": "object",
"properties": {
- "fallbackDestination": {
- "description": "This is the fallback destination an inbound call will be transferred to if:\n1. `assistantId` is not set\n2. `squadId` is not set\n3. and, `assistant-request` message to the `serverUrl` fails\n\nIf this is not set and above conditions are met, the inbound call is hung up with an error message.",
- "oneOf": [
- {
- "$ref": "#/components/schemas/TransferDestinationNumber",
- "title": "NumberTransferDestination"
- },
+ "results": {
+ "type": "array",
+ "description": "A list of phone numbers, which can be of any provider type.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/ByoPhoneNumber"
+ },
+ {
+ "$ref": "#/components/schemas/TwilioPhoneNumber"
+ },
+ {
+ "$ref": "#/components/schemas/VonagePhoneNumber"
+ },
+ {
+ "$ref": "#/components/schemas/VapiPhoneNumber"
+ },
+ {
+ "$ref": "#/components/schemas/TelnyxPhoneNumber"
+ }
+ ]
+ }
+ },
+ "metadata": {
+ "description": "Metadata about the pagination.",
+ "allOf": [
{
- "$ref": "#/components/schemas/TransferDestinationSip",
- "title": "SipTransferDestination"
+ "$ref": "#/components/schemas/PaginationMeta"
}
]
+ }
+ },
+ "required": [
+ "results",
+ "metadata"
+ ]
+ },
+ "ApiRequestTool": {
+ "type": "object",
+ "properties": {
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
},
- "hooks": {
+ "messages": {
"type": "array",
- "description": "This is the hooks that will be used for incoming calls to this phone number.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
- "$ref": "#/components/schemas/PhoneNumberHookCallRinging",
- "title": "PhoneNumberHookCallRinging"
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
},
{
- "$ref": "#/components/schemas/PhoneNumberHookCallEnding",
- "title": "PhoneNumberHookCallEnding"
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
}
]
}
},
- "numberE164CheckEnabled": {
- "type": "boolean",
- "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.\n\nUse cases:\n- `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.\n- `true` (default): To allow only E164 numbers like `+14155551234`. This is standard for PSTN calls.\n\nIf `false`, the `number` is still required to only contain alphanumeric characters (regex: `/^\\+?[a-zA-Z0-9]+$/`).\n\n@default true (E164 check is enabled)",
- "default": true
+ "type": {
+ "type": "string",
+ "enum": [
+ "apiRequest"
+ ],
+ "description": "The type of tool. \"apiRequest\" for API request tool."
},
"name": {
"type": "string",
- "description": "This is the name of the phone number. This is just for your own reference.",
- "maxLength": 40
+ "description": "This is the name of the tool. This will be passed to the model.\n\nMust be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 40.",
+ "maxLength": 40,
+ "pattern": "/^[a-zA-Z0-9_-]{1,40}$/"
},
- "assistantId": {
+ "method": {
"type": "string",
- "description": "This is the assistant that will be used for incoming calls to this phone number.\n\nIf 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."
+ "enum": [
+ "POST",
+ "GET",
+ "PUT",
+ "PATCH",
+ "DELETE"
+ ]
},
- "workflowId": {
+ "timeoutSeconds": {
+ "type": "number",
+ "description": "This is the timeout in seconds for the request. Defaults to 20 seconds.\n\n@default 20",
+ "minimum": 1,
+ "maximum": 300,
+ "example": 20
+ },
+ "credentialId": {
"type": "string",
- "description": "This is the workflow that will be used for incoming calls to this phone number.\n\nIf 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."
+ "description": "The credential ID for API request authentication",
+ "example": "550e8400-e29b-41d4-a716-446655440000"
},
- "squadId": {
+ "encryptedPaths": {
+ "type": "array",
+ "description": "This is the paths to encrypt in the request body if credentialId and encryptionPlan are defined.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "parameters": {
+ "description": "Static key-value pairs merged into the request body. Values support Liquid templates.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolParameter"
+ }
+ },
+ "id": {
"type": "string",
- "description": "This is the squad that will be used for incoming calls to this phone number.\n\nIf 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."
+ "description": "This is the unique identifier for the tool."
},
- "server": {
- "description": "This is where Vapi will send webhooks. You can find all webhooks available along with their shape in ServerMessage schema.\n\nThe order of precedence is:\n\n1. assistant.server\n2. phoneNumber.server\n3. org.server",
+ "orgId": {
+ "type": "string",
+ "description": "This is the unique identifier for the organization that this tool belongs to."
+ },
+ "createdAt": {
+ "format": "date-time",
+ "type": "string",
+ "description": "This is the ISO 8601 date-time string of when the tool was created."
+ },
+ "updatedAt": {
+ "format": "date-time",
+ "type": "string",
+ "description": "This is the ISO 8601 date-time string of when the tool was last updated."
+ },
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
"allOf": [
{
- "$ref": "#/components/schemas/Server"
+ "$ref": "#/components/schemas/ToolRejectionPlan"
}
]
},
- "number": {
+ "description": {
"type": "string",
- "description": "This is the number of the customer.",
- "minLength": 3,
- "maxLength": 40
+ "description": "This is the description of the tool. This will be passed to the model."
},
- "credentialId": {
+ "url": {
"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.\n\nYou can add the SIP trunk or Carrier credential in the Provider Credentials page on the Dashboard to get the credentialId."
- }
- }
- },
- "UpdateTwilioPhoneNumberDTO": {
- "type": "object",
- "properties": {
- "fallbackDestination": {
- "description": "This is the fallback destination an inbound call will be transferred to if:\n1. `assistantId` is not set\n2. `squadId` is not set\n3. and, `assistant-request` message to the `serverUrl` fails\n\nIf this is not set and above conditions are met, the inbound call is hung up with an error message.",
- "oneOf": [
+ "description": "This is where the request will be sent."
+ },
+ "body": {
+ "description": "This is the body of the request.",
+ "allOf": [
{
- "$ref": "#/components/schemas/TransferDestinationNumber",
- "title": "NumberTransferDestination"
- },
+ "$ref": "#/components/schemas/JsonSchema"
+ }
+ ]
+ },
+ "headers": {
+ "description": "These are the headers to send with the request.",
+ "allOf": [
{
- "$ref": "#/components/schemas/TransferDestinationSip",
- "title": "SipTransferDestination"
+ "$ref": "#/components/schemas/JsonSchema"
}
]
},
- "hooks": {
+ "backoffPlan": {
+ "description": "This is the backoff plan if the request fails. Defaults to undefined (the request will not be retried).\n\n@default undefined (the request will not be retried)",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BackoffPlan"
+ }
+ ]
+ },
+ "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.\n\nUsage:\n1. Use `aliases` to extract variables from the tool's response body. (Most common case)\n\n```json\n{\n \"aliases\": [\n {\n \"key\": \"customerName\",\n \"value\": \"{{customer.name}}\"\n },\n {\n \"key\": \"customerAge\",\n \"value\": \"{{customer.age}}\"\n }\n ]\n}\n```\n\nThe tool response body is made available to the liquid template.\n\n2. Use `aliases` to extract variables from the tool's response body if the response is an array.\n\n```json\n{\n \"aliases\": [\n {\n \"key\": \"customerName\",\n \"value\": \"{{$[0].name}}\"\n },\n {\n \"key\": \"customerAge\",\n \"value\": \"{{$[0].age}}\"\n }\n ]\n}\n```\n\n$ 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).\n\n3. Use `aliases` to extract variables from the tool's response headers.\n\n```json\n{\n \"aliases\": [\n {\n \"key\": \"customerName\",\n \"value\": \"{{tool.response.headers.customer-name}}\"\n },\n {\n \"key\": \"customerAge\",\n \"value\": \"{{tool.response.headers.customer-age}}\"\n }\n ]\n}\n```\n\n`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).\n\n4. Use `schema` to extract a large portion of the tool's response body.\n\n4.1. If you hit example.com and it returns `{\"name\": \"John\", \"age\": 30}`, then you can specify the schema as:\n\n```json\n{\n \"schema\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"age\": {\n \"type\": \"number\"\n }\n }\n }\n}\n```\nThese will be extracted as `{{ name }}` and `{{ age }}` respectively. To emphasize, object properties are extracted as direct global variables.\n\n4.2. If you hit example.com and it returns `{\"name\": {\"first\": \"John\", \"last\": \"Doe\"}}`, then you can specify the schema as:\n\n```json\n{\n \"schema\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"object\",\n \"properties\": {\n \"first\": {\n \"type\": \"string\"\n },\n \"last\": {\n \"type\": \"string\"\n }\n }\n }\n }\n }\n}\n```\n\nThese will be extracted as `{{ name }}`. And, `{{ name.first }}` and `{{ name.last }}` will be accessible.\n\n4.3. If you hit example.com and it returns `[\"94123\", \"94124\"]`, then you can specify the schema as:\n\n```json\n{\n \"schema\": {\n \"type\": \"array\",\n \"title\": \"zipCodes\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n}\n```\n\nThis will be extracted as `{{ zipCodes }}`. To access the array items, you can use `{{ zipCodes[0] }}` and `{{ zipCodes[1] }}`.\n\n4.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:\n\n```json\n{\n \"schema\": {\n \"type\": \"array\",\n \"title\": \"people\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"age\": {\n \"type\": \"number\"\n },\n \"zipCodes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n }\n }\n }\n}\n```\n\nThis 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] }}`.\n\nNote: Both `aliases` and `schema` can be used together.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/VariableExtractionPlan"
+ }
+ ]
+ }
+ },
+ "required": [
+ "type",
+ "method",
+ "id",
+ "orgId",
+ "createdAt",
+ "updatedAt",
+ "url"
+ ]
+ },
+ "CodeToolEnvironmentVariable": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the environment variable",
+ "maxLength": 64,
+ "pattern": "/^[A-Z][A-Z0-9_]*$/",
+ "example": "API_KEY"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the environment variable. Supports Liquid templates.",
+ "maxLength": 10000,
+ "example": "{{apiKey}}"
+ }
+ },
+ "required": [
+ "name",
+ "value"
+ ]
+ },
+ "CodeTool": {
+ "type": "object",
+ "properties": {
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
+ },
+ "messages": {
"type": "array",
- "description": "This is the hooks that will be used for incoming calls to this phone number.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
- "$ref": "#/components/schemas/PhoneNumberHookCallRinging",
- "title": "PhoneNumberHookCallRinging"
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
},
{
- "$ref": "#/components/schemas/PhoneNumberHookCallEnding",
- "title": "PhoneNumberHookCallEnding"
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
}
]
}
},
- "smsEnabled": {
+ "type": {
+ "type": "string",
+ "enum": [
+ "code"
+ ],
+ "description": "The type of tool. \"code\" for Code tool."
+ },
+ "async": {
"type": "boolean",
- "description": "Controls whether Vapi sets the messaging webhook URL on the Twilio number during import.\n\nIf set to `false`, Vapi will not update the Twilio messaging URL, leaving it as is.\nIf `true` or omitted (default), Vapi will configure both the voice and messaging URLs.\n\n@default true",
- "default": true
+ "example": false,
+ "description": "This determines if the tool is async.\n\n 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.\n\n 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.\n\n Defaults to synchronous (`false`)."
},
- "name": {
- "type": "string",
- "description": "This is the name of the phone number. This is just for your own reference.",
- "maxLength": 40
+ "server": {
+ "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Server"
+ }
+ ]
},
- "assistantId": {
+ "code": {
"type": "string",
- "description": "This is the assistant that will be used for incoming calls to this phone number.\n\nIf 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."
+ "description": "TypeScript code to execute when the tool is called",
+ "maxLength": 50000
},
- "workflowId": {
- "type": "string",
- "description": "This is the workflow that will be used for incoming calls to this phone number.\n\nIf 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."
+ "environmentVariables": {
+ "description": "Environment variables available in code via `env` object",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CodeToolEnvironmentVariable"
+ }
},
- "squadId": {
+ "timeoutSeconds": {
+ "type": "number",
+ "description": "This is the timeout in seconds for the code execution. Defaults to 10 seconds.\nMaximum is 30 seconds to prevent abuse.\n\n@default 10",
+ "minimum": 1,
+ "maximum": 30,
+ "example": 10
+ },
+ "credentialId": {
"type": "string",
- "description": "This is the squad that will be used for incoming calls to this phone number.\n\nIf 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."
+ "description": "Credential ID containing the Val Town API key",
+ "example": "550e8400-e29b-41d4-a716-446655440000"
},
- "server": {
- "description": "This is where Vapi will send webhooks. You can find all webhooks available along with their shape in ServerMessage schema.\n\nThe order of precedence is:\n\n1. assistant.server\n2. phoneNumber.server\n3. org.server",
+ "variableExtractionPlan": {
+ "description": "Plan to extract variables from the tool response",
"allOf": [
{
- "$ref": "#/components/schemas/Server"
+ "$ref": "#/components/schemas/VariableExtractionPlan"
}
]
},
- "number": {
+ "id": {
"type": "string",
- "description": "These are the digits of the phone number you own on your Twilio."
+ "description": "This is the unique identifier for the tool."
},
- "twilioAccountSid": {
+ "orgId": {
"type": "string",
- "description": "This is the Twilio Account SID for the phone number."
+ "description": "This is the unique identifier for the organization that this tool belongs to."
},
- "twilioAuthToken": {
+ "createdAt": {
+ "format": "date-time",
"type": "string",
- "description": "This is the Twilio Auth Token for the phone number."
+ "description": "This is the ISO 8601 date-time string of when the tool was created."
},
- "twilioApiKey": {
+ "updatedAt": {
+ "format": "date-time",
"type": "string",
- "description": "This is the Twilio API Key for the phone number."
+ "description": "This is the ISO 8601 date-time string of when the tool was last updated."
},
- "twilioApiSecret": {
- "type": "string",
- "description": "This is the Twilio API Secret for the phone number."
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ToolRejectionPlan"
+ }
+ ]
+ },
+ "function": {
+ "description": "This is the function definition of the tool.\n\nFor the Code tool, this defines the name, description, and parameters that the model\nwill use to understand when and how to call this tool.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/OpenAIFunction"
+ }
+ ]
}
- }
+ },
+ "required": [
+ "type",
+ "code",
+ "id",
+ "orgId",
+ "createdAt",
+ "updatedAt"
+ ]
},
- "UpdateVonagePhoneNumberDTO": {
+ "DtmfTool": {
"type": "object",
"properties": {
- "fallbackDestination": {
- "description": "This is the fallback destination an inbound call will be transferred to if:\n1. `assistantId` is not set\n2. `squadId` is not set\n3. and, `assistant-request` message to the `serverUrl` fails\n\nIf this is not set and above conditions are met, the inbound call is hung up with an error message.",
- "oneOf": [
- {
- "$ref": "#/components/schemas/TransferDestinationNumber",
- "title": "NumberTransferDestination"
- },
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
+ },
+ "messages": {
+ "type": "array",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
+ }
+ ]
+ }
+ },
+ "type": {
+ "type": "string",
+ "enum": [
+ "dtmf"
+ ],
+ "description": "The type of tool. \"dtmf\" for DTMF tool."
+ },
+ "sipInfoDtmfEnabled": {
+ "type": "boolean",
+ "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.",
+ "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": {
+ "format": "date-time",
+ "type": "string",
+ "description": "This is the ISO 8601 date-time string of when the tool was created."
+ },
+ "updatedAt": {
+ "format": "date-time",
+ "type": "string",
+ "description": "This is the ISO 8601 date-time string of when the tool was last updated."
+ },
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "allOf": [
{
- "$ref": "#/components/schemas/TransferDestinationSip",
- "title": "SipTransferDestination"
+ "$ref": "#/components/schemas/ToolRejectionPlan"
}
]
+ }
+ },
+ "required": [
+ "type",
+ "id",
+ "orgId",
+ "createdAt",
+ "updatedAt"
+ ]
+ },
+ "EndCallTool": {
+ "type": "object",
+ "properties": {
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
},
- "hooks": {
+ "messages": {
"type": "array",
- "description": "This is the hooks that will be used for incoming calls to this phone number.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
- "$ref": "#/components/schemas/PhoneNumberHookCallRinging",
- "title": "PhoneNumberHookCallRinging"
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
},
{
- "$ref": "#/components/schemas/PhoneNumberHookCallEnding",
- "title": "PhoneNumberHookCallEnding"
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
}
]
}
},
- "name": {
+ "type": {
"type": "string",
- "description": "This is the name of the phone number. This is just for your own reference.",
- "maxLength": 40
+ "enum": [
+ "endCall"
+ ],
+ "description": "The type of tool. \"endCall\" for End Call tool."
},
- "assistantId": {
+ "id": {
"type": "string",
- "description": "This is the assistant that will be used for incoming calls to this phone number.\n\nIf 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."
+ "description": "This is the unique identifier for the tool."
},
- "workflowId": {
+ "orgId": {
"type": "string",
- "description": "This is the workflow that will be used for incoming calls to this phone number.\n\nIf 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."
+ "description": "This is the unique identifier for the organization that this tool belongs to."
},
- "squadId": {
+ "createdAt": {
+ "format": "date-time",
"type": "string",
- "description": "This is the squad that will be used for incoming calls to this phone number.\n\nIf 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."
+ "description": "This is the ISO 8601 date-time string of when the tool was created."
},
- "server": {
- "description": "This is where Vapi will send webhooks. You can find all webhooks available along with their shape in ServerMessage schema.\n\nThe order of precedence is:\n\n1. assistant.server\n2. phoneNumber.server\n3. org.server",
+ "updatedAt": {
+ "format": "date-time",
+ "type": "string",
+ "description": "This is the ISO 8601 date-time string of when the tool was last updated."
+ },
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
"allOf": [
{
- "$ref": "#/components/schemas/Server"
+ "$ref": "#/components/schemas/ToolRejectionPlan"
}
]
- },
- "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": [
+ "type",
+ "id",
+ "orgId",
+ "createdAt",
+ "updatedAt"
+ ]
},
- "UpdateVapiPhoneNumberDTO": {
+ "FunctionTool": {
"type": "object",
"properties": {
- "fallbackDestination": {
- "description": "This is the fallback destination an inbound call will be transferred to if:\n1. `assistantId` is not set\n2. `squadId` is not set\n3. and, `assistant-request` message to the `serverUrl` fails\n\nIf this is not set and above conditions are met, the inbound call is hung up with an error message.",
- "oneOf": [
- {
- "$ref": "#/components/schemas/TransferDestinationNumber",
- "title": "NumberTransferDestination"
- },
- {
- "$ref": "#/components/schemas/TransferDestinationSip",
- "title": "SipTransferDestination"
- }
- ]
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
},
- "hooks": {
+ "messages": {
"type": "array",
- "description": "This is the hooks that will be used for incoming calls to this phone number.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
- "$ref": "#/components/schemas/PhoneNumberHookCallRinging",
- "title": "PhoneNumberHookCallRinging"
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
},
{
- "$ref": "#/components/schemas/PhoneNumberHookCallEnding",
- "title": "PhoneNumberHookCallEnding"
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
}
]
}
},
- "name": {
- "type": "string",
- "description": "This is the name of the phone number. This is just for your own reference.",
- "maxLength": 40
- },
- "assistantId": {
- "type": "string",
- "description": "This is the assistant that will be used for incoming calls to this phone number.\n\nIf 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": {
"type": "string",
- "description": "This is the workflow that will be used for incoming calls to this phone number.\n\nIf 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."
+ "enum": [
+ "function"
+ ],
+ "description": "The type of tool. \"function\" for Function tool."
},
- "squadId": {
- "type": "string",
- "description": "This is the squad that will be used for incoming calls to this phone number.\n\nIf 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."
+ "async": {
+ "type": "boolean",
+ "example": false,
+ "description": "This determines if the tool is async.\n\n 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.\n\n 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.\n\n Defaults to synchronous (`false`)."
},
"server": {
- "description": "This is where Vapi will send webhooks. You can find all webhooks available along with their shape in ServerMessage schema.\n\nThe order of precedence is:\n\n1. assistant.server\n2. phoneNumber.server\n3. org.server",
+ "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
"allOf": [
{
"$ref": "#/components/schemas/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.\n\nThis is case-insensitive."
- },
- "authentication": {
- "description": "This enables authentication for incoming SIP INVITE requests to the `sipUri`.\n\nIf not set, any username/password to the 401 challenge of the SIP INVITE will be accepted.",
+ "variableExtractionPlan": {
+ "description": "Plan to extract variables from the tool response",
"allOf": [
{
- "$ref": "#/components/schemas/SipAuthentication"
- }
- ]
- }
- }
- },
- "UpdateTelnyxPhoneNumberDTO": {
- "type": "object",
- "properties": {
- "fallbackDestination": {
- "description": "This is the fallback destination an inbound call will be transferred to if:\n1. `assistantId` is not set\n2. `squadId` is not set\n3. and, `assistant-request` message to the `serverUrl` fails\n\nIf this is not set and above conditions are met, the inbound call is hung up with an error message.",
- "oneOf": [
- {
- "$ref": "#/components/schemas/TransferDestinationNumber",
- "title": "NumberTransferDestination"
- },
- {
- "$ref": "#/components/schemas/TransferDestinationSip",
- "title": "SipTransferDestination"
+ "$ref": "#/components/schemas/VariableExtractionPlan"
}
]
},
- "hooks": {
+ "parameters": {
+ "description": "Static key-value pairs merged into the request body. Values support Liquid templates.",
"type": "array",
- "description": "This is the hooks that will be used for incoming calls to this phone number.",
"items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/PhoneNumberHookCallRinging",
- "title": "PhoneNumberHookCallRinging"
- },
- {
- "$ref": "#/components/schemas/PhoneNumberHookCallEnding",
- "title": "PhoneNumberHookCallEnding"
- }
- ]
+ "$ref": "#/components/schemas/ToolParameter"
}
},
- "name": {
+ "id": {
"type": "string",
- "description": "This is the name of the phone number. This is just for your own reference.",
- "maxLength": 40
+ "description": "This is the unique identifier for the tool."
},
- "assistantId": {
+ "orgId": {
"type": "string",
- "description": "This is the assistant that will be used for incoming calls to this phone number.\n\nIf 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."
+ "description": "This is the unique identifier for the organization that this tool belongs to."
},
- "workflowId": {
+ "createdAt": {
+ "format": "date-time",
"type": "string",
- "description": "This is the workflow that will be used for incoming calls to this phone number.\n\nIf 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."
+ "description": "This is the ISO 8601 date-time string of when the tool was created."
},
- "squadId": {
+ "updatedAt": {
+ "format": "date-time",
"type": "string",
- "description": "This is the squad that will be used for incoming calls to this phone number.\n\nIf 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."
+ "description": "This is the ISO 8601 date-time string of when the tool was last updated."
},
- "server": {
- "description": "This is where Vapi will send webhooks. You can find all webhooks available along with their shape in ServerMessage schema.\n\nThe order of precedence is:\n\n1. assistant.server\n2. phoneNumber.server\n3. org.server",
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
"allOf": [
{
- "$ref": "#/components/schemas/Server"
+ "$ref": "#/components/schemas/ToolRejectionPlan"
}
]
},
- "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."
+ "function": {
+ "description": "This is the function definition of the tool.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/OpenAIFunction"
+ }
+ ]
}
- }
+ },
+ "required": [
+ "type",
+ "id",
+ "orgId",
+ "createdAt",
+ "updatedAt"
+ ]
},
- "ImportVonagePhoneNumberDTO": {
+ "GhlTool": {
"type": "object",
"properties": {
- "fallbackDestination": {
- "description": "This is the fallback destination an inbound call will be transferred to if:\n1. `assistantId` is not set\n2. `squadId` is not set\n3. and, `assistant-request` message to the `serverUrl` fails\n\nIf this is not set and above conditions are met, the inbound call is hung up with an error message.",
- "oneOf": [
- {
- "$ref": "#/components/schemas/TransferDestinationNumber",
- "title": "NumberTransferDestination"
- },
- {
- "$ref": "#/components/schemas/TransferDestinationSip",
- "title": "SipTransferDestination"
- }
- ]
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
},
- "hooks": {
+ "messages": {
"type": "array",
- "description": "This is the hooks that will be used for incoming calls to this phone number.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
- "$ref": "#/components/schemas/PhoneNumberHookCallRinging",
- "title": "PhoneNumberHookCallRinging"
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
},
{
- "$ref": "#/components/schemas/PhoneNumberHookCallEnding",
- "title": "PhoneNumberHookCallEnding"
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
}
]
}
},
- "vonagePhoneNumber": {
- "type": "string",
- "description": "These are the digits of the phone number you own on your Vonage.",
- "deprecated": true
- },
- "credentialId": {
+ "type": {
"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."
+ "enum": [
+ "ghl"
+ ],
+ "description": "The type of tool. \"ghl\" for GHL tool."
},
- "name": {
+ "id": {
"type": "string",
- "description": "This is the name of the phone number. This is just for your own reference.",
- "maxLength": 40
+ "description": "This is the unique identifier for the tool."
},
- "assistantId": {
+ "orgId": {
"type": "string",
- "description": "This is the assistant that will be used for incoming calls to this phone number.\n\nIf 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."
+ "description": "This is the unique identifier for the organization that this tool belongs to."
},
- "workflowId": {
+ "createdAt": {
+ "format": "date-time",
"type": "string",
- "description": "This is the workflow that will be used for incoming calls to this phone number.\n\nIf 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."
+ "description": "This is the ISO 8601 date-time string of when the tool was created."
},
- "squadId": {
+ "updatedAt": {
+ "format": "date-time",
"type": "string",
- "description": "This is the squad that will be used for incoming calls to this phone number.\n\nIf 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."
+ "description": "This is the ISO 8601 date-time string of when the tool was last updated."
},
- "server": {
- "description": "This is where Vapi will send webhooks. You can find all webhooks available along with their shape in ServerMessage schema.\n\nThe order of precedence is:\n\n1. assistant.server\n2. phoneNumber.server\n3. org.server",
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
"allOf": [
{
- "$ref": "#/components/schemas/Server"
+ "$ref": "#/components/schemas/ToolRejectionPlan"
}
]
+ },
+ "metadata": {
+ "$ref": "#/components/schemas/GhlToolMetadata"
}
},
"required": [
- "vonagePhoneNumber",
- "credentialId"
+ "type",
+ "id",
+ "orgId",
+ "createdAt",
+ "updatedAt",
+ "metadata"
]
},
- "PhoneNumberPaginatedResponse": {
+ "MakeTool": {
"type": "object",
"properties": {
- "results": {
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
+ },
+ "messages": {
"type": "array",
- "description": "A list of phone numbers, which can be of any provider type.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
- "$ref": "#/components/schemas/ByoPhoneNumber"
- },
- {
- "$ref": "#/components/schemas/TwilioPhoneNumber"
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
},
{
- "$ref": "#/components/schemas/VonagePhoneNumber"
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
},
{
- "$ref": "#/components/schemas/VapiPhoneNumber"
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
},
{
- "$ref": "#/components/schemas/TelnyxPhoneNumber"
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
}
]
}
},
- "metadata": {
- "description": "Metadata about the pagination.",
+ "type": {
+ "type": "string",
+ "enum": [
+ "make"
+ ],
+ "description": "The type of tool. \"make\" for Make 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": {
+ "format": "date-time",
+ "type": "string",
+ "description": "This is the ISO 8601 date-time string of when the tool was created."
+ },
+ "updatedAt": {
+ "format": "date-time",
+ "type": "string",
+ "description": "This is the ISO 8601 date-time string of when the tool was last updated."
+ },
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
"allOf": [
{
- "$ref": "#/components/schemas/PaginationMeta"
+ "$ref": "#/components/schemas/ToolRejectionPlan"
}
]
+ },
+ "metadata": {
+ "$ref": "#/components/schemas/MakeToolMetadata"
}
},
"required": [
- "results",
+ "type",
+ "id",
+ "orgId",
+ "createdAt",
+ "updatedAt",
"metadata"
]
},
- "ApiRequestTool": {
+ "TransferCallTool": {
"type": "object",
"properties": {
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
+ },
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -39471,44 +48519,27 @@
"type": {
"type": "string",
"enum": [
- "apiRequest"
- ],
- "description": "The type of tool. \"apiRequest\" for API request tool."
- },
- "method": {
- "type": "string",
- "enum": [
- "POST",
- "GET",
- "PUT",
- "PATCH",
- "DELETE"
+ "transferCall"
]
},
- "timeoutSeconds": {
- "type": "number",
- "description": "This is the timeout in seconds for the request. Defaults to 20 seconds.\n\n@default 20",
- "minimum": 1,
- "maximum": 300,
- "example": 20
- },
- "credentialId": {
- "type": "string",
- "description": "The credential ID for API request authentication",
- "example": "550e8400-e29b-41d4-a716-446655440000"
- },
- "encryptedPaths": {
- "type": "array",
- "description": "This is the paths to encrypt in the request body if credentialId and encryptionPlan are defined.",
- "items": {
- "type": "string"
- }
- },
- "parameters": {
- "description": "Static key-value pairs merged into the request body. Values support Liquid templates.",
+ "destinations": {
"type": "array",
+ "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.",
"items": {
- "$ref": "#/components/schemas/ToolParameter"
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/TransferDestinationAssistant",
+ "title": "Assistant"
+ },
+ {
+ "$ref": "#/components/schemas/TransferDestinationNumber",
+ "title": "Number"
+ },
+ {
+ "$ref": "#/components/schemas/TransferDestinationSip",
+ "title": "Sip"
+ }
+ ]
}
},
"id": {
@@ -39536,92 +48567,26 @@
"$ref": "#/components/schemas/ToolRejectionPlan"
}
]
- },
- "name": {
- "type": "string",
- "description": "This is the name of the tool. This will be passed to the model.\n\nMust be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 40.",
- "maxLength": 40,
- "pattern": "/^[a-zA-Z0-9_-]{1,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": {
- "description": "This is the body of the request.",
- "allOf": [
- {
- "$ref": "#/components/schemas/JsonSchema"
- }
- ]
- },
- "headers": {
- "description": "These are the headers to send with the request.",
- "allOf": [
- {
- "$ref": "#/components/schemas/JsonSchema"
- }
- ]
- },
- "backoffPlan": {
- "description": "This is the backoff plan if the request fails. Defaults to undefined (the request will not be retried).\n\n@default undefined (the request will not be retried)",
- "allOf": [
- {
- "$ref": "#/components/schemas/BackoffPlan"
- }
- ]
- },
- "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.\n\nUsage:\n1. Use `aliases` to extract variables from the tool's response body. (Most common case)\n\n```json\n{\n \"aliases\": [\n {\n \"key\": \"customerName\",\n \"value\": \"{{customer.name}}\"\n },\n {\n \"key\": \"customerAge\",\n \"value\": \"{{customer.age}}\"\n }\n ]\n}\n```\n\nThe tool response body is made available to the liquid template.\n\n2. Use `aliases` to extract variables from the tool's response body if the response is an array.\n\n```json\n{\n \"aliases\": [\n {\n \"key\": \"customerName\",\n \"value\": \"{{$[0].name}}\"\n },\n {\n \"key\": \"customerAge\",\n \"value\": \"{{$[0].age}}\"\n }\n ]\n}\n```\n\n$ 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).\n\n3. Use `aliases` to extract variables from the tool's response headers.\n\n```json\n{\n \"aliases\": [\n {\n \"key\": \"customerName\",\n \"value\": \"{{tool.response.headers.customer-name}}\"\n },\n {\n \"key\": \"customerAge\",\n \"value\": \"{{tool.response.headers.customer-age}}\"\n }\n ]\n}\n```\n\n`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).\n\n4. Use `schema` to extract a large portion of the tool's response body.\n\n4.1. If you hit example.com and it returns `{\"name\": \"John\", \"age\": 30}`, then you can specify the schema as:\n\n```json\n{\n \"schema\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"age\": {\n \"type\": \"number\"\n }\n }\n }\n}\n```\nThese will be extracted as `{{ name }}` and `{{ age }}` respectively. To emphasize, object properties are extracted as direct global variables.\n\n4.2. If you hit example.com and it returns `{\"name\": {\"first\": \"John\", \"last\": \"Doe\"}}`, then you can specify the schema as:\n\n```json\n{\n \"schema\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"object\",\n \"properties\": {\n \"first\": {\n \"type\": \"string\"\n },\n \"last\": {\n \"type\": \"string\"\n }\n }\n }\n }\n }\n}\n```\n\nThese will be extracted as `{{ name }}`. And, `{{ name.first }}` and `{{ name.last }}` will be accessible.\n\n4.3. If you hit example.com and it returns `[\"94123\", \"94124\"]`, then you can specify the schema as:\n\n```json\n{\n \"schema\": {\n \"type\": \"array\",\n \"title\": \"zipCodes\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n}\n```\n\nThis will be extracted as `{{ zipCodes }}`. To access the array items, you can use `{{ zipCodes[0] }}` and `{{ zipCodes[1] }}`.\n\n4.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:\n\n```json\n{\n \"schema\": {\n \"type\": \"array\",\n \"title\": \"people\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"age\": {\n \"type\": \"number\"\n },\n \"zipCodes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n }\n }\n }\n}\n```\n\nThis 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] }}`.\n\nNote: Both `aliases` and `schema` can be used together.",
- "allOf": [
- {
- "$ref": "#/components/schemas/VariableExtractionPlan"
- }
- ]
}
},
"required": [
"type",
- "method",
"id",
"orgId",
"createdAt",
- "updatedAt",
- "url"
+ "updatedAt"
]
},
- "CodeToolEnvironmentVariable": {
+ "HandoffTool": {
"type": "object",
"properties": {
- "name": {
+ "latestVersion": {
"type": "string",
- "description": "Name of the environment variable",
- "maxLength": 64,
- "pattern": "/^[A-Z][A-Z0-9_]*$/",
- "example": "API_KEY"
+ "nullable": true
},
- "value": {
- "type": "string",
- "description": "Value of the environment variable. Supports Liquid templates.",
- "maxLength": 10000,
- "example": "{{apiKey}}"
- }
- },
- "required": [
- "name",
- "value"
- ]
- },
- "CodeTool": {
- "type": "object",
- "properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -39645,56 +48610,35 @@
},
"type": {
"type": "string",
+ "description": "This is the type of the tool.\nWhen you're using handoff tool, we recommend adding this to your system prompt\n---\n# System context\n\nYou are part of a multi-agent system designed to make agent coordination and execution easy. Agents uses two primary abstraction: **Agents** and **Handoffs**. An agent encompasses instructions and tools and can hand off a conversation to another agent when appropriate. Handoffs are achieved by calling a handoff function, generally named `handoff_to_`. Handoffs between agents are handled seamlessly in the background; do not mention or draw attention to these handoffs in your conversation with the user.\n\n# Agent context\n\n{put your agent system prompt here}\n---",
"enum": [
- "code"
- ],
- "description": "The type of tool. \"code\" for Code tool."
- },
- "async": {
- "type": "boolean",
- "example": false,
- "description": "This determines if the tool is async.\n\n 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.\n\n 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.\n\n Defaults to synchronous (`false`)."
- },
- "server": {
- "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
- "allOf": [
- {
- "$ref": "#/components/schemas/Server"
- }
+ "handoff"
]
},
- "code": {
+ "defaultResult": {
"type": "string",
- "description": "TypeScript code to execute when the tool is called",
- "maxLength": 50000
+ "description": "This is the default local tool result message used when no runtime handoff result override is returned."
},
- "environmentVariables": {
- "description": "Environment variables available in code via `env` object",
+ "destinations": {
"type": "array",
+ "description": "These are the destinations that the call can be handed off to.\n\nUsage:\n1. Single destination\n\nUse `assistantId` to handoff the call to a saved assistant, or `assistantName` to handoff the call to an assistant in the same squad.\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\", // or \"assistantName\": \"Assistant123\"\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\n2. Multiple destinations\n\n2.1. Multiple Tools, Each With One Destination (OpenAI recommended)\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\",\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n },\n ],\n },\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-456\",\n \"description\": \"customer wants to be handed off to assistant-456\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\n2.2. One Tool, Multiple Destinations (Anthropic recommended)\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\",\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n },\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-456\",\n \"description\": \"customer wants to be handed off to assistant-456\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\n3. Dynamic destination\n\n3.1 To determine the destination dynamically, supply a `dynamic` handoff destination type and a `server` object.\n VAPI will send a handoff-destination-request webhook to the `server.url`.\n The response from the server will be used as the destination (if valid).\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"dynamic\",\n \"server\": {\n \"url\": \"https://example.com\"\n }\n }\n ],\n }\n ]\n}\n```\n\n3.2. To pass custom parameters to the server, you can use the `function` object.\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"dynamic\",\n \"server\": {\n \"url\": \"https://example.com\"\n },\n }\n ],\n \"function\": {\n \"name\": \"handoff\",\n \"description\": \"Call this function when the customer is ready to be handed off to the next assistant\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"destination\": {\n \"type\": \"string\",\n \"description\": \"Use dynamic when customer is ready to be handed off to the next assistant\",\n \"enum\": [\"dynamic\"]\n },\n \"customerAreaCode\": {\n \"type\": \"number\",\n \"description\": \"Area code of the customer\"\n },\n \"customerIntent\": {\n \"type\": \"string\",\n \"enum\": [\"new-customer\", \"existing-customer\"],\n \"description\": \"Use new-customer when customer is a new customer, existing-customer when customer is an existing customer\"\n },\n \"customerSentiment\": {\n \"type\": \"string\",\n \"enum\": [\"positive\", \"negative\", \"neutral\"],\n \"description\": \"Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral\"\n }\n }\n }\n }\n }\n ]\n}\n```\n\nThe properties `customerAreaCode`, `customerIntent`, and `customerSentiment` will be passed to the server in the webhook request body.",
"items": {
- "$ref": "#/components/schemas/CodeToolEnvironmentVariable"
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/HandoffDestinationAssistant",
+ "title": "Assistant"
+ },
+ {
+ "$ref": "#/components/schemas/HandoffDestinationDynamic",
+ "title": "Dynamic"
+ },
+ {
+ "$ref": "#/components/schemas/HandoffDestinationSquad",
+ "title": "Squad"
+ }
+ ]
}
},
- "timeoutSeconds": {
- "type": "number",
- "description": "This is the timeout in seconds for the code execution. Defaults to 10 seconds.\nMaximum is 30 seconds to prevent abuse.\n\n@default 10",
- "minimum": 1,
- "maximum": 30,
- "example": 10
- },
- "credentialId": {
- "type": "string",
- "description": "Credential ID containing the Val Town API key",
- "example": "550e8400-e29b-41d4-a716-446655440000"
- },
- "variableExtractionPlan": {
- "description": "Plan to extract variables from the tool response",
- "allOf": [
- {
- "$ref": "#/components/schemas/VariableExtractionPlan"
- }
- ]
- },
"id": {
"type": "string",
"description": "This is the unique identifier for the tool."
@@ -39722,7 +48666,7 @@
]
},
"function": {
- "description": "This is the function definition of the tool.\n\nFor the Code tool, this defines the name, description, and parameters that the model\nwill use to understand when and how to call this tool.",
+ "description": "This is the optional function definition that will be passed to the LLM.\nIf this is not defined, we will construct this based on the other properties.\n\nFor example, given the following tools definition:\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\",\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n },\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-456\",\n \"description\": \"customer wants to be handed off to assistant-456\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\nWe will construct the following function definition:\n```json\n{\n \"function\": {\n \"name\": \"handoff_to_assistant-123\",\n \"description\": \"\n Use this function to handoff the call to the next assistant.\n Only use it when instructions explicitly ask you to use the handoff_to_assistant function.\n DO NOT call this function unless you are instructed to do so.\n Here are the destinations you can handoff the call to:\n 1. assistant-123. When: customer wants to be handed off to assistant-123\n 2. assistant-456. When: customer wants to be handed off to assistant-456\n \",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"destination\": {\n \"type\": \"string\",\n \"description\": \"Options: assistant-123 (customer wants to be handed off to assistant-123), assistant-456 (customer wants to be handed off to assistant-456)\",\n \"enum\": [\"assistant-123\", \"assistant-456\"]\n },\n },\n \"required\": [\"destination\"]\n }\n }\n}\n```\n\nTo override this function, please provide an OpenAI function definition and refer to it in the system prompt.\nYou may override parts of the function definition (i.e. you may only want to change the function name for your prompt).\nIf 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`.\n\nTo pass custom parameters to the server in a dynamic handoff, you can use the function parameters, with `dynamic` as the destination.\n```json\n{\n \"function\": {\n \"name\": \"dynamic_handoff\",\n \"description\": \"\n Call this function when the customer is ready to be handed off to the next assistant\n \",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"destination\": {\n \"type\": \"string\",\n \"enum\": [\"dynamic\"]\n },\n \"customerAreaCode\": {\n \"type\": \"number\",\n \"description\": \"Area code of the customer\"\n },\n \"customerIntent\": {\n \"type\": \"string\",\n \"enum\": [\"new-customer\", \"existing-customer\"],\n \"description\": \"Use new-customer when customer is a new customer, existing-customer when customer is an existing customer\"\n },\n \"customerSentiment\": {\n \"type\": \"string\",\n \"enum\": [\"positive\", \"negative\", \"neutral\"],\n \"description\": \"Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral\"\n }\n },\n \"required\": [\"destination\", \"customerAreaCode\", \"customerIntent\", \"customerSentiment\"]\n }\n }\n}\n```",
"allOf": [
{
"$ref": "#/components/schemas/OpenAIFunction"
@@ -39732,19 +48676,22 @@
},
"required": [
"type",
- "code",
"id",
"orgId",
"createdAt",
"updatedAt"
]
},
- "DtmfTool": {
+ "OutputTool": {
"type": "object",
"properties": {
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
+ },
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -39769,14 +48716,9 @@
"type": {
"type": "string",
"enum": [
- "dtmf"
+ "output"
],
- "description": "The type of tool. \"dtmf\" for DTMF tool."
- },
- "sipInfoDtmfEnabled": {
- "type": "boolean",
- "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.",
- "default": false
+ "description": "The type of tool. \"output\" for Output tool."
},
"id": {
"type": "string",
@@ -39813,12 +48755,16 @@
"updatedAt"
]
},
- "EndCallTool": {
+ "BashTool": {
"type": "object",
"properties": {
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
+ },
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -39843,9 +48789,24 @@
"type": {
"type": "string",
"enum": [
- "endCall"
+ "bash"
],
- "description": "The type of tool. \"endCall\" for End Call tool."
+ "description": "The type of tool. \"bash\" for Bash tool."
+ },
+ "subType": {
+ "type": "string",
+ "enum": [
+ "bash_20241022"
+ ],
+ "description": "The sub type of tool."
+ },
+ "server": {
+ "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Server"
+ }
+ ]
},
"id": {
"type": "string",
@@ -39872,22 +48833,36 @@
"$ref": "#/components/schemas/ToolRejectionPlan"
}
]
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the tool, fixed to 'bash'",
+ "default": "bash",
+ "enum": [
+ "bash"
+ ]
}
},
"required": [
"type",
+ "subType",
"id",
"orgId",
"createdAt",
- "updatedAt"
+ "updatedAt",
+ "name"
]
},
- "FunctionTool": {
+ "ComputerTool": {
"type": "object",
"properties": {
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
+ },
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -39912,14 +48887,16 @@
"type": {
"type": "string",
"enum": [
- "function"
+ "computer"
],
- "description": "The type of tool. \"function\" for Function tool."
+ "description": "The type of tool. \"computer\" for Computer tool."
},
- "async": {
- "type": "boolean",
- "example": false,
- "description": "This determines if the tool is async.\n\n 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.\n\n 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.\n\n Defaults to synchronous (`false`)."
+ "subType": {
+ "type": "string",
+ "enum": [
+ "computer_20241022"
+ ],
+ "description": "The sub type of tool."
},
"server": {
"description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
@@ -39929,21 +48906,6 @@
}
]
},
- "variableExtractionPlan": {
- "description": "Plan to extract variables from the tool response",
- "allOf": [
- {
- "$ref": "#/components/schemas/VariableExtractionPlan"
- }
- ]
- },
- "parameters": {
- "description": "Static key-value pairs merged into the request body. Values support Liquid templates.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/ToolParameter"
- }
- },
"id": {
"type": "string",
"description": "This is the unique identifier for the tool."
@@ -39970,29 +48932,49 @@
}
]
},
- "function": {
- "description": "This is the function definition of the tool.",
- "allOf": [
- {
- "$ref": "#/components/schemas/OpenAIFunction"
- }
+ "name": {
+ "type": "string",
+ "description": "The name of the tool, fixed to 'computer'",
+ "default": "computer",
+ "enum": [
+ "computer"
]
+ },
+ "displayWidthPx": {
+ "type": "number",
+ "description": "The display width in pixels"
+ },
+ "displayHeightPx": {
+ "type": "number",
+ "description": "The display height in pixels"
+ },
+ "displayNumber": {
+ "type": "number",
+ "description": "Optional display number"
}
},
"required": [
"type",
+ "subType",
"id",
"orgId",
"createdAt",
- "updatedAt"
+ "updatedAt",
+ "name",
+ "displayWidthPx",
+ "displayHeightPx"
]
},
- "GhlTool": {
+ "TextEditorTool": {
"type": "object",
"properties": {
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
+ },
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -40017,9 +48999,24 @@
"type": {
"type": "string",
"enum": [
- "ghl"
+ "textEditor"
],
- "description": "The type of tool. \"ghl\" for GHL tool."
+ "description": "The type of tool. \"textEditor\" for Text Editor tool."
+ },
+ "subType": {
+ "type": "string",
+ "enum": [
+ "text_editor_20241022"
+ ],
+ "description": "The sub type of tool."
+ },
+ "server": {
+ "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Server"
+ }
+ ]
},
"id": {
"type": "string",
@@ -40047,25 +49044,35 @@
}
]
},
- "metadata": {
- "$ref": "#/components/schemas/GhlToolMetadata"
+ "name": {
+ "type": "string",
+ "description": "The name of the tool, fixed to 'str_replace_editor'",
+ "default": "str_replace_editor",
+ "enum": [
+ "str_replace_editor"
+ ]
}
},
"required": [
"type",
+ "subType",
"id",
"orgId",
"createdAt",
"updatedAt",
- "metadata"
+ "name"
]
},
- "MakeTool": {
+ "QueryTool": {
"type": "object",
"properties": {
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
+ },
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -40090,9 +49097,16 @@
"type": {
"type": "string",
"enum": [
- "make"
+ "query"
],
- "description": "The type of tool. \"make\" for Make tool."
+ "description": "The type of tool. \"query\" for Query tool."
+ },
+ "knowledgeBases": {
+ "description": "The knowledge bases to query",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/KnowledgeBase"
+ }
},
"id": {
"type": "string",
@@ -40119,9 +49133,6 @@
"$ref": "#/components/schemas/ToolRejectionPlan"
}
]
- },
- "metadata": {
- "$ref": "#/components/schemas/MakeToolMetadata"
}
},
"required": [
@@ -40129,16 +49140,19 @@
"id",
"orgId",
"createdAt",
- "updatedAt",
- "metadata"
+ "updatedAt"
]
},
- "TransferCallTool": {
+ "GoogleCalendarCreateEventTool": {
"type": "object",
"properties": {
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
+ },
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -40163,28 +49177,9 @@
"type": {
"type": "string",
"enum": [
- "transferCall"
- ]
- },
- "destinations": {
- "type": "array",
- "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.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/TransferDestinationAssistant",
- "title": "Assistant"
- },
- {
- "$ref": "#/components/schemas/TransferDestinationNumber",
- "title": "Number"
- },
- {
- "$ref": "#/components/schemas/TransferDestinationSip",
- "title": "Sip"
- }
- ]
- }
+ "google.calendar.event.create"
+ ],
+ "description": "The type of tool. \"google.calendar.event.create\" for Google Calendar Create Event tool."
},
"id": {
"type": "string",
@@ -40221,12 +49216,16 @@
"updatedAt"
]
},
- "HandoffTool": {
+ "GoogleSheetsRowAppendTool": {
"type": "object",
"properties": {
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
+ },
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -40250,34 +49249,10 @@
},
"type": {
"type": "string",
- "description": "This is the type of the tool.\nWhen you're using handoff tool, we recommend adding this to your system prompt\n---\n# System context\n\nYou are part of a multi-agent system designed to make agent coordination and execution easy. Agents uses two primary abstraction: **Agents** and **Handoffs**. An agent encompasses instructions and tools and can hand off a conversation to another agent when appropriate. Handoffs are achieved by calling a handoff function, generally named `handoff_to_`. Handoffs between agents are handled seamlessly in the background; do not mention or draw attention to these handoffs in your conversation with the user.\n\n# Agent context\n\n{put your agent system prompt here}\n---",
"enum": [
- "handoff"
- ]
- },
- "defaultResult": {
- "type": "string",
- "description": "This is the default local tool result message used when no runtime handoff result override is returned."
- },
- "destinations": {
- "type": "array",
- "description": "These are the destinations that the call can be handed off to.\n\nUsage:\n1. Single destination\n\nUse `assistantId` to handoff the call to a saved assistant, or `assistantName` to handoff the call to an assistant in the same squad.\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\", // or \"assistantName\": \"Assistant123\"\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\n2. Multiple destinations\n\n2.1. Multiple Tools, Each With One Destination (OpenAI recommended)\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\",\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n },\n ],\n },\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-456\",\n \"description\": \"customer wants to be handed off to assistant-456\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\n2.2. One Tool, Multiple Destinations (Anthropic recommended)\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\",\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n },\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-456\",\n \"description\": \"customer wants to be handed off to assistant-456\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\n3. Dynamic destination\n\n3.1 To determine the destination dynamically, supply a `dynamic` handoff destination type and a `server` object.\n VAPI will send a handoff-destination-request webhook to the `server.url`.\n The response from the server will be used as the destination (if valid).\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"dynamic\",\n \"server\": {\n \"url\": \"https://example.com\"\n }\n }\n ],\n }\n ]\n}\n```\n\n3.2. To pass custom parameters to the server, you can use the `function` object.\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"dynamic\",\n \"server\": {\n \"url\": \"https://example.com\"\n },\n }\n ],\n \"function\": {\n \"name\": \"handoff\",\n \"description\": \"Call this function when the customer is ready to be handed off to the next assistant\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"destination\": {\n \"type\": \"string\",\n \"description\": \"Use dynamic when customer is ready to be handed off to the next assistant\",\n \"enum\": [\"dynamic\"]\n },\n \"customerAreaCode\": {\n \"type\": \"number\",\n \"description\": \"Area code of the customer\"\n },\n \"customerIntent\": {\n \"type\": \"string\",\n \"enum\": [\"new-customer\", \"existing-customer\"],\n \"description\": \"Use new-customer when customer is a new customer, existing-customer when customer is an existing customer\"\n },\n \"customerSentiment\": {\n \"type\": \"string\",\n \"enum\": [\"positive\", \"negative\", \"neutral\"],\n \"description\": \"Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral\"\n }\n }\n }\n }\n }\n ]\n}\n```\n\nThe properties `customerAreaCode`, `customerIntent`, and `customerSentiment` will be passed to the server in the webhook request body.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/HandoffDestinationAssistant",
- "title": "Assistant"
- },
- {
- "$ref": "#/components/schemas/HandoffDestinationDynamic",
- "title": "Dynamic"
- },
- {
- "$ref": "#/components/schemas/HandoffDestinationSquad",
- "title": "Squad"
- }
- ]
- }
+ "google.sheets.row.append"
+ ],
+ "description": "The type of tool. \"google.sheets.row.append\" for Google Sheets Row Append tool."
},
"id": {
"type": "string",
@@ -40304,14 +49279,6 @@
"$ref": "#/components/schemas/ToolRejectionPlan"
}
]
- },
- "function": {
- "description": "This is the optional function definition that will be passed to the LLM.\nIf this is not defined, we will construct this based on the other properties.\n\nFor example, given the following tools definition:\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\",\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n },\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-456\",\n \"description\": \"customer wants to be handed off to assistant-456\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\nWe will construct the following function definition:\n```json\n{\n \"function\": {\n \"name\": \"handoff_to_assistant-123\",\n \"description\": \"\n Use this function to handoff the call to the next assistant.\n Only use it when instructions explicitly ask you to use the handoff_to_assistant function.\n DO NOT call this function unless you are instructed to do so.\n Here are the destinations you can handoff the call to:\n 1. assistant-123. When: customer wants to be handed off to assistant-123\n 2. assistant-456. When: customer wants to be handed off to assistant-456\n \",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"destination\": {\n \"type\": \"string\",\n \"description\": \"Options: assistant-123 (customer wants to be handed off to assistant-123), assistant-456 (customer wants to be handed off to assistant-456)\",\n \"enum\": [\"assistant-123\", \"assistant-456\"]\n },\n },\n \"required\": [\"destination\"]\n }\n }\n}\n```\n\nTo override this function, please provide an OpenAI function definition and refer to it in the system prompt.\nYou may override parts of the function definition (i.e. you may only want to change the function name for your prompt).\nIf 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`.\n\nTo pass custom parameters to the server in a dynamic handoff, you can use the function parameters, with `dynamic` as the destination.\n```json\n{\n \"function\": {\n \"name\": \"dynamic_handoff\",\n \"description\": \"\n Call this function when the customer is ready to be handed off to the next assistant\n \",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"destination\": {\n \"type\": \"string\",\n \"enum\": [\"dynamic\"]\n },\n \"customerAreaCode\": {\n \"type\": \"number\",\n \"description\": \"Area code of the customer\"\n },\n \"customerIntent\": {\n \"type\": \"string\",\n \"enum\": [\"new-customer\", \"existing-customer\"],\n \"description\": \"Use new-customer when customer is a new customer, existing-customer when customer is an existing customer\"\n },\n \"customerSentiment\": {\n \"type\": \"string\",\n \"enum\": [\"positive\", \"negative\", \"neutral\"],\n \"description\": \"Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral\"\n }\n },\n \"required\": [\"destination\", \"customerAreaCode\", \"customerIntent\", \"customerSentiment\"]\n }\n }\n}\n```",
- "allOf": [
- {
- "$ref": "#/components/schemas/OpenAIFunction"
- }
- ]
}
},
"required": [
@@ -40322,12 +49289,16 @@
"updatedAt"
]
},
- "OutputTool": {
+ "GoogleCalendarCheckAvailabilityTool": {
"type": "object",
"properties": {
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
+ },
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -40352,9 +49323,9 @@
"type": {
"type": "string",
"enum": [
- "output"
+ "google.calendar.availability.check"
],
- "description": "The type of tool. \"output\" for Output tool."
+ "description": "The type of tool. \"google.calendar.availability.check\" for Google Calendar Check Availability tool."
},
"id": {
"type": "string",
@@ -40391,12 +49362,16 @@
"updatedAt"
]
},
- "BashTool": {
+ "SlackSendMessageTool": {
"type": "object",
"properties": {
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
+ },
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -40421,24 +49396,82 @@
"type": {
"type": "string",
"enum": [
- "bash"
+ "slack.message.send"
],
- "description": "The type of tool. \"bash\" for Bash tool."
+ "description": "The type of tool. \"slack.message.send\" for Slack Send Message tool."
},
- "subType": {
+ "id": {
"type": "string",
- "enum": [
- "bash_20241022"
- ],
- "description": "The sub type of tool."
+ "description": "This is the unique identifier for the tool."
},
- "server": {
- "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
+ "orgId": {
+ "type": "string",
+ "description": "This is the unique identifier for the organization that this tool belongs to."
+ },
+ "createdAt": {
+ "format": "date-time",
+ "type": "string",
+ "description": "This is the ISO 8601 date-time string of when the tool was created."
+ },
+ "updatedAt": {
+ "format": "date-time",
+ "type": "string",
+ "description": "This is the ISO 8601 date-time string of when the tool was last updated."
+ },
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
"allOf": [
{
- "$ref": "#/components/schemas/Server"
+ "$ref": "#/components/schemas/ToolRejectionPlan"
}
]
+ }
+ },
+ "required": [
+ "type",
+ "id",
+ "orgId",
+ "createdAt",
+ "updatedAt"
+ ]
+ },
+ "SmsTool": {
+ "type": "object",
+ "properties": {
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
+ },
+ "messages": {
+ "type": "array",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
+ }
+ ]
+ }
+ },
+ "type": {
+ "type": "string",
+ "enum": [
+ "sms"
+ ],
+ "description": "The type of tool. \"sms\" for Twilio SMS sending tool."
},
"id": {
"type": "string",
@@ -40465,32 +49498,26 @@
"$ref": "#/components/schemas/ToolRejectionPlan"
}
]
- },
- "name": {
- "type": "string",
- "description": "The name of the tool, fixed to 'bash'",
- "default": "bash",
- "enum": [
- "bash"
- ]
}
},
"required": [
"type",
- "subType",
"id",
"orgId",
"createdAt",
- "updatedAt",
- "name"
+ "updatedAt"
]
},
- "ComputerTool": {
+ "McpTool": {
"type": "object",
"properties": {
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
+ },
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -40515,16 +49542,9 @@
"type": {
"type": "string",
"enum": [
- "computer"
- ],
- "description": "The type of tool. \"computer\" for Computer tool."
- },
- "subType": {
- "type": "string",
- "enum": [
- "computer_20241022"
+ "mcp"
],
- "description": "The sub type of tool."
+ "description": "The type of tool. \"mcp\" for MCP tool."
},
"server": {
"description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
@@ -40534,6 +49554,13 @@
}
]
},
+ "toolMessages": {
+ "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.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/McpToolMessages"
+ }
+ },
"id": {
"type": "string",
"description": "This is the unique identifier for the tool."
@@ -40560,45 +49587,28 @@
}
]
},
- "name": {
- "type": "string",
- "description": "The name of the tool, fixed to 'computer'",
- "default": "computer",
- "enum": [
- "computer"
- ]
- },
- "displayWidthPx": {
- "type": "number",
- "description": "The display width in pixels"
- },
- "displayHeightPx": {
- "type": "number",
- "description": "The display height in pixels"
- },
- "displayNumber": {
- "type": "number",
- "description": "Optional display number"
+ "metadata": {
+ "$ref": "#/components/schemas/McpToolMetadata"
}
},
"required": [
"type",
- "subType",
"id",
"orgId",
"createdAt",
- "updatedAt",
- "name",
- "displayWidthPx",
- "displayHeightPx"
+ "updatedAt"
]
},
- "TextEditorTool": {
+ "GoHighLevelCalendarAvailabilityTool": {
"type": "object",
"properties": {
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
+ },
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -40623,24 +49633,9 @@
"type": {
"type": "string",
"enum": [
- "textEditor"
- ],
- "description": "The type of tool. \"textEditor\" for Text Editor tool."
- },
- "subType": {
- "type": "string",
- "enum": [
- "text_editor_20241022"
+ "gohighlevel.calendar.availability.check"
],
- "description": "The sub type of tool."
- },
- "server": {
- "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
- "allOf": [
- {
- "$ref": "#/components/schemas/Server"
- }
- ]
+ "description": "The type of tool. \"gohighlevel.calendar.availability.check\" for GoHighLevel Calendar Availability Check tool."
},
"id": {
"type": "string",
@@ -40667,32 +49662,26 @@
"$ref": "#/components/schemas/ToolRejectionPlan"
}
]
- },
- "name": {
- "type": "string",
- "description": "The name of the tool, fixed to 'str_replace_editor'",
- "default": "str_replace_editor",
- "enum": [
- "str_replace_editor"
- ]
}
},
"required": [
"type",
- "subType",
"id",
"orgId",
"createdAt",
- "updatedAt",
- "name"
+ "updatedAt"
]
},
- "QueryTool": {
+ "GoHighLevelCalendarEventCreateTool": {
"type": "object",
"properties": {
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
+ },
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -40717,16 +49706,9 @@
"type": {
"type": "string",
"enum": [
- "query"
+ "gohighlevel.calendar.event.create"
],
- "description": "The type of tool. \"query\" for Query tool."
- },
- "knowledgeBases": {
- "description": "The knowledge bases to query",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/KnowledgeBase"
- }
+ "description": "The type of tool. \"gohighlevel.calendar.event.create\" for GoHighLevel Calendar Event Create tool."
},
"id": {
"type": "string",
@@ -40763,12 +49745,16 @@
"updatedAt"
]
},
- "GoogleCalendarCreateEventTool": {
+ "GoHighLevelContactCreateTool": {
"type": "object",
"properties": {
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
+ },
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -40793,9 +49779,9 @@
"type": {
"type": "string",
"enum": [
- "google.calendar.event.create"
+ "gohighlevel.contact.create"
],
- "description": "The type of tool. \"google.calendar.event.create\" for Google Calendar Create Event tool."
+ "description": "The type of tool. \"gohighlevel.contact.create\" for GoHighLevel Contact Create tool."
},
"id": {
"type": "string",
@@ -40832,12 +49818,16 @@
"updatedAt"
]
},
- "GoogleSheetsRowAppendTool": {
+ "GoHighLevelContactGetTool": {
"type": "object",
"properties": {
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
+ },
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -40862,9 +49852,9 @@
"type": {
"type": "string",
"enum": [
- "google.sheets.row.append"
+ "gohighlevel.contact.get"
],
- "description": "The type of tool. \"google.sheets.row.append\" for Google Sheets Row Append tool."
+ "description": "The type of tool. \"gohighlevel.contact.get\" for GoHighLevel Contact Get tool."
},
"id": {
"type": "string",
@@ -40901,12 +49891,16 @@
"updatedAt"
]
},
- "GoogleCalendarCheckAvailabilityTool": {
+ "SipRequestTool": {
"type": "object",
"properties": {
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
+ },
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -40931,9 +49925,37 @@
"type": {
"type": "string",
"enum": [
- "google.calendar.availability.check"
+ "sipRequest"
],
- "description": "The type of tool. \"google.calendar.availability.check\" for Google Calendar Check Availability tool."
+ "description": "The type of tool. \"sipRequest\" for SIP request tool."
+ },
+ "verb": {
+ "type": "string",
+ "enum": [
+ "INFO",
+ "MESSAGE",
+ "NOTIFY"
+ ],
+ "description": "The SIP method to send."
+ },
+ "headers": {
+ "description": "JSON schema for headers the model should populate when sending the SIP request.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/JsonSchema"
+ }
+ ]
+ },
+ "body": {
+ "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.",
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "$ref": "#/components/schemas/JsonSchema"
+ }
+ ]
},
"id": {
"type": "string",
@@ -40964,18 +49986,23 @@
},
"required": [
"type",
+ "verb",
"id",
"orgId",
"createdAt",
"updatedAt"
]
},
- "SlackSendMessageTool": {
+ "VoicemailTool": {
"type": "object",
"properties": {
+ "latestVersion": {
+ "type": "string",
+ "nullable": true
+ },
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -40999,10 +50026,16 @@
},
"type": {
"type": "string",
+ "description": "The type of tool. \"voicemail\" for Voicemail tool.",
"enum": [
- "slack.message.send"
- ],
- "description": "The type of tool. \"slack.message.send\" for Slack Send Message tool."
+ "voicemail"
+ ]
+ },
+ "beepDetectionEnabled": {
+ "type": "boolean",
+ "description": "This is the flag that enables beep detection for voicemail detection and applies only for twilio based calls.\n\n@default false",
+ "default": false,
+ "example": false
},
"id": {
"type": "string",
@@ -41039,12 +50072,12 @@
"updatedAt"
]
},
- "SmsTool": {
+ "CreateApiRequestToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -41069,27 +50102,91 @@
"type": {
"type": "string",
"enum": [
- "sms"
+ "apiRequest"
],
- "description": "The type of tool. \"sms\" for Twilio SMS sending tool."
+ "description": "The type of tool. \"apiRequest\" for API request tool."
},
- "id": {
+ "name": {
"type": "string",
- "description": "This is the unique identifier for the tool."
+ "description": "This is the name of the tool. This will be passed to the model.\n\nMust be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 40.",
+ "maxLength": 40,
+ "pattern": "/^[a-zA-Z0-9_-]{1,40}$/"
},
- "orgId": {
+ "method": {
"type": "string",
- "description": "This is the unique identifier for the organization that this tool belongs to."
+ "enum": [
+ "POST",
+ "GET",
+ "PUT",
+ "PATCH",
+ "DELETE"
+ ]
},
- "createdAt": {
- "format": "date-time",
+ "timeoutSeconds": {
+ "type": "number",
+ "description": "This is the timeout in seconds for the request. Defaults to 20 seconds.\n\n@default 20",
+ "minimum": 1,
+ "maximum": 300,
+ "example": 20
+ },
+ "credentialId": {
"type": "string",
- "description": "This is the ISO 8601 date-time string of when the tool was created."
+ "description": "The credential ID for API request authentication",
+ "example": "550e8400-e29b-41d4-a716-446655440000"
},
- "updatedAt": {
- "format": "date-time",
+ "encryptedPaths": {
+ "type": "array",
+ "description": "This is the paths to encrypt in the request body if credentialId and encryptionPlan are defined.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "parameters": {
+ "description": "Static key-value pairs merged into the request body. Values support Liquid templates.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolParameter"
+ }
+ },
+ "description": {
"type": "string",
- "description": "This is the ISO 8601 date-time string of when the tool was last updated."
+ "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": {
+ "description": "This is the body of the request.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/JsonSchema"
+ }
+ ]
+ },
+ "headers": {
+ "description": "These are the headers to send with the request.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/JsonSchema"
+ }
+ ]
+ },
+ "backoffPlan": {
+ "description": "This is the backoff plan if the request fails. Defaults to undefined (the request will not be retried).\n\n@default undefined (the request will not be retried)",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BackoffPlan"
+ }
+ ]
+ },
+ "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.\n\nUsage:\n1. Use `aliases` to extract variables from the tool's response body. (Most common case)\n\n```json\n{\n \"aliases\": [\n {\n \"key\": \"customerName\",\n \"value\": \"{{customer.name}}\"\n },\n {\n \"key\": \"customerAge\",\n \"value\": \"{{customer.age}}\"\n }\n ]\n}\n```\n\nThe tool response body is made available to the liquid template.\n\n2. Use `aliases` to extract variables from the tool's response body if the response is an array.\n\n```json\n{\n \"aliases\": [\n {\n \"key\": \"customerName\",\n \"value\": \"{{$[0].name}}\"\n },\n {\n \"key\": \"customerAge\",\n \"value\": \"{{$[0].age}}\"\n }\n ]\n}\n```\n\n$ 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).\n\n3. Use `aliases` to extract variables from the tool's response headers.\n\n```json\n{\n \"aliases\": [\n {\n \"key\": \"customerName\",\n \"value\": \"{{tool.response.headers.customer-name}}\"\n },\n {\n \"key\": \"customerAge\",\n \"value\": \"{{tool.response.headers.customer-age}}\"\n }\n ]\n}\n```\n\n`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).\n\n4. Use `schema` to extract a large portion of the tool's response body.\n\n4.1. If you hit example.com and it returns `{\"name\": \"John\", \"age\": 30}`, then you can specify the schema as:\n\n```json\n{\n \"schema\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"age\": {\n \"type\": \"number\"\n }\n }\n }\n}\n```\nThese will be extracted as `{{ name }}` and `{{ age }}` respectively. To emphasize, object properties are extracted as direct global variables.\n\n4.2. If you hit example.com and it returns `{\"name\": {\"first\": \"John\", \"last\": \"Doe\"}}`, then you can specify the schema as:\n\n```json\n{\n \"schema\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"object\",\n \"properties\": {\n \"first\": {\n \"type\": \"string\"\n },\n \"last\": {\n \"type\": \"string\"\n }\n }\n }\n }\n }\n}\n```\n\nThese will be extracted as `{{ name }}`. And, `{{ name.first }}` and `{{ name.last }}` will be accessible.\n\n4.3. If you hit example.com and it returns `[\"94123\", \"94124\"]`, then you can specify the schema as:\n\n```json\n{\n \"schema\": {\n \"type\": \"array\",\n \"title\": \"zipCodes\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n}\n```\n\nThis will be extracted as `{{ zipCodes }}`. To access the array items, you can use `{{ zipCodes[0] }}` and `{{ zipCodes[1] }}`.\n\n4.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:\n\n```json\n{\n \"schema\": {\n \"type\": \"array\",\n \"title\": \"people\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"age\": {\n \"type\": \"number\"\n },\n \"zipCodes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n }\n }\n }\n}\n```\n\nThis 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] }}`.\n\nNote: Both `aliases` and `schema` can be used together.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/VariableExtractionPlan"
+ }
+ ]
},
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
@@ -41102,18 +50199,16 @@
},
"required": [
"type",
- "id",
- "orgId",
- "createdAt",
- "updatedAt"
+ "method",
+ "url"
]
},
- "McpTool": {
+ "CreateCodeToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -41138,9 +50233,14 @@
"type": {
"type": "string",
"enum": [
- "mcp"
+ "code"
],
- "description": "The type of tool. \"mcp\" for MCP tool."
+ "description": "The type of tool. \"code\" for Code tool."
+ },
+ "async": {
+ "type": "boolean",
+ "example": false,
+ "description": "This determines if the tool is async.\n\n 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.\n\n 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.\n\n Defaults to synchronous (`false`)."
},
"server": {
"description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
@@ -41150,30 +50250,45 @@
}
]
},
- "toolMessages": {
- "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.",
+ "code": {
+ "type": "string",
+ "description": "TypeScript code to execute when the tool is called",
+ "maxLength": 50000
+ },
+ "environmentVariables": {
+ "description": "Environment variables available in code via `env` object",
"type": "array",
"items": {
- "$ref": "#/components/schemas/McpToolMessages"
+ "$ref": "#/components/schemas/CodeToolEnvironmentVariable"
}
},
- "id": {
- "type": "string",
- "description": "This is the unique identifier for the tool."
+ "timeoutSeconds": {
+ "type": "number",
+ "description": "This is the timeout in seconds for the code execution. Defaults to 10 seconds.\nMaximum is 30 seconds to prevent abuse.\n\n@default 10",
+ "minimum": 1,
+ "maximum": 30,
+ "example": 10
},
- "orgId": {
+ "credentialId": {
"type": "string",
- "description": "This is the unique identifier for the organization that this tool belongs to."
+ "description": "Credential ID containing the Val Town API key",
+ "example": "550e8400-e29b-41d4-a716-446655440000"
},
- "createdAt": {
- "format": "date-time",
- "type": "string",
- "description": "This is the ISO 8601 date-time string of when the tool was created."
+ "variableExtractionPlan": {
+ "description": "Plan to extract variables from the tool response",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/VariableExtractionPlan"
+ }
+ ]
},
- "updatedAt": {
- "format": "date-time",
- "type": "string",
- "description": "This is the ISO 8601 date-time string of when the tool was last updated."
+ "function": {
+ "description": "This is the function definition of the tool.\n\nFor the Code tool, this defines the name, description, and parameters that the model\nwill use to understand when and how to call this tool.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/OpenAIFunction"
+ }
+ ]
},
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
@@ -41182,25 +50297,19 @@
"$ref": "#/components/schemas/ToolRejectionPlan"
}
]
- },
- "metadata": {
- "$ref": "#/components/schemas/McpToolMetadata"
}
},
"required": [
"type",
- "id",
- "orgId",
- "createdAt",
- "updatedAt"
+ "code"
]
},
- "GoHighLevelCalendarAvailabilityTool": {
+ "CreateOutputToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -41225,27 +50334,9 @@
"type": {
"type": "string",
"enum": [
- "gohighlevel.calendar.availability.check"
+ "output"
],
- "description": "The type of tool. \"gohighlevel.calendar.availability.check\" for GoHighLevel Calendar Availability Check 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": {
- "format": "date-time",
- "type": "string",
- "description": "This is the ISO 8601 date-time string of when the tool was created."
- },
- "updatedAt": {
- "format": "date-time",
- "type": "string",
- "description": "This is the ISO 8601 date-time string of when the tool was last updated."
+ "description": "The type of tool. \"output\" for Output tool."
},
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
@@ -41257,19 +50348,15 @@
}
},
"required": [
- "type",
- "id",
- "orgId",
- "createdAt",
- "updatedAt"
+ "type"
]
},
- "GoHighLevelCalendarEventCreateTool": {
+ "CreateBashToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -41294,27 +50381,32 @@
"type": {
"type": "string",
"enum": [
- "gohighlevel.calendar.event.create"
+ "bash"
],
- "description": "The type of tool. \"gohighlevel.calendar.event.create\" for GoHighLevel Calendar Event Create tool."
- },
- "id": {
- "type": "string",
- "description": "This is the unique identifier for the tool."
+ "description": "The type of tool. \"bash\" for Bash tool."
},
- "orgId": {
+ "subType": {
"type": "string",
- "description": "This is the unique identifier for the organization that this tool belongs to."
+ "enum": [
+ "bash_20241022"
+ ],
+ "description": "The sub type of tool."
},
- "createdAt": {
- "format": "date-time",
- "type": "string",
- "description": "This is the ISO 8601 date-time string of when the tool was created."
+ "server": {
+ "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Server"
+ }
+ ]
},
- "updatedAt": {
- "format": "date-time",
+ "name": {
"type": "string",
- "description": "This is the ISO 8601 date-time string of when the tool was last updated."
+ "description": "The name of the tool, fixed to 'bash'",
+ "default": "bash",
+ "enum": [
+ "bash"
+ ]
},
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
@@ -41327,18 +50419,16 @@
},
"required": [
"type",
- "id",
- "orgId",
- "createdAt",
- "updatedAt"
+ "subType",
+ "name"
]
},
- "GoHighLevelContactCreateTool": {
+ "CreateComputerToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -41363,27 +50453,44 @@
"type": {
"type": "string",
"enum": [
- "gohighlevel.contact.create"
+ "computer"
],
- "description": "The type of tool. \"gohighlevel.contact.create\" for GoHighLevel Contact Create tool."
+ "description": "The type of tool. \"computer\" for Computer tool."
},
- "id": {
+ "subType": {
"type": "string",
- "description": "This is the unique identifier for the tool."
+ "enum": [
+ "computer_20241022"
+ ],
+ "description": "The sub type of tool."
},
- "orgId": {
- "type": "string",
- "description": "This is the unique identifier for the organization that this tool belongs to."
+ "server": {
+ "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Server"
+ }
+ ]
},
- "createdAt": {
- "format": "date-time",
+ "name": {
"type": "string",
- "description": "This is the ISO 8601 date-time string of when the tool was created."
+ "description": "The name of the tool, fixed to 'computer'",
+ "default": "computer",
+ "enum": [
+ "computer"
+ ]
},
- "updatedAt": {
- "format": "date-time",
- "type": "string",
- "description": "This is the ISO 8601 date-time string of when the tool was last updated."
+ "displayWidthPx": {
+ "type": "number",
+ "description": "The display width in pixels"
+ },
+ "displayHeightPx": {
+ "type": "number",
+ "description": "The display height in pixels"
+ },
+ "displayNumber": {
+ "type": "number",
+ "description": "Optional display number"
},
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
@@ -41396,18 +50503,18 @@
},
"required": [
"type",
- "id",
- "orgId",
- "createdAt",
- "updatedAt"
+ "subType",
+ "name",
+ "displayWidthPx",
+ "displayHeightPx"
]
},
- "GoHighLevelContactGetTool": {
+ "CreateTextEditorToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -41432,27 +50539,32 @@
"type": {
"type": "string",
"enum": [
- "gohighlevel.contact.get"
+ "textEditor"
],
- "description": "The type of tool. \"gohighlevel.contact.get\" for GoHighLevel Contact Get tool."
- },
- "id": {
- "type": "string",
- "description": "This is the unique identifier for the tool."
+ "description": "The type of tool. \"textEditor\" for Text Editor tool."
},
- "orgId": {
+ "subType": {
"type": "string",
- "description": "This is the unique identifier for the organization that this tool belongs to."
+ "enum": [
+ "text_editor_20241022"
+ ],
+ "description": "The sub type of tool."
},
- "createdAt": {
- "format": "date-time",
- "type": "string",
- "description": "This is the ISO 8601 date-time string of when the tool was created."
+ "server": {
+ "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Server"
+ }
+ ]
},
- "updatedAt": {
- "format": "date-time",
+ "name": {
"type": "string",
- "description": "This is the ISO 8601 date-time string of when the tool was last updated."
+ "description": "The name of the tool, fixed to 'str_replace_editor'",
+ "default": "str_replace_editor",
+ "enum": [
+ "str_replace_editor"
+ ]
},
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
@@ -41465,18 +50577,16 @@
},
"required": [
"type",
- "id",
- "orgId",
- "createdAt",
- "updatedAt"
+ "subType",
+ "name"
]
},
- "SipRequestTool": {
+ "CreateSmsToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -41501,55 +50611,9 @@
"type": {
"type": "string",
"enum": [
- "sipRequest"
- ],
- "description": "The type of tool. \"sipRequest\" for SIP request tool."
- },
- "verb": {
- "type": "string",
- "enum": [
- "INFO",
- "MESSAGE",
- "NOTIFY"
+ "sms"
],
- "description": "The SIP method to send."
- },
- "headers": {
- "description": "JSON schema for headers the model should populate when sending the SIP request.",
- "allOf": [
- {
- "$ref": "#/components/schemas/JsonSchema"
- }
- ]
- },
- "body": {
- "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.",
- "oneOf": [
- {
- "type": "string"
- },
- {
- "$ref": "#/components/schemas/JsonSchema"
- }
- ]
- },
- "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": {
- "format": "date-time",
- "type": "string",
- "description": "This is the ISO 8601 date-time string of when the tool was created."
- },
- "updatedAt": {
- "format": "date-time",
- "type": "string",
- "description": "This is the ISO 8601 date-time string of when the tool was last updated."
+ "description": "The type of tool. \"sms\" for Twilio SMS sending tool."
},
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
@@ -41561,20 +50625,15 @@
}
},
"required": [
- "type",
- "verb",
- "id",
- "orgId",
- "createdAt",
- "updatedAt"
+ "type"
]
},
- "VoicemailTool": {
+ "CreateSipRequestToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -41598,34 +50657,38 @@
},
"type": {
"type": "string",
- "description": "The type of tool. \"voicemail\" for Voicemail tool.",
"enum": [
- "voicemail"
- ]
- },
- "beepDetectionEnabled": {
- "type": "boolean",
- "description": "This is the flag that enables beep detection for voicemail detection and applies only for twilio based calls.\n\n@default false",
- "default": false,
- "example": false
- },
- "id": {
- "type": "string",
- "description": "This is the unique identifier for the tool."
+ "sipRequest"
+ ],
+ "description": "The type of tool. \"sipRequest\" for SIP request tool."
},
- "orgId": {
+ "verb": {
"type": "string",
- "description": "This is the unique identifier for the organization that this tool belongs to."
+ "enum": [
+ "INFO",
+ "MESSAGE",
+ "NOTIFY"
+ ],
+ "description": "The SIP method to send."
},
- "createdAt": {
- "format": "date-time",
- "type": "string",
- "description": "This is the ISO 8601 date-time string of when the tool was created."
+ "headers": {
+ "description": "JSON schema for headers the model should populate when sending the SIP request.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/JsonSchema"
+ }
+ ]
},
- "updatedAt": {
- "format": "date-time",
- "type": "string",
- "description": "This is the ISO 8601 date-time string of when the tool was last updated."
+ "body": {
+ "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.",
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "$ref": "#/components/schemas/JsonSchema"
+ }
+ ]
},
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
@@ -41638,18 +50701,15 @@
},
"required": [
"type",
- "id",
- "orgId",
- "createdAt",
- "updatedAt"
+ "verb"
]
},
- "CreateApiRequestToolDTO": {
+ "UpdateApiRequestToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -41678,6 +50738,12 @@
],
"description": "The type of tool. \"apiRequest\" for API request tool."
},
+ "name": {
+ "type": "string",
+ "description": "This is the name of the tool. This will be passed to the model.\n\nMust be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 40.",
+ "maxLength": 40,
+ "pattern": "/^[a-zA-Z0-9_-]{1,40}$/"
+ },
"method": {
"type": "string",
"enum": [
@@ -41714,11 +50780,13 @@
"$ref": "#/components/schemas/ToolParameter"
}
},
- "name": {
- "type": "string",
- "description": "This is the name of the tool. This will be passed to the model.\n\nMust be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 40.",
- "maxLength": 40,
- "pattern": "/^[a-zA-Z0-9_-]{1,40}$/"
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ToolRejectionPlan"
+ }
+ ]
},
"description": {
"type": "string",
@@ -41758,29 +50826,16 @@
{
"$ref": "#/components/schemas/VariableExtractionPlan"
}
- ]
- },
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
- "allOf": [
- {
- "$ref": "#/components/schemas/ToolRejectionPlan"
- }
- ]
- }
- },
- "required": [
- "type",
- "method",
- "url"
- ]
+ ]
+ }
+ }
},
- "CreateCodeToolDTO": {
+ "UpdateCodeToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -41854,34 +50909,30 @@
}
]
},
- "function": {
- "description": "This is the function definition of the tool.\n\nFor the Code tool, this defines the name, description, and parameters that the model\nwill use to understand when and how to call this tool.",
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
"allOf": [
{
- "$ref": "#/components/schemas/OpenAIFunction"
+ "$ref": "#/components/schemas/ToolRejectionPlan"
}
]
},
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "function": {
+ "description": "This is the function definition of the tool.\n\nFor the Code tool, this defines the name, description, and parameters that the model\nwill use to understand when and how to call this tool.",
"allOf": [
{
- "$ref": "#/components/schemas/ToolRejectionPlan"
+ "$ref": "#/components/schemas/OpenAIFunction"
}
]
}
- },
- "required": [
- "type",
- "code"
- ]
+ }
},
- "CreateOutputToolDTO": {
+ "UpdateDtmfToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -41906,9 +50957,14 @@
"type": {
"type": "string",
"enum": [
- "output"
+ "dtmf"
],
- "description": "The type of tool. \"output\" for Output tool."
+ "description": "The type of tool. \"dtmf\" for DTMF tool."
+ },
+ "sipInfoDtmfEnabled": {
+ "type": "boolean",
+ "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.",
+ "default": false
},
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
@@ -41918,17 +50974,14 @@
}
]
}
- },
- "required": [
- "type"
- ]
+ }
},
- "CreateBashToolDTO": {
+ "UpdateEndCallToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -41953,32 +51006,9 @@
"type": {
"type": "string",
"enum": [
- "bash"
- ],
- "description": "The type of tool. \"bash\" for Bash tool."
- },
- "subType": {
- "type": "string",
- "enum": [
- "bash_20241022"
+ "endCall"
],
- "description": "The sub type of tool."
- },
- "server": {
- "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
- "allOf": [
- {
- "$ref": "#/components/schemas/Server"
- }
- ]
- },
- "name": {
- "type": "string",
- "description": "The name of the tool, fixed to 'bash'",
- "default": "bash",
- "enum": [
- "bash"
- ]
+ "description": "The type of tool. \"endCall\" for End Call tool."
},
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
@@ -41988,19 +51018,14 @@
}
]
}
- },
- "required": [
- "type",
- "subType",
- "name"
- ]
+ }
},
- "CreateComputerToolDTO": {
+ "UpdateFunctionToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -42025,16 +51050,14 @@
"type": {
"type": "string",
"enum": [
- "computer"
+ "function"
],
- "description": "The type of tool. \"computer\" for Computer tool."
+ "description": "The type of tool. \"function\" for Function tool."
},
- "subType": {
- "type": "string",
- "enum": [
- "computer_20241022"
- ],
- "description": "The sub type of tool."
+ "async": {
+ "type": "boolean",
+ "example": false,
+ "description": "This determines if the tool is async.\n\n 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.\n\n 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.\n\n Defaults to synchronous (`false`)."
},
"server": {
"description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
@@ -42044,25 +51067,20 @@
}
]
},
- "name": {
- "type": "string",
- "description": "The name of the tool, fixed to 'computer'",
- "default": "computer",
- "enum": [
- "computer"
+ "variableExtractionPlan": {
+ "description": "Plan to extract variables from the tool response",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/VariableExtractionPlan"
+ }
]
},
- "displayWidthPx": {
- "type": "number",
- "description": "The display width in pixels"
- },
- "displayHeightPx": {
- "type": "number",
- "description": "The display height in pixels"
- },
- "displayNumber": {
- "type": "number",
- "description": "Optional display number"
+ "parameters": {
+ "description": "Static key-value pairs merged into the request body. Values support Liquid templates.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolParameter"
+ }
},
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
@@ -42071,22 +51089,23 @@
"$ref": "#/components/schemas/ToolRejectionPlan"
}
]
+ },
+ "function": {
+ "description": "This is the function definition of the tool.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/OpenAIFunction"
+ }
+ ]
}
- },
- "required": [
- "type",
- "subType",
- "name",
- "displayWidthPx",
- "displayHeightPx"
- ]
+ }
},
- "CreateTextEditorToolDTO": {
+ "UpdateGhlToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -42111,32 +51130,9 @@
"type": {
"type": "string",
"enum": [
- "textEditor"
- ],
- "description": "The type of tool. \"textEditor\" for Text Editor tool."
- },
- "subType": {
- "type": "string",
- "enum": [
- "text_editor_20241022"
+ "ghl"
],
- "description": "The sub type of tool."
- },
- "server": {
- "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
- "allOf": [
- {
- "$ref": "#/components/schemas/Server"
- }
- ]
- },
- "name": {
- "type": "string",
- "description": "The name of the tool, fixed to 'str_replace_editor'",
- "default": "str_replace_editor",
- "enum": [
- "str_replace_editor"
- ]
+ "description": "The type of tool. \"ghl\" for GHL tool."
},
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
@@ -42145,20 +51141,18 @@
"$ref": "#/components/schemas/ToolRejectionPlan"
}
]
+ },
+ "metadata": {
+ "$ref": "#/components/schemas/GhlToolMetadata"
}
- },
- "required": [
- "type",
- "subType",
- "name"
- ]
+ }
},
- "CreateSmsToolDTO": {
+ "UpdateMakeToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -42183,9 +51177,9 @@
"type": {
"type": "string",
"enum": [
- "sms"
+ "make"
],
- "description": "The type of tool. \"sms\" for Twilio SMS sending tool."
+ "description": "The type of tool. \"make\" for Make tool."
},
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
@@ -42194,18 +51188,18 @@
"$ref": "#/components/schemas/ToolRejectionPlan"
}
]
+ },
+ "metadata": {
+ "$ref": "#/components/schemas/MakeToolMetadata"
}
- },
- "required": [
- "type"
- ]
+ }
},
- "CreateSipRequestToolDTO": {
+ "UpdateHandoffToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -42229,59 +51223,59 @@
},
"type": {
"type": "string",
+ "description": "This is the type of the tool.\nWhen you're using handoff tool, we recommend adding this to your system prompt\n---\n# System context\n\nYou are part of a multi-agent system designed to make agent coordination and execution easy. Agents uses two primary abstraction: **Agents** and **Handoffs**. An agent encompasses instructions and tools and can hand off a conversation to another agent when appropriate. Handoffs are achieved by calling a handoff function, generally named `handoff_to_`. Handoffs between agents are handled seamlessly in the background; do not mention or draw attention to these handoffs in your conversation with the user.\n\n# Agent context\n\n{put your agent system prompt here}\n---",
"enum": [
- "sipRequest"
- ],
- "description": "The type of tool. \"sipRequest\" for SIP request tool."
+ "handoff"
+ ]
},
- "verb": {
+ "defaultResult": {
"type": "string",
- "enum": [
- "INFO",
- "MESSAGE",
- "NOTIFY"
- ],
- "description": "The SIP method to send."
+ "description": "This is the default local tool result message used when no runtime handoff result override is returned."
},
- "headers": {
- "description": "JSON schema for headers the model should populate when sending the SIP request.",
- "allOf": [
- {
- "$ref": "#/components/schemas/JsonSchema"
- }
- ]
+ "destinations": {
+ "type": "array",
+ "description": "These are the destinations that the call can be handed off to.\n\nUsage:\n1. Single destination\n\nUse `assistantId` to handoff the call to a saved assistant, or `assistantName` to handoff the call to an assistant in the same squad.\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\", // or \"assistantName\": \"Assistant123\"\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\n2. Multiple destinations\n\n2.1. Multiple Tools, Each With One Destination (OpenAI recommended)\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\",\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n },\n ],\n },\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-456\",\n \"description\": \"customer wants to be handed off to assistant-456\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\n2.2. One Tool, Multiple Destinations (Anthropic recommended)\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\",\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n },\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-456\",\n \"description\": \"customer wants to be handed off to assistant-456\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\n3. Dynamic destination\n\n3.1 To determine the destination dynamically, supply a `dynamic` handoff destination type and a `server` object.\n VAPI will send a handoff-destination-request webhook to the `server.url`.\n The response from the server will be used as the destination (if valid).\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"dynamic\",\n \"server\": {\n \"url\": \"https://example.com\"\n }\n }\n ],\n }\n ]\n}\n```\n\n3.2. To pass custom parameters to the server, you can use the `function` object.\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"dynamic\",\n \"server\": {\n \"url\": \"https://example.com\"\n },\n }\n ],\n \"function\": {\n \"name\": \"handoff\",\n \"description\": \"Call this function when the customer is ready to be handed off to the next assistant\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"destination\": {\n \"type\": \"string\",\n \"description\": \"Use dynamic when customer is ready to be handed off to the next assistant\",\n \"enum\": [\"dynamic\"]\n },\n \"customerAreaCode\": {\n \"type\": \"number\",\n \"description\": \"Area code of the customer\"\n },\n \"customerIntent\": {\n \"type\": \"string\",\n \"enum\": [\"new-customer\", \"existing-customer\"],\n \"description\": \"Use new-customer when customer is a new customer, existing-customer when customer is an existing customer\"\n },\n \"customerSentiment\": {\n \"type\": \"string\",\n \"enum\": [\"positive\", \"negative\", \"neutral\"],\n \"description\": \"Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral\"\n }\n }\n }\n }\n }\n ]\n}\n```\n\nThe properties `customerAreaCode`, `customerIntent`, and `customerSentiment` will be passed to the server in the webhook request body.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/HandoffDestinationAssistant",
+ "title": "Assistant"
+ },
+ {
+ "$ref": "#/components/schemas/HandoffDestinationDynamic",
+ "title": "Dynamic"
+ },
+ {
+ "$ref": "#/components/schemas/HandoffDestinationSquad",
+ "title": "Squad"
+ }
+ ]
+ }
},
- "body": {
- "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.",
- "oneOf": [
- {
- "type": "string"
- },
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "allOf": [
{
- "$ref": "#/components/schemas/JsonSchema"
+ "$ref": "#/components/schemas/ToolRejectionPlan"
}
]
},
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "function": {
+ "description": "This is the optional function definition that will be passed to the LLM.\nIf this is not defined, we will construct this based on the other properties.\n\nFor example, given the following tools definition:\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\",\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n },\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-456\",\n \"description\": \"customer wants to be handed off to assistant-456\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\nWe will construct the following function definition:\n```json\n{\n \"function\": {\n \"name\": \"handoff_to_assistant-123\",\n \"description\": \"\n Use this function to handoff the call to the next assistant.\n Only use it when instructions explicitly ask you to use the handoff_to_assistant function.\n DO NOT call this function unless you are instructed to do so.\n Here are the destinations you can handoff the call to:\n 1. assistant-123. When: customer wants to be handed off to assistant-123\n 2. assistant-456. When: customer wants to be handed off to assistant-456\n \",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"destination\": {\n \"type\": \"string\",\n \"description\": \"Options: assistant-123 (customer wants to be handed off to assistant-123), assistant-456 (customer wants to be handed off to assistant-456)\",\n \"enum\": [\"assistant-123\", \"assistant-456\"]\n },\n },\n \"required\": [\"destination\"]\n }\n }\n}\n```\n\nTo override this function, please provide an OpenAI function definition and refer to it in the system prompt.\nYou may override parts of the function definition (i.e. you may only want to change the function name for your prompt).\nIf 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`.\n\nTo pass custom parameters to the server in a dynamic handoff, you can use the function parameters, with `dynamic` as the destination.\n```json\n{\n \"function\": {\n \"name\": \"dynamic_handoff\",\n \"description\": \"\n Call this function when the customer is ready to be handed off to the next assistant\n \",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"destination\": {\n \"type\": \"string\",\n \"enum\": [\"dynamic\"]\n },\n \"customerAreaCode\": {\n \"type\": \"number\",\n \"description\": \"Area code of the customer\"\n },\n \"customerIntent\": {\n \"type\": \"string\",\n \"enum\": [\"new-customer\", \"existing-customer\"],\n \"description\": \"Use new-customer when customer is a new customer, existing-customer when customer is an existing customer\"\n },\n \"customerSentiment\": {\n \"type\": \"string\",\n \"enum\": [\"positive\", \"negative\", \"neutral\"],\n \"description\": \"Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral\"\n }\n },\n \"required\": [\"destination\", \"customerAreaCode\", \"customerIntent\", \"customerSentiment\"]\n }\n }\n}\n```",
"allOf": [
{
- "$ref": "#/components/schemas/ToolRejectionPlan"
+ "$ref": "#/components/schemas/OpenAIFunction"
}
]
}
- },
- "required": [
- "type",
- "verb"
- ]
+ }
},
- "UpdateApiRequestToolDTO": {
+ "UpdateTransferCallToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -42303,40 +51297,30 @@
]
}
},
- "method": {
+ "type": {
"type": "string",
"enum": [
- "POST",
- "GET",
- "PUT",
- "PATCH",
- "DELETE"
+ "transferCall"
]
},
- "timeoutSeconds": {
- "type": "number",
- "description": "This is the timeout in seconds for the request. Defaults to 20 seconds.\n\n@default 20",
- "minimum": 1,
- "maximum": 300,
- "example": 20
- },
- "credentialId": {
- "type": "string",
- "description": "The credential ID for API request authentication",
- "example": "550e8400-e29b-41d4-a716-446655440000"
- },
- "encryptedPaths": {
- "type": "array",
- "description": "This is the paths to encrypt in the request body if credentialId and encryptionPlan are defined.",
- "items": {
- "type": "string"
- }
- },
- "parameters": {
- "description": "Static key-value pairs merged into the request body. Values support Liquid templates.",
+ "destinations": {
"type": "array",
+ "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.",
"items": {
- "$ref": "#/components/schemas/ToolParameter"
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/TransferDestinationAssistant",
+ "title": "Assistant"
+ },
+ {
+ "$ref": "#/components/schemas/TransferDestinationNumber",
+ "title": "Number"
+ },
+ {
+ "$ref": "#/components/schemas/TransferDestinationSip",
+ "title": "Sip"
+ }
+ ]
}
},
"rejectionPlan": {
@@ -42346,61 +51330,15 @@
"$ref": "#/components/schemas/ToolRejectionPlan"
}
]
- },
- "name": {
- "type": "string",
- "description": "This is the name of the tool. This will be passed to the model.\n\nMust be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 40.",
- "maxLength": 40,
- "pattern": "/^[a-zA-Z0-9_-]{1,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": {
- "description": "This is the body of the request.",
- "allOf": [
- {
- "$ref": "#/components/schemas/JsonSchema"
- }
- ]
- },
- "headers": {
- "description": "These are the headers to send with the request.",
- "allOf": [
- {
- "$ref": "#/components/schemas/JsonSchema"
- }
- ]
- },
- "backoffPlan": {
- "description": "This is the backoff plan if the request fails. Defaults to undefined (the request will not be retried).\n\n@default undefined (the request will not be retried)",
- "allOf": [
- {
- "$ref": "#/components/schemas/BackoffPlan"
- }
- ]
- },
- "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.\n\nUsage:\n1. Use `aliases` to extract variables from the tool's response body. (Most common case)\n\n```json\n{\n \"aliases\": [\n {\n \"key\": \"customerName\",\n \"value\": \"{{customer.name}}\"\n },\n {\n \"key\": \"customerAge\",\n \"value\": \"{{customer.age}}\"\n }\n ]\n}\n```\n\nThe tool response body is made available to the liquid template.\n\n2. Use `aliases` to extract variables from the tool's response body if the response is an array.\n\n```json\n{\n \"aliases\": [\n {\n \"key\": \"customerName\",\n \"value\": \"{{$[0].name}}\"\n },\n {\n \"key\": \"customerAge\",\n \"value\": \"{{$[0].age}}\"\n }\n ]\n}\n```\n\n$ 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).\n\n3. Use `aliases` to extract variables from the tool's response headers.\n\n```json\n{\n \"aliases\": [\n {\n \"key\": \"customerName\",\n \"value\": \"{{tool.response.headers.customer-name}}\"\n },\n {\n \"key\": \"customerAge\",\n \"value\": \"{{tool.response.headers.customer-age}}\"\n }\n ]\n}\n```\n\n`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).\n\n4. Use `schema` to extract a large portion of the tool's response body.\n\n4.1. If you hit example.com and it returns `{\"name\": \"John\", \"age\": 30}`, then you can specify the schema as:\n\n```json\n{\n \"schema\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"age\": {\n \"type\": \"number\"\n }\n }\n }\n}\n```\nThese will be extracted as `{{ name }}` and `{{ age }}` respectively. To emphasize, object properties are extracted as direct global variables.\n\n4.2. If you hit example.com and it returns `{\"name\": {\"first\": \"John\", \"last\": \"Doe\"}}`, then you can specify the schema as:\n\n```json\n{\n \"schema\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"object\",\n \"properties\": {\n \"first\": {\n \"type\": \"string\"\n },\n \"last\": {\n \"type\": \"string\"\n }\n }\n }\n }\n }\n}\n```\n\nThese will be extracted as `{{ name }}`. And, `{{ name.first }}` and `{{ name.last }}` will be accessible.\n\n4.3. If you hit example.com and it returns `[\"94123\", \"94124\"]`, then you can specify the schema as:\n\n```json\n{\n \"schema\": {\n \"type\": \"array\",\n \"title\": \"zipCodes\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n}\n```\n\nThis will be extracted as `{{ zipCodes }}`. To access the array items, you can use `{{ zipCodes[0] }}` and `{{ zipCodes[1] }}`.\n\n4.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:\n\n```json\n{\n \"schema\": {\n \"type\": \"array\",\n \"title\": \"people\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"age\": {\n \"type\": \"number\"\n },\n \"zipCodes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n }\n }\n }\n}\n```\n\nThis 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] }}`.\n\nNote: Both `aliases` and `schema` can be used together.",
- "allOf": [
- {
- "$ref": "#/components/schemas/VariableExtractionPlan"
- }
- ]
}
}
},
- "UpdateCodeToolDTO": {
+ "UpdateOutputToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -42422,48 +51360,69 @@
]
}
},
- "async": {
- "type": "boolean",
- "example": false,
- "description": "This determines if the tool is async.\n\n 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.\n\n 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.\n\n Defaults to synchronous (`false`)."
+ "type": {
+ "type": "string",
+ "enum": [
+ "output"
+ ],
+ "description": "The type of tool. \"output\" for Output tool."
},
- "server": {
- "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
"allOf": [
{
- "$ref": "#/components/schemas/Server"
+ "$ref": "#/components/schemas/ToolRejectionPlan"
}
]
- },
- "code": {
- "type": "string",
- "description": "TypeScript code to execute when the tool is called",
- "maxLength": 50000
- },
- "environmentVariables": {
- "description": "Environment variables available in code via `env` object",
+ }
+ }
+ },
+ "UpdateBashToolDTO": {
+ "type": "object",
+ "properties": {
+ "messages": {
"type": "array",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
- "$ref": "#/components/schemas/CodeToolEnvironmentVariable"
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/ToolMessageStart",
+ "title": "ToolMessageStart"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageComplete",
+ "title": "ToolMessageComplete"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageFailed",
+ "title": "ToolMessageFailed"
+ },
+ {
+ "$ref": "#/components/schemas/ToolMessageDelayed",
+ "title": "ToolMessageDelayed"
+ }
+ ]
}
},
- "timeoutSeconds": {
- "type": "number",
- "description": "This is the timeout in seconds for the code execution. Defaults to 10 seconds.\nMaximum is 30 seconds to prevent abuse.\n\n@default 10",
- "minimum": 1,
- "maximum": 30,
- "example": 10
+ "type": {
+ "type": "string",
+ "enum": [
+ "bash"
+ ],
+ "description": "The type of tool. \"bash\" for Bash tool."
},
- "credentialId": {
+ "subType": {
"type": "string",
- "description": "Credential ID containing the Val Town API key",
- "example": "550e8400-e29b-41d4-a716-446655440000"
+ "enum": [
+ "bash_20241022"
+ ],
+ "description": "The sub type of tool."
},
- "variableExtractionPlan": {
- "description": "Plan to extract variables from the tool response",
+ "server": {
+ "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
"allOf": [
{
- "$ref": "#/components/schemas/VariableExtractionPlan"
+ "$ref": "#/components/schemas/Server"
}
]
},
@@ -42475,22 +51434,22 @@
}
]
},
- "function": {
- "description": "This is the function definition of the tool.\n\nFor the Code tool, this defines the name, description, and parameters that the model\nwill use to understand when and how to call this tool.",
- "allOf": [
- {
- "$ref": "#/components/schemas/OpenAIFunction"
- }
+ "name": {
+ "type": "string",
+ "description": "The name of the tool, fixed to 'bash'",
+ "default": "bash",
+ "enum": [
+ "bash"
]
}
}
},
- "UpdateDtmfToolDTO": {
+ "UpdateComputerToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -42512,10 +51471,27 @@
]
}
},
- "sipInfoDtmfEnabled": {
- "type": "boolean",
- "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.",
- "default": false
+ "type": {
+ "type": "string",
+ "enum": [
+ "computer"
+ ],
+ "description": "The type of tool. \"computer\" for Computer tool."
+ },
+ "subType": {
+ "type": "string",
+ "enum": [
+ "computer_20241022"
+ ],
+ "description": "The sub type of tool."
+ },
+ "server": {
+ "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Server"
+ }
+ ]
},
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
@@ -42524,15 +51500,35 @@
"$ref": "#/components/schemas/ToolRejectionPlan"
}
]
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the tool, fixed to 'computer'",
+ "default": "computer",
+ "enum": [
+ "computer"
+ ]
+ },
+ "displayWidthPx": {
+ "type": "number",
+ "description": "The display width in pixels"
+ },
+ "displayHeightPx": {
+ "type": "number",
+ "description": "The display height in pixels"
+ },
+ "displayNumber": {
+ "type": "number",
+ "description": "Optional display number"
}
}
},
- "UpdateEndCallToolDTO": {
+ "UpdateTextEditorToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -42554,6 +51550,28 @@
]
}
},
+ "type": {
+ "type": "string",
+ "enum": [
+ "textEditor"
+ ],
+ "description": "The type of tool. \"textEditor\" for Text Editor tool."
+ },
+ "subType": {
+ "type": "string",
+ "enum": [
+ "text_editor_20241022"
+ ],
+ "description": "The sub type of tool."
+ },
+ "server": {
+ "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Server"
+ }
+ ]
+ },
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
"allOf": [
@@ -42561,15 +51579,23 @@
"$ref": "#/components/schemas/ToolRejectionPlan"
}
]
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the tool, fixed to 'str_replace_editor'",
+ "default": "str_replace_editor",
+ "enum": [
+ "str_replace_editor"
+ ]
}
}
},
- "UpdateFunctionToolDTO": {
+ "UpdateQueryToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -42591,32 +51617,18 @@
]
}
},
- "async": {
- "type": "boolean",
- "example": false,
- "description": "This determines if the tool is async.\n\n 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.\n\n 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.\n\n Defaults to synchronous (`false`)."
- },
- "server": {
- "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
- "allOf": [
- {
- "$ref": "#/components/schemas/Server"
- }
- ]
- },
- "variableExtractionPlan": {
- "description": "Plan to extract variables from the tool response",
- "allOf": [
- {
- "$ref": "#/components/schemas/VariableExtractionPlan"
- }
- ]
+ "type": {
+ "type": "string",
+ "enum": [
+ "query"
+ ],
+ "description": "The type of tool. \"query\" for Query tool."
},
- "parameters": {
- "description": "Static key-value pairs merged into the request body. Values support Liquid templates.",
+ "knowledgeBases": {
+ "description": "The knowledge bases to query",
"type": "array",
"items": {
- "$ref": "#/components/schemas/ToolParameter"
+ "$ref": "#/components/schemas/KnowledgeBase"
}
},
"rejectionPlan": {
@@ -42626,23 +51638,15 @@
"$ref": "#/components/schemas/ToolRejectionPlan"
}
]
- },
- "function": {
- "description": "This is the function definition of the tool.",
- "allOf": [
- {
- "$ref": "#/components/schemas/OpenAIFunction"
- }
- ]
}
}
},
- "UpdateGhlToolDTO": {
+ "UpdateGoogleCalendarCreateEventToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -42664,6 +51668,13 @@
]
}
},
+ "type": {
+ "type": "string",
+ "enum": [
+ "google.calendar.event.create"
+ ],
+ "description": "The type of tool. \"google.calendar.event.create\" for Google Calendar Create Event tool."
+ },
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
"allOf": [
@@ -42671,18 +51682,15 @@
"$ref": "#/components/schemas/ToolRejectionPlan"
}
]
- },
- "metadata": {
- "$ref": "#/components/schemas/GhlToolMetadata"
}
}
},
- "UpdateMakeToolDTO": {
+ "UpdateGoogleSheetsRowAppendToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -42704,6 +51712,13 @@
]
}
},
+ "type": {
+ "type": "string",
+ "enum": [
+ "google.sheets.row.append"
+ ],
+ "description": "The type of tool. \"google.sheets.row.append\" for Google Sheets Row Append tool."
+ },
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
"allOf": [
@@ -42711,18 +51726,15 @@
"$ref": "#/components/schemas/ToolRejectionPlan"
}
]
- },
- "metadata": {
- "$ref": "#/components/schemas/MakeToolMetadata"
}
}
},
- "UpdateHandoffToolDTO": {
+ "UpdateGoogleCalendarCheckAvailabilityToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -42744,29 +51756,12 @@
]
}
},
- "defaultResult": {
+ "type": {
"type": "string",
- "description": "This is the default local tool result message used when no runtime handoff result override is returned."
- },
- "destinations": {
- "type": "array",
- "description": "These are the destinations that the call can be handed off to.\n\nUsage:\n1. Single destination\n\nUse `assistantId` to handoff the call to a saved assistant, or `assistantName` to handoff the call to an assistant in the same squad.\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\", // or \"assistantName\": \"Assistant123\"\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\n2. Multiple destinations\n\n2.1. Multiple Tools, Each With One Destination (OpenAI recommended)\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\",\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n },\n ],\n },\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-456\",\n \"description\": \"customer wants to be handed off to assistant-456\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\n2.2. One Tool, Multiple Destinations (Anthropic recommended)\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\",\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n },\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-456\",\n \"description\": \"customer wants to be handed off to assistant-456\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\n3. Dynamic destination\n\n3.1 To determine the destination dynamically, supply a `dynamic` handoff destination type and a `server` object.\n VAPI will send a handoff-destination-request webhook to the `server.url`.\n The response from the server will be used as the destination (if valid).\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"dynamic\",\n \"server\": {\n \"url\": \"https://example.com\"\n }\n }\n ],\n }\n ]\n}\n```\n\n3.2. To pass custom parameters to the server, you can use the `function` object.\n\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"dynamic\",\n \"server\": {\n \"url\": \"https://example.com\"\n },\n }\n ],\n \"function\": {\n \"name\": \"handoff\",\n \"description\": \"Call this function when the customer is ready to be handed off to the next assistant\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"destination\": {\n \"type\": \"string\",\n \"description\": \"Use dynamic when customer is ready to be handed off to the next assistant\",\n \"enum\": [\"dynamic\"]\n },\n \"customerAreaCode\": {\n \"type\": \"number\",\n \"description\": \"Area code of the customer\"\n },\n \"customerIntent\": {\n \"type\": \"string\",\n \"enum\": [\"new-customer\", \"existing-customer\"],\n \"description\": \"Use new-customer when customer is a new customer, existing-customer when customer is an existing customer\"\n },\n \"customerSentiment\": {\n \"type\": \"string\",\n \"enum\": [\"positive\", \"negative\", \"neutral\"],\n \"description\": \"Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral\"\n }\n }\n }\n }\n }\n ]\n}\n```\n\nThe properties `customerAreaCode`, `customerIntent`, and `customerSentiment` will be passed to the server in the webhook request body.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/HandoffDestinationAssistant",
- "title": "Assistant"
- },
- {
- "$ref": "#/components/schemas/HandoffDestinationDynamic",
- "title": "Dynamic"
- },
- {
- "$ref": "#/components/schemas/HandoffDestinationSquad",
- "title": "Squad"
- }
- ]
- }
+ "enum": [
+ "google.calendar.availability.check"
+ ],
+ "description": "The type of tool. \"google.calendar.availability.check\" for Google Calendar Check Availability tool."
},
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
@@ -42775,23 +51770,15 @@
"$ref": "#/components/schemas/ToolRejectionPlan"
}
]
- },
- "function": {
- "description": "This is the optional function definition that will be passed to the LLM.\nIf this is not defined, we will construct this based on the other properties.\n\nFor example, given the following tools definition:\n```json\n{\n \"tools\": [\n {\n \"type\": \"handoff\",\n \"destinations\": [\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-123\",\n \"description\": \"customer wants to be handed off to assistant-123\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n },\n {\n \"type\": \"assistant\",\n \"assistantId\": \"assistant-456\",\n \"description\": \"customer wants to be handed off to assistant-456\",\n \"contextEngineeringPlan\": {\n \"type\": \"all\"\n }\n }\n ],\n }\n ]\n}\n```\n\nWe will construct the following function definition:\n```json\n{\n \"function\": {\n \"name\": \"handoff_to_assistant-123\",\n \"description\": \"\n Use this function to handoff the call to the next assistant.\n Only use it when instructions explicitly ask you to use the handoff_to_assistant function.\n DO NOT call this function unless you are instructed to do so.\n Here are the destinations you can handoff the call to:\n 1. assistant-123. When: customer wants to be handed off to assistant-123\n 2. assistant-456. When: customer wants to be handed off to assistant-456\n \",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"destination\": {\n \"type\": \"string\",\n \"description\": \"Options: assistant-123 (customer wants to be handed off to assistant-123), assistant-456 (customer wants to be handed off to assistant-456)\",\n \"enum\": [\"assistant-123\", \"assistant-456\"]\n },\n },\n \"required\": [\"destination\"]\n }\n }\n}\n```\n\nTo override this function, please provide an OpenAI function definition and refer to it in the system prompt.\nYou may override parts of the function definition (i.e. you may only want to change the function name for your prompt).\nIf 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`.\n\nTo pass custom parameters to the server in a dynamic handoff, you can use the function parameters, with `dynamic` as the destination.\n```json\n{\n \"function\": {\n \"name\": \"dynamic_handoff\",\n \"description\": \"\n Call this function when the customer is ready to be handed off to the next assistant\n \",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"destination\": {\n \"type\": \"string\",\n \"enum\": [\"dynamic\"]\n },\n \"customerAreaCode\": {\n \"type\": \"number\",\n \"description\": \"Area code of the customer\"\n },\n \"customerIntent\": {\n \"type\": \"string\",\n \"enum\": [\"new-customer\", \"existing-customer\"],\n \"description\": \"Use new-customer when customer is a new customer, existing-customer when customer is an existing customer\"\n },\n \"customerSentiment\": {\n \"type\": \"string\",\n \"enum\": [\"positive\", \"negative\", \"neutral\"],\n \"description\": \"Use positive when customer is happy, negative when customer is unhappy, neutral when customer is neutral\"\n }\n },\n \"required\": [\"destination\", \"customerAreaCode\", \"customerIntent\", \"customerSentiment\"]\n }\n }\n}\n```",
- "allOf": [
- {
- "$ref": "#/components/schemas/OpenAIFunction"
- }
- ]
}
}
},
- "UpdateTransferCallToolDTO": {
+ "UpdateSlackSendMessageToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -42813,25 +51800,12 @@
]
}
},
- "destinations": {
- "type": "array",
- "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.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/TransferDestinationAssistant",
- "title": "Assistant"
- },
- {
- "$ref": "#/components/schemas/TransferDestinationNumber",
- "title": "Number"
- },
- {
- "$ref": "#/components/schemas/TransferDestinationSip",
- "title": "Sip"
- }
- ]
- }
+ "type": {
+ "type": "string",
+ "enum": [
+ "slack.message.send"
+ ],
+ "description": "The type of tool. \"slack.message.send\" for Slack Send Message tool."
},
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
@@ -42843,12 +51817,12 @@
}
}
},
- "UpdateOutputToolDTO": {
+ "UpdateSmsToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -42870,6 +51844,13 @@
]
}
},
+ "type": {
+ "type": "string",
+ "enum": [
+ "sms"
+ ],
+ "description": "The type of tool. \"sms\" for Twilio SMS sending tool."
+ },
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
"allOf": [
@@ -42880,12 +51861,12 @@
}
}
},
- "UpdateBashToolDTO": {
+ "UpdateMcpToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -42907,12 +51888,12 @@
]
}
},
- "subType": {
+ "type": {
"type": "string",
"enum": [
- "bash_20241022"
+ "mcp"
],
- "description": "The sub type of tool."
+ "description": "The type of tool. \"mcp\" for MCP tool."
},
"server": {
"description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
@@ -42922,6 +51903,13 @@
}
]
},
+ "toolMessages": {
+ "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.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/McpToolMessages"
+ }
+ },
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
"allOf": [
@@ -42930,22 +51918,17 @@
}
]
},
- "name": {
- "type": "string",
- "description": "The name of the tool, fixed to 'bash'",
- "default": "bash",
- "enum": [
- "bash"
- ]
+ "metadata": {
+ "$ref": "#/components/schemas/McpToolMetadata"
}
}
},
- "UpdateComputerToolDTO": {
+ "UpdateGoHighLevelCalendarAvailabilityToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -42967,20 +51950,12 @@
]
}
},
- "subType": {
+ "type": {
"type": "string",
"enum": [
- "computer_20241022"
+ "gohighlevel.calendar.availability.check"
],
- "description": "The sub type of tool."
- },
- "server": {
- "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
- "allOf": [
- {
- "$ref": "#/components/schemas/Server"
- }
- ]
+ "description": "The type of tool. \"gohighlevel.calendar.availability.check\" for GoHighLevel Calendar Availability Check tool."
},
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
@@ -42989,35 +51964,15 @@
"$ref": "#/components/schemas/ToolRejectionPlan"
}
]
- },
- "name": {
- "type": "string",
- "description": "The name of the tool, fixed to 'computer'",
- "default": "computer",
- "enum": [
- "computer"
- ]
- },
- "displayWidthPx": {
- "type": "number",
- "description": "The display width in pixels"
- },
- "displayHeightPx": {
- "type": "number",
- "description": "The display height in pixels"
- },
- "displayNumber": {
- "type": "number",
- "description": "Optional display number"
}
}
},
- "UpdateTextEditorToolDTO": {
+ "UpdateGoHighLevelCalendarEventCreateToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -43039,20 +51994,12 @@
]
}
},
- "subType": {
+ "type": {
"type": "string",
"enum": [
- "text_editor_20241022"
+ "gohighlevel.calendar.event.create"
],
- "description": "The sub type of tool."
- },
- "server": {
- "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
- "allOf": [
- {
- "$ref": "#/components/schemas/Server"
- }
- ]
+ "description": "The type of tool. \"gohighlevel.calendar.event.create\" for GoHighLevel Calendar Event Create tool."
},
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
@@ -43061,23 +52008,15 @@
"$ref": "#/components/schemas/ToolRejectionPlan"
}
]
- },
- "name": {
- "type": "string",
- "description": "The name of the tool, fixed to 'str_replace_editor'",
- "default": "str_replace_editor",
- "enum": [
- "str_replace_editor"
- ]
}
}
},
- "UpdateQueryToolDTO": {
+ "UpdateGoHighLevelContactCreateToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -43099,12 +52038,12 @@
]
}
},
- "knowledgeBases": {
- "description": "The knowledge bases to query",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/KnowledgeBase"
- }
+ "type": {
+ "type": "string",
+ "enum": [
+ "gohighlevel.contact.create"
+ ],
+ "description": "The type of tool. \"gohighlevel.contact.create\" for GoHighLevel Contact Create tool."
},
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
@@ -43116,12 +52055,12 @@
}
}
},
- "UpdateGoogleCalendarCreateEventToolDTO": {
+ "UpdateGoHighLevelContactGetToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -43143,6 +52082,13 @@
]
}
},
+ "type": {
+ "type": "string",
+ "enum": [
+ "gohighlevel.contact.get"
+ ],
+ "description": "The type of tool. \"gohighlevel.contact.get\" for GoHighLevel Contact Get tool."
+ },
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
"allOf": [
@@ -43153,12 +52099,12 @@
}
}
},
- "UpdateGoogleSheetsRowAppendToolDTO": {
+ "UpdateSipRequestToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -43180,6 +52126,41 @@
]
}
},
+ "type": {
+ "type": "string",
+ "enum": [
+ "sipRequest"
+ ],
+ "description": "The type of tool. \"sipRequest\" for SIP request tool."
+ },
+ "verb": {
+ "type": "string",
+ "enum": [
+ "INFO",
+ "MESSAGE",
+ "NOTIFY"
+ ],
+ "description": "The SIP method to send."
+ },
+ "headers": {
+ "description": "JSON schema for headers the model should populate when sending the SIP request.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/JsonSchema"
+ }
+ ]
+ },
+ "body": {
+ "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.",
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "$ref": "#/components/schemas/JsonSchema"
+ }
+ ]
+ },
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
"allOf": [
@@ -43190,12 +52171,12 @@
}
}
},
- "UpdateGoogleCalendarCheckAvailabilityToolDTO": {
+ "UpdateVoicemailToolDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -43217,59 +52198,293 @@
]
}
},
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
- "allOf": [
- {
- "$ref": "#/components/schemas/ToolRejectionPlan"
- }
- ]
+ "type": {
+ "type": "string",
+ "description": "The type of tool. \"voicemail\" for Voicemail tool.",
+ "enum": [
+ "voicemail"
+ ]
+ },
+ "beepDetectionEnabled": {
+ "type": "boolean",
+ "description": "This is the flag that enables beep detection for voicemail detection and applies only for twilio based calls.\n\n@default false",
+ "default": false,
+ "example": false
+ },
+ "rejectionPlan": {
+ "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/ToolRejectionPlan"
+ }
+ ]
+ }
+ }
+ },
+ "ToolVersion": {
+ "type": "object",
+ "properties": {
+ "versionName": {
+ "type": "string",
+ "nullable": true,
+ "description": "Optional human-readable label for this version. Pass `null` to clear.",
+ "maxLength": 80
+ },
+ "versionDescription": {
+ "type": "string",
+ "nullable": true,
+ "description": "Optional description for this version. Pass `null` to clear.",
+ "maxLength": 500
+ },
+ "type": {
+ "type": "object"
+ },
+ "function": {
+ "type": "object",
+ "nullable": true
+ },
+ "messages": {
+ "type": "array",
+ "nullable": true,
+ "items": {
+ "type": "object"
+ }
+ },
+ "metadata": {
+ "type": "object",
+ "nullable": true
+ },
+ "templateId": {
+ "type": "string",
+ "nullable": true
+ },
+ "server": {
+ "type": "object",
+ "nullable": true
+ },
+ "async": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "destinations": {
+ "type": "array",
+ "nullable": true,
+ "items": {
+ "type": "object"
+ }
+ },
+ "name": {
+ "type": "string",
+ "nullable": true
+ },
+ "subType": {
+ "type": "string",
+ "nullable": true
+ },
+ "displayWidthPx": {
+ "type": "number",
+ "nullable": true
+ },
+ "displayHeightPx": {
+ "type": "number",
+ "nullable": true
+ },
+ "displayNumber": {
+ "type": "number",
+ "nullable": true
+ },
+ "knowledgeBases": {
+ "type": "array",
+ "nullable": true,
+ "items": {
+ "type": "object"
+ }
+ },
+ "url": {
+ "type": "string",
+ "nullable": true
+ },
+ "method": {
+ "type": "string",
+ "nullable": true
+ },
+ "headers": {
+ "type": "object",
+ "nullable": true
+ },
+ "body": {
+ "type": "object"
+ },
+ "backoffPlan": {
+ "type": "object",
+ "nullable": true
+ },
+ "timeoutSeconds": {
+ "type": "number",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "nullable": true
+ },
+ "variableExtractionPlan": {
+ "type": "object",
+ "nullable": true
+ },
+ "rejectionPlan": {
+ "type": "object",
+ "nullable": true
+ },
+ "credentialId": {
+ "type": "string",
+ "nullable": true
+ },
+ "extendedDelayWhenPrecededByTextEnabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "beepDetectionEnabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "code": {
+ "type": "string",
+ "nullable": true
+ },
+ "environmentVariables": {
+ "type": "array",
+ "nullable": true,
+ "items": {
+ "type": "object"
+ }
+ },
+ "parameters": {
+ "type": "array",
+ "nullable": true,
+ "items": {
+ "type": "object"
+ }
+ },
+ "encryptedPaths": {
+ "type": "array",
+ "nullable": true,
+ "items": {
+ "type": "string"
+ }
+ },
+ "sipInfoDtmfEnabled": {
+ "type": "boolean",
+ "nullable": true
+ },
+ "verb": {
+ "type": "string",
+ "nullable": true
+ },
+ "defaultResult": {
+ "type": "string",
+ "nullable": true
+ },
+ "toolMessages": {
+ "type": "array",
+ "nullable": true,
+ "items": {
+ "type": "object"
+ }
+ },
+ "id": {
+ "type": "string",
+ "description": "This is the unique identifier for the version row."
+ },
+ "orgId": {
+ "type": "string",
+ "description": "This is the unique identifier for the org that owns this version."
+ },
+ "toolId": {
+ "type": "string",
+ "description": "This is the unique identifier for the tool this version was snapshotted from."
+ },
+ "version": {
+ "type": "string",
+ "description": "This is the public monotonic version label, e.g. \"v1\".\nSystem-owned and incremented per tool; never user-supplied."
+ },
+ "configHash": {
+ "type": "string",
+ "description": "This is the SHA-256 hex of the snapshotted content used for no-op detection."
+ },
+ "parentVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the prior version label (vN-1). Null on v1 or for branch roots."
+ },
+ "createdBy": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the actor that wrote this version. Email when created via JWT, null when created via API."
+ },
+ "deletedAt": {
+ "format": "date-time",
+ "type": "string",
+ "nullable": true,
+ "description": "This is the soft-delete timestamp. Null when active."
+ },
+ "createdAt": {
+ "format": "date-time",
+ "type": "string",
+ "description": "This is the ISO 8601 date-time string of when the version was created."
+ }
+ },
+ "required": [
+ "id",
+ "orgId",
+ "toolId",
+ "version",
+ "configHash",
+ "createdAt"
+ ]
+ },
+ "ToolVersionPaginatedMetadata": {
+ "type": "object",
+ "properties": {
+ "nextCursor": {
+ "type": "string",
+ "nullable": true
+ },
+ "hasNextPage": {
+ "type": "boolean"
+ },
+ "limit": {
+ "type": "number"
}
- }
+ },
+ "required": [
+ "hasNextPage",
+ "limit"
+ ]
},
- "UpdateSlackSendMessageToolDTO": {
+ "ToolVersionPaginatedResponse": {
"type": "object",
"properties": {
- "messages": {
+ "results": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
"items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/ToolMessageStart",
- "title": "ToolMessageStart"
- },
- {
- "$ref": "#/components/schemas/ToolMessageComplete",
- "title": "ToolMessageComplete"
- },
- {
- "$ref": "#/components/schemas/ToolMessageFailed",
- "title": "ToolMessageFailed"
- },
- {
- "$ref": "#/components/schemas/ToolMessageDelayed",
- "title": "ToolMessageDelayed"
- }
- ]
+ "$ref": "#/components/schemas/ToolVersion"
}
},
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
- "allOf": [
- {
- "$ref": "#/components/schemas/ToolRejectionPlan"
- }
- ]
+ "metadata": {
+ "$ref": "#/components/schemas/ToolVersionPaginatedMetadata"
}
- }
+ },
+ "required": [
+ "results",
+ "metadata"
+ ]
},
- "UpdateSmsToolDTO": {
+ "ToolDraft": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -43291,6 +52506,71 @@
]
}
},
+ "type": {
+ "type": "string",
+ "description": "This is the type of the tool.",
+ "enum": [
+ "dtmf",
+ "endCall",
+ "transferCall",
+ "transferCancel",
+ "transferSuccessful",
+ "handoff",
+ "output",
+ "voicemail",
+ "query",
+ "sms",
+ "sipRequest",
+ "function",
+ "mcp",
+ "apiRequest",
+ "code",
+ "bash",
+ "computer",
+ "textEditor",
+ "google.calendar.event.create",
+ "google.calendar.availability.check",
+ "google.sheets.row.append",
+ "slack.message.send",
+ "gohighlevel.calendar.event.create",
+ "gohighlevel.calendar.availability.check",
+ "gohighlevel.contact.create",
+ "gohighlevel.contact.get",
+ "make",
+ "ghl"
+ ]
+ },
+ "id": {
+ "type": "string",
+ "description": "Key used as `draftId` in URLs."
+ },
+ "orgId": {
+ "type": "string",
+ "description": "This is the unique identifier for the org that owns this draft."
+ },
+ "toolId": {
+ "type": "string",
+ "description": "This is the unique identifier for the tool this draft was forked from.\nIntentionally NOT a FK — `tool_draft` mirrors `tool_version` / `version_pin`'s\nno-FK / app-cleanup philosophy, so there is no `ON DELETE CASCADE`. Drafts\nmust be cleaned up explicitly (`toolDraftDelete({ orgId, toolId })`) on a\nparent tool hard-delete; nothing reaps them automatically."
+ },
+ "baseVersion": {
+ "type": "string",
+ "description": "The published version this draft was forked from. Server defaults to\n`tool.latestVersion` on POST if omitted. Immutable for the draft's lifetime."
+ },
+ "createdBy": {
+ "type": "string",
+ "nullable": true,
+ "description": "Email when JWT, null when API or external JWT. Set on POST, never rewritten on PATCH."
+ },
+ "createdAt": {
+ "format": "date-time",
+ "type": "string",
+ "description": "This is the ISO 8601 date-time string of when the draft was created."
+ },
+ "updatedAt": {
+ "format": "date-time",
+ "type": "string",
+ "description": "This is the ISO 8601 date-time string of when the draft was last updated."
+ },
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
"allOf": [
@@ -43298,181 +52578,192 @@
"$ref": "#/components/schemas/ToolRejectionPlan"
}
]
- }
- }
- },
- "UpdateMcpToolDTO": {
- "type": "object",
- "properties": {
- "messages": {
- "type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/ToolMessageStart",
- "title": "ToolMessageStart"
- },
- {
- "$ref": "#/components/schemas/ToolMessageComplete",
- "title": "ToolMessageComplete"
- },
- {
- "$ref": "#/components/schemas/ToolMessageFailed",
- "title": "ToolMessageFailed"
- },
- {
- "$ref": "#/components/schemas/ToolMessageDelayed",
- "title": "ToolMessageDelayed"
- }
- ]
- }
},
- "server": {
- "description": "\n This is the server where a `tool-calls` webhook will be sent.\n\n Notes:\n - Webhook is sent to this server when a tool call is made.\n - Webhook contains the call, assistant, and phone number objects.\n - Webhook contains the variables set on the assistant.\n - Webhook is sent to the first available URL in this order: {{tool.server.url}}, {{assistant.server.url}}, {{phoneNumber.server.url}}, {{org.server.url}}.\n - Webhook expects a response with tool call result.",
+ "function": {
+ "description": "This is the function definition of the tool.",
"allOf": [
{
- "$ref": "#/components/schemas/Server"
+ "$ref": "#/components/schemas/OpenAIFunction"
}
]
},
- "toolMessages": {
- "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": {
+ "type": "object",
+ "description": "Provider-specific metadata. Polymorphic across tool variants with no shared\ndiscriminator, so it is validated as a plain object (mirrors how\n`ToolCallResult.metadata` is typed)."
+ },
+ "templateId": {
+ "type": "string",
+ "description": "This is the unique identifier for the template this tool was created from."
+ },
+ "server": {
+ "$ref": "#/components/schemas/Server"
+ },
+ "async": {
+ "type": "boolean"
+ },
+ "destinations": {
+ "description": "These are the destinations that the call can be transferred to.",
"type": "array",
"items": {
- "$ref": "#/components/schemas/McpToolMessages"
+ "type": "object"
}
},
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "name": {
+ "type": "string",
+ "description": "This is the name of the tool. This will be passed to the model."
+ },
+ "subType": {
+ "type": "string",
+ "description": "This is the sub type of the tool (e.g. for computer, bash and text-editor tools)."
+ },
+ "displayWidthPx": {
+ "type": "number",
+ "description": "The display width in pixels (computer tool)."
+ },
+ "displayHeightPx": {
+ "type": "number",
+ "description": "The display height in pixels (computer tool)."
+ },
+ "displayNumber": {
+ "type": "number",
+ "description": "Optional display number (computer tool)."
+ },
+ "knowledgeBases": {
+ "description": "The knowledge bases to query (query tool).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/KnowledgeBase"
+ }
+ },
+ "url": {
+ "type": "string",
+ "description": "This is where the request will be sent (api-request tool)."
+ },
+ "method": {
+ "type": "string",
+ "description": "This is the HTTP method for the request (api-request tool).",
+ "enum": [
+ "POST",
+ "GET",
+ "PUT",
+ "PATCH",
+ "DELETE"
+ ]
+ },
+ "headers": {
+ "description": "These are the headers to send with the request (api-request / sip-request tool).",
"allOf": [
{
- "$ref": "#/components/schemas/ToolRejectionPlan"
+ "$ref": "#/components/schemas/JsonSchema"
}
]
},
- "metadata": {
- "$ref": "#/components/schemas/McpToolMetadata"
- }
- }
- },
- "UpdateGoHighLevelCalendarAvailabilityToolDTO": {
- "type": "object",
- "properties": {
- "messages": {
- "type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/ToolMessageStart",
- "title": "ToolMessageStart"
- },
- {
- "$ref": "#/components/schemas/ToolMessageComplete",
- "title": "ToolMessageComplete"
- },
- {
- "$ref": "#/components/schemas/ToolMessageFailed",
- "title": "ToolMessageFailed"
- },
- {
- "$ref": "#/components/schemas/ToolMessageDelayed",
- "title": "ToolMessageDelayed"
- }
- ]
- }
+ "body": {
+ "type": "object",
+ "description": "This is the body of the request. Either a JSON schema (api-request) or a\nliteral string / schema (sip-request)."
},
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "backoffPlan": {
+ "description": "This is the backoff plan if the request fails.",
"allOf": [
{
- "$ref": "#/components/schemas/ToolRejectionPlan"
+ "$ref": "#/components/schemas/BackoffPlan"
}
]
- }
- }
- },
- "UpdateGoHighLevelCalendarEventCreateToolDTO": {
- "type": "object",
- "properties": {
- "messages": {
- "type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/ToolMessageStart",
- "title": "ToolMessageStart"
- },
- {
- "$ref": "#/components/schemas/ToolMessageComplete",
- "title": "ToolMessageComplete"
- },
- {
- "$ref": "#/components/schemas/ToolMessageFailed",
- "title": "ToolMessageFailed"
- },
- {
- "$ref": "#/components/schemas/ToolMessageDelayed",
- "title": "ToolMessageDelayed"
- }
- ]
- }
},
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "timeoutSeconds": {
+ "type": "number",
+ "description": "This is the timeout in seconds for the request.",
+ "minimum": 1,
+ "maximum": 300
+ },
+ "description": {
+ "type": "string",
+ "description": "This is the description of the tool. This will be passed to the model."
+ },
+ "variableExtractionPlan": {
+ "description": "This is the plan to extract variables from the tool's response.",
"allOf": [
{
- "$ref": "#/components/schemas/ToolRejectionPlan"
+ "$ref": "#/components/schemas/VariableExtractionPlan"
}
]
- }
- }
- },
- "UpdateGoHighLevelContactCreateToolDTO": {
- "type": "object",
- "properties": {
- "messages": {
+ },
+ "credentialId": {
+ "type": "string",
+ "description": "This is the credential ID that will be used for authorization."
+ },
+ "extendedDelayWhenPrecededByTextEnabled": {
+ "type": "boolean"
+ },
+ "beepDetectionEnabled": {
+ "type": "boolean"
+ },
+ "code": {
+ "type": "string",
+ "description": "This is the TypeScript code that will be executed when the tool is called (code tool).",
+ "maxLength": 50000
+ },
+ "environmentVariables": {
+ "description": "These are the environment variables available in the code via the `env` object (code tool).",
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
"items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/ToolMessageStart",
- "title": "ToolMessageStart"
- },
- {
- "$ref": "#/components/schemas/ToolMessageComplete",
- "title": "ToolMessageComplete"
- },
- {
- "$ref": "#/components/schemas/ToolMessageFailed",
- "title": "ToolMessageFailed"
- },
- {
- "$ref": "#/components/schemas/ToolMessageDelayed",
- "title": "ToolMessageDelayed"
- }
- ]
+ "$ref": "#/components/schemas/CodeToolEnvironmentVariable"
}
},
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
- "allOf": [
- {
- "$ref": "#/components/schemas/ToolRejectionPlan"
- }
+ "parameters": {
+ "description": "These are the static parameters to merge into the tool's request body.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolParameter"
+ }
+ },
+ "encryptedPaths": {
+ "description": "This is the paths to encrypt in the request body.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "sipInfoDtmfEnabled": {
+ "type": "boolean",
+ "description": "This enables sending DTMF tones via SIP INFO messages instead of RFC 2833."
+ },
+ "verb": {
+ "type": "string",
+ "description": "This is the SIP method to send (sip-request tool).",
+ "enum": [
+ "INFO",
+ "MESSAGE",
+ "NOTIFY"
]
+ },
+ "defaultResult": {
+ "type": "string",
+ "description": "This is the default local tool result message used when no runtime override is returned (handoff tool)."
+ },
+ "toolMessages": {
+ "description": "Per-tool message overrides for individual tools loaded from the MCP server (mcp tool).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/McpToolMessages"
+ }
}
- }
+ },
+ "required": [
+ "id",
+ "orgId",
+ "toolId",
+ "baseVersion",
+ "createdAt",
+ "updatedAt"
+ ]
},
- "UpdateGoHighLevelContactGetToolDTO": {
+ "CreateToolDraftDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -43494,54 +52785,117 @@
]
}
},
- "rejectionPlan": {
- "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
+ "type": {
+ "type": "string",
+ "description": "This is the type of the tool.",
+ "enum": [
+ "dtmf",
+ "endCall",
+ "transferCall",
+ "transferCancel",
+ "transferSuccessful",
+ "handoff",
+ "output",
+ "voicemail",
+ "query",
+ "sms",
+ "sipRequest",
+ "function",
+ "mcp",
+ "apiRequest",
+ "code",
+ "bash",
+ "computer",
+ "textEditor",
+ "google.calendar.event.create",
+ "google.calendar.availability.check",
+ "google.sheets.row.append",
+ "slack.message.send",
+ "gohighlevel.calendar.event.create",
+ "gohighlevel.calendar.availability.check",
+ "gohighlevel.contact.create",
+ "gohighlevel.contact.get",
+ "make",
+ "ghl"
+ ]
+ },
+ "baseVersion": {
+ "type": "string",
+ "description": "Optional pointer to the published version this draft was forked from.\nWhen omitted, defaults server-side to the parent tool's current\n`latestVersion` (lazy-created via `toolBaselineVersionEnsureInTx` if the\ntool has never been versioned). Immutable for the lifetime of the draft."
+ },
+ "function": {
+ "description": "This is the function definition of the tool.",
"allOf": [
{
- "$ref": "#/components/schemas/ToolRejectionPlan"
+ "$ref": "#/components/schemas/OpenAIFunction"
}
]
- }
- }
- },
- "UpdateSipRequestToolDTO": {
- "type": "object",
- "properties": {
- "messages": {
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Provider-specific metadata. Polymorphic across tool variants with no shared\ndiscriminator, so it is validated as a plain object (mirrors how\n`ToolCallResult.metadata` is typed)."
+ },
+ "templateId": {
+ "type": "string",
+ "description": "This is the unique identifier for the template this tool was created from."
+ },
+ "server": {
+ "$ref": "#/components/schemas/Server"
+ },
+ "async": {
+ "type": "boolean"
+ },
+ "destinations": {
+ "description": "These are the destinations that the call can be transferred to.",
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
"items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/ToolMessageStart",
- "title": "ToolMessageStart"
- },
- {
- "$ref": "#/components/schemas/ToolMessageComplete",
- "title": "ToolMessageComplete"
- },
- {
- "$ref": "#/components/schemas/ToolMessageFailed",
- "title": "ToolMessageFailed"
- },
- {
- "$ref": "#/components/schemas/ToolMessageDelayed",
- "title": "ToolMessageDelayed"
- }
- ]
+ "type": "object"
}
},
- "verb": {
+ "name": {
+ "type": "string",
+ "description": "This is the name of the tool. This will be passed to the model."
+ },
+ "subType": {
+ "type": "string",
+ "description": "This is the sub type of the tool (e.g. for computer, bash and text-editor tools)."
+ },
+ "displayWidthPx": {
+ "type": "number",
+ "description": "The display width in pixels (computer tool)."
+ },
+ "displayHeightPx": {
+ "type": "number",
+ "description": "The display height in pixels (computer tool)."
+ },
+ "displayNumber": {
+ "type": "number",
+ "description": "Optional display number (computer tool)."
+ },
+ "knowledgeBases": {
+ "description": "The knowledge bases to query (query tool).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/KnowledgeBase"
+ }
+ },
+ "url": {
+ "type": "string",
+ "description": "This is where the request will be sent (api-request tool)."
+ },
+ "method": {
"type": "string",
+ "description": "This is the HTTP method for the request (api-request tool).",
"enum": [
- "INFO",
- "MESSAGE",
- "NOTIFY"
- ],
- "description": "The SIP method to send."
+ "POST",
+ "GET",
+ "PUT",
+ "PATCH",
+ "DELETE"
+ ]
},
"headers": {
- "description": "JSON schema for headers the model should populate when sending the SIP request.",
+ "description": "These are the headers to send with the request (api-request / sip-request tool).",
"allOf": [
{
"$ref": "#/components/schemas/JsonSchema"
@@ -43549,16 +52903,95 @@
]
},
"body": {
- "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.",
- "oneOf": [
+ "type": "object",
+ "description": "This is the body of the request. Either a JSON schema (api-request) or a\nliteral string / schema (sip-request)."
+ },
+ "backoffPlan": {
+ "description": "This is the backoff plan if the request fails.",
+ "allOf": [
{
- "type": "string"
- },
+ "$ref": "#/components/schemas/BackoffPlan"
+ }
+ ]
+ },
+ "timeoutSeconds": {
+ "type": "number",
+ "description": "This is the timeout in seconds for the request.",
+ "minimum": 1,
+ "maximum": 300
+ },
+ "description": {
+ "type": "string",
+ "description": "This is the description of the tool. This will be passed to the model."
+ },
+ "variableExtractionPlan": {
+ "description": "This is the plan to extract variables from the tool's response.",
+ "allOf": [
{
- "$ref": "#/components/schemas/JsonSchema"
+ "$ref": "#/components/schemas/VariableExtractionPlan"
}
]
},
+ "credentialId": {
+ "type": "string",
+ "description": "This is the credential ID that will be used for authorization."
+ },
+ "extendedDelayWhenPrecededByTextEnabled": {
+ "type": "boolean"
+ },
+ "beepDetectionEnabled": {
+ "type": "boolean"
+ },
+ "code": {
+ "type": "string",
+ "description": "This is the TypeScript code that will be executed when the tool is called (code tool).",
+ "maxLength": 50000
+ },
+ "environmentVariables": {
+ "description": "These are the environment variables available in the code via the `env` object (code tool).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CodeToolEnvironmentVariable"
+ }
+ },
+ "parameters": {
+ "description": "These are the static parameters to merge into the tool's request body.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolParameter"
+ }
+ },
+ "encryptedPaths": {
+ "description": "This is the paths to encrypt in the request body.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "sipInfoDtmfEnabled": {
+ "type": "boolean",
+ "description": "This enables sending DTMF tones via SIP INFO messages instead of RFC 2833."
+ },
+ "verb": {
+ "type": "string",
+ "description": "This is the SIP method to send (sip-request tool).",
+ "enum": [
+ "INFO",
+ "MESSAGE",
+ "NOTIFY"
+ ]
+ },
+ "defaultResult": {
+ "type": "string",
+ "description": "This is the default local tool result message used when no runtime override is returned (handoff tool)."
+ },
+ "toolMessages": {
+ "description": "Per-tool message overrides for individual tools loaded from the MCP server (mcp tool).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/McpToolMessages"
+ }
+ },
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
"allOf": [
@@ -43569,12 +53002,12 @@
}
}
},
- "UpdateVoicemailToolDTO": {
+ "UpdateToolDraftDTO": {
"type": "object",
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -43596,11 +53029,208 @@
]
}
},
+ "type": {
+ "type": "string",
+ "description": "This is the type of the tool.",
+ "enum": [
+ "dtmf",
+ "endCall",
+ "transferCall",
+ "transferCancel",
+ "transferSuccessful",
+ "handoff",
+ "output",
+ "voicemail",
+ "query",
+ "sms",
+ "sipRequest",
+ "function",
+ "mcp",
+ "apiRequest",
+ "code",
+ "bash",
+ "computer",
+ "textEditor",
+ "google.calendar.event.create",
+ "google.calendar.availability.check",
+ "google.sheets.row.append",
+ "slack.message.send",
+ "gohighlevel.calendar.event.create",
+ "gohighlevel.calendar.availability.check",
+ "gohighlevel.contact.create",
+ "gohighlevel.contact.get",
+ "make",
+ "ghl"
+ ]
+ },
+ "function": {
+ "description": "This is the function definition of the tool.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/OpenAIFunction"
+ }
+ ]
+ },
+ "metadata": {
+ "type": "object",
+ "description": "Provider-specific metadata. Polymorphic across tool variants with no shared\ndiscriminator, so it is validated as a plain object (mirrors how\n`ToolCallResult.metadata` is typed)."
+ },
+ "templateId": {
+ "type": "string",
+ "description": "This is the unique identifier for the template this tool was created from."
+ },
+ "server": {
+ "$ref": "#/components/schemas/Server"
+ },
+ "async": {
+ "type": "boolean"
+ },
+ "destinations": {
+ "description": "These are the destinations that the call can be transferred to.",
+ "type": "array",
+ "items": {
+ "type": "object"
+ }
+ },
+ "name": {
+ "type": "string",
+ "description": "This is the name of the tool. This will be passed to the model."
+ },
+ "subType": {
+ "type": "string",
+ "description": "This is the sub type of the tool (e.g. for computer, bash and text-editor tools)."
+ },
+ "displayWidthPx": {
+ "type": "number",
+ "description": "The display width in pixels (computer tool)."
+ },
+ "displayHeightPx": {
+ "type": "number",
+ "description": "The display height in pixels (computer tool)."
+ },
+ "displayNumber": {
+ "type": "number",
+ "description": "Optional display number (computer tool)."
+ },
+ "knowledgeBases": {
+ "description": "The knowledge bases to query (query tool).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/KnowledgeBase"
+ }
+ },
+ "url": {
+ "type": "string",
+ "description": "This is where the request will be sent (api-request tool)."
+ },
+ "method": {
+ "type": "string",
+ "description": "This is the HTTP method for the request (api-request tool).",
+ "enum": [
+ "POST",
+ "GET",
+ "PUT",
+ "PATCH",
+ "DELETE"
+ ]
+ },
+ "headers": {
+ "description": "These are the headers to send with the request (api-request / sip-request tool).",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/JsonSchema"
+ }
+ ]
+ },
+ "body": {
+ "type": "object",
+ "description": "This is the body of the request. Either a JSON schema (api-request) or a\nliteral string / schema (sip-request)."
+ },
+ "backoffPlan": {
+ "description": "This is the backoff plan if the request fails.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BackoffPlan"
+ }
+ ]
+ },
+ "timeoutSeconds": {
+ "type": "number",
+ "description": "This is the timeout in seconds for the request.",
+ "minimum": 1,
+ "maximum": 300
+ },
+ "description": {
+ "type": "string",
+ "description": "This is the description of the tool. This will be passed to the model."
+ },
+ "variableExtractionPlan": {
+ "description": "This is the plan to extract variables from the tool's response.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/VariableExtractionPlan"
+ }
+ ]
+ },
+ "credentialId": {
+ "type": "string",
+ "description": "This is the credential ID that will be used for authorization."
+ },
+ "extendedDelayWhenPrecededByTextEnabled": {
+ "type": "boolean"
+ },
"beepDetectionEnabled": {
+ "type": "boolean"
+ },
+ "code": {
+ "type": "string",
+ "description": "This is the TypeScript code that will be executed when the tool is called (code tool).",
+ "maxLength": 50000
+ },
+ "environmentVariables": {
+ "description": "These are the environment variables available in the code via the `env` object (code tool).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CodeToolEnvironmentVariable"
+ }
+ },
+ "parameters": {
+ "description": "These are the static parameters to merge into the tool's request body.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolParameter"
+ }
+ },
+ "encryptedPaths": {
+ "description": "This is the paths to encrypt in the request body.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "sipInfoDtmfEnabled": {
"type": "boolean",
- "description": "This is the flag that enables beep detection for voicemail detection and applies only for twilio based calls.\n\n@default false",
- "default": false,
- "example": false
+ "description": "This enables sending DTMF tones via SIP INFO messages instead of RFC 2833."
+ },
+ "verb": {
+ "type": "string",
+ "description": "This is the SIP method to send (sip-request tool).",
+ "enum": [
+ "INFO",
+ "MESSAGE",
+ "NOTIFY"
+ ]
+ },
+ "defaultResult": {
+ "type": "string",
+ "description": "This is the default local tool result message used when no runtime override is returned (handoff tool)."
+ },
+ "toolMessages": {
+ "description": "Per-tool message overrides for individual tools loaded from the MCP server (mcp tool).",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/McpToolMessages"
+ }
},
"rejectionPlan": {
"description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```",
@@ -43612,6 +53242,118 @@
}
}
},
+ "ToolDraftPaginatedMetadata": {
+ "type": "object",
+ "properties": {
+ "nextCursor": {
+ "type": "string",
+ "nullable": true
+ },
+ "hasNextPage": {
+ "type": "boolean"
+ },
+ "limit": {
+ "type": "number"
+ }
+ },
+ "required": [
+ "nextCursor",
+ "hasNextPage",
+ "limit"
+ ]
+ },
+ "ToolDraftPaginatedResponse": {
+ "type": "object",
+ "properties": {
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ToolDraft"
+ }
+ },
+ "metadata": {
+ "$ref": "#/components/schemas/ToolDraftPaginatedMetadata"
+ }
+ },
+ "required": [
+ "results",
+ "metadata"
+ ]
+ },
+ "ToolDraftConflictResponseDTO": {
+ "type": "object",
+ "properties": {
+ "existingDraftId": {
+ "type": "string",
+ "nullable": true
+ },
+ "error": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "existingDraftId",
+ "error",
+ "message"
+ ]
+ },
+ "GetToolDraftsDTO": {
+ "type": "object",
+ "properties": {
+ "cursor": {
+ "type": "string",
+ "description": "Opaque base64-encoded keyset cursor. Omit on first page."
+ },
+ "limit": {
+ "type": "number",
+ "description": "Page size, defaults to 25, capped at 100.",
+ "minimum": 1,
+ "maximum": 100
+ },
+ "createdBy": {
+ "type": "string"
+ }
+ }
+ },
+ "UpdateToolVersionMetadataDTO": {
+ "type": "object",
+ "properties": {
+ "versionName": {
+ "type": "string",
+ "nullable": true,
+ "description": "Optional human-readable label for this version. Pass `null` to clear.",
+ "maxLength": 80
+ },
+ "versionDescription": {
+ "type": "string",
+ "nullable": true,
+ "description": "Optional description for this version. Pass `null` to clear.",
+ "maxLength": 500
+ }
+ }
+ },
+ "ToolPinnedConflictResponseDTO": {
+ "type": "object",
+ "properties": {
+ "error": {
+ "type": "string",
+ "enum": [
+ "tool_pinned"
+ ]
+ },
+ "message": {
+ "type": "string",
+ "description": "Human-readable reason the parent-tool delete was rejected."
+ }
+ },
+ "required": [
+ "error",
+ "message"
+ ]
+ },
"CreateFileDTO": {
"type": "object",
"properties": {
@@ -43717,82 +53459,6 @@
}
}
},
- "TrieveKnowledgeBaseSearchPlan": {
- "type": "object",
- "properties": {
- "topK": {
- "type": "number",
- "description": "Specifies the number of top chunks to return. This corresponds to the `page_size` parameter in Trieve."
- },
- "removeStopWords": {
- "type": "boolean",
- "description": "If true, stop words (specified in server/src/stop-words.txt in the git repo) will be removed. This will preserve queries that are entirely stop words."
- },
- "scoreThreshold": {
- "type": "number",
- "description": "This is the score threshold to filter out chunks with a score below the threshold for cosine distance metric. For Manhattan Distance, Euclidean Distance, and Dot Product, it will filter out scores above the threshold distance. This threshold applies before weight and bias modifications. If not specified, this defaults to no threshold. A threshold of 0 will default to no threshold."
- },
- "searchType": {
- "type": "string",
- "description": "This is the search method used when searching for relevant chunks from the vector store.",
- "enum": [
- "fulltext",
- "semantic",
- "hybrid",
- "bm25"
- ]
- }
- },
- "required": [
- "searchType"
- ]
- },
- "TrieveKnowledgeBase": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "description": "This knowledge base is provided by Trieve.\n\nTo learn more about Trieve, visit https://trieve.ai.",
- "enum": [
- "trieve"
- ]
- },
- "name": {
- "type": "string",
- "description": "This is the name of the knowledge base."
- },
- "searchPlan": {
- "description": "This is the searching plan used when searching for relevant chunks from the vector store.\n\nYou should configure this if you're running into these issues:\n- Too much unnecessary context is being fed as knowledge base context.\n- Not enough relevant context is being fed as knowledge base context.",
- "allOf": [
- {
- "$ref": "#/components/schemas/TrieveKnowledgeBaseSearchPlan"
- }
- ]
- },
- "createPlan": {
- "description": "This is the plan if you want us to create/import a new vector store using Trieve.",
- "oneOf": [
- {
- "$ref": "#/components/schemas/TrieveKnowledgeBaseImport",
- "title": "Import"
- }
- ]
- },
- "id": {
- "type": "string",
- "description": "This is the id of the knowledge base."
- },
- "orgId": {
- "type": "string",
- "description": "This is the org id of the knowledge base."
- }
- },
- "required": [
- "provider",
- "id",
- "orgId"
- ]
- },
"CustomKnowledgeBase": {
"type": "object",
"properties": {
@@ -43827,71 +53493,16 @@
"orgId"
]
},
- "CreateTrieveKnowledgeBaseDTO": {
+ "UpdateCustomKnowledgeBaseDTO": {
"type": "object",
"properties": {
"provider": {
"type": "string",
- "description": "This knowledge base is provided by Trieve.\n\nTo learn more about Trieve, visit https://trieve.ai.",
+ "description": "This knowledge base is bring your own knowledge base implementation.",
"enum": [
- "trieve"
- ]
- },
- "name": {
- "type": "string",
- "description": "This is the name of the knowledge base."
- },
- "searchPlan": {
- "description": "This is the searching plan used when searching for relevant chunks from the vector store.\n\nYou should configure this if you're running into these issues:\n- Too much unnecessary context is being fed as knowledge base context.\n- Not enough relevant context is being fed as knowledge base context.",
- "allOf": [
- {
- "$ref": "#/components/schemas/TrieveKnowledgeBaseSearchPlan"
- }
- ]
- },
- "createPlan": {
- "description": "This is the plan if you want us to create/import a new vector store using Trieve.",
- "oneOf": [
- {
- "$ref": "#/components/schemas/TrieveKnowledgeBaseImport",
- "title": "Import"
- }
- ]
- }
- },
- "required": [
- "provider"
- ]
- },
- "UpdateTrieveKnowledgeBaseDTO": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string",
- "description": "This is the name of the knowledge base."
- },
- "searchPlan": {
- "description": "This is the searching plan used when searching for relevant chunks from the vector store.\n\nYou should configure this if you're running into these issues:\n- Too much unnecessary context is being fed as knowledge base context.\n- Not enough relevant context is being fed as knowledge base context.",
- "allOf": [
- {
- "$ref": "#/components/schemas/TrieveKnowledgeBaseSearchPlan"
- }
+ "custom-knowledge-base"
]
},
- "createPlan": {
- "description": "This is the plan if you want us to create/import a new vector store using Trieve.",
- "oneOf": [
- {
- "$ref": "#/components/schemas/TrieveKnowledgeBaseImport",
- "title": "Import"
- }
- ]
- }
- }
- },
- "UpdateCustomKnowledgeBaseDTO": {
- "type": "object",
- "properties": {
"server": {
"description": "This is where the knowledge base request will be sent.\n\nRequest Example:\n\nPOST https://{server.url}\nContent-Type: application/json\n\n{\n \"messsage\": {\n \"type\": \"knowledge-base-request\",\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": \"Why is ocean blue?\"\n }\n ],\n ...other metadata about the call...\n }\n}\n\nResponse Expected:\n```\n{\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"The ocean is blue because water absorbs everything but blue.\",\n }, // YOU CAN RETURN THE EXACT RESPONSE TO SPEAK\n \"documents\": [\n {\n \"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.\",\n \"similarity\": 1\n },\n {\n \"content\": \"Blue light is scattered more by the water molecules than other colors, enhancing the blue appearance of the ocean.\",\n \"similarity\": .5\n }\n ] // OR, YOU CAN RETURN AN ARRAY OF DOCUMENTS THAT WILL BE SENT TO THE MODEL\n}\n```",
"allOf": [
@@ -43902,83 +53513,6 @@
}
}
},
- "TrieveKnowledgeBaseChunkPlan": {
- "type": "object",
- "properties": {
- "fileIds": {
- "description": "These are the file ids that will be used to create the vector store. To upload files, use the `POST /files` endpoint.",
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "websites": {
- "description": "These are the websites that will be used to create the vector store.",
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "targetSplitsPerChunk": {
- "type": "number",
- "description": "This is an optional field which allows you to specify the number of splits you want per chunk. If not specified, the default 20 is used. However, you may want to use a different number."
- },
- "splitDelimiters": {
- "description": "This is an optional field which allows you to specify the delimiters to use when splitting the file before chunking the text. If not specified, the default [.!?\\n] are used to split into sentences. However, you may want to use spaces or other delimiters.",
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "rebalanceChunks": {
- "type": "boolean",
- "description": "This is an optional field which allows you to specify whether or not to rebalance the chunks created from the file. If not specified, the default true is used. If true, Trieve will evenly distribute remainder splits across chunks such that 66 splits with a target_splits_per_chunk of 20 will result in 3 chunks with 22 splits each."
- }
- }
- },
- "TrieveKnowledgeBaseCreate": {
- "type": "object",
- "properties": {
- "type": {
- "type": "string",
- "description": "This is to create a new dataset on Trieve.",
- "enum": [
- "create"
- ]
- },
- "chunkPlans": {
- "description": "These are the chunk plans used to create the dataset.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/TrieveKnowledgeBaseChunkPlan"
- }
- }
- },
- "required": [
- "type",
- "chunkPlans"
- ]
- },
- "TrieveKnowledgeBaseImport": {
- "type": "object",
- "properties": {
- "type": {
- "type": "string",
- "description": "This is to import an existing dataset from Trieve.",
- "enum": [
- "import"
- ]
- },
- "providerId": {
- "type": "string",
- "description": "This is the `datasetId` of the dataset on your Trieve account."
- }
- },
- "required": [
- "type",
- "providerId"
- ]
- },
"StructuredOutput": {
"type": "object",
"properties": {
@@ -45267,6 +54801,11 @@
}
]
},
+ "path": {
+ "type": "string",
+ "description": "Optional dot-notation path to a primitive leaf when evaluating an object structured output.",
+ "example": "contact.auth_started"
+ },
"comparator": {
"type": "string",
"description": "This is the comparison operator to use when evaluating the extracted value against the expected value.\nAvailable operators depend on the structured output's schema type:\n- boolean: '=', '!='\n- string: '=', '!='\n- number/integer: '=', '!=', '>', '<', '>=', '<='",
@@ -46002,6 +55541,22 @@
"type": "string",
"description": "This is the name of the structured output."
},
+ "path": {
+ "type": "string",
+ "description": "This is the optional dot-notation path evaluated within an object structured output."
+ },
+ "description": {
+ "type": "string",
+ "description": "This is the structured output description captured when the evaluation ran."
+ },
+ "schema": {
+ "description": "This is the structured output schema captured when the evaluation ran.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/JsonSchema"
+ }
+ ]
+ },
"extractedValue": {
"description": "This is the value extracted from the call by the structured output.",
"oneOf": [
@@ -46857,6 +56412,10 @@
"format": "date-time",
"type": "string",
"description": "This is the ISO 8601 date-time string of when the Insight was last updated."
+ },
+ "systemKey": {
+ "type": "string",
+ "description": "Stable server-owned identifier for system-created insights."
}
},
"required": [
@@ -46968,6 +56527,10 @@
"format": "date-time",
"type": "string",
"description": "This is the ISO 8601 date-time string of when the Insight was last updated."
+ },
+ "systemKey": {
+ "type": "string",
+ "description": "Stable server-owned identifier for system-created insights."
}
},
"required": [
@@ -47094,80 +56657,88 @@
"format": "date-time",
"type": "string",
"description": "This is the ISO 8601 date-time string of when the Insight was last updated."
- }
- },
- "required": [
- "type",
- "queries",
- "id",
- "orgId",
- "createdAt",
- "updatedAt"
- ]
- },
- "TextInsight": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string",
- "description": "This is the name of the Insight.",
- "minLength": 1,
- "maxLength": 255
- },
- "type": {
- "type": "string",
- "description": "This is the type of the Insight.\nIt is required to be `text` to create a text insight.",
- "enum": [
- "text"
- ]
- },
- "formula": {
- "type": "object",
- "description": "Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe 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.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula.",
- "items": {
- "$ref": "#/components/schemas/InsightFormula"
- }
- },
- "timeRange": {
- "$ref": "#/components/schemas/InsightTimeRange"
- },
- "queries": {
- "type": "array",
- "description": "These are the queries to run to generate the insight.\nFor Text Insights, we only allow a single query, or require a formula if multiple queries are provided",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn",
- "title": "JSONQueryOnCallTableWithStringTypeColumn"
- },
- {
- "$ref": "#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn",
- "title": "JSONQueryOnCallTableWithNumberTypeColumn"
- },
- {
- "$ref": "#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn",
- "title": "JSONQueryOnCallTableWithStructuredOutputColumn"
- }
- ]
- }
- },
- "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": {
- "format": "date-time",
+ "systemKey": {
+ "type": "string",
+ "description": "Stable server-owned identifier for system-created insights."
+ }
+ },
+ "required": [
+ "type",
+ "queries",
+ "id",
+ "orgId",
+ "createdAt",
+ "updatedAt"
+ ]
+ },
+ "TextInsight": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "This is the name of the Insight.",
+ "minLength": 1,
+ "maxLength": 255
+ },
+ "type": {
+ "type": "string",
+ "description": "This is the type of the Insight.\nIt is required to be `text` to create a text insight.",
+ "enum": [
+ "text"
+ ]
+ },
+ "formula": {
+ "type": "object",
+ "description": "Formulas are mathematical expressions applied on the data returned by the queries to transform them before being used to create the insight.\nThe formulas needs to be a valid mathematical expression, supported by MathJS - https://mathjs.org/docs/expressions/syntax.html\nA formula is created by using the query names as the variable.\nThe 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.\nFor example, if you have 2 queries, 'Was Booking Made' and 'Average Call Duration', you can create a formula like this:\n```\n{{['Query 1']}} / {{['Query 2']}} * 100\n```\n\n```\n({{[Query 1]}} * 10) + {{[Query 2]}}\n```\nThis will take the\n\nYou can also use the query names as the variable in the formula.",
+ "items": {
+ "$ref": "#/components/schemas/InsightFormula"
+ }
+ },
+ "timeRange": {
+ "$ref": "#/components/schemas/InsightTimeRange"
+ },
+ "queries": {
+ "type": "array",
+ "description": "These are the queries to run to generate the insight.\nFor Text Insights, we only allow a single query, or require a formula if multiple queries are provided",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/JSONQueryOnCallTableWithStringTypeColumn",
+ "title": "JSONQueryOnCallTableWithStringTypeColumn"
+ },
+ {
+ "$ref": "#/components/schemas/JSONQueryOnCallTableWithNumberTypeColumn",
+ "title": "JSONQueryOnCallTableWithNumberTypeColumn"
+ },
+ {
+ "$ref": "#/components/schemas/JSONQueryOnCallTableWithStructuredOutputColumn",
+ "title": "JSONQueryOnCallTableWithStructuredOutputColumn"
+ }
+ ]
+ }
+ },
+ "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": {
+ "format": "date-time",
+ "type": "string",
+ "description": "This is the ISO 8601 date-time string of when the Insight was created."
+ },
+ "updatedAt": {
+ "format": "date-time",
+ "type": "string",
+ "description": "This is the ISO 8601 date-time string of when the Insight was last updated."
+ },
+ "systemKey": {
"type": "string",
- "description": "This is the ISO 8601 date-time string of when the Insight was created."
- },
- "updatedAt": {
- "format": "date-time",
- "type": "string",
- "description": "This is the ISO 8601 date-time string of when the Insight was last updated."
+ "description": "Stable server-owned identifier for system-created insights."
}
},
"required": [
@@ -48790,6 +58361,10 @@
"$ref": "#/components/schemas/InsightTimeRangeWithStep"
}
]
+ },
+ "assistantId": {
+ "type": "string",
+ "description": "Optional runtime assistant scope for dashboards.\nThis is applied to call-table queries without mutating the saved insight."
}
}
},
@@ -48858,6 +58433,10 @@
"format": "date-time",
"type": "string",
"description": "This is the ISO 8601 date-time string of when the Insight was last updated."
+ },
+ "systemKey": {
+ "type": "string",
+ "description": "Stable server-owned identifier for system-created insights."
}
},
"required": [
@@ -49423,7 +59002,10 @@
"gpt-3.5-turbo-0125:northcentralus",
"gpt-3.5-turbo-0125:southcentralus",
"gpt-3.5-turbo-1106:canadaeast",
- "gpt-3.5-turbo-1106:westus"
+ "gpt-3.5-turbo-1106:westus",
+ "gpt-4.1:australiaeast",
+ "gpt-4o:australiaeast",
+ "gpt-5.4-mini:australiaeast"
]
},
"temperature": {
@@ -49534,6 +59116,8 @@
"description": "This is the name of the model. Ex. gpt-4o",
"maxLength": 100,
"enum": [
+ "gemini-3.5-flash",
+ "gemini-3.1-flash-lite",
"gemini-3-flash-preview",
"gemini-2.5-pro",
"gemini-2.5-flash",
@@ -49846,6 +59430,15 @@
"DESC"
]
},
+ "sortBy": {
+ "type": "string",
+ "description": "This is the column to sort by. Defaults to 'createdAt'.",
+ "enum": [
+ "createdAt",
+ "duration",
+ "cost"
+ ]
+ },
"limit": {
"type": "number",
"description": "This is the maximum number of items to return. Defaults to 100.",
@@ -50237,6 +59830,15 @@
"DESC"
]
},
+ "sortBy": {
+ "type": "string",
+ "description": "This is the column to sort by. Defaults to 'createdAt'.",
+ "enum": [
+ "createdAt",
+ "duration",
+ "cost"
+ ]
+ },
"limit": {
"type": "number",
"description": "This is the maximum number of items to return. Defaults to 100.",
@@ -51023,12 +60625,21 @@
}
},
"role": {
- "enum": [
- "admin",
- "editor",
- "viewer"
- ],
- "type": "string"
+ "pattern": "ORG_ROLE_OR_CUSTOM_ROLE_PATTERN",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "admin",
+ "editor",
+ "viewer"
+ ]
+ },
+ {
+ "type": "string",
+ "pattern": "^org-[a-z0-9-]+$"
+ }
+ ]
},
"redirectTo": {
"type": "string"
@@ -51046,12 +60657,21 @@
"type": "string"
},
"role": {
- "enum": [
- "admin",
- "editor",
- "viewer"
- ],
- "type": "string"
+ "pattern": "ORG_ROLE_OR_CUSTOM_ROLE_PATTERN",
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "admin",
+ "editor",
+ "viewer"
+ ]
+ },
+ {
+ "type": "string",
+ "pattern": "^org-[a-z0-9-]+$"
+ }
+ ]
}
},
"required": [
@@ -51346,6 +60966,7 @@
"enum": [
"us-east-1",
"us-west-2",
+ "eu-central-1",
"eu-west-1",
"eu-west-3",
"ap-northeast-1",
@@ -51670,7 +61291,10 @@
"gpt-4-1106-preview",
"gpt-4-0613",
"gpt-35-turbo-0125",
- "gpt-35-turbo-1106"
+ "gpt-35-turbo-1106",
+ "gpt-4o",
+ "gpt-4.1",
+ "gpt-5.4-mini-2026-03-17"
],
"example": [
"gpt-4-0125-preview",
@@ -51701,7 +61325,10 @@
"gpt-4-1106-preview",
"gpt-4-0613",
"gpt-35-turbo-0125",
- "gpt-35-turbo-1106"
+ "gpt-35-turbo-1106",
+ "gpt-4o",
+ "gpt-4.1",
+ "gpt-5.4-mini-2026-03-17"
]
}
},
@@ -51737,33 +61364,221 @@
"description": "This is the name of credential. This is just for your reference.",
"minLength": 1,
"maxLength": 40
- },
- "openAIEndpoint": {
- "type": "string",
- "maxLength": 10000
+ },
+ "openAIEndpoint": {
+ "type": "string",
+ "maxLength": 10000
+ }
+ },
+ "required": [
+ "provider",
+ "region",
+ "models",
+ "openAIKey",
+ "id",
+ "orgId",
+ "createdAt",
+ "updatedAt",
+ "openAIEndpoint"
+ ]
+ },
+ "ByoSipTrunkCredential": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "type": "string",
+ "description": "This can be used to bring your own SIP trunks or to connect to a Carrier.",
+ "enum": [
+ "byo-sip-trunk"
+ ]
+ },
+ "id": {
+ "type": "string",
+ "description": "This is the unique identifier for the credential."
+ },
+ "orgId": {
+ "type": "string",
+ "description": "This is the unique identifier for the org that this credential belongs to."
+ },
+ "createdAt": {
+ "format": "date-time",
+ "type": "string",
+ "description": "This is the ISO 8601 date-time string of when the credential was created."
+ },
+ "updatedAt": {
+ "format": "date-time",
+ "type": "string",
+ "description": "This is the ISO 8601 date-time string of when the assistant was last updated."
+ },
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
+ },
+ "gateways": {
+ "description": "This is the list of SIP trunk's gateways.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/SipTrunkGateway"
+ }
+ },
+ "outboundAuthenticationPlan": {
+ "description": "This can be used to configure the outbound authentication if required by the SIP trunk.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/SipTrunkOutboundAuthenticationPlan"
+ }
+ ]
+ },
+ "outboundLeadingPlusEnabled": {
+ "type": "boolean",
+ "description": "This ensures the outbound origination attempts have a leading plus. Defaults to false to match conventional telecom behavior.\n\nUsage:\n- Vonage/Twilio requires leading plus for all outbound calls. Set this to true.\n\n@default false"
+ },
+ "techPrefix": {
+ "type": "string",
+ "description": "This can be used to configure the tech prefix on outbound calls. This is an advanced property.",
+ "maxLength": 10000
+ },
+ "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.",
+ "maxLength": 10000
+ }
+ },
+ "required": [
+ "id",
+ "orgId",
+ "createdAt",
+ "updatedAt",
+ "gateways"
+ ]
+ },
+ "CartesiaCredential": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "cartesia"
+ ]
+ },
+ "apiKey": {
+ "type": "string",
+ "description": "This is not returned in the API."
+ },
+ "id": {
+ "type": "string",
+ "description": "This is the unique identifier for the credential."
+ },
+ "orgId": {
+ "type": "string",
+ "description": "This is the unique identifier for the org that this credential belongs to."
+ },
+ "createdAt": {
+ "format": "date-time",
+ "type": "string",
+ "description": "This is the ISO 8601 date-time string of when the credential was created."
+ },
+ "updatedAt": {
+ "format": "date-time",
+ "type": "string",
+ "description": "This is the ISO 8601 date-time string of when the assistant was last updated."
+ },
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
+ },
+ "apiUrl": {
+ "type": "string",
+ "description": "This can be used to point to an onprem Cartesia instance. Defaults to api.cartesia.ai."
+ }
+ },
+ "required": [
+ "provider",
+ "apiKey",
+ "id",
+ "orgId",
+ "createdAt",
+ "updatedAt"
+ ]
+ },
+ "CerebrasCredential": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "cerebras"
+ ]
+ },
+ "apiKey": {
+ "type": "string",
+ "maxLength": 10000,
+ "description": "This is not returned in the API."
+ },
+ "id": {
+ "type": "string",
+ "description": "This is the unique identifier for the credential."
+ },
+ "orgId": {
+ "type": "string",
+ "description": "This is the unique identifier for the org that this credential belongs to."
+ },
+ "createdAt": {
+ "format": "date-time",
+ "type": "string",
+ "description": "This is the ISO 8601 date-time string of when the credential was created."
+ },
+ "updatedAt": {
+ "format": "date-time",
+ "type": "string",
+ "description": "This is the ISO 8601 date-time string of when the assistant was last updated."
+ },
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
}
},
"required": [
"provider",
- "region",
- "models",
- "openAIKey",
+ "apiKey",
"id",
"orgId",
"createdAt",
- "updatedAt",
- "openAIEndpoint"
+ "updatedAt"
]
},
- "ByoSipTrunkCredential": {
+ "CloudflareCredential": {
"type": "object",
"properties": {
"provider": {
"type": "string",
- "description": "This can be used to bring your own SIP trunks or to connect to a Carrier.",
"enum": [
- "byo-sip-trunk"
- ]
+ "cloudflare"
+ ],
+ "description": "Credential provider. Only allowed value is 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",
+ "description": "This is the order in which this storage provider is tried during upload retries. Lower numbers are tried first in increasing order.",
+ "minimum": 1
},
"id": {
"type": "string",
@@ -51789,65 +61604,63 @@
"minLength": 1,
"maxLength": 40
},
- "gateways": {
- "description": "This is the list of SIP trunk's gateways.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/SipTrunkGateway"
- }
- },
- "outboundAuthenticationPlan": {
- "description": "This can be used to configure the outbound authentication if required by the SIP trunk.",
- "allOf": [
- {
- "$ref": "#/components/schemas/SipTrunkOutboundAuthenticationPlan"
- }
- ]
- },
- "outboundLeadingPlusEnabled": {
- "type": "boolean",
- "description": "This ensures the outbound origination attempts have a leading plus. Defaults to false to match conventional telecom behavior.\n\nUsage:\n- Vonage/Twilio requires leading plus for all outbound calls. Set this to true.\n\n@default false"
- },
- "techPrefix": {
- "type": "string",
- "description": "This can be used to configure the tech prefix on outbound calls. This is an advanced property.",
- "maxLength": 10000
- },
- "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.",
- "maxLength": 10000
- },
- "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.",
+ "bucketPlan": {
+ "description": "This is the bucket plan that can be provided to store call artifacts in R2",
"allOf": [
{
- "$ref": "#/components/schemas/SbcConfiguration"
+ "$ref": "#/components/schemas/CloudflareR2BucketPlan"
}
]
}
},
"required": [
+ "provider",
"id",
"orgId",
"createdAt",
- "updatedAt",
- "gateways"
+ "updatedAt"
]
},
- "CartesiaCredential": {
+ "Oauth2AuthenticationSession": {
+ "type": "object",
+ "properties": {
+ "accessToken": {
+ "type": "string",
+ "description": "This is the OAuth2 access token."
+ },
+ "expiresAt": {
+ "format": "date-time",
+ "type": "string",
+ "description": "This is the OAuth2 access token expiration."
+ },
+ "refreshToken": {
+ "type": "string",
+ "description": "This is the OAuth2 refresh token."
+ }
+ }
+ },
+ "CustomLLMCredential": {
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
- "cartesia"
+ "custom-llm"
]
},
"apiKey": {
"type": "string",
+ "maxLength": 10000,
"description": "This is not returned in the API."
},
+ "authenticationPlan": {
+ "description": "This is the authentication plan. Currently supports OAuth2 RFC 6749. To use Bearer authentication, use apiKey",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/OAuth2AuthenticationPlan"
+ }
+ ]
+ },
"id": {
"type": "string",
"description": "This is the unique identifier for the credential."
@@ -51866,6 +61679,14 @@
"type": "string",
"description": "This is the ISO 8601 date-time string of when the assistant was last updated."
},
+ "authenticationSession": {
+ "description": "This is the authentication session for the credential. Available for credentials that have an authentication plan.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Oauth2AuthenticationSession"
+ }
+ ]
+ },
"name": {
"type": "string",
"description": "This is the name of credential. This is just for your reference.",
@@ -51882,18 +61703,17 @@
"updatedAt"
]
},
- "CerebrasCredential": {
+ "DeepgramCredential": {
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
- "cerebras"
+ "deepgram"
]
},
"apiKey": {
"type": "string",
- "maxLength": 10000,
"description": "This is not returned in the API."
},
"id": {
@@ -51919,6 +61739,10 @@
"description": "This is the name of credential. This is just for your reference.",
"minLength": 1,
"maxLength": 40
+ },
+ "apiUrl": {
+ "type": "string",
+ "description": "This can be used to point to an onprem Deepgram instance. Defaults to api.deepgram.com."
}
},
"required": [
@@ -51930,32 +61754,18 @@
"updatedAt"
]
},
- "CloudflareCredential": {
+ "DeepInfraCredential": {
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
- "cloudflare"
- ],
- "description": "Credential provider. Only allowed value is cloudflare"
- },
- "accountId": {
- "type": "string",
- "description": "Cloudflare Account Id."
+ "deepinfra"
+ ]
},
"apiKey": {
"type": "string",
- "description": "Cloudflare API Key / Token."
- },
- "accountEmail": {
- "type": "string",
- "description": "Cloudflare Account Email."
- },
- "fallbackIndex": {
- "type": "number",
- "description": "This is the order in which this storage provider is tried during upload retries. Lower numbers are tried first in increasing order.",
- "minimum": 1
+ "description": "This is not returned in the API."
},
"id": {
"type": "string",
@@ -51980,64 +61790,30 @@
"description": "This is the name of credential. This is just for your reference.",
"minLength": 1,
"maxLength": 40
- },
- "bucketPlan": {
- "description": "This is the bucket plan that can be provided to store call artifacts in R2",
- "allOf": [
- {
- "$ref": "#/components/schemas/CloudflareR2BucketPlan"
- }
- ]
}
},
"required": [
"provider",
+ "apiKey",
"id",
"orgId",
"createdAt",
"updatedAt"
]
},
- "Oauth2AuthenticationSession": {
- "type": "object",
- "properties": {
- "accessToken": {
- "type": "string",
- "description": "This is the OAuth2 access token."
- },
- "expiresAt": {
- "format": "date-time",
- "type": "string",
- "description": "This is the OAuth2 access token expiration."
- },
- "refreshToken": {
- "type": "string",
- "description": "This is the OAuth2 refresh token."
- }
- }
- },
- "CustomLLMCredential": {
+ "DeepSeekCredential": {
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
- "custom-llm"
+ "deep-seek"
]
},
"apiKey": {
"type": "string",
- "maxLength": 10000,
"description": "This is not returned in the API."
},
- "authenticationPlan": {
- "description": "This is the authentication plan. Currently supports OAuth2 RFC 6749. To use Bearer authentication, use apiKey",
- "allOf": [
- {
- "$ref": "#/components/schemas/OAuth2AuthenticationPlan"
- }
- ]
- },
"id": {
"type": "string",
"description": "This is the unique identifier for the credential."
@@ -52056,14 +61832,6 @@
"type": "string",
"description": "This is the ISO 8601 date-time string of when the assistant was last updated."
},
- "authenticationSession": {
- "description": "This is the authentication session for the credential. Available for credentials that have an authentication plan.",
- "allOf": [
- {
- "$ref": "#/components/schemas/Oauth2AuthenticationSession"
- }
- ]
- },
"name": {
"type": "string",
"description": "This is the name of credential. This is just for your reference.",
@@ -52080,19 +61848,29 @@
"updatedAt"
]
},
- "DeepgramCredential": {
+ "ElevenLabsCredential": {
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
- "deepgram"
+ "11labs"
]
},
"apiKey": {
"type": "string",
+ "maxLength": 10000,
"description": "This is not returned in the API."
},
+ "apiUrl": {
+ "type": "string",
+ "enum": [
+ "https://api.elevenlabs.io",
+ "https://api.eu.residency.elevenlabs.io"
+ ],
+ "description": "ElevenLabs-only API environment for this key: the global endpoint or the EU data residency endpoint. If omitted on create, Vapi detects it automatically. If set to null on update, Vapi clears the saved endpoint and re-detects it with the saved API key.",
+ "nullable": true
+ },
"id": {
"type": "string",
"description": "This is the unique identifier for the credential."
@@ -52116,10 +61894,6 @@
"description": "This is the name of credential. This is just for your reference.",
"minLength": 1,
"maxLength": 40
- },
- "apiUrl": {
- "type": "string",
- "description": "This can be used to point to an onprem Deepgram instance. Defaults to api.deepgram.com."
}
},
"required": [
@@ -52131,18 +61905,19 @@
"updatedAt"
]
},
- "DeepInfraCredential": {
+ "GcpCredential": {
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
- "deepinfra"
+ "gcp"
]
},
- "apiKey": {
- "type": "string",
- "description": "This is not returned in the API."
+ "fallbackIndex": {
+ "type": "number",
+ "description": "This is the order in which this storage provider is tried during upload retries. Lower numbers are tried first in increasing order.",
+ "minimum": 1
},
"id": {
"type": "string",
@@ -52167,24 +61942,40 @@
"description": "This is the name of credential. This is just for your reference.",
"minLength": 1,
"maxLength": 40
+ },
+ "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//keys.\n\nThe schema is identical to the JSON that GCP outputs.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/GcpKey"
+ }
+ ]
+ },
+ "region": {
+ "type": "string",
+ "description": "This is the region of the GCP resource.",
+ "maxLength": 40
+ },
+ "bucketPlan": {
+ "$ref": "#/components/schemas/BucketPlan"
}
},
"required": [
"provider",
- "apiKey",
"id",
"orgId",
"createdAt",
- "updatedAt"
+ "updatedAt",
+ "gcpKey"
]
},
- "DeepSeekCredential": {
+ "GladiaCredential": {
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
- "deep-seek"
+ "gladia"
]
},
"apiKey": {
@@ -52225,18 +62016,17 @@
"updatedAt"
]
},
- "ElevenLabsCredential": {
+ "GoHighLevelCredential": {
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
- "11labs"
+ "gohighlevel"
]
},
"apiKey": {
"type": "string",
- "maxLength": 10000,
"description": "This is not returned in the API."
},
"id": {
@@ -52273,19 +62063,20 @@
"updatedAt"
]
},
- "GcpCredential": {
+ "GoogleCredential": {
"type": "object",
"properties": {
"provider": {
"type": "string",
+ "description": "This is the key for Gemini in Google AI Studio. Get it from here: https://aistudio.google.com/app/apikey",
"enum": [
- "gcp"
+ "google"
]
},
- "fallbackIndex": {
- "type": "number",
- "description": "This is the order in which this storage provider is tried during upload retries. Lower numbers are tried first in increasing order.",
- "minimum": 1
+ "apiKey": {
+ "type": "string",
+ "maxLength": 10000,
+ "description": "This is not returned in the API."
},
"id": {
"type": "string",
@@ -52310,40 +62101,24 @@
"description": "This is the name of credential. This is just for your reference.",
"minLength": 1,
"maxLength": 40
- },
- "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//keys.\n\nThe schema is identical to the JSON that GCP outputs.",
- "allOf": [
- {
- "$ref": "#/components/schemas/GcpKey"
- }
- ]
- },
- "region": {
- "type": "string",
- "description": "This is the region of the GCP resource.",
- "maxLength": 40
- },
- "bucketPlan": {
- "$ref": "#/components/schemas/BucketPlan"
}
},
"required": [
"provider",
+ "apiKey",
"id",
"orgId",
"createdAt",
- "updatedAt",
- "gcpKey"
+ "updatedAt"
]
},
- "GladiaCredential": {
+ "GroqCredential": {
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
- "gladia"
+ "groq"
]
},
"apiKey": {
@@ -52384,17 +62159,18 @@
"updatedAt"
]
},
- "GoHighLevelCredential": {
+ "HumeCredential": {
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
- "gohighlevel"
+ "hume"
]
},
"apiKey": {
"type": "string",
+ "maxLength": 10000,
"description": "This is not returned in the API."
},
"id": {
@@ -52431,14 +62207,14 @@
"updatedAt"
]
},
- "GoogleCredential": {
+ "InflectionAICredential": {
"type": "object",
"properties": {
"provider": {
"type": "string",
- "description": "This is the key for Gemini in Google AI Studio. Get it from here: https://aistudio.google.com/app/apikey",
+ "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",
"enum": [
- "google"
+ "inflection-ai"
]
},
"apiKey": {
@@ -52480,66 +62256,26 @@
"updatedAt"
]
},
- "GroqCredential": {
+ "LangfuseCredential": {
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
- "groq"
+ "langfuse"
]
},
- "apiKey": {
- "type": "string",
- "description": "This is not returned in the API."
- },
- "id": {
- "type": "string",
- "description": "This is the unique identifier for the credential."
- },
- "orgId": {
- "type": "string",
- "description": "This is the unique identifier for the org that this credential belongs to."
- },
- "createdAt": {
- "format": "date-time",
- "type": "string",
- "description": "This is the ISO 8601 date-time string of when the credential was created."
- },
- "updatedAt": {
- "format": "date-time",
+ "publicKey": {
"type": "string",
- "description": "This is the ISO 8601 date-time string of when the assistant was last updated."
+ "description": "The public key for Langfuse project. Eg: pk-lf-..."
},
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "apiKey",
- "id",
- "orgId",
- "createdAt",
- "updatedAt"
- ]
- },
- "HumeCredential": {
- "type": "object",
- "properties": {
- "provider": {
+ "apiKey": {
"type": "string",
- "enum": [
- "hume"
- ]
+ "description": "The secret key for Langfuse project. Eg: sk-lf-... .This is not returned in the API."
},
- "apiKey": {
+ "apiUrl": {
"type": "string",
- "maxLength": 10000,
- "description": "This is not returned in the API."
+ "description": "The host URL for Langfuse project. Eg: https://cloud.langfuse.com"
},
"id": {
"type": "string",
@@ -52568,26 +62304,26 @@
},
"required": [
"provider",
+ "publicKey",
"apiKey",
+ "apiUrl",
"id",
"orgId",
"createdAt",
"updatedAt"
]
},
- "InflectionAICredential": {
+ "LmntCredential": {
"type": "object",
"properties": {
"provider": {
"type": "string",
- "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",
"enum": [
- "inflection-ai"
+ "lmnt"
]
},
"apiKey": {
"type": "string",
- "maxLength": 10000,
"description": "This is not returned in the API."
},
"id": {
@@ -52624,71 +62360,22 @@
"updatedAt"
]
},
- "LangfuseCredential": {
+ "MakeCredential": {
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
- "langfuse"
+ "make"
]
},
- "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"
- },
- "id": {
- "type": "string",
- "description": "This is the unique identifier for the credential."
- },
- "orgId": {
- "type": "string",
- "description": "This is the unique identifier for the org that this credential belongs to."
- },
- "createdAt": {
- "format": "date-time",
- "type": "string",
- "description": "This is the ISO 8601 date-time string of when the credential was created."
- },
- "updatedAt": {
- "format": "date-time",
+ "teamId": {
"type": "string",
- "description": "This is the ISO 8601 date-time string of when the assistant was last updated."
+ "description": "Team ID"
},
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "publicKey",
- "apiKey",
- "apiUrl",
- "id",
- "orgId",
- "createdAt",
- "updatedAt"
- ]
- },
- "LmntCredential": {
- "type": "object",
- "properties": {
- "provider": {
+ "region": {
"type": "string",
- "enum": [
- "lmnt"
- ]
+ "description": "Region of your application. For example: eu1, eu2, us1, us2"
},
"apiKey": {
"type": "string",
@@ -52721,6 +62408,8 @@
},
"required": [
"provider",
+ "teamId",
+ "region",
"apiKey",
"id",
"orgId",
@@ -52728,26 +62417,25 @@
"updatedAt"
]
},
- "MakeCredential": {
+ "MicrosoftCredential": {
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
- "make"
+ "microsoft"
]
},
- "teamId": {
+ "apiKey": {
"type": "string",
- "description": "Team ID"
+ "description": "This is not returned in the API.",
+ "maxLength": 10000
},
"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."
+ "description": "Azure region for the Speech resource. Defaults to `eastus` when omitted. MAI-Voice-2 is preview and region-limited.",
+ "maxLength": 64,
+ "example": "eastus"
},
"id": {
"type": "string",
@@ -52776,8 +62464,6 @@
},
"required": [
"provider",
- "teamId",
- "region",
"apiKey",
"id",
"orgId",
@@ -53287,6 +62973,96 @@
"updatedAt"
]
},
+ "S3CompatibleBucketPlan": {
+ "type": "object",
+ "properties": {
+ "url": {
+ "type": "string",
+ "description": "S3-compatible endpoint URL, such as https://s3.us-west-004.backblazeb2.com. Must be public HTTPS."
+ },
+ "region": {
+ "type": "string",
+ "maxLength": 64,
+ "description": "SigV4 signing region expected by the object store. Most stores accept us-east-1."
+ },
+ "accessKeyId": {
+ "type": "string",
+ "description": "S3 access key ID."
+ },
+ "secretAccessKey": {
+ "type": "string",
+ "description": "S3 secret access key. This is not returned in the API.",
+ "writeOnly": true
+ },
+ "name": {
+ "type": "string",
+ "description": "Bucket name."
+ },
+ "path": {
+ "type": "string",
+ "description": "Optional key prefix inside the bucket, such as recordings/."
+ }
+ },
+ "required": [
+ "url",
+ "region",
+ "accessKeyId",
+ "secretAccessKey",
+ "name"
+ ]
+ },
+ "S3CompatibleStorageCredential": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "s3-compatible"
+ ],
+ "description": "This is for S3-compatible storage such as MinIO, Garage, Ceph, or Backblaze B2."
+ },
+ "bucketPlan": {
+ "$ref": "#/components/schemas/S3CompatibleBucketPlan"
+ },
+ "fallbackIndex": {
+ "type": "number",
+ "minimum": 1,
+ "description": "This is the order in which this storage provider is tried during upload retries. Lower numbers are tried first in increasing order."
+ },
+ "id": {
+ "type": "string",
+ "description": "This is the unique identifier for the credential."
+ },
+ "orgId": {
+ "type": "string",
+ "description": "This is the unique identifier for the org that this credential belongs to."
+ },
+ "createdAt": {
+ "format": "date-time",
+ "type": "string",
+ "description": "This is the ISO 8601 date-time string of when the credential was created."
+ },
+ "updatedAt": {
+ "format": "date-time",
+ "type": "string",
+ "description": "This is the ISO 8601 date-time string of when the assistant was last updated."
+ },
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ },
+ "required": [
+ "provider",
+ "bucketPlan",
+ "id",
+ "orgId",
+ "createdAt",
+ "updatedAt"
+ ]
+ },
"SmallestAICredential": {
"type": "object",
"properties": {
@@ -53347,6 +63123,10 @@
"type": "string",
"description": "This is not returned in the API."
},
+ "apiUrl": {
+ "type": "string",
+ "description": "Custom Soniox WebSocket endpoint (e.g. EU server wss://stt-rt.eu.soniox.com/transcribe-websocket). Defaults to the region-appropriate endpoint when omitted."
+ },
"id": {
"type": "string",
"description": "This is the unique identifier for the credential."
@@ -53573,53 +63353,6 @@
"updatedAt"
]
},
- "TrieveCredential": {
- "type": "object",
- "properties": {
- "provider": {
- "type": "string",
- "enum": [
- "trieve"
- ]
- },
- "apiKey": {
- "type": "string",
- "description": "This is not returned in the API."
- },
- "id": {
- "type": "string",
- "description": "This is the unique identifier for the credential."
- },
- "orgId": {
- "type": "string",
- "description": "This is the unique identifier for the org that this credential belongs to."
- },
- "createdAt": {
- "format": "date-time",
- "type": "string",
- "description": "This is the ISO 8601 date-time string of when the credential was created."
- },
- "updatedAt": {
- "format": "date-time",
- "type": "string",
- "description": "This is the ISO 8601 date-time string of when the assistant was last updated."
- },
- "name": {
- "type": "string",
- "description": "This is the name of credential. This is just for your reference.",
- "minLength": 1,
- "maxLength": 40
- }
- },
- "required": [
- "provider",
- "apiKey",
- "id",
- "orgId",
- "createdAt",
- "updatedAt"
- ]
- },
"TwilioCredential": {
"type": "object",
"properties": {
@@ -54507,6 +64240,38 @@
"apiKey"
]
},
+ "CreateMicrosoftCredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "microsoft"
+ ]
+ },
+ "apiKey": {
+ "type": "string",
+ "description": "This is not returned in the API.",
+ "maxLength": 10000
+ },
+ "region": {
+ "type": "string",
+ "description": "Azure region for the Speech resource. Defaults to `eastus` when omitted. MAI-Voice-2 is preview and region-limited.",
+ "maxLength": 64,
+ "example": "eastus"
+ },
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ },
+ "required": [
+ "provider",
+ "apiKey"
+ ]
+ },
"CreateMistralCredentialDTO": {
"type": "object",
"properties": {
@@ -54584,18 +64349,23 @@
"apiKey"
]
},
- "CreateSonioxCredentialDTO": {
+ "CreateS3CompatibleCredentialDTO": {
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
- "soniox"
- ]
+ "s3-compatible"
+ ],
+ "description": "This is for S3-compatible storage such as MinIO, Garage, Ceph, or Backblaze B2."
},
- "apiKey": {
- "type": "string",
- "description": "This is not returned in the API."
+ "bucketPlan": {
+ "$ref": "#/components/schemas/S3CompatibleBucketPlan"
+ },
+ "fallbackIndex": {
+ "type": "number",
+ "minimum": 1,
+ "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",
@@ -54606,22 +64376,26 @@
},
"required": [
"provider",
- "apiKey"
+ "bucketPlan"
]
},
- "CreateSpeechmaticsCredentialDTO": {
+ "CreateSonioxCredentialDTO": {
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
- "speechmatics"
+ "soniox"
]
},
"apiKey": {
"type": "string",
"description": "This is not returned in the API."
},
+ "apiUrl": {
+ "type": "string",
+ "description": "Custom Soniox WebSocket endpoint (e.g. EU server wss://stt-rt.eu.soniox.com/transcribe-websocket). Defaults to the region-appropriate endpoint when omitted."
+ },
"name": {
"type": "string",
"description": "This is the name of credential. This is just for your reference.",
@@ -54634,13 +64408,13 @@
"apiKey"
]
},
- "CreateTrieveCredentialDTO": {
+ "CreateSpeechmaticsCredentialDTO": {
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
- "trieve"
+ "speechmatics"
]
},
"apiKey": {
@@ -54829,6 +64603,12 @@
"UpdateAnthropicCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "anthropic"
+ ]
+ },
"apiKey": {
"type": "string",
"maxLength": 10000,
@@ -54845,12 +64625,19 @@
"UpdateAnthropicBedrockCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "anthropic-bedrock"
+ ]
+ },
"region": {
"type": "string",
"description": "AWS region where Bedrock is configured.",
"enum": [
"us-east-1",
"us-west-2",
+ "eu-central-1",
"eu-west-1",
"eu-west-3",
"ap-northeast-1",
@@ -54879,6 +64666,12 @@
"UpdateAnyscaleCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "anyscale"
+ ]
+ },
"apiKey": {
"type": "string",
"maxLength": 10000,
@@ -54895,6 +64688,12 @@
"UpdateAssemblyAICredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "assembly-ai"
+ ]
+ },
"apiKey": {
"type": "string",
"description": "This is not returned in the API."
@@ -54910,6 +64709,12 @@
"UpdateAzureCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "azure"
+ ]
+ },
"service": {
"type": "string",
"description": "This is the service being used in Azure.",
@@ -54977,6 +64782,12 @@
"UpdateAzureOpenAICredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "azure-openai"
+ ]
+ },
"region": {
"type": "string",
"enum": [
@@ -55030,7 +64841,10 @@
"gpt-4-1106-preview",
"gpt-4-0613",
"gpt-35-turbo-0125",
- "gpt-35-turbo-1106"
+ "gpt-35-turbo-1106",
+ "gpt-4o",
+ "gpt-4.1",
+ "gpt-5.4-mini-2026-03-17"
],
"example": [
"gpt-4-0125-preview",
@@ -55061,7 +64875,10 @@
"gpt-4-1106-preview",
"gpt-4-0613",
"gpt-35-turbo-0125",
- "gpt-35-turbo-1106"
+ "gpt-35-turbo-1106",
+ "gpt-4o",
+ "gpt-4.1",
+ "gpt-5.4-mini-2026-03-17"
]
}
},
@@ -55089,6 +64906,13 @@
"UpdateByoSipTrunkCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "description": "This can be used to bring your own SIP trunks or to connect to a Carrier.",
+ "enum": [
+ "byo-sip-trunk"
+ ]
+ },
"name": {
"type": "string",
"description": "This is the name of credential. This is just for your reference.",
@@ -55123,20 +64947,18 @@
"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.",
"maxLength": 10000
- },
- "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.",
- "allOf": [
- {
- "$ref": "#/components/schemas/SbcConfiguration"
- }
- ]
}
}
},
"UpdateCartesiaCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "cartesia"
+ ]
+ },
"apiKey": {
"type": "string",
"description": "This is not returned in the API."
@@ -55146,12 +64968,22 @@
"description": "This is the name of credential. This is just for your reference.",
"minLength": 1,
"maxLength": 40
+ },
+ "apiUrl": {
+ "type": "string",
+ "description": "This can be used to point to an onprem Cartesia instance. Defaults to api.cartesia.ai."
}
}
},
"UpdateCerebrasCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "cerebras"
+ ]
+ },
"apiKey": {
"type": "string",
"maxLength": 10000,
@@ -55168,6 +65000,13 @@
"UpdateCloudflareCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "cloudflare"
+ ],
+ "description": "Credential provider. Only allowed value is cloudflare"
+ },
"accountId": {
"type": "string",
"description": "Cloudflare Account Id."
@@ -55204,6 +65043,12 @@
"UpdateCustomLLMCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "custom-llm"
+ ]
+ },
"apiKey": {
"type": "string",
"maxLength": 10000,
@@ -55228,6 +65073,12 @@
"UpdateDeepgramCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "deepgram"
+ ]
+ },
"apiKey": {
"type": "string",
"description": "This is not returned in the API."
@@ -55247,6 +65098,12 @@
"UpdateDeepInfraCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "deepinfra"
+ ]
+ },
"apiKey": {
"type": "string",
"description": "This is not returned in the API."
@@ -55262,6 +65119,12 @@
"UpdateDeepSeekCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "deep-seek"
+ ]
+ },
"apiKey": {
"type": "string",
"description": "This is not returned in the API."
@@ -55277,11 +65140,26 @@
"UpdateElevenLabsCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "11labs"
+ ]
+ },
"apiKey": {
"type": "string",
"maxLength": 10000,
"description": "This is not returned in the API."
},
+ "apiUrl": {
+ "type": "string",
+ "enum": [
+ "https://api.elevenlabs.io",
+ "https://api.eu.residency.elevenlabs.io"
+ ],
+ "description": "ElevenLabs-only API environment for this key: the global endpoint or the EU data residency endpoint. If omitted on create, Vapi detects it automatically. If set to null on update, Vapi clears the saved endpoint and re-detects it with the saved API key.",
+ "nullable": true
+ },
"name": {
"type": "string",
"description": "This is the name of credential. This is just for your reference.",
@@ -55293,6 +65171,12 @@
"UpdateGcpCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "gcp"
+ ]
+ },
"fallbackIndex": {
"type": "number",
"description": "This is the order in which this storage provider is tried during upload retries. Lower numbers are tried first in increasing order.",
@@ -55325,6 +65209,12 @@
"UpdateGladiaCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "gladia"
+ ]
+ },
"apiKey": {
"type": "string",
"description": "This is not returned in the API."
@@ -55340,6 +65230,12 @@
"UpdateGoHighLevelCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "gohighlevel"
+ ]
+ },
"apiKey": {
"type": "string",
"description": "This is not returned in the API."
@@ -55355,6 +65251,13 @@
"UpdateGoogleCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "description": "This is the key for Gemini in Google AI Studio. Get it from here: https://aistudio.google.com/app/apikey",
+ "enum": [
+ "google"
+ ]
+ },
"apiKey": {
"type": "string",
"maxLength": 10000,
@@ -55371,6 +65274,12 @@
"UpdateGroqCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "groq"
+ ]
+ },
"apiKey": {
"type": "string",
"description": "This is not returned in the API."
@@ -55386,6 +65295,12 @@
"UpdateHumeCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "hume"
+ ]
+ },
"apiKey": {
"type": "string",
"maxLength": 10000,
@@ -55402,6 +65317,13 @@
"UpdateInflectionAICredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "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",
+ "enum": [
+ "inflection-ai"
+ ]
+ },
"apiKey": {
"type": "string",
"maxLength": 10000,
@@ -55418,6 +65340,12 @@
"UpdateLangfuseCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "langfuse"
+ ]
+ },
"publicKey": {
"type": "string",
"description": "The public key for Langfuse project. Eg: pk-lf-..."
@@ -55441,6 +65369,12 @@
"UpdateLmntCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "lmnt"
+ ]
+ },
"apiKey": {
"type": "string",
"description": "This is not returned in the API."
@@ -55456,6 +65390,12 @@
"UpdateMakeCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "make"
+ ]
+ },
"teamId": {
"type": "string",
"description": "Team ID"
@@ -55476,9 +65416,43 @@
}
}
},
+ "UpdateMicrosoftCredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "microsoft"
+ ]
+ },
+ "apiKey": {
+ "type": "string",
+ "description": "This is not returned in the API.",
+ "maxLength": 10000
+ },
+ "region": {
+ "type": "string",
+ "description": "Azure region for the Speech resource. Defaults to `eastus` when omitted. MAI-Voice-2 is preview and region-limited.",
+ "maxLength": 64,
+ "example": "eastus"
+ },
+ "name": {
+ "type": "string",
+ "description": "This is the name of credential. This is just for your reference.",
+ "minLength": 1,
+ "maxLength": 40
+ }
+ }
+ },
"UpdateMistralCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "mistral"
+ ]
+ },
"apiKey": {
"type": "string",
"maxLength": 100,
@@ -55495,6 +65469,12 @@
"UpdateNeuphonicCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "neuphonic"
+ ]
+ },
"apiKey": {
"type": "string",
"description": "This is not returned in the API."
@@ -55510,6 +65490,12 @@
"UpdateOpenAICredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "openai"
+ ]
+ },
"apiKey": {
"type": "string",
"description": "This is not returned in the API."
@@ -55525,6 +65511,12 @@
"UpdateOpenRouterCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "openrouter"
+ ]
+ },
"apiKey": {
"type": "string",
"description": "This is not returned in the API."
@@ -55540,6 +65532,12 @@
"UpdatePerplexityAICredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "perplexity-ai"
+ ]
+ },
"apiKey": {
"type": "string",
"description": "This is not returned in the API."
@@ -55555,6 +65553,12 @@
"UpdatePlayHTCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "playht"
+ ]
+ },
"apiKey": {
"type": "string",
"description": "This is not returned in the API."
@@ -55573,6 +65577,12 @@
"UpdateRimeAICredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "rime-ai"
+ ]
+ },
"apiKey": {
"type": "string",
"description": "This is not returned in the API."
@@ -55588,6 +65598,12 @@
"UpdateRunpodCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "runpod"
+ ]
+ },
"apiKey": {
"type": "string",
"description": "This is not returned in the API."
@@ -55603,6 +65619,12 @@
"UpdateWellSaidCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "wellsaid"
+ ]
+ },
"apiKey": {
"type": "string",
"maxLength": 10000,
@@ -55619,6 +65641,13 @@
"UpdateS3CredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "s3"
+ ],
+ "description": "Credential provider. Only allowed value is s3"
+ },
"awsAccessKeyId": {
"type": "string",
"description": "AWS access key ID."
@@ -55652,12 +65681,54 @@
}
}
},
- "UpdateTogetherAICredentialDTO": {
+ "UpdateS3CompatibleBucketPlanDTO": {
"type": "object",
"properties": {
- "apiKey": {
+ "url": {
"type": "string",
- "description": "This is not returned in the API."
+ "description": "S3-compatible endpoint URL, such as https://s3.us-west-004.backblazeb2.com. Must be public HTTPS."
+ },
+ "region": {
+ "type": "string",
+ "maxLength": 64,
+ "description": "SigV4 signing region expected by the object store. Most stores accept us-east-1."
+ },
+ "accessKeyId": {
+ "type": "string",
+ "description": "S3 access key ID."
+ },
+ "secretAccessKey": {
+ "type": "string",
+ "description": "S3 secret access key. This is not returned in the API.",
+ "writeOnly": true
+ },
+ "name": {
+ "type": "string",
+ "description": "Bucket name."
+ },
+ "path": {
+ "type": "string",
+ "description": "Optional key prefix inside the bucket, such as recordings/."
+ }
+ }
+ },
+ "UpdateS3CompatibleCredentialDTO": {
+ "type": "object",
+ "properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "s3-compatible"
+ ],
+ "description": "This is for S3-compatible storage such as MinIO, Garage, Ceph, or Backblaze B2."
+ },
+ "fallbackIndex": {
+ "type": "number",
+ "minimum": 1,
+ "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/UpdateS3CompatibleBucketPlanDTO"
},
"name": {
"type": "string",
@@ -55667,9 +65738,15 @@
}
}
},
- "UpdateTrieveCredentialDTO": {
+ "UpdateTogetherAICredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "together-ai"
+ ]
+ },
"apiKey": {
"type": "string",
"description": "This is not returned in the API."
@@ -55685,6 +65762,12 @@
"UpdateTwilioCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "twilio"
+ ]
+ },
"authToken": {
"type": "string",
"description": "This is not returned in the API."
@@ -55711,6 +65794,12 @@
"UpdateVonageCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "vonage"
+ ]
+ },
"apiSecret": {
"type": "string",
"description": "This is not returned in the API."
@@ -55729,6 +65818,12 @@
"UpdateWebhookCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "webhook"
+ ]
+ },
"authenticationPlan": {
"description": "This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication.",
"oneOf": [
@@ -55762,6 +65857,12 @@
"UpdateCustomCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "custom-credential"
+ ]
+ },
"authenticationPlan": {
"description": "This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication.",
"oneOf": [
@@ -55814,6 +65915,13 @@
"UpdateXAiCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "description": "This is the api key for Grok in XAi's console. Get it from here: https://console.x.ai",
+ "enum": [
+ "xai"
+ ]
+ },
"apiKey": {
"type": "string",
"maxLength": 10000,
@@ -55830,6 +65938,12 @@
"UpdateGoogleCalendarOAuth2ClientCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "google.calendar.oauth2-client"
+ ]
+ },
"name": {
"type": "string",
"description": "This is the name of credential. This is just for your reference.",
@@ -55841,6 +65955,12 @@
"UpdateGoogleCalendarOAuth2AuthorizationCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "google.calendar.oauth2-authorization"
+ ]
+ },
"authorizationId": {
"type": "string",
"description": "The authorization ID for the OAuth2 authorization"
@@ -55856,6 +65976,12 @@
"UpdateGoogleSheetsOAuth2AuthorizationCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "google.sheets.oauth2-authorization"
+ ]
+ },
"authorizationId": {
"type": "string",
"description": "The authorization ID for the OAuth2 authorization"
@@ -55871,6 +65997,12 @@
"UpdateSlackOAuth2AuthorizationCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "slack.oauth2-authorization"
+ ]
+ },
"authorizationId": {
"type": "string",
"description": "The authorization ID for the OAuth2 authorization"
@@ -55886,6 +66018,12 @@
"UpdateGoHighLevelMCPCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "ghl.oauth2-authorization"
+ ]
+ },
"authenticationSession": {
"description": "This is the authentication session for the credential.",
"allOf": [
@@ -55905,6 +66043,12 @@
"UpdateInworldCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "inworld"
+ ]
+ },
"apiKey": {
"type": "string",
"description": "This is the Inworld Basic (Base64) authentication token. This is not returned in the API.",
@@ -55921,6 +66065,12 @@
"UpdateEmailCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "email"
+ ]
+ },
"email": {
"type": "string",
"description": "The recipient email address for alerts"
@@ -55936,6 +66086,12 @@
"UpdateSlackWebhookCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "slack-webhook"
+ ]
+ },
"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."
@@ -55951,10 +66107,20 @@
"UpdateSonioxCredentialDTO": {
"type": "object",
"properties": {
+ "provider": {
+ "type": "string",
+ "enum": [
+ "soniox"
+ ]
+ },
"apiKey": {
"type": "string",
"description": "This is not returned in the API."
},
+ "apiUrl": {
+ "type": "string",
+ "description": "Custom Soniox WebSocket endpoint (e.g. EU server wss://stt-rt.eu.soniox.com/transcribe-websocket). Defaults to the region-appropriate endpoint when omitted."
+ },
"name": {
"type": "string",
"description": "This is the name of credential. This is just for your reference.",
@@ -57095,7 +67261,9 @@
"inworld",
"minimax",
"wellsaid",
- "orpheus"
+ "orpheus",
+ "xai",
+ "microsoft"
]
},
"providerId": {
@@ -57215,7 +67383,9 @@
"inworld",
"minimax",
"wellsaid",
- "orpheus"
+ "orpheus",
+ "xai",
+ "microsoft"
],
"items": {
"type": "string",
@@ -57238,7 +67408,9 @@
"inworld",
"minimax",
"wellsaid",
- "orpheus"
+ "orpheus",
+ "xai",
+ "microsoft"
]
}
}
@@ -57455,6 +67627,16 @@
"VoiceLibraryVoiceResponse": {
"type": "object",
"properties": {
+ "age": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ }
+ ]
+ },
"voiceId": {
"type": "string"
},
@@ -57470,9 +67652,6 @@
"gender": {
"type": "string"
},
- "age": {
- "type": "object"
- },
"accent": {
"type": "string"
}
@@ -57768,6 +67947,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"workflow.node.started\" is sent when the active node changes.",
@@ -57841,6 +68025,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"assistant.started\" is sent when the assistant is started.",
@@ -57918,6 +68107,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"conversation-update\" is sent when an update is committed to the conversation history.",
@@ -58022,6 +68216,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"hang\" is sent when the assistant is hanging due to a delay. The delay can be caused by many factors, such as:\n- the model is too slow to respond\n- the voice is too slow to respond\n- the tool call is still waiting for a response from your server\n- etc.",
@@ -58090,6 +68289,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"metadata\" is sent to forward metadata to the client.",
@@ -58163,6 +68367,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"model-output\" is sent as the model outputs tokens.",
@@ -58240,6 +68449,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"speech-update\" is sent whenever assistant or user start or stop speaking.",
@@ -58330,6 +68544,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"transcript\" is sent as transcriber outputs partial or final transcript.",
@@ -58437,6 +68656,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"tool-calls\" is sent to call a tool.",
@@ -58549,6 +68773,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"tool-calls-result\" is sent to forward the result of a tool call to the client.",
@@ -58622,6 +68851,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"transfer-update\" is sent whenever a transfer happens.",
@@ -58731,6 +68965,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"user-interrupted\" is sent when the user interrupts the assistant.",
@@ -58803,6 +69042,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"language-change-detected\" is sent when the transcriber is automatically switched based on the detected language.",
@@ -58876,6 +69120,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"voice-input\" is sent when a generation is requested from voice provider.",
@@ -58949,6 +69198,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"assistant-speech\" is sent as assistant audio is being played.",
@@ -59051,6 +69305,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"chat.created\" is sent when a new chat is created.",
@@ -59128,6 +69387,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"chat.deleted\" is sent when a chat is deleted.",
@@ -59205,6 +69469,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"session.created\" is sent when a new session is created.",
@@ -59282,6 +69551,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"session.updated\" is sent when a session is updated.",
@@ -59359,6 +69633,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"session.deleted\" is sent when a session is deleted.",
@@ -59436,6 +69715,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"call.deleted\" is sent when a call is deleted.",
@@ -59504,6 +69788,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"call.deleted\" is sent when a call is deleted.",
@@ -59673,6 +69962,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"assistant-request\" is sent to fetch assistant configuration for an incoming call.",
@@ -59757,6 +70051,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"conversation-update\" is sent when an update is committed to the conversation history.",
@@ -59877,6 +70176,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"end-of-call-report\" is sent when the call ends and post-processing is complete.",
@@ -59912,6 +70216,7 @@
"call.start.error-subscription-upgrade-failed",
"call.start.error-subscription-concurrency-limit-reached",
"call.start.error-enterprise-feature-not-available-recording-consent",
+ "call.start.assistant-version-error-validation",
"assistant-not-valid",
"call.start.error-vapifault-database-error",
"assistant-not-found",
@@ -59931,6 +70236,9 @@
"pipeline-error-inworld-voice-failed",
"pipeline-error-minimax-voice-failed",
"pipeline-error-wellsaid-voice-failed",
+ "pipeline-error-xai-voice-failed",
+ "pipeline-error-microsoft-voice-failed",
+ "pipeline-error-microsoft-voice-request-canceled",
"pipeline-error-tavus-video-failed",
"call.in-progress.error-vapifault-openai-voice-failed",
"call.in-progress.error-vapifault-cartesia-voice-failed",
@@ -59948,6 +70256,8 @@
"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-xai-voice-failed",
+ "call.in-progress.error-vapifault-microsoft-voice-failed",
"call.in-progress.error-vapifault-tavus-video-failed",
"pipeline-error-vapi-llm-failed",
"pipeline-error-vapi-400-bad-request-validation-failed",
@@ -59957,12 +70267,17 @@
"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-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-vapi-transcriber-failed",
+ "call.in-progress.error-vapifault-vapi-transcriber-failed",
+ "call.in-progress.error-providerfault-vapi-transcriber-failed",
+ "call.in-progress.error-providerfault-vapi-voice-failed",
"pipeline-error-deepgram-transcriber-failed",
"pipeline-error-deepgram-transcriber-api-key-missing",
"call.in-progress.error-vapifault-deepgram-transcriber-failed",
@@ -60002,6 +70317,18 @@
"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",
+ "pipeline-error-xai-transcriber-auth-failed",
+ "pipeline-error-xai-transcriber-rate-limited",
+ "pipeline-error-xai-transcriber-invalid-config",
+ "pipeline-error-xai-transcriber-server-error",
+ "pipeline-error-xai-transcriber-failed",
+ "call.in-progress.error-vapifault-xai-transcriber-auth-failed",
+ "call.in-progress.error-vapifault-xai-transcriber-rate-limited",
+ "call.in-progress.error-vapifault-xai-transcriber-invalid-config",
+ "call.in-progress.error-vapifault-xai-transcriber-server-error",
+ "call.in-progress.error-vapifault-xai-transcriber-failed",
+ "pipeline-error-cartesia-transcriber-failed",
+ "call.in-progress.error-vapifault-cartesia-transcriber-failed",
"call.in-progress.error-pipeline-no-available-llm-model",
"worker-shutdown",
"vonage-disconnected",
@@ -60437,6 +70764,18 @@
"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",
+ "pipeline-error-xai-transcriber-auth-failed",
+ "pipeline-error-xai-transcriber-rate-limited",
+ "pipeline-error-xai-transcriber-invalid-config",
+ "pipeline-error-xai-transcriber-server-error",
+ "pipeline-error-xai-transcriber-failed",
+ "call.in-progress.error-vapifault-xai-transcriber-auth-failed",
+ "call.in-progress.error-vapifault-xai-transcriber-rate-limited",
+ "call.in-progress.error-vapifault-xai-transcriber-invalid-config",
+ "call.in-progress.error-vapifault-xai-transcriber-server-error",
+ "call.in-progress.error-vapifault-xai-transcriber-failed",
+ "pipeline-error-cartesia-transcriber-failed",
+ "call.in-progress.error-vapifault-cartesia-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",
@@ -60644,6 +70983,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"handoff-destination-request\" is sent when the model is requesting handoff but destination is unknown.",
@@ -60733,6 +71077,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"hang\" is sent when the assistant is hanging due to a delay. The delay can be caused by many factors, such as:\n- the model is too slow to respond\n- the voice is too slow to respond\n- the tool call is still waiting for a response from your server\n- etc.",
@@ -60817,6 +71166,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"knowledge-base-request\" is sent to request knowledge base documents. To enable, use `assistant.knowledgeBase.provider=custom-knowledge-base`.",
@@ -60937,6 +71291,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"model-output\" is sent as the model outputs tokens.",
@@ -61030,6 +71389,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"phone-call-control\" is an advanced type of message.\n\nWhen it is requested in `assistant.serverMessages`, the hangup and forwarding responsibilities are delegated to your server. Vapi will no longer do the actual transfer and hangup.",
@@ -61136,6 +71500,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"speech-update\" is sent whenever assistant or user start or stop speaking.",
@@ -61242,6 +71611,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"status-update\" is sent whenever the `call.status` changes.",
@@ -61291,6 +71665,7 @@
"call.start.error-subscription-upgrade-failed",
"call.start.error-subscription-concurrency-limit-reached",
"call.start.error-enterprise-feature-not-available-recording-consent",
+ "call.start.assistant-version-error-validation",
"assistant-not-valid",
"call.start.error-vapifault-database-error",
"assistant-not-found",
@@ -61310,6 +71685,9 @@
"pipeline-error-inworld-voice-failed",
"pipeline-error-minimax-voice-failed",
"pipeline-error-wellsaid-voice-failed",
+ "pipeline-error-xai-voice-failed",
+ "pipeline-error-microsoft-voice-failed",
+ "pipeline-error-microsoft-voice-request-canceled",
"pipeline-error-tavus-video-failed",
"call.in-progress.error-vapifault-openai-voice-failed",
"call.in-progress.error-vapifault-cartesia-voice-failed",
@@ -61327,6 +71705,8 @@
"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-xai-voice-failed",
+ "call.in-progress.error-vapifault-microsoft-voice-failed",
"call.in-progress.error-vapifault-tavus-video-failed",
"pipeline-error-vapi-llm-failed",
"pipeline-error-vapi-400-bad-request-validation-failed",
@@ -61336,12 +71716,17 @@
"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-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-vapi-transcriber-failed",
+ "call.in-progress.error-vapifault-vapi-transcriber-failed",
+ "call.in-progress.error-providerfault-vapi-transcriber-failed",
+ "call.in-progress.error-providerfault-vapi-voice-failed",
"pipeline-error-deepgram-transcriber-failed",
"pipeline-error-deepgram-transcriber-api-key-missing",
"call.in-progress.error-vapifault-deepgram-transcriber-failed",
@@ -61381,6 +71766,18 @@
"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",
+ "pipeline-error-xai-transcriber-auth-failed",
+ "pipeline-error-xai-transcriber-rate-limited",
+ "pipeline-error-xai-transcriber-invalid-config",
+ "pipeline-error-xai-transcriber-server-error",
+ "pipeline-error-xai-transcriber-failed",
+ "call.in-progress.error-vapifault-xai-transcriber-auth-failed",
+ "call.in-progress.error-vapifault-xai-transcriber-rate-limited",
+ "call.in-progress.error-vapifault-xai-transcriber-invalid-config",
+ "call.in-progress.error-vapifault-xai-transcriber-server-error",
+ "call.in-progress.error-vapifault-xai-transcriber-failed",
+ "pipeline-error-cartesia-transcriber-failed",
+ "call.in-progress.error-vapifault-cartesia-transcriber-failed",
"call.in-progress.error-pipeline-no-available-llm-model",
"worker-shutdown",
"vonage-disconnected",
@@ -61816,6 +72213,18 @@
"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",
+ "pipeline-error-xai-transcriber-auth-failed",
+ "pipeline-error-xai-transcriber-rate-limited",
+ "pipeline-error-xai-transcriber-invalid-config",
+ "pipeline-error-xai-transcriber-server-error",
+ "pipeline-error-xai-transcriber-failed",
+ "call.in-progress.error-vapifault-xai-transcriber-auth-failed",
+ "call.in-progress.error-vapifault-xai-transcriber-rate-limited",
+ "call.in-progress.error-vapifault-xai-transcriber-invalid-config",
+ "call.in-progress.error-vapifault-xai-transcriber-server-error",
+ "call.in-progress.error-vapifault-xai-transcriber-failed",
+ "pipeline-error-cartesia-transcriber-failed",
+ "call.in-progress.error-vapifault-cartesia-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",
@@ -61998,6 +72407,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"tool-calls\" is sent to call a tool.",
@@ -62126,6 +72540,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"transfer-destination-request\" is sent when the model is requesting transfer but destination is unknown.",
@@ -62210,6 +72629,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"transfer-update\" is sent whenever a transfer happens.",
@@ -62335,6 +72759,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"transcript\" is sent as transcriber outputs partial or final transcript.",
@@ -62458,6 +72887,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"user-interrupted\" is sent when the user interrupts the assistant.",
@@ -62546,6 +72980,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"language-change-detected\" is sent when the transcriber is automatically switched based on the detected language.",
@@ -62635,6 +73074,11 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"voice-input\" is sent when a generation is requested from voice provider.",
@@ -62724,44 +73168,273 @@
}
]
},
- "type": {
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
+ "type": {
+ "type": "string",
+ "description": "This is the type of the message. \"assistant-speech\" is sent as assistant audio is being played.",
+ "enum": [
+ "assistant.speechStarted"
+ ]
+ },
+ "text": {
+ "type": "string",
+ "description": "The full assistant text for the current turn. This is the complete text,\nnot an incremental delta — consumers should use `timing` metadata (e.g.\n`wordsSpoken`) to determine which portion has been spoken so far."
+ },
+ "turn": {
+ "type": "number",
+ "description": "This is the turn number of the assistant speech event (0-indexed)."
+ },
+ "source": {
+ "type": "string",
+ "description": "Indicates how the text was sourced.",
+ "enum": [
+ "model",
+ "force-say",
+ "custom-voice"
+ ]
+ },
+ "timing": {
+ "description": "Optional timing metadata. Shape depends on `timing.type`:\n\n- `word-alignment` (ElevenLabs): per-character timing at playback\n cadence. words[] includes space entries. Best consumed by tracking\n a running character count: join timing.words, add to a char cursor,\n and highlight text up to that position. No interpolation needed.\n\n- `word-progress` (Minimax with voice.subtitleType: 'word'): cursor-\n based word count per TTS segment. Use wordsSpoken as the anchor,\n interpolate forward using segmentDurationMs or timing.words until\n the next event arrives.\n\nWhen absent, the event is a text-only fallback for providers without\nword-level timing (e.g. Cartesia, Deepgram, Azure). Text emits once\nper TTS chunk when audio is playing. Optionally interpolate a word\ncursor at ~3.5 words/sec between events for approximate tracking.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/AssistantSpeechWordAlignmentTiming",
+ "title": "WordAlignmentTiming"
+ },
+ {
+ "$ref": "#/components/schemas/AssistantSpeechWordProgressTiming",
+ "title": "WordProgressTiming"
+ }
+ ],
+ "discriminator": {
+ "propertyName": "type"
+ }
+ },
+ "timestamp": {
+ "type": "number",
+ "description": "This is the timestamp of the message."
+ },
+ "artifact": {
+ "description": "This is a live version of the `call.artifact`.\n\nThis matches what is stored on `call.artifact` after the call.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Artifact"
+ }
+ ]
+ },
+ "assistant": {
+ "description": "This is the assistant that the message is associated with.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/CreateAssistantDTO"
+ }
+ ]
+ },
+ "customer": {
+ "description": "This is the customer that the message is associated with.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/CreateCustomerDTO"
+ }
+ ]
+ },
+ "call": {
+ "description": "This is the call that the message is associated with.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Call"
+ }
+ ]
+ },
+ "chat": {
+ "description": "This is the chat object.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Chat"
+ }
+ ]
+ }
+ },
+ "required": [
+ "type",
+ "text"
+ ]
+ },
+ "ServerMessageVoiceRequest": {
+ "type": "object",
+ "properties": {
+ "phoneNumber": {
+ "description": "This is the phone number that the message is associated with.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CreateByoPhoneNumberDTO",
+ "title": "ByoPhoneNumber"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTwilioPhoneNumberDTO",
+ "title": "TwilioPhoneNumber"
+ },
+ {
+ "$ref": "#/components/schemas/CreateVonagePhoneNumberDTO",
+ "title": "VonagePhoneNumber"
+ },
+ {
+ "$ref": "#/components/schemas/CreateVapiPhoneNumberDTO",
+ "title": "VapiPhoneNumber"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTelnyxPhoneNumberDTO",
+ "title": "TelnyxPhoneNumber"
+ }
+ ]
+ },
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
+ "type": {
+ "type": "string",
+ "description": "This is the type of the message. \"voice-request\" is sent when using `assistant.voice={ \"type\": \"custom-voice\" }`.\n\nHere is what the request will look like:\n\nPOST https://{assistant.voice.server.url}\nContent-Type: application/json\n\n{\n \"messsage\": {\n \"type\": \"voice-request\",\n \"text\": \"Hello, world!\",\n \"sampleRate\": 24000,\n ...other metadata about the call...\n }\n}\n\nThe expected response is 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:\n```\nresponse.on('data', (chunk: Buffer) => {\n outputStream.write(chunk);\n});\n```",
+ "enum": [
+ "voice-request"
+ ]
+ },
+ "timestamp": {
+ "type": "number",
+ "description": "This is the timestamp of the message."
+ },
+ "artifact": {
+ "description": "This is a live version of the `call.artifact`.\n\nThis matches what is stored on `call.artifact` after the call.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Artifact"
+ }
+ ]
+ },
+ "assistant": {
+ "description": "This is the assistant that the message is associated with.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/CreateAssistantDTO"
+ }
+ ]
+ },
+ "customer": {
+ "description": "This is the customer that the message is associated with.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/CreateCustomerDTO"
+ }
+ ]
+ },
+ "call": {
+ "description": "This is the call that the message is associated with.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Call"
+ }
+ ]
+ },
+ "chat": {
+ "description": "This is the chat object.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Chat"
+ }
+ ]
+ },
+ "text": {
+ "type": "string",
+ "description": "This is the text to be synthesized."
+ },
+ "sampleRate": {
+ "type": "number",
+ "description": "This is the sample rate to be synthesized."
+ }
+ },
+ "required": [
+ "type",
+ "text",
+ "sampleRate"
+ ]
+ },
+ "ServerMessageCallEndpointingRequest": {
+ "type": "object",
+ "properties": {
+ "phoneNumber": {
+ "description": "This is the phone number that the message is associated with.",
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/CreateByoPhoneNumberDTO",
+ "title": "ByoPhoneNumber"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTwilioPhoneNumberDTO",
+ "title": "TwilioPhoneNumber"
+ },
+ {
+ "$ref": "#/components/schemas/CreateVonagePhoneNumberDTO",
+ "title": "VonagePhoneNumber"
+ },
+ {
+ "$ref": "#/components/schemas/CreateVapiPhoneNumberDTO",
+ "title": "VapiPhoneNumber"
+ },
+ {
+ "$ref": "#/components/schemas/CreateTelnyxPhoneNumberDTO",
+ "title": "TelnyxPhoneNumber"
+ }
+ ]
+ },
+ "assistantVersion": {
"type": "string",
- "description": "This is the type of the message. \"assistant-speech\" is sent as assistant audio is being played.",
- "enum": [
- "assistant.speechStarted"
- ]
- },
- "text": {
- "type": "string",
- "description": "The full assistant text for the current turn. This is the complete text,\nnot an incremental delta — consumers should use `timing` metadata (e.g.\n`wordsSpoken`) to determine which portion has been spoken so far."
- },
- "turn": {
- "type": "number",
- "description": "This is the turn number of the assistant speech event (0-indexed)."
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
},
- "source": {
+ "type": {
"type": "string",
- "description": "Indicates how the text was sourced.",
+ "description": "This is the type of the message. \"call.endpointing.request\" is sent when using `assistant.startSpeakingPlan.smartEndpointingPlan={ \"provider\": \"custom-endpointing-model\" }`.\n\nHere is what the request will look like:\n\nPOST https://{assistant.startSpeakingPlan.smartEndpointingPlan.server.url}\nContent-Type: application/json\n\n{\n \"message\": {\n \"type\": \"call.endpointing.request\",\n \"messages\": [\n {\n \"role\": \"user\",\n \"message\": \"Hello, how are you?\",\n \"time\": 1234567890,\n \"secondsFromStart\": 0\n }\n ],\n ...other metadata about the call...\n }\n}\n\nThe expected response:\n{\n \"timeoutSeconds\": 0.5\n}",
"enum": [
- "model",
- "force-say",
- "custom-voice"
+ "call.endpointing.request"
]
},
- "timing": {
- "description": "Optional timing metadata. Shape depends on `timing.type`:\n\n- `word-alignment` (ElevenLabs): per-character timing at playback\n cadence. words[] includes space entries. Best consumed by tracking\n a running character count: join timing.words, add to a char cursor,\n and highlight text up to that position. No interpolation needed.\n\n- `word-progress` (Minimax with voice.subtitleType: 'word'): cursor-\n based word count per TTS segment. Use wordsSpoken as the anchor,\n interpolate forward using segmentDurationMs or timing.words until\n the next event arrives.\n\nWhen absent, the event is a text-only fallback for providers without\nword-level timing (e.g. Cartesia, Deepgram, Azure). Text emits once\nper TTS chunk when audio is playing. Optionally interpolate a word\ncursor at ~3.5 words/sec between events for approximate tracking.",
- "oneOf": [
- {
- "$ref": "#/components/schemas/AssistantSpeechWordAlignmentTiming",
- "title": "WordAlignmentTiming"
- },
- {
- "$ref": "#/components/schemas/AssistantSpeechWordProgressTiming",
- "title": "WordProgressTiming"
- }
- ],
- "discriminator": {
- "propertyName": "type"
+ "messages": {
+ "type": "array",
+ "description": "This is the conversation history at the time of the endpointing request.",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/UserMessage",
+ "title": "UserMessage"
+ },
+ {
+ "$ref": "#/components/schemas/SystemMessage",
+ "title": "SystemMessage"
+ },
+ {
+ "$ref": "#/components/schemas/BotMessage",
+ "title": "BotMessage"
+ },
+ {
+ "$ref": "#/components/schemas/ToolCallMessage",
+ "title": "ToolCallMessage"
+ },
+ {
+ "$ref": "#/components/schemas/ToolCallResultMessage",
+ "title": "ToolCallResultMessage"
+ }
+ ]
+ }
+ },
+ "messagesOpenAIFormatted": {
+ "description": "This is just `messages` formatted for OpenAI.",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/OpenAIMessage"
}
},
"timestamp": {
@@ -62811,10 +73484,10 @@
},
"required": [
"type",
- "text"
+ "messagesOpenAIFormatted"
]
},
- "ServerMessageVoiceRequest": {
+ "ServerMessageChatCreated": {
"type": "object",
"properties": {
"phoneNumber": {
@@ -62842,11 +73515,16 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
- "description": "This is the type of the message. \"voice-request\" is sent when using `assistant.voice={ \"type\": \"custom-voice\" }`.\n\nHere is what the request will look like:\n\nPOST https://{assistant.voice.server.url}\nContent-Type: application/json\n\n{\n \"messsage\": {\n \"type\": \"voice-request\",\n \"text\": \"Hello, world!\",\n \"sampleRate\": 24000,\n ...other metadata about the call...\n }\n}\n\nThe expected response is 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:\n```\nresponse.on('data', (chunk: Buffer) => {\n outputStream.write(chunk);\n});\n```",
+ "description": "This is the type of the message. \"chat.created\" is sent when a new chat is created.",
"enum": [
- "voice-request"
+ "chat.created"
]
},
"timestamp": {
@@ -62886,29 +73564,20 @@
]
},
"chat": {
- "description": "This is the chat object.",
+ "description": "This is the chat that was created.",
"allOf": [
{
"$ref": "#/components/schemas/Chat"
}
]
- },
- "text": {
- "type": "string",
- "description": "This is the text to be synthesized."
- },
- "sampleRate": {
- "type": "number",
- "description": "This is the sample rate to be synthesized."
}
},
"required": [
"type",
- "text",
- "sampleRate"
+ "chat"
]
},
- "ServerMessageCallEndpointingRequest": {
+ "ServerMessageChatDeleted": {
"type": "object",
"properties": {
"phoneNumber": {
@@ -62936,48 +73605,18 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
- "description": "This is the type of the message. \"call.endpointing.request\" is sent when using `assistant.startSpeakingPlan.smartEndpointingPlan={ \"provider\": \"custom-endpointing-model\" }`.\n\nHere is what the request will look like:\n\nPOST https://{assistant.startSpeakingPlan.smartEndpointingPlan.server.url}\nContent-Type: application/json\n\n{\n \"message\": {\n \"type\": \"call.endpointing.request\",\n \"messages\": [\n {\n \"role\": \"user\",\n \"message\": \"Hello, how are you?\",\n \"time\": 1234567890,\n \"secondsFromStart\": 0\n }\n ],\n ...other metadata about the call...\n }\n}\n\nThe expected response:\n{\n \"timeoutSeconds\": 0.5\n}",
+ "description": "This is the type of the message. \"chat.deleted\" is sent when a chat is deleted.",
"enum": [
- "call.endpointing.request"
+ "chat.deleted"
]
},
- "messages": {
- "type": "array",
- "description": "This is the conversation history at the time of the endpointing request.",
- "items": {
- "oneOf": [
- {
- "$ref": "#/components/schemas/UserMessage",
- "title": "UserMessage"
- },
- {
- "$ref": "#/components/schemas/SystemMessage",
- "title": "SystemMessage"
- },
- {
- "$ref": "#/components/schemas/BotMessage",
- "title": "BotMessage"
- },
- {
- "$ref": "#/components/schemas/ToolCallMessage",
- "title": "ToolCallMessage"
- },
- {
- "$ref": "#/components/schemas/ToolCallResultMessage",
- "title": "ToolCallResultMessage"
- }
- ]
- }
- },
- "messagesOpenAIFormatted": {
- "description": "This is just `messages` formatted for OpenAI.",
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/OpenAIMessage"
- }
- },
"timestamp": {
"type": "number",
"description": "This is the timestamp of the message."
@@ -63015,7 +73654,7 @@
]
},
"chat": {
- "description": "This is the chat object.",
+ "description": "This is the chat that was deleted.",
"allOf": [
{
"$ref": "#/components/schemas/Chat"
@@ -63025,10 +73664,10 @@
},
"required": [
"type",
- "messagesOpenAIFormatted"
+ "chat"
]
},
- "ServerMessageChatCreated": {
+ "ServerMessageSessionCreated": {
"type": "object",
"properties": {
"phoneNumber": {
@@ -63056,11 +73695,16 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
- "description": "This is the type of the message. \"chat.created\" is sent when a new chat is created.",
+ "description": "This is the type of the message. \"session.created\" is sent when a new session is created.",
"enum": [
- "chat.created"
+ "session.created"
]
},
"timestamp": {
@@ -63100,105 +73744,28 @@
]
},
"chat": {
- "description": "This is the chat that was created.",
+ "description": "This is the chat object.",
"allOf": [
{
"$ref": "#/components/schemas/Chat"
}
]
- }
- },
- "required": [
- "type",
- "chat"
- ]
- },
- "ServerMessageChatDeleted": {
- "type": "object",
- "properties": {
- "phoneNumber": {
- "description": "This is the phone number that the message is associated with.",
- "oneOf": [
- {
- "$ref": "#/components/schemas/CreateByoPhoneNumberDTO",
- "title": "ByoPhoneNumber"
- },
- {
- "$ref": "#/components/schemas/CreateTwilioPhoneNumberDTO",
- "title": "TwilioPhoneNumber"
- },
- {
- "$ref": "#/components/schemas/CreateVonagePhoneNumberDTO",
- "title": "VonagePhoneNumber"
- },
- {
- "$ref": "#/components/schemas/CreateVapiPhoneNumberDTO",
- "title": "VapiPhoneNumber"
- },
- {
- "$ref": "#/components/schemas/CreateTelnyxPhoneNumberDTO",
- "title": "TelnyxPhoneNumber"
- }
- ]
- },
- "type": {
- "type": "string",
- "description": "This is the type of the message. \"chat.deleted\" is sent when a chat is deleted.",
- "enum": [
- "chat.deleted"
- ]
- },
- "timestamp": {
- "type": "number",
- "description": "This is the timestamp of the message."
- },
- "artifact": {
- "description": "This is a live version of the `call.artifact`.\n\nThis matches what is stored on `call.artifact` after the call.",
- "allOf": [
- {
- "$ref": "#/components/schemas/Artifact"
- }
- ]
- },
- "assistant": {
- "description": "This is the assistant that the message is associated with.",
- "allOf": [
- {
- "$ref": "#/components/schemas/CreateAssistantDTO"
- }
- ]
- },
- "customer": {
- "description": "This is the customer that the message is associated with.",
- "allOf": [
- {
- "$ref": "#/components/schemas/CreateCustomerDTO"
- }
- ]
- },
- "call": {
- "description": "This is the call that the message is associated with.",
- "allOf": [
- {
- "$ref": "#/components/schemas/Call"
- }
- ]
},
- "chat": {
- "description": "This is the chat that was deleted.",
+ "session": {
+ "description": "This is the session that was created.",
"allOf": [
{
- "$ref": "#/components/schemas/Chat"
+ "$ref": "#/components/schemas/Session"
}
]
}
},
"required": [
"type",
- "chat"
+ "session"
]
},
- "ServerMessageSessionCreated": {
+ "ServerMessageSessionUpdated": {
"type": "object",
"properties": {
"phoneNumber": {
@@ -63226,11 +73793,16 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
- "description": "This is the type of the message. \"session.created\" is sent when a new session is created.",
+ "description": "This is the type of the message. \"session.updated\" is sent when a session is updated.",
"enum": [
- "session.created"
+ "session.updated"
]
},
"timestamp": {
@@ -63278,7 +73850,7 @@
]
},
"session": {
- "description": "This is the session that was created.",
+ "description": "This is the session that was updated.",
"allOf": [
{
"$ref": "#/components/schemas/Session"
@@ -63291,7 +73863,7 @@
"session"
]
},
- "ServerMessageSessionUpdated": {
+ "ServerMessageSessionDeleted": {
"type": "object",
"properties": {
"phoneNumber": {
@@ -63319,11 +73891,16 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
- "description": "This is the type of the message. \"session.updated\" is sent when a session is updated.",
+ "description": "This is the type of the message. \"session.deleted\" is sent when a session is deleted.",
"enum": [
- "session.updated"
+ "session.deleted"
]
},
"timestamp": {
@@ -63371,7 +73948,7 @@
]
},
"session": {
- "description": "This is the session that was updated.",
+ "description": "This is the session that was deleted.",
"allOf": [
{
"$ref": "#/components/schemas/Session"
@@ -63384,7 +73961,7 @@
"session"
]
},
- "ServerMessageSessionDeleted": {
+ "ServerMessageCallDeleted": {
"type": "object",
"properties": {
"phoneNumber": {
@@ -63412,11 +73989,16 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
- "description": "This is the type of the message. \"session.deleted\" is sent when a session is deleted.",
+ "description": "This is the type of the message. \"call.deleted\" is sent when a call is deleted.",
"enum": [
- "session.deleted"
+ "call.deleted"
]
},
"timestamp": {
@@ -63462,22 +74044,13 @@
"$ref": "#/components/schemas/Chat"
}
]
- },
- "session": {
- "description": "This is the session that was deleted.",
- "allOf": [
- {
- "$ref": "#/components/schemas/Session"
- }
- ]
}
},
"required": [
- "type",
- "session"
+ "type"
]
},
- "ServerMessageCallDeleted": {
+ "ServerMessageCallDeleteFailed": {
"type": "object",
"properties": {
"phoneNumber": {
@@ -63505,11 +74078,16 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
"description": "This is the type of the message. \"call.deleted\" is sent when a call is deleted.",
"enum": [
- "call.deleted"
+ "call.delete.failed"
]
},
"timestamp": {
@@ -63561,7 +74139,55 @@
"type"
]
},
- "ServerMessageCallDeleteFailed": {
+ "CampaignContact": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "campaignId": {
+ "type": "string"
+ },
+ "orgId": {
+ "type": "string"
+ },
+ "customerId": {
+ "type": "string"
+ },
+ "number": {
+ "type": "string",
+ "minLength": 3,
+ "maxLength": 40
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 40
+ },
+ "assistantOverrides": {
+ "$ref": "#/components/schemas/AssistantOverrides"
+ },
+ "squadOverrides": {
+ "description": "Use this when the campaign targets a `squadId`. Mirrors the call-level `squadOverrides` field. Merged with the campaign-level squadOverrides at dispatch time.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/AssistantOverrides"
+ }
+ ]
+ },
+ "createdAt": {
+ "format": "date-time",
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "campaignId",
+ "orgId",
+ "number",
+ "createdAt"
+ ]
+ },
+ "ServerMessageCampaignPredial": {
"type": "object",
"properties": {
"phoneNumber": {
@@ -63589,11 +74215,28 @@
}
]
},
+ "assistantVersion": {
+ "type": "string",
+ "nullable": true,
+ "description": "This is the version label (e.g. `v3`) of the assistant the call was\nconfigured with. `null` for inline assistants, squad/workflow calls,\npre-resolution assistant-request messages, and orgs not on\nassistant versioning."
+ },
"type": {
"type": "string",
- "description": "This is the type of the message. \"call.deleted\" is sent when a call is deleted.",
+ "description": "This is the type of the message. \"campaign.predial\" is sent to the campaign's server before each contact is dialed, so the server can decide whether the contact is eligible to be called.",
"enum": [
- "call.delete.failed"
+ "campaign.predial"
+ ]
+ },
+ "campaignId": {
+ "type": "string",
+ "description": "This is the ID of the campaign the contact belongs to."
+ },
+ "contact": {
+ "description": "This is the contact that is about to be dialed.",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/CampaignContact"
+ }
]
},
"timestamp": {
@@ -63642,7 +74285,9 @@
}
},
"required": [
- "type"
+ "type",
+ "campaignId",
+ "contact"
]
},
"ServerMessage": {
@@ -63758,6 +74403,10 @@
{
"$ref": "#/components/schemas/ServerMessageCallDeleteFailed",
"title": "CallDeleteFailed"
+ },
+ {
+ "$ref": "#/components/schemas/ServerMessageCampaignPredial",
+ "title": "CampaignPredial"
}
]
}
@@ -64040,6 +74689,18 @@
"timeoutSeconds"
]
},
+ "ServerMessageResponseCampaignPredial": {
+ "type": "object",
+ "properties": {
+ "eligible": {
+ "type": "boolean",
+ "description": "This is whether the contact is eligible to be dialed. When `false` — or when the server is unreachable, errors, or times out — the contact is skipped and not called."
+ }
+ },
+ "required": [
+ "eligible"
+ ]
+ },
"ServerMessageResponse": {
"type": "object",
"properties": {
@@ -64073,6 +74734,10 @@
{
"$ref": "#/components/schemas/ServerMessageResponseCallEndpointingRequest",
"title": "CallEndpointingRequest"
+ },
+ {
+ "$ref": "#/components/schemas/ServerMessageResponseCampaignPredial",
+ "title": "CampaignPredial"
}
]
}
@@ -64279,397 +74944,6 @@
"message"
]
},
- "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",
- "description": "The timestamp when the message was sent."
- },
- "endTime": {
- "type": "number",
- "description": "The timestamp when the message ended."
- },
- "secondsFromStart": {
- "type": "number",
- "description": "The number of seconds from the start of the conversation."
- },
- "source": {
- "type": "string",
- "description": "The source of the message."
- },
- "duration": {
- "type": "number",
- "description": "The duration of the message in seconds."
- }
- },
- "required": [
- "role",
- "message",
- "time",
- "endTime",
- "secondsFromStart"
- ]
- },
- "ToolCallMessage": {
- "type": "object",
- "properties": {
- "role": {
- "type": "string",
- "description": "The role of the tool call in the conversation."
- },
- "toolCalls": {
- "description": "The list of tool calls made during the conversation.",
- "type": "array",
- "items": {
- "type": "object"
- }
- },
- "message": {
- "type": "string",
- "description": "The message content for the tool call."
- },
- "time": {
- "type": "number",
- "description": "The timestamp when the message was sent."
- },
- "secondsFromStart": {
- "type": "number",
- "description": "The number of seconds from the start of the conversation."
- }
- },
- "required": [
- "role",
- "toolCalls",
- "message",
- "time",
- "secondsFromStart"
- ]
- },
- "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",
- "description": "The timestamp when the message was sent."
- },
- "secondsFromStart": {
- "type": "number",
- "description": "The number of seconds from the start of the conversation."
- },
- "metadata": {
- "type": "object",
- "description": "The metadata for the tool call result."
- }
- },
- "required": [
- "role",
- "toolCallId",
- "name",
- "result",
- "time",
- "secondsFromStart"
- ]
- },
- "TransportCost": {
- "type": "object",
- "properties": {
- "type": {
- "type": "string",
- "description": "This is the type of cost, always 'transport' for this class.",
- "enum": [
- "transport"
- ]
- },
- "provider": {
- "type": "string",
- "enum": [
- "daily",
- "vapi.websocket",
- "twilio",
- "vonage",
- "telnyx",
- "vapi.sip"
- ]
- },
- "minutes": {
- "type": "number",
- "description": "This is the minutes of `transport` usage. This should match `call.endedAt` - `call.startedAt`."
- },
- "cost": {
- "type": "number",
- "description": "This is the cost of the component in USD."
- }
- },
- "required": [
- "type",
- "minutes",
- "cost"
- ]
- },
- "TranscriberCost": {
- "type": "object",
- "properties": {
- "type": {
- "type": "string",
- "description": "This is the type of cost, always 'transcriber' for this class.",
- "enum": [
- "transcriber"
- ]
- },
- "transcriber": {
- "type": "object",
- "description": "This is the transcriber that was used during the call.\n\nThis matches one of the below:\n- `call.assistant.transcriber`,\n- `call.assistantId->transcriber`,\n- `call.squad[n].assistant.transcriber`,\n- `call.squad[n].assistantId->transcriber`,\n- `call.squadId->[n].assistant.transcriber`,\n- `call.squadId->[n].assistantId->transcriber`."
- },
- "minutes": {
- "type": "number",
- "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",
- "description": "This is the cost of the component in USD."
- }
- },
- "required": [
- "type",
- "transcriber",
- "minutes",
- "cost"
- ]
- },
- "ModelCost": {
- "type": "object",
- "properties": {
- "type": {
- "type": "string",
- "description": "This is the type of cost, always 'model' for this class.",
- "enum": [
- "model"
- ]
- },
- "model": {
- "type": "object",
- "description": "This is the model that was used during the call.\n\nThis matches one of the following:\n- `call.assistant.model`,\n- `call.assistantId->model`,\n- `call.squad[n].assistant.model`,\n- `call.squad[n].assistantId->model`,\n- `call.squadId->[n].assistant.model`,\n- `call.squadId->[n].assistantId->model`."
- },
- "promptTokens": {
- "type": "number",
- "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",
- "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",
- "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",
- "description": "This is the cost of the component in USD."
- }
- },
- "required": [
- "type",
- "model",
- "promptTokens",
- "completionTokens",
- "cost"
- ]
- },
- "VoiceCost": {
- "type": "object",
- "properties": {
- "type": {
- "type": "string",
- "description": "This is the type of cost, always 'voice' for this class.",
- "enum": [
- "voice"
- ]
- },
- "voice": {
- "type": "object",
- "description": "This is the voice that was used during the call.\n\nThis matches one of the following:\n- `call.assistant.voice`,\n- `call.assistantId->voice`,\n- `call.squad[n].assistant.voice`,\n- `call.squad[n].assistantId->voice`,\n- `call.squadId->[n].assistant.voice`,\n- `call.squadId->[n].assistantId->voice`."
- },
- "characters": {
- "type": "number",
- "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",
- "description": "This is the cost of the component in USD."
- }
- },
- "required": [
- "type",
- "voice",
- "characters",
- "cost"
- ]
- },
- "VapiCost": {
- "type": "object",
- "properties": {
- "type": {
- "type": "string",
- "description": "This is the type of cost, always 'vapi' for this class.",
- "enum": [
- "vapi"
- ]
- },
- "subType": {
- "type": "string",
- "description": "This is the sub type of the cost.",
- "enum": [
- "normal",
- "overage"
- ]
- },
- "minutes": {
- "type": "number",
- "description": "This is the minutes of Vapi usage. This should match `call.endedAt` - `call.startedAt`."
- },
- "cost": {
- "type": "number",
- "description": "This is the cost of the component in USD."
- }
- },
- "required": [
- "type",
- "subType",
- "minutes",
- "cost"
- ]
- },
- "AnalysisCost": {
- "type": "object",
- "properties": {
- "type": {
- "type": "string",
- "description": "This is the type of cost, always 'analysis' for this class.",
- "enum": [
- "analysis"
- ]
- },
- "analysisType": {
- "type": "string",
- "description": "This is the type of analysis performed.",
- "enum": [
- "summary",
- "structuredData",
- "successEvaluation",
- "structuredOutput"
- ]
- },
- "model": {
- "type": "object",
- "description": "This is the model that was used to perform the analysis."
- },
- "promptTokens": {
- "type": "number",
- "description": "This is the number of prompt tokens used in the analysis."
- },
- "completionTokens": {
- "type": "number",
- "description": "This is the number of completion tokens generated in the analysis."
- },
- "cachedPromptTokens": {
- "type": "number",
- "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",
- "description": "This is the cost of the component in USD."
- }
- },
- "required": [
- "type",
- "analysisType",
- "model",
- "promptTokens",
- "completionTokens",
- "cost"
- ]
- },
- "VoicemailDetectionCost": {
- "type": "object",
- "properties": {
- "type": {
- "type": "string",
- "description": "This is the type of cost, always 'voicemail-detection' for this class.",
- "enum": [
- "voicemail-detection"
- ]
- },
- "model": {
- "type": "object",
- "description": "This is the model that was used to perform the analysis."
- },
- "provider": {
- "type": "string",
- "description": "This is the provider that was used to detect the voicemail.",
- "enum": [
- "twilio",
- "google",
- "openai",
- "vapi"
- ]
- },
- "promptTextTokens": {
- "type": "number",
- "description": "This is the number of prompt text tokens used in the voicemail detection."
- },
- "promptAudioTokens": {
- "type": "number",
- "description": "This is the number of prompt audio tokens used in the voicemail detection."
- },
- "completionTextTokens": {
- "type": "number",
- "description": "This is the number of completion text tokens used in the voicemail detection."
- },
- "completionAudioTokens": {
- "type": "number",
- "description": "This is the number of completion audio tokens used in the voicemail detection."
- },
- "cost": {
- "type": "number",
- "description": "This is the cost of the component in USD."
- }
- },
- "required": [
- "type",
- "model",
- "provider",
- "promptTextTokens",
- "promptAudioTokens",
- "completionTextTokens",
- "completionAudioTokens",
- "cost"
- ]
- },
"KnowledgeBaseCost": {
"type": "object",
"properties": {
@@ -64705,26 +74979,6 @@
"cost"
]
},
- "ChatCost": {
- "type": "object",
- "properties": {
- "type": {
- "type": "string",
- "description": "This is the type of cost, always 'chat' for this class.",
- "enum": [
- "chat"
- ]
- },
- "cost": {
- "type": "number",
- "description": "This is the cost of the component in USD."
- }
- },
- "required": [
- "type",
- "cost"
- ]
- },
"SessionCost": {
"type": "object",
"properties": {
@@ -64750,7 +75004,7 @@
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -64837,7 +75091,7 @@
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -64892,7 +75146,7 @@
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -64947,7 +75201,7 @@
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -65023,7 +75277,7 @@
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -65113,7 +75367,7 @@
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -65189,7 +75443,7 @@
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -65240,7 +75494,7 @@
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -65291,7 +75545,7 @@
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -65342,7 +75596,7 @@
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -65393,7 +75647,7 @@
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{
@@ -65444,7 +75698,7 @@
"properties": {
"messages": {
"type": "array",
- "description": "These are the messages that will be spoken to the user as the tool is running.\n\nFor some tools, this is auto-filled based on special fields like `tool.destinations`. For others like the function tool, these can be custom configured.",
+ "description": "Messages spoken while the tool is running. Multiple request-start messages are variants. For request-response-delayed, same timing means variants and different timings mean staged updates.",
"items": {
"oneOf": [
{