diff --git a/fern/apis/api/openapi.json b/fern/apis/api/openapi.json index 9681e7eb9..d2d8c4d25 100644 --- a/fern/apis/api/openapi.json +++ b/fern/apis/api/openapi.json @@ -158,43 +158,6 @@ ] } }, - "/assistant/background-sound/validate": { - "post": { - "operationId": "AssistantController_validateBackgroundSoundUrl", - "summary": "Validate Background Sound URL", - "parameters": [], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ValidateBackgroundSoundUrlDTO" - } - } - } - }, - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/BackgroundSoundUrlValidationResult" - } - } - } - } - }, - "tags": [ - "Assistants" - ], - "security": [ - { - "bearer": [] - } - ] - } - }, "/assistant/{id}": { "get": { "operationId": "AssistantController_findOne", @@ -2926,9 +2889,8 @@ "/traffic-allocations": { "post": { "operationId": "TrafficAllocationController_create", - "x-fern-availability": "beta", "summary": "Create traffic allocation", - "description": "Creates a new traffic allocation for an assistant, replacing the one currently in effect. To start or adjust a split, send targets naming published versions (such as \"v7\") with percentages totaling 100; allocationIntent is inferred as 'explicit'. To stop splitting and send every call to the newest published version, send allocationIntent 'follow-latest' with no targets field; stopping always names its intent, so a dropped targets field can never end a split by accident. Traffic splitting is in beta, rolling out to select organizations; requests from organizations without access receive a 403.", + "description": "Creates a new traffic allocation for an assistant, replacing the one currently in effect. To start or adjust a split, send targets naming published versions (such as \"v7\") with percentages totaling 100; allocationIntent is inferred as 'explicit'. To stop splitting and send every call to the newest published version, send allocationIntent 'follow-latest' with no targets field; stopping always names its intent, so a dropped targets field can never end a split by accident.", "parameters": [], "requestBody": { "required": true, @@ -2996,9 +2958,8 @@ }, "get": { "operationId": "TrafficAllocationController_findAllPaginated", - "x-fern-availability": "beta", "summary": "List traffic allocations", - "description": "The append-only history of an assistant's allocations, newest first. Traffic splitting is in beta, rolling out to select organizations; requests from organizations without access receive a 403.", + "description": "The append-only history of an assistant's allocations, newest first.", "parameters": [ { "name": "assistantId", @@ -3072,9 +3033,8 @@ "/traffic-allocations/latest": { "get": { "operationId": "TrafficAllocationController_latestGet", - "x-fern-availability": "beta", "summary": "Get latest traffic allocation", - "description": "The allocation currently in effect for the assistant, with its targets. The response carries no allocation field when traffic splitting has never been configured. Traffic splitting is in beta, rolling out to select organizations; requests from organizations without access receive a 403.", + "description": "The allocation currently in effect for the assistant, with its targets. The response carries no allocation field when traffic splitting has never been configured.", "parameters": [ { "name": "assistantId", @@ -3117,9 +3077,8 @@ "/traffic-allocations/metrics": { "get": { "operationId": "TrafficAllocationController_metricsGet", - "x-fern-availability": "beta", "summary": "Get traffic split metrics", - "description": "Per-assistant-version call metrics over a time window: call counts, configured vs actual traffic share, duration, cost per minute, latency, ended reasons, a bucketed timeseries, and optional structured output aggregations. Calls with no assistant version are reported as an 'unversioned' row. Traffic splitting is in beta, rolling out to select organizations; requests from organizations without access receive a 403.", + "description": "Per-assistant-version call metrics over a time window: call counts, configured vs actual traffic share, duration, cost per minute, latency, ended reasons, a bucketed timeseries, and optional structured output aggregations. Calls with no assistant version are reported as an 'unversioned' row.", "parameters": [ { "name": "assistantId", @@ -3205,9 +3164,8 @@ "/traffic-allocations/{id}": { "get": { "operationId": "TrafficAllocationController_findOne", - "x-fern-availability": "beta", "summary": "Get traffic allocation", - "description": "Returns a single allocation by id, including its targets and actor attribution. Traffic splitting is in beta, rolling out to select organizations; requests from organizations without access receive a 403.", + "description": "Returns a single allocation by id, including its targets and actor attribution.", "parameters": [ { "name": "id", @@ -7971,6 +7929,382 @@ ] } }, + "/eval/simulation/onboarding/requirements": { + "post": { + "operationId": "SimulationOnboardingController_requirementsDraft", + "summary": "Draft simulation requirements", + "description": "Drafts the behaviours an assistant must get right, as numbered requirements plus open questions, from its prompt, tools and handoffs. This is the first step of building a simulation suite.\n\n1. Show the draft to your user and ask its open questions.\n2. To revise it, call again with `previousDraft` set to the draft and `feedback` set to what the user said, verbatim. Repeat until they agree.\n3. Generate the suite from the agreed requirements with `POST /eval/simulation/onboarding/suite`.\n\nTakes up to 2 minutes. Each org can draft 60 times per UTC day, shared with the dashboard. On a 429 `SIMULATION_ONBOARDING_QUOTA_EXCEEDED`, don't retry: tell your user the limit resets at 00:00 UTC.", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SimulationOnboardingRequirementsCreateDTO" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SimulationOnboardingRequirementsDraftDTO" + } + } + } + }, + "400": { + "description": "The body is invalid, or `previousDraft` and `feedback` were not sent together." + }, + "403": { + "description": "The key can't create simulation suites." + }, + "404": { + "description": "The assistant wasn't found, or the org doesn't have API access to these endpoints yet." + }, + "429": { + "description": "`SIMULATION_ONBOARDING_QUOTA_EXCEEDED`: the org drafted 60 times today. Don't retry; the limit resets at 00:00 UTC (`Retry-After`).", + "headers": { + "Retry-After": { + "description": "Seconds to wait before retrying, when retrying is useful.", + "required": false, + "schema": { + "type": "integer" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SimulationOnboardingErrorDTO" + } + } + } + }, + "502": { + "description": "The model failed to generate a usable result. Retry." + }, + "503": { + "description": "Simulation generation is paused, no caller personalities are configured, or the quota store is unavailable for a private-key request. Quota outages return SIMULATION_ONBOARDING_QUOTA_UNAVAILABLE with Retry-After; retry with the same key.", + "headers": { + "Retry-After": { + "description": "Seconds to wait before retrying, when retrying is useful.", + "required": false, + "schema": { + "type": "integer" + } + } + }, + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/SimulationOnboardingErrorDTO" + }, + { + "type": "object", + "required": [ + "statusCode", + "message", + "error" + ], + "properties": { + "statusCode": { + "type": "number" + }, + "message": { + "type": "string" + }, + "error": { + "type": "string" + } + } + } + ] + } + } + } + }, + "504": { + "description": "Drafting took too long. Retry." + } + }, + "tags": [ + "Simulations" + ], + "security": [ + { + "bearer": [] + } + ] + } + }, + "/eval/simulation/onboarding/suite": { + "post": { + "operationId": "SimulationOnboardingController_suiteCreate", + "summary": "Generate a simulation suite", + "description": "Generates a simulation suite from requirements your user agreed to, saves it and assigns it to the assistant. Takes up to 3 minutes, so set a client timeout of at least 200 seconds.\n\nSend one `idempotencyKey` per agreed draft. Retrying with the same key never generates a second suite:\n- On a timeout or a 5xx (502, 504, 524), retry with the same key. You get the saved suite, a 409 while it is still generating, or a fresh generation if the first one never saved.\n- On a 409 `SIMULATION_ONBOARDING_GENERATION_IN_PROGRESS`, the first request is still generating. Wait `Retry-After` seconds (15) and retry with the same key.\n- On a 409 `SIMULATION_ONBOARDING_IDEMPOTENCY_KEY_REUSED`, the key was used for other requirements. Send a new key.\n\nThen review the suite with your user, edit it with `PATCH /eval/simulation/onboarding/suite/{suiteId}`, and run it with `POST /eval/simulation/run`.\n\nEach org can generate 20 suites per UTC day, shared with the dashboard, and 2 at a time. A retry that returns a saved suite doesn't count. On a 429 `SIMULATION_ONBOARDING_CONCURRENCY_LIMITED`, wait `Retry-After` seconds (30). On a 429 `SIMULATION_ONBOARDING_QUOTA_EXCEEDED`, don't retry: the limit resets at 00:00 UTC.", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SimulationOnboardingSuiteCreateDTO" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SimulationOnboardingSuiteViewDTO" + } + } + } + }, + "400": { + "description": "The body is invalid, or the generated suite uses something the org's data-region policy doesn't allow, so it isn't saved." + }, + "403": { + "description": "The key can't create simulation suites." + }, + "404": { + "description": "The assistant wasn't found, or the org doesn't have API access to these endpoints yet." + }, + "409": { + "description": "`SIMULATION_ONBOARDING_GENERATION_IN_PROGRESS`: a request with this key is still generating; retry with the same key after `Retry-After`. `SIMULATION_ONBOARDING_IDEMPOTENCY_KEY_REUSED`: the key was used for other requirements; send a new key.", + "headers": { + "Retry-After": { + "description": "Seconds to wait before retrying, when retrying is useful.", + "required": false, + "schema": { + "type": "integer" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SimulationOnboardingErrorDTO" + } + } + } + }, + "422": { + "description": "None of the requirements can be checked in a chat simulation, or an MCP server's tools could not be listed, so simulations would call them for real. Fix the requirements or the server and retry." + }, + "429": { + "description": "`SIMULATION_ONBOARDING_CONCURRENCY_LIMITED`: the org already has 2 suites generating; retry after `Retry-After`. `SIMULATION_ONBOARDING_QUOTA_EXCEEDED`: the org generated 20 suites today; don't retry, the limit resets at 00:00 UTC.", + "headers": { + "Retry-After": { + "description": "Seconds to wait before retrying, when retrying is useful.", + "required": false, + "schema": { + "type": "integer" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SimulationOnboardingErrorDTO" + } + } + } + }, + "502": { + "description": "The model failed to generate a usable result. Retry." + }, + "503": { + "description": "Simulation generation is paused, no caller personalities are configured, or the quota store is unavailable for a private-key request. Quota outages return SIMULATION_ONBOARDING_QUOTA_UNAVAILABLE with Retry-After; retry with the same key.", + "headers": { + "Retry-After": { + "description": "Seconds to wait before retrying, when retrying is useful.", + "required": false, + "schema": { + "type": "integer" + } + } + }, + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/SimulationOnboardingErrorDTO" + }, + { + "type": "object", + "required": [ + "statusCode", + "message", + "error" + ], + "properties": { + "statusCode": { + "type": "number" + }, + "message": { + "type": "string" + }, + "error": { + "type": "string" + } + } + } + ] + } + } + } + }, + "504": { + "description": "Generation took too long. Retry with the same `idempotencyKey`: it may still save." + } + }, + "tags": [ + "Simulations" + ], + "security": [ + { + "bearer": [] + } + ] + } + }, + "/eval/simulation/onboarding/suite/{suiteId}": { + "patch": { + "operationId": "SimulationOnboardingController_suiteUpdate", + "summary": "Edit a generated simulation suite", + "description": "Edits a generated suite: removes simulations, rewrites a simulation's scenario from your user's instruction, or regenerates the scenarios that failed or did not fit (`retryFailed`). Takes up to 2 minutes.\n\nSend a new `patchKey` for each edit. Replaying an applied key changes nothing and returns the current suite, with `failedEditSimulationIds` listing the simulations that edit could not rewrite, so retry a timeout or a 5xx with the same key. A suite remembers its last 50 keys, so never reuse one.\n\nEach org can make 60 edits per UTC day, shared with the dashboard. Removals and replays don't count. On a 429 `SIMULATION_ONBOARDING_QUOTA_EXCEEDED`, don't retry: the limit resets at 00:00 UTC.", + "parameters": [ + { + "name": "suiteId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SimulationOnboardingSuiteUpdateDTO" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SimulationOnboardingSuiteViewDTO" + } + } + } + }, + "400": { + "description": "The body is invalid, or the edited suite uses something the org's data-region policy doesn't allow, so it isn't saved." + }, + "403": { + "description": "The key can't edit simulation suites." + }, + "404": { + "description": "The suite wasn't generated by `POST /eval/simulation/onboarding/suite` in this org, or the org doesn't have API access to these endpoints yet." + }, + "422": { + "description": "An MCP server's tools could not be listed, so simulations would call them for real instead of a mock. Check the server is reachable and retry." + }, + "429": { + "description": "`SIMULATION_ONBOARDING_QUOTA_EXCEEDED`: the org made 60 edits today. Don't retry; the limit resets at 00:00 UTC.", + "headers": { + "Retry-After": { + "description": "Seconds to wait before retrying, when retrying is useful.", + "required": false, + "schema": { + "type": "integer" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SimulationOnboardingErrorDTO" + } + } + } + }, + "502": { + "description": "The model failed to generate a usable result. Retry." + }, + "503": { + "description": "Simulation generation is paused, no caller personalities are configured, or the quota store is unavailable for a private-key request. Quota outages return SIMULATION_ONBOARDING_QUOTA_UNAVAILABLE with Retry-After; retry with the same key.", + "headers": { + "Retry-After": { + "description": "Seconds to wait before retrying, when retrying is useful.", + "required": false, + "schema": { + "type": "integer" + } + } + }, + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/SimulationOnboardingErrorDTO" + }, + { + "type": "object", + "required": [ + "statusCode", + "message", + "error" + ], + "properties": { + "statusCode": { + "type": "number" + }, + "message": { + "type": "string" + }, + "error": { + "type": "string" + } + } + } + ] + } + } + } + }, + "504": { + "description": "The edit took too long. Retry with the same `patchKey`." + } + }, + "tags": [ + "Simulations" + ], + "security": [ + { + "bearer": [] + } + ] + } + }, "/eval/simulation": { "post": { "operationId": "SimulationController_create", @@ -19088,404 +19422,574 @@ "type" ] }, - "HandoffDestinationAssistant": { + "RecordingConsentPlanStayOnLine": { "type": "object", "properties": { - "type": { + "message": { "type": "string", - "enum": [ - "assistant" + "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." ] }, - "contextEngineeringPlan": { - "description": "This is the plan for manipulating the message context before handing off the call to the next assistant.", + "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/ContextEngineeringPlanLastNMessages", - "title": "Last N Messages" + "$ref": "#/components/schemas/AzureVoice", + "title": "AzureVoice" }, { - "$ref": "#/components/schemas/ContextEngineeringPlanNone", - "title": "None" + "$ref": "#/components/schemas/CartesiaVoice", + "title": "CartesiaVoice" }, { - "$ref": "#/components/schemas/ContextEngineeringPlanAll", - "title": "All" + "$ref": "#/components/schemas/CustomVoice", + "title": "CustomVoice" }, { - "$ref": "#/components/schemas/ContextEngineeringPlanUserAndAssistantMessages", - "title": "User And Assistant Messages" + "$ref": "#/components/schemas/DeepgramVoice", + "title": "DeepgramVoice" }, { - "$ref": "#/components/schemas/ContextEngineeringPlanPreviousAssistantMessages", - "title": "Previous 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/ElevenLabsVoice", + "title": "ElevenLabsVoice" + }, { - "$ref": "#/components/schemas/CreateAssistantDTO" - } - ] - }, - "variableExtractionPlan": { - "description": "This is the variable extraction plan for the handoff tool.", - "allOf": [ + "$ref": "#/components/schemas/HumeVoice", + "title": "HumeVoice" + }, { - "$ref": "#/components/schemas/VariableExtractionPlan" - } - ] - }, - "assistantOverrides": { - "description": "These are the assistant overrides to apply to the destination assistant.", - "allOf": [ + "$ref": "#/components/schemas/LMNTVoice", + "title": "LMNTVoice" + }, { - "$ref": "#/components/schemas/AssistantOverrides" + "$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" } ] }, - "description": { + "firstMessageMode": { "type": "string", - "description": "This is the description of the destination, used by the AI to choose when and how to transfer the call." + "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" ] }, - "HandoffDestinationDynamic": { + "RecordingConsentPlanVerbal": { "type": "object", "properties": { - "type": { + "message": { "type": "string", - "enum": [ - "dynamic" + "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." ] }, - "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": [ + "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/Server" + "$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" } ] }, - "description": { + "firstMessageMode": { "type": "string", - "description": "This is the description of the destination, used by the AI to choose when and how to transfer the call." + "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" ] }, - "SquadMemberDTO": { + "SecurityFilterBase": { + "type": "object", + "properties": {} + }, + "SecurityFilterPlan": { "type": "object", "properties": { - "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." + "enabled": { + "type": "boolean", + "description": "Whether the security filter is enabled.\n@default false", + "default": false }, - "assistantDestinations": { + "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", "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/TransferDestinationAssistant", - "title": "Transfer Destination" - }, - { - "$ref": "#/components/schemas/HandoffDestinationAssistant", - "title": "Handoff Destination" - } - ] + "$ref": "#/components/schemas/SecurityFilterBase" } }, - "assistantId": { + "mode": { "type": "string", - "nullable": true, - "description": "This is the assistant that will be used for the call. To use a transient assistant, use `assistant` instead." + "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" }, - "assistant": { - "description": "This is the assistant that will be used for the call. To use an existing assistant, use `assistantId` instead.", + "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." + }, + "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 + } + }, + "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/CreateAssistantDTO" + "$ref": "#/components/schemas/SecurityFilterPlan" } ] }, - "assistantOverrides": { - "description": "This can be used to override the assistant's settings and provide values for it's template variables.", - "allOf": [ + "recordingConsentPlan": { + "oneOf": [ { - "$ref": "#/components/schemas/AssistantOverrides" + "$ref": "#/components/schemas/RecordingConsentPlanStayOnLine", + "title": "RecordingConsentStayOnLinePlan" + }, + { + "$ref": "#/components/schemas/RecordingConsentPlanVerbal", + "title": "RecordingConsentPlanVerbal" } - ] + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "stay-on-line": "#/components/schemas/RecordingConsentPlanStayOnLine", + "verbal": "#/components/schemas/RecordingConsentPlanVerbal" + } + } } } }, - "CreateSquadDTO": { + "StructuredDataPlan": { "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.", + "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": { - "$ref": "#/components/schemas/SquadMemberDTO" + "type": "object" } }, - "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.", + "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" + }, + "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/AssistantOverrides" + "$ref": "#/components/schemas/JsonSchema" + } + ] + }, + "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." + }, + "plan": { + "description": "This is an individual structured data plan in the catalog.", + "allOf": [ + { + "$ref": "#/components/schemas/StructuredDataPlan" } ] } }, "required": [ - "members" + "key", + "plan" ] }, - "HandoffDestinationSquad": { + "SuccessEvaluationPlan": { "type": "object", "properties": { - "type": { + "rubric": { "type": "string", "enum": [ - "squad" - ] + "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'." }, - "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" - } - ] + "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`", + "type": "array", + "items": { + "type": "object" + } }, - "squadId": { - "type": "string", - "description": "This is the squad id to transfer the call to." + "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" }, - "squad": { - "description": "This is a transient squad to transfer the call to.", + "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 + }, + "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/CreateSquadDTO" + "$ref": "#/components/schemas/SummaryPlan" } ] }, - "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." - }, - "variableExtractionPlan": { - "description": "This is the variable extraction plan for the handoff tool.", + "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/VariableExtractionPlan" + "$ref": "#/components/schemas/StructuredDataPlan" } ] }, - "squadOverrides": { - "description": "These are the overrides to apply to the squad configuration.\nMaps to squad-level membersOverrides.", + "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" + } + }, + "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/AssistantOverrides" + "$ref": "#/components/schemas/SuccessEvaluationPlan" } ] }, - "description": { - "type": "string", - "description": "This is the description of the destination, used by the AI to choose when and how to transfer the call." + "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" + } } - }, - "required": [ - "type" - ] + } }, - "CreateHandoffToolDTO": { + "TranscriptPlan": { "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" - } - ] - } + "enabled": { + "type": "boolean", + "description": "This determines whether the transcript is stored in `call.artifact.transcript`. Defaults to true.\n\n@default true", + "example": true }, - "type": { + "assistantName": { "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" - ] + "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'" }, - "defaultResult": { + "userName": { "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" - } - ] - } - }, - "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" - } + "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'" + } + } + }, + "MinMessagesCondition": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "This is the type discriminator for the minMessages condition.", + "example": "minMessages", + "enum": [ + "minMessages" ] }, - "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" - } - ] + "count": { + "type": "number", + "description": "This is the minimum number of conversation messages required for the\nstructured output to run.\n\nA count of 0 removes the runtime default minimum, so the structured output\nruns regardless of how few messages the conversation has.", + "example": 4, + "minimum": 0 } }, "required": [ - "type" + "type", + "count" ] }, - "CreateCustomKnowledgeBaseDTO": { + "MinCallDurationCondition": { "type": "object", "properties": { - "provider": { + "type": { "type": "string", - "description": "This knowledge base is bring your own knowledge base implementation.", + "description": "This is the type discriminator for the minCallDuration condition.", + "example": "minCallDuration", "enum": [ - "custom-knowledge-base" + "minCallDuration" ] }, - "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/Server" - } - ] + "seconds": { + "type": "number", + "description": "This is the minimum call duration in seconds required for the structured\noutput to run.\n\nWhen timestamps are unavailable (for example, chat sessions have no call\ntimestamps), this check passes and does not block the structured output.", + "example": 10, + "minimum": 0 } }, "required": [ - "provider", - "server" + "type", + "seconds" ] }, - "KnowledgeBase": { + "EndedReasonCondition": { "type": "object", "properties": { - "name": { - "type": "string", - "description": "The name of the knowledge base", - "example": "My Knowledge Base" - }, - "provider": { + "type": { "type": "string", - "description": "The provider of the knowledge base", + "description": "This is the type discriminator for the endedReason condition.", + "example": "endedReason", "enum": [ - "google" - ], - "example": "google" + "endedReason" + ] }, - "model": { + "operator": { "type": "string", - "description": "The model to use for the knowledge base", + "description": "This is the membership operator applied against `values`.\n\n- 'oneOf': the structured output runs only if the call's ended reason is in `values`.\n- 'notOneOf': the structured output runs only if the call's ended reason is NOT in `values`.", + "example": "oneOf", "enum": [ - "gemini-3.8-flash", - "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" + "oneOf", + "notOneOf" ] }, - "description": { - "type": "string", - "description": "A description of the knowledge base" - }, - "fileIds": { - "description": "The file IDs associated with this knowledge base", + "values": { + "description": "These are the ended reasons compared against the call's ended reason.\n\nAny string is accepted so configurations never break when new ended\nreasons are introduced. Must contain at least one value.", + "example": [ + "customer-ended-call" + ], "type": "array", "items": { "type": "string" @@ -19493,1816 +19997,2265 @@ } }, "required": [ - "name", - "provider", - "description", - "fileIds" + "type", + "operator", + "values" ] }, - "CreateQueryToolDTO": { + "ComplianceOverride": { + "type": "object", + "properties": { + "forceStoreOnHipaaEnabled": { + "type": "boolean", + "description": "Force storage for this output under HIPAA. Only enable if output contains no sensitive data.", + "example": false + } + } + }, + "CreateStructuredOutputDTO": { "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" - } - ] - } - }, "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": [ - "query" + "ai", + "regex" ], - "description": "The type of tool. \"query\" for Query tool." + "default": "ai" }, - "knowledgeBases": { - "description": "The knowledge bases to query", - "type": "array", - "items": { - "$ref": "#/components/schemas/KnowledgeBase" - } + "regex": { + "type": "string", + "description": "This is the regex pattern to match against the transcript.\n\nSimulation evaluations use a canonical transcript built from recorded messages:\nUser: and AI: dialogue, AI: tool_calls: JSON name/arguments records, and\nAI: tool_call_results: JSON results. System messages are excluded. These\nfixed labels apply even when custom artifact transcript labels are configured.\nTool payloads participate in first-match and all-match extraction in event order.\nAn empty message array falls back to the supplied transcript verbatim.\nProduction-call extraction and call preview use their existing transcripts,\nso previewing the same output on a simulation's call can return a different result.\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 }, - "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```", + "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.\nFor text extraction, you must reference 'transcript', 'messages', or 'messagesWithConfidence' with the `{{}}` syntax to access the conversation history.\nIn structured outputs, `{{messages}}` includes conversation text and tool calls/results but omits caller transcription-confidence fields. Text extraction can use `{{messagesWithConfidence}}` when the output needs the original message history with transcription confidence. These variables also apply in structured-output schema descriptions. Audio-targeted (`messages-with-audio`) extraction ignores custom messages. Stored call artifacts and API messages retain their confidence data.\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/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" + } + ] + }, + "compliancePlan": { + "description": "Compliance configuration for this output. Only enable overrides if no sensitive data will be stored.", + "example": { + "forceStoreOnHipaaEnabled": false + }, "allOf": [ { - "$ref": "#/components/schemas/ToolRejectionPlan" + "$ref": "#/components/schemas/ComplianceOverride" } ] - } - }, - "required": [ - "type" - ] - }, - "CreateGoogleCalendarCreateEventToolDTO": { - "type": "object", - "properties": { - "messages": { + }, + "conditions": { "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.", + "nullable": true, + "description": "These are the conditions that gate the execution of this structured output. Every condition must pass for the structured output to run (AND semantics). When omitted or empty, no user-defined conditions gate this output. Send null to clear a previously saved gate.", + "example": [ + { + "type": "minMessages", + "count": 4 + }, + { + "type": "minCallDuration", + "seconds": 10 + } + ], "items": { "oneOf": [ { - "$ref": "#/components/schemas/ToolMessageStart", - "title": "ToolMessageStart" - }, - { - "$ref": "#/components/schemas/ToolMessageComplete", - "title": "ToolMessageComplete" + "$ref": "#/components/schemas/MinMessagesCondition", + "title": "MinMessagesCondition" }, { - "$ref": "#/components/schemas/ToolMessageFailed", - "title": "ToolMessageFailed" + "$ref": "#/components/schemas/MinCallDurationCondition", + "title": "MinCallDurationCondition" }, { - "$ref": "#/components/schemas/ToolMessageDelayed", - "title": "ToolMessageDelayed" + "$ref": "#/components/schemas/EndedReasonCondition", + "title": "EndedReasonCondition" } ] } }, - "type": { + "name": { "type": "string", - "enum": [ - "google.calendar.event.create" - ], - "description": "The type of tool. \"google.calendar.event.create\" for Google Calendar Create Event tool." + "description": "This is the name of the structured output.", + "minLength": 1, + "maxLength": 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```", + "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/ToolRejectionPlan" + "$ref": "#/components/schemas/JsonSchema" } ] + }, + "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." + }, + "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" + } + }, + "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": [ - "type" + "name", + "schema" ] }, - "CreateGoogleSheetsRowAppendToolDTO": { + "NumberComparatorScorecardMetricCondition": { "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" - } - ] - } - }, "type": { "type": "string", + "description": "This is the type of the condition. Currently only 'comparator' is supported.", "enum": [ - "google.sheets.row.append" - ], - "description": "The type of tool. \"google.sheets.row.append\" for Google Sheets Row Append tool." + "comparator" + ] }, - "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" - } + "comparator": { + "type": "string", + "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": "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" + "type", + "comparator", + "value", + "points" ] }, - "CreateGoogleCalendarCheckAvailabilityToolDTO": { + "BooleanComparatorScorecardMetricCondition": { "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" - } - ] - } - }, "type": { "type": "string", + "description": "This is the type of the condition. Currently only 'comparator' is supported.", "enum": [ - "google.calendar.availability.check" - ], - "description": "The type of tool. \"google.calendar.availability.check\" for Google Calendar Check Availability tool." + "comparator" + ] }, - "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" - } + "comparator": { + "type": "string", + "description": "The comparator can only be '=' for boolean conditions.", + "enum": [ + "=" ] + }, + "value": { + "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" + "type", + "comparator", + "value", + "points" ] }, - "CreateSlackSendMessageToolDTO": { + "ScorecardMetric": { "type": "object", "properties": { - "messages": { + "conditions": { "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.", + "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/ToolMessageStart", - "title": "ToolMessageStart" - }, - { - "$ref": "#/components/schemas/ToolMessageComplete", - "title": "ToolMessageComplete" - }, - { - "$ref": "#/components/schemas/ToolMessageFailed", - "title": "ToolMessageFailed" + "$ref": "#/components/schemas/NumberComparatorScorecardMetricCondition", + "title": "NumberComparatorScorecardMetricCondition" }, { - "$ref": "#/components/schemas/ToolMessageDelayed", - "title": "ToolMessageDelayed" + "$ref": "#/components/schemas/BooleanComparatorScorecardMetricCondition", + "title": "BooleanComparatorScorecardMetricCondition" } ] } }, - "type": { + "structuredOutputId": { "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" - } - ] + "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": [ - "type" + "conditions", + "structuredOutputId" ] }, - "McpToolMessages": { + "CreateScorecardDTO": { "type": "object", "properties": { "name": { "type": "string", - "description": "The name of the tool from the MCP server." + "description": "This is the name of the scorecard. It is only for user reference and will not be used for any evaluation.", + "maxLength": 80 }, - "messages": { + "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 + }, + "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": "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/ToolMessageStart", - "title": "ToolMessageStart" - }, - { - "$ref": "#/components/schemas/ToolMessageComplete", - "title": "ToolMessageComplete" - }, - { - "$ref": "#/components/schemas/ToolMessageFailed", - "title": "ToolMessageFailed" - }, - { - "$ref": "#/components/schemas/ToolMessageDelayed", - "title": "ToolMessageDelayed" - } - ] + "$ref": "#/components/schemas/ScorecardMetric" + } + }, + "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" } } }, "required": [ - "name" + "metrics" ] }, - "McpToolMetadata": { + "ArtifactPlan": { "type": "object", "properties": { - "protocol": { + "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": { "type": "string", + "description": "This determines the format of the recording. Defaults to `wav;l16`.\n\n@default 'wav;l16'", "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/ToolMessageStart", - "title": "ToolMessageStart" - }, - { - "$ref": "#/components/schemas/ToolMessageComplete", - "title": "ToolMessageComplete" - }, - { - "$ref": "#/components/schemas/ToolMessageFailed", - "title": "ToolMessageFailed" - }, - { - "$ref": "#/components/schemas/ToolMessageDelayed", - "title": "ToolMessageDelayed" - } - ] - } + "wav;l16", + "mp3" + ] }, - "type": { + "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\nIf your organization has ZDR (zero data retention) or PCI enabled, recordings are never written to Vapi storage. In that case, false means \"do not use my custom storage\", so nothing is stored at all.\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", - "enum": [ - "mcp" - ], - "description": "The type of tool. \"mcp\" for MCP tool." + "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" }, - "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.", + "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\nIf your organization has ZDR (zero data retention) or PCI enabled, packet captures are never written to Vapi storage. In that case, false means \"do not use my custom storage\", so nothing is stored at all.\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\nIf your organization has ZDR (zero data retention) or PCI enabled, logs are never written to Vapi storage. In that case, false means \"do not use my custom storage\", so nothing is stored at all.\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/Server" + "$ref": "#/components/schemas/TranscriptPlan" } ] }, - "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.", + "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": { - "$ref": "#/components/schemas/McpToolMessages" + "type": "string" } }, - "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": { + "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", - "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" - } - ] + "$ref": "#/components/schemas/CreateStructuredOutputDTO" } }, - "type": { - "type": "string", - "enum": [ - "gohighlevel.calendar.availability.check" - ], - "description": "The type of tool. \"gohighlevel.calendar.availability.check\" for GoHighLevel Calendar Availability Check tool." + "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" + } }, - "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": { + "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", - "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" - } - ] + "$ref": "#/components/schemas/CreateScorecardDTO" } }, - "type": { + "loggingPath": { "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" - } - ] + "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 '/'" } - }, - "required": [ - "type" - ] + } }, - "CreateGoHighLevelContactCreateToolDTO": { + "StopSpeakingPlan": { "type": "object", "properties": { - "messages": { + "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", - "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": "string", + "maxLength": 240 } }, - "type": { - "type": "string", - "enum": [ - "gohighlevel.contact.create" + "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" ], - "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" - } - ] + "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": [ - "type" - ] + } }, - "CreateGoHighLevelContactGetToolDTO": { + "MonitorPlan": { "type": "object", "properties": { - "messages": { + "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", - "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": "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" }, - "type": { + "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": [ - "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": { + "TransientAssistantDTO": { "type": "object", "properties": { - "content": { + "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" + } + ] + }, + "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" + } + ] + }, + "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" + } + ] + }, + "firstMessage": { "type": "string", - "nullable": true, - "maxLength": 100000000 + "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?" }, - "role": { + "firstMessageInterruptionsEnabled": { + "type": "boolean", + "default": false + }, + "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. (`assistant.model.messages` at call start, `call.messages` at squad transfer points).\n\n@default 'assistant-speaks-first'", "enum": [ - "assistant", - "function", - "user", - "system", - "tool" + "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" + } ] - } - }, - "required": [ - "content", - "role" - ] - }, - "ToolRef": { - "type": "object", - "properties": { - "toolId": { - "type": "string", - "description": "This is the unique identifier of the tool whose version is being pinned.", - "format": "uuid" }, - "version": { - "type": "string", - "description": "Public version label of the tool, e.g. \"v3\"" - } - }, - "required": [ - "toolId", - "version" - ] - }, - "AnyscaleModel": { - "type": "object", - "properties": { - "messages": { - "description": "This is the starting state for the conversation.", + "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": { - "$ref": "#/components/schemas/OpenAIMessage" + "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" + ] } }, - "tools": { + "serverMessages": { "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.", + "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", + "call.artifact.upload" + ], + "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", + "call.artifact.upload" + ] + } + }, + "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": [ + "off", + "office" + ], + "example": "office" + }, + { + "type": "string", + "format": "uri", + "example": "https://example.com/my-sound.mp3" + } + ] + }, + "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 + }, + "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/CreateApiRequestToolDTO", - "title": "ApiRequestTool" - }, + "$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/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/CreateBashToolDTO", - "title": "BashTool" + "$ref": "#/components/schemas/CreateAnthropicCredentialDTO", + "title": "AnthropicCredential" }, { - "$ref": "#/components/schemas/CreateCodeToolDTO", - "title": "CodeTool" + "$ref": "#/components/schemas/CreateAnthropicBedrockCredentialDTO", + "title": "AnthropicBedrockCredential" }, { - "$ref": "#/components/schemas/CreateComputerToolDTO", - "title": "ComputerTool" + "$ref": "#/components/schemas/CreateAnyscaleCredentialDTO", + "title": "AnyscaleCredential" }, { - "$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/CreateAssemblyAICredentialDTO", + "title": "AssemblyAICredential" }, { - "$ref": "#/components/schemas/CreateHandoffToolDTO", - "title": "HandoffTool" + "$ref": "#/components/schemas/CreateAzureCredentialDTO", + "title": "AzureCredential" }, { - "$ref": "#/components/schemas/CreateMcpToolDTO", - "title": "McpTool" + "$ref": "#/components/schemas/CreateAzureOpenAICredentialDTO", + "title": "AzureOpenAICredential" }, { - "$ref": "#/components/schemas/CreateQueryToolDTO", - "title": "QueryTool" + "$ref": "#/components/schemas/CreateByoSipTrunkCredentialDTO", + "title": "ByoSipTrunkCredential" }, { - "$ref": "#/components/schemas/CreateSlackSendMessageToolDTO", - "title": "SlackSendMessageTool" + "$ref": "#/components/schemas/CreateCartesiaCredentialDTO", + "title": "CartesiaCredential" }, { - "$ref": "#/components/schemas/CreateSmsToolDTO", - "title": "SmsTool" + "$ref": "#/components/schemas/CreateCerebrasCredentialDTO", + "title": "CerebrasCredential" }, { - "$ref": "#/components/schemas/CreateTextEditorToolDTO", - "title": "TextEditorTool" + "$ref": "#/components/schemas/CreateCloudflareCredentialDTO", + "title": "CloudflareCredential" }, { - "$ref": "#/components/schemas/CreateTransferCallToolDTO", - "title": "TransferCallTool" + "$ref": "#/components/schemas/CreateCustomLLMCredentialDTO", + "title": "CustomLLMCredential" }, { - "$ref": "#/components/schemas/CreateSipRequestToolDTO", - "title": "SipRequestTool" + "$ref": "#/components/schemas/CreateDeepgramCredentialDTO", + "title": "DeepgramCredential" }, { - "$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": [ - "anyscale" - ] - }, - "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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", - "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" - ] - }, - "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": { - "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/CreateDeepInfraCredentialDTO", + "title": "DeepInfraCredential" }, { - "$ref": "#/components/schemas/CreateBashToolDTO", - "title": "BashTool" + "$ref": "#/components/schemas/CreateDeepSeekCredentialDTO", + "title": "DeepSeekCredential" }, { - "$ref": "#/components/schemas/CreateCodeToolDTO", - "title": "CodeTool" + "$ref": "#/components/schemas/CreateElevenLabsCredentialDTO", + "title": "ElevenLabsCredential" }, { - "$ref": "#/components/schemas/CreateComputerToolDTO", - "title": "ComputerTool" + "$ref": "#/components/schemas/CreateGcpCredentialDTO", + "title": "GcpCredential" }, { - "$ref": "#/components/schemas/CreateDtmfToolDTO", - "title": "DtmfTool" + "$ref": "#/components/schemas/CreateGladiaCredentialDTO", + "title": "GladiaCredential" }, { - "$ref": "#/components/schemas/CreateEndCallToolDTO", - "title": "EndCallTool" + "$ref": "#/components/schemas/CreateGoHighLevelCredentialDTO", + "title": "GhlCredential" }, { - "$ref": "#/components/schemas/CreateFunctionToolDTO", - "title": "FunctionTool" + "$ref": "#/components/schemas/CreateGoogleCredentialDTO", + "title": "GoogleCredential" }, { - "$ref": "#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO", - "title": "GoHighLevelCalendarAvailabilityTool" + "$ref": "#/components/schemas/CreateGroqCredentialDTO", + "title": "GroqCredential" }, { - "$ref": "#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO", - "title": "GoHighLevelCalendarEventCreateTool" + "$ref": "#/components/schemas/CreateHumeCredentialDTO", + "title": "HumeCredential" }, { - "$ref": "#/components/schemas/CreateGoHighLevelContactCreateToolDTO", - "title": "GoHighLevelContactCreateTool" + "$ref": "#/components/schemas/CreateInflectionAICredentialDTO", + "title": "InflectionAICredential" }, { - "$ref": "#/components/schemas/CreateGoHighLevelContactGetToolDTO", - "title": "GoHighLevelContactGetTool" + "$ref": "#/components/schemas/CreateLangfuseCredentialDTO", + "title": "LangfuseCredential" }, { - "$ref": "#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO", - "title": "GoogleCalendarCheckAvailabilityTool" + "$ref": "#/components/schemas/CreateLmntCredentialDTO", + "title": "LmntCredential" }, { - "$ref": "#/components/schemas/CreateGoogleCalendarCreateEventToolDTO", - "title": "GoogleCalendarCreateEventTool" + "$ref": "#/components/schemas/CreateMakeCredentialDTO", + "title": "MakeCredential" }, { - "$ref": "#/components/schemas/CreateGoogleSheetsRowAppendToolDTO", - "title": "GoogleSheetsRowAppendTool" + "$ref": "#/components/schemas/CreateMistralCredentialDTO", + "title": "MistralCredential" }, { - "$ref": "#/components/schemas/CreateHandoffToolDTO", - "title": "HandoffTool" + "$ref": "#/components/schemas/CreateNeuphonicCredentialDTO", + "title": "NeuphonicCredential" }, { - "$ref": "#/components/schemas/CreateMcpToolDTO", - "title": "McpTool" + "$ref": "#/components/schemas/CreateOpenAICredentialDTO", + "title": "OpenAICredential" }, { - "$ref": "#/components/schemas/CreateQueryToolDTO", - "title": "QueryTool" + "$ref": "#/components/schemas/CreateOpenRouterCredentialDTO", + "title": "OpenRouterCredential" }, { - "$ref": "#/components/schemas/CreateSlackSendMessageToolDTO", - "title": "SlackSendMessageTool" + "$ref": "#/components/schemas/CreatePerplexityAICredentialDTO", + "title": "PerplexityAICredential" }, { - "$ref": "#/components/schemas/CreateSmsToolDTO", - "title": "SmsTool" + "$ref": "#/components/schemas/CreatePlayHTCredentialDTO", + "title": "PlayHTCredential" }, { - "$ref": "#/components/schemas/CreateTextEditorToolDTO", - "title": "TextEditorTool" + "$ref": "#/components/schemas/CreateRimeAICredentialDTO", + "title": "RimeAICredential" }, { - "$ref": "#/components/schemas/CreateTransferCallToolDTO", - "title": "TransferCallTool" + "$ref": "#/components/schemas/CreateRunpodCredentialDTO", + "title": "RunpodCredential" }, { - "$ref": "#/components/schemas/CreateSipRequestToolDTO", - "title": "SipRequestTool" + "$ref": "#/components/schemas/CreateS3CredentialDTO", + "title": "S3Credential" }, { - "$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": "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-sonnet-5", - "claude-haiku-4-5-20251001", - "claude-haiku-5-5" - ] - }, - "reasoningEffort": { - "type": "string", - "description": "Reasoning effort for claude-haiku-5-5. `none` turns thinking off. `low` to `max`\nuse adaptive thinking at that effort; higher effort can add latency before the\nmodel speaks. Unset means `none`. Rejected for every other model.", - "enum": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - }, - "provider": { - "type": "string", - "description": "The provider identifier for Anthropic.", - "enum": [ - "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.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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", - "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" - ] - }, - "AnthropicBedrockModel": { - "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/CreateS3CompatibleCredentialDTO", + "title": "S3CompatibleStorageCredential" }, { - "$ref": "#/components/schemas/CreateBashToolDTO", - "title": "BashTool" + "$ref": "#/components/schemas/CreateSmallestAICredentialDTO", + "title": "SmallestAICredential" }, { - "$ref": "#/components/schemas/CreateCodeToolDTO", - "title": "CodeTool" + "$ref": "#/components/schemas/CreateSpeechmaticsCredentialDTO", + "title": "SpeechmaticsCredential" }, { - "$ref": "#/components/schemas/CreateComputerToolDTO", - "title": "ComputerTool" + "$ref": "#/components/schemas/CreateSonioxCredentialDTO", + "title": "SonioxCredential" }, { - "$ref": "#/components/schemas/CreateDtmfToolDTO", - "title": "DtmfTool" + "$ref": "#/components/schemas/CreateSupabaseCredentialDTO", + "title": "SupabaseCredential" }, { - "$ref": "#/components/schemas/CreateEndCallToolDTO", - "title": "EndCallTool" + "$ref": "#/components/schemas/CreateTavusCredentialDTO", + "title": "TavusCredential" }, { - "$ref": "#/components/schemas/CreateFunctionToolDTO", - "title": "FunctionTool" + "$ref": "#/components/schemas/CreateTogetherAICredentialDTO", + "title": "TogetherAICredential" }, { - "$ref": "#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO", - "title": "GoHighLevelCalendarAvailabilityTool" + "$ref": "#/components/schemas/CreateTwilioCredentialDTO", + "title": "TwilioCredential" }, { - "$ref": "#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO", - "title": "GoHighLevelCalendarEventCreateTool" + "$ref": "#/components/schemas/CreateVonageCredentialDTO", + "title": "VonageCredential" }, { - "$ref": "#/components/schemas/CreateGoHighLevelContactCreateToolDTO", - "title": "GoHighLevelContactCreateTool" + "$ref": "#/components/schemas/CreateWebhookCredentialDTO", + "title": "WebhookCredential" }, { - "$ref": "#/components/schemas/CreateGoHighLevelContactGetToolDTO", - "title": "GoHighLevelContactGetTool" + "$ref": "#/components/schemas/CreateCustomCredentialDTO", + "title": "CustomCredential" }, { - "$ref": "#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO", - "title": "GoogleCalendarCheckAvailabilityTool" + "$ref": "#/components/schemas/CreateXAiCredentialDTO", + "title": "XAiCredential" }, { - "$ref": "#/components/schemas/CreateGoogleCalendarCreateEventToolDTO", - "title": "GoogleCalendarCreateEventTool" + "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO", + "title": "MicrosoftCredential" }, { - "$ref": "#/components/schemas/CreateGoogleSheetsRowAppendToolDTO", - "title": "GoogleSheetsRowAppendTool" + "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", + "title": "GoogleCalendarOAuth2ClientCredential" }, { - "$ref": "#/components/schemas/CreateHandoffToolDTO", - "title": "HandoffTool" + "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO", + "title": "GoogleCalendarOAuth2AuthorizationCredential" }, { - "$ref": "#/components/schemas/CreateMcpToolDTO", - "title": "McpTool" + "$ref": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO", + "title": "GoogleSheetsOAuth2AuthorizationCredential" }, { - "$ref": "#/components/schemas/CreateQueryToolDTO", - "title": "QueryTool" + "$ref": "#/components/schemas/CreateSlackOAuth2AuthorizationCredentialDTO", + "title": "SlackOAuth2AuthorizationCredential" }, { - "$ref": "#/components/schemas/CreateSlackSendMessageToolDTO", - "title": "SlackSendMessageTool" + "$ref": "#/components/schemas/CreateGoHighLevelMCPCredentialDTO", + "title": "GoHighLevelMCPCredential" }, { - "$ref": "#/components/schemas/CreateSmsToolDTO", - "title": "SmsTool" + "$ref": "#/components/schemas/CreateInworldCredentialDTO", + "title": "InworldCredential" }, { - "$ref": "#/components/schemas/CreateTextEditorToolDTO", - "title": "TextEditorTool" + "$ref": "#/components/schemas/CreateMinimaxCredentialDTO", + "title": "MinimaxCredential" }, { - "$ref": "#/components/schemas/CreateTransferCallToolDTO", - "title": "TransferCallTool" + "$ref": "#/components/schemas/CreateWellSaidCredentialDTO", + "title": "WellSaidCredential" }, { - "$ref": "#/components/schemas/CreateSipRequestToolDTO", - "title": "SipRequestTool" + "$ref": "#/components/schemas/CreateEmailCredentialDTO", + "title": "EmailCredential" }, { - "$ref": "#/components/schemas/CreateVoicemailToolDTO", - "title": "VoicemailTool" + "$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" } - ] - } - }, - "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": "The provider identifier for Anthropic via AWS Bedrock.", - "enum": [ - "anthropic-bedrock" - ] - }, - "model": { - "type": "string", - "description": "The specific Anthropic/Claude model that will be used via Bedrock.", - "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", - "claude-haiku-5-5", - "global.anthropic.claude-haiku-4-5-20251001-v1:0" - ] - }, - "fallbackModels": { - "type": "array", - "description": "At most one same-provider Bedrock fallback model, tried if the primary fails. Cannot be combined with thinking in this release. Resolution uses the call's Bedrock credential region (or ANTHROPIC_BEDROCK_AWS_REGION). Names with no inference profile in that region are skipped and warned, never remapped to US or global. On Vapi EU, fallback names without an EU inference profile are rejected at write time.", - "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", - "claude-haiku-5-5", - "global.anthropic.claude-haiku-4-5-20251001-v1:0" - ], - "maxItems": 1, - "example": [ - "claude-haiku-4-5-20251001" - ], - "items": { - "type": "string", - "enum": [ - "claude-3-opus-20240229", - "claude-3-sonnet-20240229", - "claude-3-haiku-20240307", - "claude-3-5-sonnet-20240620", - "claude-3-5-sonnet-20241022", - "claude-3-5-haiku-20241022", - "claude-3-7-sonnet-20250219", - "claude-opus-4-20250514", - "claude-opus-4-5-20251101", - "claude-opus-4-6", - "claude-sonnet-4-20250514", - "claude-sonnet-4-5-20250929", - "claude-sonnet-4-6", - "claude-haiku-4-5-20251001", - "claude-haiku-5-5", - "global.anthropic.claude-haiku-4-5-20251001-v1:0" - ] - } - }, - "reasoningEffort": { - "type": "string", - "description": "Reasoning effort for claude-haiku-5-5. `none` turns thinking off. `low` to `max`\nuse adaptive thinking at that effort; higher effort can add latency before the\nmodel speaks. Unset means `none`. Rejected for every other model.", - "enum": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ] - }, - "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.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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", - "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" - ] - }, - "CerebrasModel": { - "type": "object", - "properties": { - "messages": { - "description": "This is the starting state for the conversation.", - "type": "array", - "items": { - "$ref": "#/components/schemas/OpenAIMessage" } }, - "tools": { + "hooks": { "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": "This is a set of actions that will be performed on certain events.", "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/CallHookCallEnding", + "title": "CallHookCallEnding" }, { - "$ref": "#/components/schemas/CreateTextEditorToolDTO", - "title": "TextEditorTool" + "$ref": "#/components/schemas/CallHookAssistantSpeechInterrupted", + "title": "CallHookAssistantSpeechInterrupted" }, { - "$ref": "#/components/schemas/CreateTransferCallToolDTO", - "title": "TransferCallTool" + "$ref": "#/components/schemas/CallHookCustomerSpeechInterrupted", + "title": "CallHookCustomerSpeechInterrupted" }, { - "$ref": "#/components/schemas/CreateSipRequestToolDTO", - "title": "SipRequestTool" + "$ref": "#/components/schemas/CallHookCustomerSpeechTimeout", + "title": "CallHookCustomerSpeechTimeout" }, { - "$ref": "#/components/schemas/CreateVoicemailToolDTO", - "title": "VoicemailTool" + "$ref": "#/components/schemas/SessionCreatedHook", + "title": "SessionCreatedHook" } ] } }, - "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" - } + "name": { + "type": "string", + "description": "This is the name of the assistant.\n\nThis is required when you want to transfer between assistants in a call.", + "maxLength": 40 }, - "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).", + "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 + }, + "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 + }, + "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/ToolRef" + "type": "string", + "maxLength": 140, + "minLength": 2 } }, - "knowledgeBase": { - "description": "These are the options for the knowledge base.", - "oneOf": [ + "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/CreateCustomKnowledgeBaseDTO", - "title": "Custom" + "$ref": "#/components/schemas/BackgroundSpeechDenoisingPlan" } ] }, - "model": { - "type": "string", - "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b", - "enum": [ - "llama3.1-8b", - "llama-3.3-70b" + "analysisPlan": { + "description": "This is the plan for analysis of assistant's calls. Stored in `call.analysis`.", + "deprecated": true, + "allOf": [ + { + "$ref": "#/components/schemas/AnalysisPlan" + } ] }, - "provider": { - "type": "string", - "enum": [ - "cerebras" + "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": "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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", - "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" + "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" + } + ] }, - "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" - ] - }, - "CustomLLMModel": { - "type": "object", - "properties": { - "messages": { - "description": "This is the starting state for the conversation.", - "type": "array", - "items": { - "$ref": "#/components/schemas/OpenAIMessage" - } + "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" + } + ] }, - "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" - } - ] - } + "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" + } + ] }, - "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.", + "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" } }, - "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": [ + "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/CreateCustomKnowledgeBaseDTO", - "title": "Custom" + "$ref": "#/components/schemas/Server" } ] }, - "provider": { - "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" + "keypadInputPlan": { + "$ref": "#/components/schemas/KeypadInputPlan" + } + } + }, + "AssistantOverrides": { + "type": "object", + "properties": { + "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" + } ] }, - "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" + "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" + } ] }, - "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" - } + "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" + } + ] }, - "url": { + "firstMessage": { "type": "string", - "description": "These is the URL we'll use for the OpenAI client's `baseURL`. Ex. https://openrouter.ai/api/v1" + "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?" }, - "wordLevelConfidenceEnabled": { + "firstMessageInterruptionsEnabled": { "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 + "default": false }, - "model": { + "firstMessageMode": { "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 + "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" }, - "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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", - "minimum": 50, - "maximum": 10000 + "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" + } + ] }, - "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" + "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" + ] + } }, - "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", - "url", - "model" - ] - }, - "DeepInfraModel": { - "type": "object", - "properties": { - "messages": { - "description": "This is the starting state for the conversation.", + "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", + "call.artifact.upload" + ], + "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/OpenAIMessage" + "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", + "call.artifact.upload" + ] } }, - "tools": { + "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": [ + "off", + "office" + ], + "example": "office" + }, + { + "type": "string", + "format": "uri", + "example": "https://example.com/my-sound.mp3" + } + ] + }, + "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 + }, + "transportConfigurations": { "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": "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/CreateApiRequestToolDTO", - "title": "ApiRequestTool" - }, - { - "$ref": "#/components/schemas/CreateBashToolDTO", - "title": "BashTool" + "$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/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/CreateCodeToolDTO", - "title": "CodeTool" + "$ref": "#/components/schemas/CreateAnthropicBedrockCredentialDTO", + "title": "AnthropicBedrockCredential" }, { - "$ref": "#/components/schemas/CreateComputerToolDTO", - "title": "ComputerTool" + "$ref": "#/components/schemas/CreateAnyscaleCredentialDTO", + "title": "AnyscaleCredential" }, { - "$ref": "#/components/schemas/CreateDtmfToolDTO", - "title": "DtmfTool" + "$ref": "#/components/schemas/CreateAssemblyAICredentialDTO", + "title": "AssemblyAICredential" }, { - "$ref": "#/components/schemas/CreateEndCallToolDTO", - "title": "EndCallTool" + "$ref": "#/components/schemas/CreateAzureCredentialDTO", + "title": "AzureCredential" }, { - "$ref": "#/components/schemas/CreateFunctionToolDTO", - "title": "FunctionTool" + "$ref": "#/components/schemas/CreateAzureOpenAICredentialDTO", + "title": "AzureOpenAICredential" }, { - "$ref": "#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO", - "title": "GoHighLevelCalendarAvailabilityTool" + "$ref": "#/components/schemas/CreateByoSipTrunkCredentialDTO", + "title": "ByoSipTrunkCredential" }, { - "$ref": "#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO", - "title": "GoHighLevelCalendarEventCreateTool" + "$ref": "#/components/schemas/CreateCartesiaCredentialDTO", + "title": "CartesiaCredential" }, { - "$ref": "#/components/schemas/CreateGoHighLevelContactCreateToolDTO", - "title": "GoHighLevelContactCreateTool" + "$ref": "#/components/schemas/CreateCerebrasCredentialDTO", + "title": "CerebrasCredential" }, { - "$ref": "#/components/schemas/CreateGoHighLevelContactGetToolDTO", - "title": "GoHighLevelContactGetTool" + "$ref": "#/components/schemas/CreateCloudflareCredentialDTO", + "title": "CloudflareCredential" }, { - "$ref": "#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO", - "title": "GoogleCalendarCheckAvailabilityTool" + "$ref": "#/components/schemas/CreateCustomLLMCredentialDTO", + "title": "CustomLLMCredential" }, { - "$ref": "#/components/schemas/CreateGoogleCalendarCreateEventToolDTO", - "title": "GoogleCalendarCreateEventTool" + "$ref": "#/components/schemas/CreateDeepgramCredentialDTO", + "title": "DeepgramCredential" }, { - "$ref": "#/components/schemas/CreateGoogleSheetsRowAppendToolDTO", - "title": "GoogleSheetsRowAppendTool" + "$ref": "#/components/schemas/CreateDeepInfraCredentialDTO", + "title": "DeepInfraCredential" }, { - "$ref": "#/components/schemas/CreateHandoffToolDTO", - "title": "HandoffTool" + "$ref": "#/components/schemas/CreateDeepSeekCredentialDTO", + "title": "DeepSeekCredential" }, { - "$ref": "#/components/schemas/CreateMcpToolDTO", - "title": "McpTool" + "$ref": "#/components/schemas/CreateElevenLabsCredentialDTO", + "title": "ElevenLabsCredential" }, { - "$ref": "#/components/schemas/CreateQueryToolDTO", - "title": "QueryTool" + "$ref": "#/components/schemas/CreateGcpCredentialDTO", + "title": "GcpCredential" }, { - "$ref": "#/components/schemas/CreateSlackSendMessageToolDTO", - "title": "SlackSendMessageTool" + "$ref": "#/components/schemas/CreateGladiaCredentialDTO", + "title": "GladiaCredential" }, { - "$ref": "#/components/schemas/CreateSmsToolDTO", - "title": "SmsTool" + "$ref": "#/components/schemas/CreateGoHighLevelCredentialDTO", + "title": "GhlCredential" }, { - "$ref": "#/components/schemas/CreateTextEditorToolDTO", - "title": "TextEditorTool" + "$ref": "#/components/schemas/CreateGoogleCredentialDTO", + "title": "GoogleCredential" }, { - "$ref": "#/components/schemas/CreateTransferCallToolDTO", - "title": "TransferCallTool" + "$ref": "#/components/schemas/CreateGroqCredentialDTO", + "title": "GroqCredential" }, { - "$ref": "#/components/schemas/CreateSipRequestToolDTO", - "title": "SipRequestTool" + "$ref": "#/components/schemas/CreateHumeCredentialDTO", + "title": "HumeCredential" }, { - "$ref": "#/components/schemas/CreateVoicemailToolDTO", - "title": "VoicemailTool" + "$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" } - ] - } - }, - "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": [ - "deepinfra" - ] - }, - "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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", - "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" - ] - }, - "DeepSeekModel": { - "type": "object", - "properties": { - "messages": { - "description": "This is the starting state for the conversation.", + "hooks": { "type": "array", + "description": "This is a set of actions that will be performed on certain events.", "items": { - "$ref": "#/components/schemas/OpenAIMessage" + "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": { + "tools:append": { "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": [ { @@ -21400,277 +22353,481 @@ ] } }, - "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" - } + "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" }, - "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).", + "name": { + "type": "string", + "description": "This is the name of the assistant.\n\nThis is required when you want to transfer between assistants in a call.", + "maxLength": 40 + }, + "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 + }, + "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 + }, + "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/ToolRef" + "type": "string", + "maxLength": 140, + "minLength": 2 } }, - "knowledgeBase": { - "description": "These are the options for the knowledge base.", - "oneOf": [ + "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/CreateCustomKnowledgeBaseDTO", - "title": "Custom" + "$ref": "#/components/schemas/BackgroundSpeechDenoisingPlan" } ] }, - "model": { - "type": "string", - "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b", - "enum": [ - "deepseek-chat", - "deepseek-reasoner", - "deepseek-flash", - "deepseek-flash-thinking" + "analysisPlan": { + "description": "This is the plan for analysis of assistant's calls. Stored in `call.analysis`.", + "deprecated": true, + "allOf": [ + { + "$ref": "#/components/schemas/AnalysisPlan" + } ] }, - "provider": { - "type": "string", - "enum": [ - "deep-seek" + "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": "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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", - "minimum": 50, - "maximum": 10000 + "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" + } + ] }, - "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" + "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" + } + ] }, - "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 + "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" + } + ] + }, + "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" + } + }, + "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" + } + ] + }, + "keypadInputPlan": { + "$ref": "#/components/schemas/KeypadInputPlan" } - }, - "required": [ - "model", - "provider" - ] + } }, - "GeminiMultimodalLivePrebuiltVoiceConfig": { + "HandoffDestinationAssistant": { "type": "object", "properties": { - "voiceName": { + "type": { "type": "string", "enum": [ - "Puck", - "Charon", - "Kore", - "Fenrir", - "Aoede" + "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" + }, + { + "$ref": "#/components/schemas/ContextEngineeringPlanPreviousAssistantMessages", + "title": "Previous 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/TransientAssistantDTO" + } + ] + }, + "variableExtractionPlan": { + "description": "This is the variable extraction plan for the handoff tool.", + "allOf": [ + { + "$ref": "#/components/schemas/VariableExtractionPlan" + } + ] + }, + "assistantOverrides": { + "description": "These are the assistant overrides to apply to the destination assistant.", + "allOf": [ + { + "$ref": "#/components/schemas/AssistantOverrides" + } ] + }, + "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": [ - "voiceName" + "type" ] }, - "GeminiMultimodalLiveVoiceConfig": { + "HandoffDestinationDynamic": { "type": "object", "properties": { - "prebuiltVoiceConfig": { - "$ref": "#/components/schemas/GeminiMultimodalLivePrebuiltVoiceConfig" + "type": { + "type": "string", + "enum": [ + "dynamic" + ] + }, + "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": [ - "prebuiltVoiceConfig" + "type" ] }, - "GeminiMultimodalLiveSpeechConfig": { + "SquadMemberDTO": { "type": "object", "properties": { - "voiceConfig": { - "$ref": "#/components/schemas/GeminiMultimodalLiveVoiceConfig" + "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." + }, + "assistantDestinations": { + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/TransferDestinationAssistant", + "title": "Transfer Destination" + }, + { + "$ref": "#/components/schemas/HandoffDestinationAssistant", + "title": "Handoff Destination" + } + ] + } + }, + "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/TransientAssistantDTO" + } + ] + }, + "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": { + "$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" + } + ] } }, "required": [ - "voiceConfig" + "members" ] }, - "GoogleRealtimeConfig": { + "HandoffDestinationSquad": { "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." + "type": { + "type": "string", + "enum": [ + "squad" + ] }, - "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." + "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" + } + ] }, - "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." + "squadId": { + "type": "string", + "description": "This is the squad id to transfer the call to." }, - "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." + "squad": { + "description": "This is a transient squad to transfer the call to.", + "allOf": [ + { + "$ref": "#/components/schemas/CreateSquadDTO" + } + ] }, - "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.", + "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." + }, + "variableExtractionPlan": { + "description": "This is the variable extraction plan for the handoff tool.", "allOf": [ { - "$ref": "#/components/schemas/GeminiMultimodalLiveSpeechConfig" + "$ref": "#/components/schemas/VariableExtractionPlan" + } + ] + }, + "squadOverrides": { + "description": "These are the overrides to apply to the squad configuration.\nMaps to squad-level membersOverrides.", + "allOf": [ + { + "$ref": "#/components/schemas/AssistantOverrides" } ] + }, + "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" + ] }, - "GoogleModel": { + "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/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/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", + "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/CreateTransferCallToolDTO", - "title": "TransferCallTool" + "$ref": "#/components/schemas/HandoffDestinationAssistant", + "title": "Assistant" }, { - "$ref": "#/components/schemas/CreateSipRequestToolDTO", - "title": "SipRequestTool" + "$ref": "#/components/schemas/HandoffDestinationDynamic", + "title": "Dynamic" }, { - "$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" - } + "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" + } + ] }, - "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" - } + "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" + ] + }, + "CreateCustomKnowledgeBaseDTO": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "description": "This knowledge base is bring your own knowledge base implementation.", + "enum": [ + "custom-knowledge-base" + ] }, - "knowledgeBase": { - "description": "These are the options for the knowledge base.", - "oneOf": [ + "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/CreateCustomKnowledgeBaseDTO", - "title": "Custom" + "$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" + }, + "provider": { + "type": "string", + "description": "The provider of the knowledge base", + "enum": [ + "google" + ], + "example": "google" }, "model": { "type": "string", - "description": "This is the Google model that will be used.", + "description": "The model to use for the knowledge base", "enum": [ "gemini-3.8-flash", "gemini-3.5-flash", @@ -21692,714 +22849,612 @@ "gemini-1.0-pro" ] }, - "provider": { + "description": { "type": "string", - "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.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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", - "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" + "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": [ - "model", - "provider" + "name", + "provider", + "description", + "fileIds" ] }, - "GroqModel": { + "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/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/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" - } + "type": { + "type": "string", + "enum": [ + "query" + ], + "description": "The type of tool. \"query\" for Query tool." }, - "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).", + "knowledgeBases": { + "description": "The knowledge bases to query", "type": "array", "items": { - "$ref": "#/components/schemas/ToolRef" + "$ref": "#/components/schemas/KnowledgeBase" } }, - "knowledgeBase": { - "description": "These are the options for the knowledge base.", - "oneOf": [ + "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" } ] - }, - "model": { - "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-scout-17b-16e-instruct", - "mistral-saba-24b", - "compound-beta", - "compound-beta-mini" - ] - }, - "provider": { - "type": "string", - "enum": [ - "groq" - ] - }, - "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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", - "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" ] }, - "InflectionAIModel": { + "CreateGoogleCalendarCreateEventToolDTO": { "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": [ + "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/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.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": [ + { + "$ref": "#/components/schemas/ToolRejectionPlan" + } + ] + } + }, + "required": [ + "type" + ] + }, + "CreateGoogleCalendarCheckAvailabilityToolDTO": { + "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" - } - }, - "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": { "type": "string", - "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b", "enum": [ - "inflection_3_pi" - ] + "google.calendar.availability.check" + ], + "description": "The type of tool. \"google.calendar.availability.check\" for Google Calendar Check Availability tool." }, - "provider": { - "type": "string", - "enum": [ - "inflection-ai" + "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.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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", - "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" ] }, - "MinimaxLLMModel": { + "CreateSlackSendMessageToolDTO": { "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/ToolMessageStart", + "title": "ToolMessageStart" }, { - "$ref": "#/components/schemas/CreateComputerToolDTO", - "title": "ComputerTool" + "$ref": "#/components/schemas/ToolMessageComplete", + "title": "ToolMessageComplete" }, { - "$ref": "#/components/schemas/CreateDtmfToolDTO", - "title": "DtmfTool" + "$ref": "#/components/schemas/ToolMessageFailed", + "title": "ToolMessageFailed" }, { - "$ref": "#/components/schemas/CreateEndCallToolDTO", - "title": "EndCallTool" - }, + "$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/CreateFunctionToolDTO", - "title": "FunctionTool" + "$ref": "#/components/schemas/ToolMessageStart", + "title": "ToolMessageStart" }, { - "$ref": "#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO", - "title": "GoHighLevelCalendarAvailabilityTool" + "$ref": "#/components/schemas/ToolMessageComplete", + "title": "ToolMessageComplete" }, { - "$ref": "#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO", - "title": "GoHighLevelCalendarEventCreateTool" + "$ref": "#/components/schemas/ToolMessageFailed", + "title": "ToolMessageFailed" }, { - "$ref": "#/components/schemas/CreateGoHighLevelContactCreateToolDTO", - "title": "GoHighLevelContactCreateTool" - }, - { - "$ref": "#/components/schemas/CreateGoHighLevelContactGetToolDTO", - "title": "GoHighLevelContactGetTool" - }, + "$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/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": [ + "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/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": [ + "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/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" - } - }, - "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": { "type": "string", "enum": [ - "minimax" - ] + "gohighlevel.calendar.event.create" + ], + "description": "The type of tool. \"gohighlevel.calendar.event.create\" for GoHighLevel Calendar Event Create tool." }, - "model": { - "type": "string", - "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b", - "enum": [ - "MiniMax-M2.7" + "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.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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", - "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" + "type" ] }, - "OpenAISpeaker": { + "CreateGoHighLevelContactCreateToolDTO": { "type": "object", "properties": { - "instructions": { - "type": "string", - "description": "Omit to use model.systemPrompt, or system-role messages when systemPrompt is absent. An explicit empty string is preserved." - }, - "personalityPacks": { + "messages": { "type": "array", - "description": "Personality packs append speaking-style guidance to the speaker prompt. Set to an array of pack IDs and test one pack at a time. These are prompt instructions, not fixed speed controls.", + "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", - "enum": [ - "eager-listener", - "idle-hummer", - "bouncy", - "unhurried" + "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" + } + ] } - } + }, + "required": [ + "type" + ] }, - "OpenAIReasonerSkill": { + "CreateGoHighLevelContactGetToolDTO": { "type": "object", "properties": { - "name": { - "type": "string", - "description": "Unique name within this assistant.", - "maxLength": 64, - "pattern": "/^[a-z][a-z0-9_-]*$/" - }, - "description": { - "type": "string", - "description": "Explain when the reasoner should load this skill. Always visible in its catalog.", - "maxLength": 1024, - "pattern": "/\\S/" - }, - "content": { - "type": "string", - "description": "Full skill instructions, loaded only while this skill is active.", - "maxLength": 32000, - "pattern": "/\\S/" - }, - "tools": { + "messages": { "type": "array", - "description": "Tools available only after loading this skill. Can be combined with toolIds.", - "maxItems": 20, + "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/CreateFunctionToolDTO" - }, - { - "$ref": "#/components/schemas/CreateApiRequestToolDTO" - }, - { - "$ref": "#/components/schemas/CreateMcpToolDTO" + "$ref": "#/components/schemas/ToolMessageStart", + "title": "ToolMessageStart" }, { - "$ref": "#/components/schemas/CreateEndCallToolDTO" + "$ref": "#/components/schemas/ToolMessageComplete", + "title": "ToolMessageComplete" }, { - "$ref": "#/components/schemas/CreateDtmfToolDTO" + "$ref": "#/components/schemas/ToolMessageFailed", + "title": "ToolMessageFailed" }, { - "$ref": "#/components/schemas/CreateTransferCallToolDTO" + "$ref": "#/components/schemas/ToolMessageDelayed", + "title": "ToolMessageDelayed" } ] } }, - "toolIds": { - "type": "array", - "description": "Existing organization-owned tools available only after loading this skill.", - "items": { - "type": "string", - "format": "uuid" - }, - "maxItems": 20 + "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" + } + ] } }, "required": [ - "name", - "description", - "content" + "type" ] }, - "OpenAIReasoner": { + "OpenAIMessage": { "type": "object", "properties": { - "provider": { + "content": { "type": "string", - "description": "The reasoner uses OpenAI. Omit to use OpenAI.", - "enum": [ - "openai" - ], - "default": "openai" + "nullable": true, + "maxLength": 100000000 }, - "model": { + "role": { "type": "string", - "description": "The delegated reasoning model. Omit to use GPT-5.6 Terra.", "enum": [ - "gpt-5.6-sol", - "gpt-5.6-terra", - "gpt-5.6-luna" - ], - "default": "gpt-5.6-terra" - }, - "reasoningEffort": { + "assistant", + "function", + "user", + "system", + "tool" + ] + } + }, + "required": [ + "content", + "role" + ] + }, + "ToolRef": { + "type": "object", + "properties": { + "toolId": { "type": "string", - "description": "Higher effort can increase response time. Omit to use low.", - "enum": [ - "none", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "default": "low" + "description": "This is the unique identifier of the tool whose version is being pinned.", + "format": "uuid" }, - "instructions": { + "version": { "type": "string", - "description": "Complete reasoner instructions. An explicit empty string is preserved.\nOmit to use Vapi's default reasoner instructions. No behavioral instructions\nare appended unless skills are configured; skill loading guidance and active\nskill content are then composed with these instructions." - }, - "skills": { - "description": "Inline skills whose instructions and tools the GPT-Live reasoner loads on demand.", - "maxItems": 20, - "type": "array", - "items": { - "$ref": "#/components/schemas/OpenAIReasonerSkill" - } + "description": "Public version label of the tool, e.g. \"v3\"" } - } + }, + "required": [ + "toolId", + "version" + ] }, - "OpenAIModel": { + "AnyscaleModel": { "type": "object", "properties": { "messages": { @@ -22532,434 +23587,65 @@ } ] }, - "speaker": { - "description": "Configuration for the GPT-Live speaker.", - "allOf": [ - { - "$ref": "#/components/schemas/OpenAISpeaker" - } - ] - }, - "reasoner": { - "description": "Configuration for the reasoner supporting the GPT-Live speaker.", - "allOf": [ - { - "$ref": "#/components/schemas/OpenAIReasoner" - } - ] - }, "provider": { "type": "string", - "description": "This is the provider that will be used for the model.", "enum": [ - "openai" + "anyscale" ] }, "model": { "type": "string", - "description": "This is the OpenAI model that will be used.\nFor GPT-Live configuration and supported settings, see https://docs.vapi.ai/gpt-live/overview.\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", + "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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", + "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" + ] + }, + "AnthropicThinkingConfig": { + "type": "object", + "properties": { + "type": { + "type": "string", "enum": [ - "gpt-6-luna", - "gpt-5.6-sol", - "gpt-5.6-terra", - "gpt-5.6-luna", - "gpt-5.5", - "chat-latest", - "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-5.6-luna:westus3", - "gpt-5.6-terra:westus3", - "gpt-5.6-sol:westus3", - "gpt-5.4:eastus2", - "gpt-5.4:swedencentral", - "gpt-5.4-mini:eastus2", - "gpt-5.4-mini:swedencentral", - "gpt-5.4-nano:eastus2", - "gpt-5.4-nano:swedencentral", - "gpt-5.2:eastus2", - "gpt-5.2:swedencentral", - "gpt-5.1:eastus2", - "gpt-5.1:swedencentral", - "gpt-5:eastus2", - "gpt-5:swedencentral", - "gpt-5:canadaeast", - "gpt-5:eastus", - "gpt-5:westeurope", - "gpt-5:germanywestcentral", - "gpt-5:polandcentral", - "gpt-5:spaincentral", - "gpt-5-mini:eastus2", - "gpt-5-mini:swedencentral", - "gpt-5-mini:westeurope", - "gpt-5-mini:germanywestcentral", - "gpt-5-mini:polandcentral", - "gpt-5-mini:spaincentral", - "gpt-5-nano:eastus2", - "gpt-5-nano:swedencentral", - "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", - "gpt-live-1" - ] - }, - "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-6-luna", - "gpt-5.6-sol", - "gpt-5.6-terra", - "gpt-5.6-luna", - "gpt-5.5", - "chat-latest", - "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-5.6-luna:westus3", - "gpt-5.6-terra:westus3", - "gpt-5.6-sol:westus3", - "gpt-5.4:eastus2", - "gpt-5.4:swedencentral", - "gpt-5.4-mini:eastus2", - "gpt-5.4-mini:swedencentral", - "gpt-5.4-nano:eastus2", - "gpt-5.4-nano:swedencentral", - "gpt-5.2:eastus2", - "gpt-5.2:swedencentral", - "gpt-5.1:eastus2", - "gpt-5.1:swedencentral", - "gpt-5:eastus2", - "gpt-5:swedencentral", - "gpt-5:canadaeast", - "gpt-5:eastus", - "gpt-5:westeurope", - "gpt-5:germanywestcentral", - "gpt-5:polandcentral", - "gpt-5:spaincentral", - "gpt-5-mini:eastus2", - "gpt-5-mini:swedencentral", - "gpt-5-mini:westeurope", - "gpt-5-mini:germanywestcentral", - "gpt-5-mini:polandcentral", - "gpt-5-mini:spaincentral", - "gpt-5-nano:eastus2", - "gpt-5-nano:swedencentral", - "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" - ] - } - }, - "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`", - "enum": [ - "strip-parameters-with-unsupported-validation", - "strip-unsupported-validation" - ] - }, - "promptCacheRetention": { - "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.6-sol, gpt-5.6-terra, gpt-5.6-luna, gpt-5.5, chat-latest, 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" - ] - }, - "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 - }, - "serviceTier": { - "type": "string", - "enum": [ - "auto", - "default", - "fast", - "priority" - ], - "description": "This is the OpenAI service tier to request.\n\n- `fast`: requests Fast mode, which gives faster responses at a higher per-token rate. How much faster depends on the model.\n- `priority`: the old name for `fast`, accepted and billed the same.\n- `default`: standard processing.\n- `auto`: the default when unset. On Vapi's OpenAI keys this is standard processing; on your own OpenAI key, OpenAI applies your project's default tier.\n\nOpenAI sets Fast mode rates per model, and they are not a fixed multiple of the standard rates. Vapi bills them only when OpenAI reports that it served the request in Fast mode. Otherwise the request is billed at standard rates, for example when Fast mode isn't available for the model on Vapi, OpenAI downgrades the request, or the request runs on Azure OpenAI.\n\nSupported models and their Fast mode rates: https://docs.vapi.ai/providers/model/openai" - }, - "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, model-aware validation limits newly public\nvalues while preserving the existing four-value storage contract.", - "enum": [ - "minimal", - "none", - "low", - "medium", - "high", - "xhigh" + "enabled" ] }, - "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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", - "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": { + "budgetTokens": { "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": "The maximum number of tokens to allocate for thinking.\nMust be between 1024 and 100000 tokens.", + "minimum": 1024, + "maximum": 100000 } }, "required": [ - "provider", - "model" + "type", + "budgetTokens" ] }, - "OpenRouterModel": { + "AnthropicModel": { "type": "object", "properties": { "messages": { @@ -23092,15 +23778,54 @@ } ] }, - "provider": { + "model": { "type": "string", + "description": "The specific Anthropic/Claude model that will be used.", "enum": [ - "openrouter" + "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-sonnet-5", + "claude-haiku-4-5-20251001", + "claude-haiku-5-5" ] }, - "model": { + "reasoningEffort": { "type": "string", - "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b" + "description": "Reasoning effort for claude-haiku-5-5. `none` turns thinking off. `low` to `max`\nuse adaptive thinking at that effort; higher effort can add latency before the\nmodel speaks. Unset means `none`. Rejected for every other model.", + "enum": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + }, + "provider": { + "type": "string", + "description": "The provider identifier for Anthropic.", + "enum": [ + "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", @@ -23125,11 +23850,11 @@ } }, "required": [ - "provider", - "model" + "model", + "provider" ] }, - "PerplexityAIModel": { + "AnthropicBedrockModel": { "type": "object", "properties": { "messages": { @@ -23264,57 +23989,143 @@ }, "provider": { "type": "string", + "description": "The provider identifier for Anthropic via AWS Bedrock.", "enum": [ - "perplexity-ai" + "anthropic-bedrock" ] }, "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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", - "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" - ] - }, - "TogetherAIModel": { - "type": "object", - "properties": { - "messages": { - "description": "This is the starting state for the conversation.", - "type": "array", - "items": { - "$ref": "#/components/schemas/OpenAIMessage" - } + "description": "The specific Anthropic/Claude model that will be used via Bedrock.", + "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", + "claude-haiku-5-5", + "global.anthropic.claude-haiku-4-5-20251001-v1:0" + ] }, - "tools": { + "fallbackModels": { "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": "At most one same-provider Bedrock fallback model, tried if the primary fails. Cannot be combined with thinking in this release. Resolution uses the call's Bedrock credential region (or ANTHROPIC_BEDROCK_AWS_REGION). Names with no inference profile in that region are skipped and warned, never remapped to US or global. On Vapi EU, fallback names without an EU inference profile are rejected at write time.", + "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", + "claude-haiku-5-5", + "global.anthropic.claude-haiku-4-5-20251001-v1:0" + ], + "maxItems": 1, + "example": [ + "claude-haiku-4-5-20251001" + ], "items": { - "oneOf": [ - { + "type": "string", + "enum": [ + "claude-3-opus-20240229", + "claude-3-sonnet-20240229", + "claude-3-haiku-20240307", + "claude-3-5-sonnet-20240620", + "claude-3-5-sonnet-20241022", + "claude-3-5-haiku-20241022", + "claude-3-7-sonnet-20250219", + "claude-opus-4-20250514", + "claude-opus-4-5-20251101", + "claude-opus-4-6", + "claude-sonnet-4-20250514", + "claude-sonnet-4-5-20250929", + "claude-sonnet-4-6", + "claude-haiku-4-5-20251001", + "claude-haiku-5-5", + "global.anthropic.claude-haiku-4-5-20251001-v1:0" + ] + } + }, + "reasoningEffort": { + "type": "string", + "description": "Reasoning effort for claude-haiku-5-5. `none` turns thinking off. `low` to `max`\nuse adaptive thinking at that effort; higher effort can add latency before the\nmodel speaks. Unset means `none`. Rejected for every other model.", + "enum": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ] + }, + "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.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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", + "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" + ] + }, + "CerebrasModel": { + "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" }, @@ -23432,15 +24243,19 @@ } ] }, - "provider": { + "model": { "type": "string", + "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b", "enum": [ - "together-ai" + "llama3.1-8b", + "llama-3.3-70b" ] }, - "model": { + "provider": { "type": "string", - "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b" + "enum": [ + "cerebras" + ] }, "temperature": { "type": "number", @@ -23465,415 +24280,378 @@ } }, "required": [ - "provider", - "model" + "model", + "provider" ] }, - "HangupNode": { + "CustomLLMModel": { "type": "object", "properties": { - "type": { - "type": "string", - "enum": [ - "hangup" - ] + "messages": { + "description": "This is the starting state for the conversation.", + "type": "array", + "items": { + "$ref": "#/components/schemas/OpenAIMessage" + } }, - "name": { - "type": "string", - "maxLength": 80 + "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" + } + ] + } }, - "isStart": { - "type": "boolean", - "description": "This is whether or not the node is the start of the workflow." + "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" + } }, - "metadata": { - "type": "object", - "description": "This is for metadata you want to store on the task." - } - }, - "required": [ - "type", - "name" - ] - }, - "WorkflowOpenAIModel": { - "type": "object", - "properties": { - "messages": { - "description": "These are the messages used to customize the prompt used for structured output extraction.\n\nWhen provided, these messages replace the default prompts. For text extraction, message contents support LiquidJS templating with the following variables:\n- `{{transcript}}`, `{{messages}}`, or `{{messagesWithConfidence}}` to reference the conversation (one is required)\n- `{{structuredOutput.name}}`, `{{structuredOutput.description}}`, or `{{structuredOutput.schema}}` to reference the structured output definition (one is required)\n- `{{systemPrompt}}`, `{{callEndedReason}}`, `{{duration}}`, `{{startedAt}}`, `{{endedAt}}`, and any `assistantOverrides.variableValues`\n\nIn structured outputs, `{{messages}}` includes conversation text and tool calls/results, but omits caller transcription-confidence fields. For text extraction, `{{messagesWithConfidence}}` includes the original message history with transcription confidence for outputs that explicitly need it. These variables also apply in structured-output schema descriptions. Audio-targeted (`messages-with-audio`) extraction ignores custom messages. Stored call artifacts and API messages retain their confidence data. `{{transcript}}` is the spoken text only, which uses significantly fewer tokens.\n\nIf not provided, default system and user prompts are used.", + "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/OpenAIMessage" + "$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. Any service, including your own server, that is compatible with the OpenAI API can be used.", "enum": [ - "openai" + "custom-llm" ] }, - "model": { + "metadataSendMode": { "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 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": [ - "gpt-6-luna", - "gpt-5.6-sol", - "gpt-5.6-terra", - "gpt-5.6-luna", - "gpt-5.5", - "chat-latest", - "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-5.6-luna:westus3", - "gpt-5.6-terra:westus3", - "gpt-5.6-sol:westus3", - "gpt-5.4:eastus2", - "gpt-5.4:swedencentral", - "gpt-5.4-mini:eastus2", - "gpt-5.4-mini:swedencentral", - "gpt-5.4-nano:eastus2", - "gpt-5.4-nano:swedencentral", - "gpt-5.2:eastus2", - "gpt-5.2:swedencentral", - "gpt-5.1:eastus2", - "gpt-5.1:swedencentral", - "gpt-5:eastus2", - "gpt-5:swedencentral", - "gpt-5:canadaeast", - "gpt-5:eastus", - "gpt-5:westeurope", - "gpt-5:germanywestcentral", - "gpt-5:polandcentral", - "gpt-5:spaincentral", - "gpt-5-mini:eastus2", - "gpt-5-mini:swedencentral", - "gpt-5-mini:westeurope", - "gpt-5-mini:germanywestcentral", - "gpt-5-mini:polandcentral", - "gpt-5-mini:spaincentral", - "gpt-5-nano:eastus2", - "gpt-5-nano:swedencentral", - "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" + "off", + "variable", + "destructured" ] }, - "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" - ] - }, - "WorkflowAnthropicModel": { - "type": "object", - "properties": { - "messages": { - "description": "These are the messages used to customize the prompt used for structured output extraction.\n\nWhen provided, these messages replace the default prompts. For text extraction, message contents support LiquidJS templating with the following variables:\n- `{{transcript}}`, `{{messages}}`, or `{{messagesWithConfidence}}` to reference the conversation (one is required)\n- `{{structuredOutput.name}}`, `{{structuredOutput.description}}`, or `{{structuredOutput.schema}}` to reference the structured output definition (one is required)\n- `{{systemPrompt}}`, `{{callEndedReason}}`, `{{duration}}`, `{{startedAt}}`, `{{endedAt}}`, and any `assistantOverrides.variableValues`\n\nIn structured outputs, `{{messages}}` includes conversation text and tool calls/results, but omits caller transcription-confidence fields. For text extraction, `{{messagesWithConfidence}}` includes the original message history with transcription confidence for outputs that explicitly need it. These variables also apply in structured-output schema descriptions. Audio-targeted (`messages-with-audio`) extraction ignores custom messages. Stored call artifacts and API messages retain their confidence data. `{{transcript}}` is the spoken text only, which uses significantly fewer tokens.\n\nIf not provided, default system and user prompts are used.", - "type": "array", - "items": { - "$ref": "#/components/schemas/OpenAIMessage" + "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" } }, - "provider": { + "url": { "type": "string", - "description": "This is the provider of the model (`anthropic`).", - "enum": [ - "anthropic" - ] + "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 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-sonnet-5", - "claude-haiku-4-5-20251001", - "claude-haiku-5-5" - ] - }, - "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" - } - ] + "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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", "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", + "url", "model" ] }, - "WorkflowAnthropicBedrockModel": { + "DeepInfraModel": { "type": "object", "properties": { "messages": { - "description": "These are the messages used to customize the prompt used for structured output extraction.\n\nWhen provided, these messages replace the default prompts. For text extraction, message contents support LiquidJS templating with the following variables:\n- `{{transcript}}`, `{{messages}}`, or `{{messagesWithConfidence}}` to reference the conversation (one is required)\n- `{{structuredOutput.name}}`, `{{structuredOutput.description}}`, or `{{structuredOutput.schema}}` to reference the structured output definition (one is required)\n- `{{systemPrompt}}`, `{{callEndedReason}}`, `{{duration}}`, `{{startedAt}}`, `{{endedAt}}`, and any `assistantOverrides.variableValues`\n\nIn structured outputs, `{{messages}}` includes conversation text and tool calls/results, but omits caller transcription-confidence fields. For text extraction, `{{messagesWithConfidence}}` includes the original message history with transcription confidence for outputs that explicitly need it. These variables also apply in structured-output schema descriptions. Audio-targeted (`messages-with-audio`) extraction ignores custom messages. Stored call artifacts and API messages retain their confidence data. `{{transcript}}` is the spoken text only, which uses significantly fewer tokens.\n\nIf not provided, default system and user prompts are used.", + "description": "This is the starting state for the conversation.", "type": "array", "items": { "$ref": "#/components/schemas/OpenAIMessage" } }, - "provider": { - "type": "string", - "description": "This is the provider of the model (`anthropic-bedrock`).", - "enum": [ - "anthropic-bedrock" - ] - }, - "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", - "claude-haiku-5-5", - "global.anthropic.claude-haiku-4-5-20251001-v1:0" - ] - }, - "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" - } - ] + "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" + } + ] + } }, - "temperature": { - "type": "number", - "description": "This is the temperature of the model.", - "minimum": 0, - "maximum": 2 + "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" + } }, - "maxTokens": { - "type": "number", - "description": "This is the max tokens of the model.", - "minimum": 50, - "maximum": 10000 - } - }, - "required": [ - "provider", - "model" - ] - }, - "WorkflowGoogleModel": { - "type": "object", - "properties": { - "messages": { - "description": "These are the messages used to customize the prompt used for structured output extraction.\n\nWhen provided, these messages replace the default prompts. For text extraction, message contents support LiquidJS templating with the following variables:\n- `{{transcript}}`, `{{messages}}`, or `{{messagesWithConfidence}}` to reference the conversation (one is required)\n- `{{structuredOutput.name}}`, `{{structuredOutput.description}}`, or `{{structuredOutput.schema}}` to reference the structured output definition (one is required)\n- `{{systemPrompt}}`, `{{callEndedReason}}`, `{{duration}}`, `{{startedAt}}`, `{{endedAt}}`, and any `assistantOverrides.variableValues`\n\nIn structured outputs, `{{messages}}` includes conversation text and tool calls/results, but omits caller transcription-confidence fields. For text extraction, `{{messagesWithConfidence}}` includes the original message history with transcription confidence for outputs that explicitly need it. These variables also apply in structured-output schema descriptions. Audio-targeted (`messages-with-audio`) extraction ignores custom messages. Stored call artifacts and API messages retain their confidence data. `{{transcript}}` is the spoken text only, which uses significantly fewer tokens.\n\nIf not provided, default system and user prompts are used.", + "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/OpenAIMessage" + "$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 (`google`).", "enum": [ - "google" + "deepinfra" ] }, "model": { "type": "string", - "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b", - "maxLength": 100, - "enum": [ - "gemini-3.8-flash", - "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" - ] + "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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", "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": [ @@ -23881,270 +24659,19 @@ "model" ] }, - "WorkflowCustomModel": { + "DeepSeekModel": { "type": "object", "properties": { "messages": { - "description": "These are the messages used to customize the prompt used for structured output extraction.\n\nWhen provided, these messages replace the default prompts. For text extraction, message contents support LiquidJS templating with the following variables:\n- `{{transcript}}`, `{{messages}}`, or `{{messagesWithConfidence}}` to reference the conversation (one is required)\n- `{{structuredOutput.name}}`, `{{structuredOutput.description}}`, or `{{structuredOutput.schema}}` to reference the structured output definition (one is required)\n- `{{systemPrompt}}`, `{{callEndedReason}}`, `{{duration}}`, `{{startedAt}}`, `{{endedAt}}`, and any `assistantOverrides.variableValues`\n\nIn structured outputs, `{{messages}}` includes conversation text and tool calls/results, but omits caller transcription-confidence fields. For text extraction, `{{messagesWithConfidence}}` includes the original message history with transcription confidence for outputs that explicitly need it. These variables also apply in structured-output schema descriptions. Audio-targeted (`messages-with-audio`) extraction ignores custom messages. Stored call artifacts and API messages retain their confidence data. `{{transcript}}` is the spoken text only, which uses significantly fewer tokens.\n\nIf not provided, default system and user prompts are used.", + "description": "This is the starting state for the conversation.", "type": "array", "items": { "$ref": "#/components/schemas/OpenAIMessage" } }, - "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 - }, - "maxTokens": { - "type": "number", - "description": "This is the max tokens of the model.", - "minimum": 50, - "maximum": 10000 - } - }, - "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": { - "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" - }, - { - "$ref": "#/components/schemas/XaiTranscriber", - "title": "XaiTranscriber" - }, - { - "$ref": "#/components/schemas/VapiTranscriber", - "title": "VapiTranscriber" - } - ] - }, - "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" - } - ] - }, "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": [ { @@ -24243,2339 +24770,2715 @@ } }, "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" - } + "model": { + "type": "string", + "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b", + "enum": [ + "deepseek-chat", + "deepseek-reasoner", + "deepseek-flash", + "deepseek-flash-thinking" ] }, - "name": { + "provider": { "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", - "name" - ] - }, - "ToolNode": { - "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" - ] - }, - "tool": { - "description": "This is the tool to call. To use an existing tool, send `toolId` instead.", - "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" - } + "deep-seek" ] }, - "toolId": { - "type": "string", - "description": "This is the tool to call. To use a transient tool, send `tool` instead." + "temperature": { + "type": "number", + "description": "This is the temperature that will be used for calls. Default is 0.5.", + "minimum": 0, + "maximum": 2 }, - "name": { - "type": "string", - "maxLength": 80 + "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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", + "minimum": 50, + "maximum": 10000 }, - "isStart": { + "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" + "model", + "provider" ] }, - "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": { + "GeminiMultimodalLivePrebuiltVoiceConfig": { "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": [ - "google" - ] - }, - "backoffPlan": { - "description": "This is the backoff plan for the voicemail detection.", - "allOf": [ - { - "$ref": "#/components/schemas/VoicemailDetectionBackoffPlan" - } - ] - }, - "type": { + "voiceName": { "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)", "enum": [ - "audio", - "transcript" + "Puck", + "Charon", + "Kore", + "Fenrir", + "Aoede" ] } }, "required": [ - "provider" + "voiceName" ] }, - "OpenAIVoicemailDetectionPlan": { + "GeminiMultimodalLiveVoiceConfig": { "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": [ - "openai" - ] - }, - "backoffPlan": { - "description": "This is the backoff plan for the voicemail detection.", - "allOf": [ - { - "$ref": "#/components/schemas/VoicemailDetectionBackoffPlan" - } - ] - }, - "type": { - "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)", - "enum": [ - "audio", - "transcript" - ] + "prebuiltVoiceConfig": { + "$ref": "#/components/schemas/GeminiMultimodalLivePrebuiltVoiceConfig" } }, "required": [ - "provider" + "prebuiltVoiceConfig" ] }, - "TwilioVoicemailDetectionPlan": { + "GeminiMultimodalLiveSpeechConfig": { "type": "object", "properties": { - "provider": { - "type": "string", - "description": "This is the provider to use for voicemail detection.", - "enum": [ - "twilio" - ] - }, - "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 + "voiceConfig": { + "$ref": "#/components/schemas/GeminiMultimodalLiveVoiceConfig" } }, "required": [ - "provider" + "voiceConfig" ] }, - "VapiVoicemailDetectionPlan": { + "GoogleRealtimeConfig": { "type": "object", "properties": { - "beepMaxAwaitSeconds": { + "topP": { "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 + "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." }, - "provider": { - "type": "string", - "description": "This is the provider to use for voicemail detection.", - "enum": [ - "vapi" - ] + "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." }, - "backoffPlan": { - "description": "This is the backoff plan for the voicemail detection.", - "allOf": [ - { - "$ref": "#/components/schemas/VoicemailDetectionBackoffPlan" - } - ] + "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." }, - "type": { - "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)", - "enum": [ - "audio", - "transcript" - ] - } - }, - "required": [ - "provider" - ] - }, - "TransferHookAction": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "This is the type of action - must be \"transfer\"", - "enum": [ - "transfer" - ] + "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." }, - "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" - }, + "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/TransferDestinationSip", - "title": "SipTransferDestination" + "$ref": "#/components/schemas/GeminiMultimodalLiveSpeechConfig" } ] } - }, - "required": [ - "type" - ] + } }, - "FunctionCallHookAction": { + "GoogleModel": { "type": "object", "properties": { "messages": { + "description": "This is the starting state for the conversation.", "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/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/ToolMessageStart", - "title": "ToolMessageStart" + "$ref": "#/components/schemas/CreateApiRequestToolDTO", + "title": "ApiRequestTool" }, { - "$ref": "#/components/schemas/ToolMessageComplete", - "title": "ToolMessageComplete" + "$ref": "#/components/schemas/CreateBashToolDTO", + "title": "BashTool" }, { - "$ref": "#/components/schemas/ToolMessageFailed", - "title": "ToolMessageFailed" + "$ref": "#/components/schemas/CreateCodeToolDTO", + "title": "CodeTool" }, { - "$ref": "#/components/schemas/ToolMessageDelayed", - "title": "ToolMessageDelayed" + "$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", - "enum": [ - "function" - ], - "description": "The type of tool. \"function\" for Function tool." + "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" + } }, - "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`)." + "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" + } }, - "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" - } - ] - }, - "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": [ + "knowledgeBase": { + "description": "These are the options for the knowledge base.", + "oneOf": [ { - "$ref": "#/components/schemas/ToolRejectionPlan" + "$ref": "#/components/schemas/CreateCustomKnowledgeBaseDTO", + "title": "Custom" } ] }, - "function": { - "description": "This is the function definition of the tool.", - "allOf": [ - { - "$ref": "#/components/schemas/OpenAIFunction" - } - ] - } - }, - "required": [ - "type" - ] - }, - "SayHookAction": { - "type": "object", - "properties": { - "type": { + "model": { "type": "string", - "description": "This is the type of action - must be \"say\"", + "description": "This is the Google model that will be used.", "enum": [ - "say" - ] - }, - "exact": { - "description": "This is the exact message to say. When a string array is provided, one is randomly selected.", - "oneOf": [ - { - "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?" - ] + "gemini-3.8-flash", + "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" ] }, - "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" - ] - }, - "MessageAddHookAction": { - "type": "object", - "properties": { - "type": { + "provider": { "type": "string", - "description": "This is the type of action - must be \"message.add\"", "enum": [ - "message.add" + "google" ] }, - "message": { - "description": "The message to add to the conversation in OpenAI format", - "example": { - "role": "system", - "content": "Context update from hook" - }, + "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/OpenAIMessage" + "$ref": "#/components/schemas/GoogleRealtimeConfig" } ] }, - "triggerResponseEnabled": { + "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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", + "minimum": 50, + "maximum": 10000 + }, + "emotionRecognitionEnabled": { "type": "boolean", - "description": "Whether to trigger an assistant response after adding the message", - "default": true + "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": [ - "type", - "message" + "model", + "provider" ] }, - "CallHookFilter": { + "GroqModel": { "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", + "messages": { + "description": "This is the starting state for the conversation.", "type": "array", "items": { - "type": "string", - "maxLength": 1000 + "$ref": "#/components/schemas/OpenAIMessage" } - } - }, - "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 }, - "do": { + "tools": { "type": "array", - "description": "This is the set of actions to perform when the hook triggers", + "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/ToolCallHookAction", - "title": "ToolCallHookAction" + "$ref": "#/components/schemas/CreateApiRequestToolDTO", + "title": "ApiRequestTool" }, { - "$ref": "#/components/schemas/MessageAddHookAction", - "title": "MessageAddHookAction" + "$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" } ] } }, - "filters": { - "description": "This is the set of filters that must match for the hook to trigger", + "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": { - "$ref": "#/components/schemas/CallHookFilter" + "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": [ + "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-scout-17b-16e-instruct", + "mistral-saba-24b", + "compound-beta", + "compound-beta-mini" + ] + }, + "provider": { + "type": "string", + "enum": [ + "groq" + ] + }, + "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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", + "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": [ - "on", - "do" + "model", + "provider" ] }, - "CallHookAssistantSpeechInterrupted": { + "InflectionAIModel": { "type": "object", "properties": { - "on": { - "type": "string", - "description": "This is the event that triggers this hook", - "enum": [ - "assistant.speech.interrupted" - ], - "maxLength": 1000 + "messages": { + "description": "This is the starting state for the conversation.", + "type": "array", + "items": { + "$ref": "#/components/schemas/OpenAIMessage" + } }, - "do": { + "tools": { "type": "array", - "description": "This is the set of actions to perform when the hook triggers", + "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/SayHookAction", - "title": "SayHookAction" + "$ref": "#/components/schemas/CreateApiRequestToolDTO", + "title": "ApiRequestTool" }, { - "$ref": "#/components/schemas/ToolCallHookAction", - "title": "ToolCallHookAction" + "$ref": "#/components/schemas/CreateBashToolDTO", + "title": "BashTool" }, { - "$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/CreateCodeToolDTO", + "title": "CodeTool" + }, { - "$ref": "#/components/schemas/SayHookAction", - "title": "SayHookAction" + "$ref": "#/components/schemas/CreateComputerToolDTO", + "title": "ComputerTool" }, { - "$ref": "#/components/schemas/ToolCallHookAction", - "title": "ToolCallHookAction" + "$ref": "#/components/schemas/CreateDtmfToolDTO", + "title": "DtmfTool" }, { - "$ref": "#/components/schemas/MessageAddHookAction", - "title": "MessageAddHookAction" - } - ] - } - } - }, - "required": [ - "on", - "do" - ] - }, - "ToolCallHookAction": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "This is the type of action - must be \"tool\"", - "enum": [ - "tool" - ] - }, - "tool": { - "description": "This is the tool to call. To use an existing tool, send `toolId` instead.", - "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/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/CreateVoicemailToolDTO", - "title": "VoicemailTool" + "$ref": "#/components/schemas/CreateCustomKnowledgeBaseDTO", + "title": "Custom" } ] }, - "toolId": { + "model": { "type": "string", - "description": "This is the tool to call. To use a transient tool, send `tool` instead." - } - }, - "required": [ - "type" - ] - }, - "CustomerSpeechTimeoutOptions": { - "type": "object", - "properties": { - "triggerResetMode": { + "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b", + "enum": [ + "inflection_3_pi" + ] + }, + "provider": { "type": "string", - "description": "This is whether the counter for hook trigger resets the user speaks.\n\n@default never", "enum": [ - "onUserSpeech", - "never" + "inflection-ai" ] }, - "timeoutSeconds": { + "temperature": { "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 + "description": "This is the temperature that will be used for calls. Default is 0.5.", + "minimum": 0, + "maximum": 2 }, - "triggerMaxCount": { + "maxTokens": { "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 max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", + "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": [ - "timeoutSeconds" + "model", + "provider" ] }, - "CallHookCustomerSpeechTimeout": { + "MinimaxLLMModel": { "type": "object", "properties": { - "on": { - "type": "string", - "description": "Must be either \"customer.speech.timeout\" or match the pattern \"customer.speech.timeout[property=value]\"", - "maxLength": 1000 + "messages": { + "description": "This is the starting state for the conversation.", + "type": "array", + "items": { + "$ref": "#/components/schemas/OpenAIMessage" + } }, - "do": { + "tools": { "type": "array", - "description": "This is the set of actions to perform when the hook triggers", + "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/SayHookAction", - "title": "SayHookAction" + "$ref": "#/components/schemas/CreateApiRequestToolDTO", + "title": "ApiRequestTool" }, { - "$ref": "#/components/schemas/ToolCallHookAction", - "title": "ToolCallHookAction" + "$ref": "#/components/schemas/CreateBashToolDTO", + "title": "BashTool" }, { - "$ref": "#/components/schemas/MessageAddHookAction", - "title": "MessageAddHookAction" + "$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" } ] } }, - "options": { - "description": "This is the set of filters that must match for the hook to trigger", - "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/CustomerSpeechTimeoutOptions" + "$ref": "#/components/schemas/CreateCustomKnowledgeBaseDTO", + "title": "Custom" } ] }, - "name": { + "provider": { "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 + "enum": [ + "minimax" + ] + }, + "model": { + "type": "string", + "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b", + "enum": [ + "MiniMax-M2.7" + ] + }, + "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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", + "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": [ - "on", - "do" + "provider", + "model" ] }, - "CallHookModelResponseTimeout": { + "OpenAISpeaker": { "type": "object", "properties": { - "on": { + "instructions": { "type": "string", - "description": "This is the event that triggers this hook", - "enum": [ - "model.response.timeout" - ], - "maxLength": 1000 + "description": "Omit to use model.systemPrompt, or system-role messages when systemPrompt is absent. An explicit empty string is preserved." }, - "do": { + "personalityPacks": { "type": "array", - "description": "This is the set of actions to perform when the hook triggers", + "description": "Personality packs append speaking-style guidance to the speaker prompt. Set to an array of pack IDs and test one pack at a time. These are prompt instructions, not fixed speed controls.", + "items": { + "type": "string", + "enum": [ + "eager-listener", + "idle-hummer", + "bouncy", + "unhurried" + ] + } + } + } + }, + "OpenAIReasonerSkill": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Unique name within this assistant.", + "maxLength": 64, + "pattern": "/^[a-z][a-z0-9_-]*$/" + }, + "description": { + "type": "string", + "description": "Explain when the reasoner should load this skill. Always visible in its catalog.", + "maxLength": 1024, + "pattern": "/\\S/" + }, + "content": { + "type": "string", + "description": "Full skill instructions, loaded only while this skill is active.", + "maxLength": 32000, + "pattern": "/\\S/" + }, + "tools": { + "type": "array", + "description": "Tools available only after loading this skill. Can be combined with toolIds.", + "maxItems": 20, "items": { "oneOf": [ { - "$ref": "#/components/schemas/SayHookAction", - "title": "SayHookAction" + "$ref": "#/components/schemas/CreateFunctionToolDTO" }, { - "$ref": "#/components/schemas/ToolCallHookAction", - "title": "ToolCallHookAction" + "$ref": "#/components/schemas/CreateApiRequestToolDTO" }, { - "$ref": "#/components/schemas/MessageAddHookAction", - "title": "MessageAddHookAction" + "$ref": "#/components/schemas/CreateMcpToolDTO" + }, + { + "$ref": "#/components/schemas/CreateEndCallToolDTO" + }, + { + "$ref": "#/components/schemas/CreateDtmfToolDTO" + }, + { + "$ref": "#/components/schemas/CreateTransferCallToolDTO" } ] } + }, + "toolIds": { + "type": "array", + "description": "Existing organization-owned tools available only after loading this skill.", + "items": { + "type": "string", + "format": "uuid" + }, + "maxItems": 20 } }, "required": [ - "on", - "do" + "name", + "description", + "content" ] }, - "AIEdgeCondition": { + "OpenAIReasoner": { "type": "object", "properties": { - "type": { + "provider": { "type": "string", + "description": "The reasoner uses OpenAI. Omit to use OpenAI.", "enum": [ - "ai" - ] + "openai" + ], + "default": "openai" }, - "prompt": { + "model": { "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": [ - { - "$ref": "#/components/schemas/AIEdgeCondition", - "title": "AIEdgeCondition" - } - ] + "description": "The delegated reasoning model. Omit to use GPT-5.6 Terra.", + "enum": [ + "gpt-5.6-sol", + "gpt-5.6-terra", + "gpt-5.6-luna" + ], + "default": "gpt-5.6-terra" }, - "from": { + "reasoningEffort": { "type": "string", - "maxLength": 80 + "description": "Higher effort can increase response time. Omit to use low.", + "enum": [ + "none", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "default": "low" }, - "to": { - "type": "string", - "maxLength": 80 - }, - "metadata": { - "type": "object", - "description": "This is for metadata you want to store on the edge." - } - }, - "required": [ - "from", - "to" - ] - }, - "RecordingConsentPlanStayOnLine": { - "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 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" - }, - { - "$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 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" - }, - { - "$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 verbally consents or declines.", - "enum": [ - "verbal" - ], - "example": "verbal" - }, - "declineTool": { - "type": "object", - "description": "Tool to execute if user verbally declines recording consent" - }, - "declineToolId": { + "instructions": { "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 + "description": "Complete reasoner instructions. An explicit empty string is preserved.\nOmit to use Vapi's default reasoner instructions. No behavioral instructions\nare appended unless skills are configured; skill loading guidance and active\nskill content are then composed with these instructions." }, - "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\" }]", + "skills": { + "description": "Inline skills whose instructions and tools the GPT-Live reasoner loads on demand.", + "maxItems": 20, "type": "array", "items": { - "$ref": "#/components/schemas/SecurityFilterBase" + "$ref": "#/components/schemas/OpenAIReasonerSkill" } - }, - "mode": { - "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" - ], - "default": "sanitize" - }, - "replacementText": { - "type": "string", - "description": "Text to use when replacing filtered content.\n@default '[FILTERED]'", - "default": "[FILTERED]" } } }, - "CompliancePlan": { + "OpenAIModel": { "type": "object", "properties": { - "hipaaEnabled": { - "type": "boolean", - "description": "When this is enabled, logs, recordings, and transcriptions will be stored in HIPAA-compliant storage. Defaults to false. Only HIPAA-compliant providers will be available for LLM, Voice, and Transcriber respectively. This setting is only honored if the organization is on an Enterprise subscription or has purchased the HIPAA add-on." - }, - "pciEnabled": { - "type": "boolean", - "description": "When this is enabled, the user will be restricted to use PCI-compliant providers, and no logs or transcripts are stored.\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 + "messages": { + "description": "This is the starting state for the conversation.", + "type": "array", + "items": { + "$ref": "#/components/schemas/OpenAIMessage" } }, - "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/SecurityFilterPlan" - } - ] + "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" + } + ] + } }, - "recordingConsentPlan": { - "oneOf": [ - { - "$ref": "#/components/schemas/RecordingConsentPlanStayOnLine", - "title": "RecordingConsentStayOnLinePlan" - }, - { - "$ref": "#/components/schemas/RecordingConsentPlanVerbal", - "title": "RecordingConsentPlanVerbal" - } - ], - "discriminator": { - "propertyName": "type", - "mapping": { - "stay-on-line": "#/components/schemas/RecordingConsentPlanStayOnLine", - "verbal": "#/components/schemas/RecordingConsentPlanVerbal" - } + "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" } - } - } - }, - "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`", + }, + "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": { - "type": "object" + "$ref": "#/components/schemas/ToolRef" } }, - "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" + "knowledgeBase": { + "description": "These are the options for the knowledge base.", + "oneOf": [ + { + "$ref": "#/components/schemas/CreateCustomKnowledgeBaseDTO", + "title": "Custom" + } + ] }, - "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).", + "speaker": { + "description": "Configuration for the GPT-Live speaker.", "allOf": [ { - "$ref": "#/components/schemas/JsonSchema" + "$ref": "#/components/schemas/OpenAISpeaker" } ] }, - "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." - }, - "plan": { - "description": "This is an individual structured data plan in the catalog.", + "reasoner": { + "description": "Configuration for the reasoner supporting the GPT-Live speaker.", "allOf": [ { - "$ref": "#/components/schemas/StructuredDataPlan" + "$ref": "#/components/schemas/OpenAIReasoner" } ] - } - }, - "required": [ - "key", - "plan" - ] - }, - "SuccessEvaluationPlan": { - "type": "object", - "properties": { - "rubric": { + }, + "provider": { "type": "string", + "description": "This is the provider that will be used for the model.", "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": "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": { - "type": "object" - } - }, - "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 - } - } - }, - "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 - }, - "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" - } + "openai" ] }, - "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" - } + "model": { + "type": "string", + "description": "This is the OpenAI model that will be used.\nFor GPT-Live configuration and supported settings, see https://docs.vapi.ai/gpt-live/overview.\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-6-luna", + "gpt-5.6-sol", + "gpt-5.6-terra", + "gpt-5.6-luna", + "gpt-5.5", + "chat-latest", + "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-5.6-luna:westus3", + "gpt-5.6-terra:westus3", + "gpt-5.6-sol:westus3", + "gpt-5.4:eastus2", + "gpt-5.4:swedencentral", + "gpt-5.4-mini:eastus2", + "gpt-5.4-mini:swedencentral", + "gpt-5.4-nano:eastus2", + "gpt-5.4-nano:swedencentral", + "gpt-5.2:eastus2", + "gpt-5.2:swedencentral", + "gpt-5.1:eastus2", + "gpt-5.1:swedencentral", + "gpt-5:eastus2", + "gpt-5:swedencentral", + "gpt-5:canadaeast", + "gpt-5:eastus", + "gpt-5:westeurope", + "gpt-5:germanywestcentral", + "gpt-5:polandcentral", + "gpt-5:spaincentral", + "gpt-5-mini:eastus2", + "gpt-5-mini:swedencentral", + "gpt-5-mini:westeurope", + "gpt-5-mini:germanywestcentral", + "gpt-5-mini:polandcentral", + "gpt-5-mini:spaincentral", + "gpt-5-nano:eastus2", + "gpt-5-nano:swedencentral", + "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", + "gpt-live-1" ] }, - "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, + "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": { - "$ref": "#/components/schemas/StructuredDataMultiPlan" + "type": "string", + "enum": [ + "gpt-6-luna", + "gpt-5.6-sol", + "gpt-5.6-terra", + "gpt-5.6-luna", + "gpt-5.5", + "chat-latest", + "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-5.6-luna:westus3", + "gpt-5.6-terra:westus3", + "gpt-5.6-sol:westus3", + "gpt-5.4:eastus2", + "gpt-5.4:swedencentral", + "gpt-5.4-mini:eastus2", + "gpt-5.4-mini:swedencentral", + "gpt-5.4-nano:eastus2", + "gpt-5.4-nano:swedencentral", + "gpt-5.2:eastus2", + "gpt-5.2:swedencentral", + "gpt-5.1:eastus2", + "gpt-5.1:swedencentral", + "gpt-5:eastus2", + "gpt-5:swedencentral", + "gpt-5:canadaeast", + "gpt-5:eastus", + "gpt-5:westeurope", + "gpt-5:germanywestcentral", + "gpt-5:polandcentral", + "gpt-5:spaincentral", + "gpt-5-mini:eastus2", + "gpt-5-mini:swedencentral", + "gpt-5-mini:westeurope", + "gpt-5-mini:germanywestcentral", + "gpt-5-mini:polandcentral", + "gpt-5-mini:spaincentral", + "gpt-5-nano:eastus2", + "gpt-5-nano:swedencentral", + "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" + ] } }, - "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" - } + "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`", + "enum": [ + "strip-parameters-with-unsupported-validation", + "strip-unsupported-validation" ] }, - "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 - }, - "assistantName": { + "promptCacheRetention": { "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 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.6-sol, gpt-5.6-terra, gpt-5.6-luna, gpt-5.5, chat-latest, 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" + ] }, - "userName": { + "promptCacheKey": { "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'" - } - } - }, - "MinMessagesCondition": { - "type": "object", - "properties": { - "type": { + "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 + }, + "serviceTier": { "type": "string", - "description": "This is the type discriminator for the minMessages condition.", - "example": "minMessages", "enum": [ - "minMessages" - ] + "auto", + "default", + "fast", + "priority" + ], + "description": "This is the OpenAI service tier to request.\n\n- `fast`: requests Fast mode, which gives faster responses at a higher per-token rate. How much faster depends on the model.\n- `priority`: the old name for `fast`, accepted and billed the same.\n- `default`: standard processing.\n- `auto`: the default when unset. On Vapi's OpenAI keys this is standard processing; on your own OpenAI key, OpenAI applies your project's default tier.\n\nOpenAI sets Fast mode rates per model, and they are not a fixed multiple of the standard rates. Vapi bills them only when OpenAI reports that it served the request in Fast mode. Otherwise the request is billed at standard rates, for example when Fast mode isn't available for the model on Vapi, OpenAI downgrades the request, or the request runs on Azure OpenAI.\n\nSupported models and their Fast mode rates: https://docs.vapi.ai/providers/model/openai" }, - "count": { - "type": "number", - "description": "This is the minimum number of conversation messages required for the\nstructured output to run.\n\nA count of 0 removes the runtime default minimum, so the structured output\nruns regardless of how few messages the conversation has.", - "example": 4, - "minimum": 0 - } - }, - "required": [ - "type", - "count" - ] - }, - "MinCallDurationCondition": { - "type": "object", - "properties": { - "type": { + "reasoningEffort": { "type": "string", - "description": "This is the type discriminator for the minCallDuration condition.", - "example": "minCallDuration", + "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, model-aware validation limits newly public\nvalues while preserving the existing four-value storage contract.", "enum": [ - "minCallDuration" + "minimal", + "none", + "low", + "medium", + "high", + "xhigh" ] }, - "seconds": { + "temperature": { "type": "number", - "description": "This is the minimum call duration in seconds required for the structured\noutput to run.\n\nWhen timestamps are unavailable (for example, chat sessions have no call\ntimestamps), this check passes and does not block the structured output.", - "example": 10, + "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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", + "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": [ - "type", - "seconds" + "provider", + "model" ] }, - "EndedReasonCondition": { + "OpenRouterModel": { "type": "object", "properties": { - "type": { - "type": "string", - "description": "This is the type discriminator for the endedReason condition.", - "example": "endedReason", - "enum": [ - "endedReason" - ] - }, - "operator": { - "type": "string", - "description": "This is the membership operator applied against `values`.\n\n- 'oneOf': the structured output runs only if the call's ended reason is in `values`.\n- 'notOneOf': the structured output runs only if the call's ended reason is NOT in `values`.", - "example": "oneOf", - "enum": [ - "oneOf", - "notOneOf" - ] - }, - "values": { - "description": "These are the ended reasons compared against the call's ended reason.\n\nAny string is accepted so configurations never break when new ended\nreasons are introduced. Must contain at least one value.", - "example": [ - "customer-ended-call" - ], + "messages": { + "description": "This is the starting state for the conversation.", "type": "array", "items": { - "type": "string" + "$ref": "#/components/schemas/OpenAIMessage" } - } - }, - "required": [ - "type", - "operator", - "values" - ] - }, - "ComplianceOverride": { - "type": "object", - "properties": { - "forceStoreOnHipaaEnabled": { - "type": "boolean", - "description": "Force storage for this output under HIPAA. Only enable if output contains no sensitive data.", - "example": false - } - } - }, - "CreateStructuredOutputDTO": { - "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.", - "enum": [ - "ai", - "regex" - ], - "default": "ai" - }, - "regex": { - "type": "string", - "description": "This is the regex pattern to match against the transcript.\n\nSimulation evaluations use a canonical transcript built from recorded messages:\nUser: and AI: dialogue, AI: tool_calls: JSON name/arguments records, and\nAI: tool_call_results: JSON results. System messages are excluded. These\nfixed labels apply even when custom artifact transcript labels are configured.\nTool payloads participate in first-match and all-match extraction in event order.\nAn empty message array falls back to the supplied transcript verbatim.\nProduction-call extraction and call preview use their existing transcripts,\nso previewing the same output on a simulation's call can return a different result.\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 - }, - "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.\nFor text extraction, you must reference 'transcript', 'messages', or 'messagesWithConfidence' with the `{{}}` syntax to access the conversation history.\nIn structured outputs, `{{messages}}` includes conversation text and tool calls/results but omits caller transcription-confidence fields. Text extraction can use `{{messagesWithConfidence}}` when the output needs the original message history with transcription confidence. These variables also apply in structured-output schema descriptions. Audio-targeted (`messages-with-audio`) extraction ignores custom messages. Stored call artifacts and API messages retain their confidence data.\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/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" - } - ] - }, - "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" - } - ] }, - "conditions": { + "tools": { "type": "array", - "nullable": true, - "description": "These are the conditions that gate the execution of this structured output. Every condition must pass for the structured output to run (AND semantics). When omitted or empty, no user-defined conditions gate this output. Send null to clear a previously saved gate.", - "example": [ - { - "type": "minMessages", - "count": 4 - }, - { - "type": "minCallDuration", - "seconds": 10 - } - ], + "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/MinMessagesCondition", - "title": "MinMessagesCondition" + "$ref": "#/components/schemas/CreateApiRequestToolDTO", + "title": "ApiRequestTool" }, { - "$ref": "#/components/schemas/MinCallDurationCondition", - "title": "MinCallDurationCondition" + "$ref": "#/components/schemas/CreateBashToolDTO", + "title": "BashTool" }, { - "$ref": "#/components/schemas/EndedReasonCondition", - "title": "EndedReasonCondition" + "$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" } ] } }, - "name": { - "type": "string", - "description": "This is the name of the structured output.", - "minLength": 1, - "maxLength": 40 - }, - "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" - } - ] - }, - "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." - }, - "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.", + "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" } }, - "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.", + "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": { - "type": "string" + "$ref": "#/components/schemas/ToolRef" } - } - }, - "required": [ - "name", - "schema" - ] - }, - "NumberComparatorScorecardMetricCondition": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "This is the type of the condition. Currently only 'comparator' is supported.", - "enum": [ - "comparator" + }, + "knowledgeBase": { + "description": "These are the options for the knowledge base.", + "oneOf": [ + { + "$ref": "#/components/schemas/CreateCustomKnowledgeBaseDTO", + "title": "Custom" + } ] }, - "comparator": { + "provider": { "type": "string", - "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": [ - "=", - "!=", - ">", - "<", - ">=", - "<=" + "openrouter" ] }, - "value": { - "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." + "model": { + "type": "string", + "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b" }, - "points": { + "temperature": { "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.", + "description": "This is the temperature that will be used for calls. Default is 0.5.", "minimum": 0, - "maximum": 100 - } - }, - "required": [ - "type", - "comparator", - "value", - "points" - ] - }, - "BooleanComparatorScorecardMetricCondition": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "This is the type of the condition. Currently only 'comparator' is supported.", - "enum": [ - "comparator" - ] + "maximum": 2 }, - "comparator": { - "type": "string", - "description": "The comparator can only be '=' for boolean conditions.", - "enum": [ - "=" - ] + "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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", + "minimum": 50, + "maximum": 10000 }, - "value": { + "emotionRecognitionEnabled": { "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." + "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" }, - "points": { + "numFastTurns": { "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 + "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", - "comparator", - "value", - "points" + "provider", + "model" ] }, - "ScorecardMetric": { + "PerplexityAIModel": { "type": "object", "properties": { - "conditions": { + "messages": { + "description": "This is the starting state for the conversation.", "type": "array", - "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": { + "$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/NumberComparatorScorecardMetricCondition", - "title": "NumberComparatorScorecardMetricCondition" + "$ref": "#/components/schemas/CreateApiRequestToolDTO", + "title": "ApiRequestTool" }, { - "$ref": "#/components/schemas/BooleanComparatorScorecardMetricCondition", - "title": "BooleanComparatorScorecardMetricCondition" + "$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" } ] } }, - "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" - ] - }, - "CreateScorecardDTO": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "This is the name of the scorecard. It is only for user reference and will not be used for any evaluation.", - "maxLength": 80 - }, - "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 - }, - "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.", + "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": { - "$ref": "#/components/schemas/ScorecardMetric" + "type": "string" } }, - "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.", + "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": { - "type": "string" + "$ref": "#/components/schemas/ToolRef" } - } - }, - "required": [ - "metrics" - ] - }, - "ArtifactPlan": { - "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": { + "knowledgeBase": { + "description": "These are the options for the knowledge base.", + "oneOf": [ + { + "$ref": "#/components/schemas/CreateCustomKnowledgeBaseDTO", + "title": "Custom" + } + ] + }, + "provider": { "type": "string", - "description": "This determines the format of the recording. Defaults to `wav;l16`.\n\n@default 'wav;l16'", "enum": [ - "wav;l16", - "mp3" + "perplexity-ai" ] }, - "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\nIf your organization has ZDR (zero data retention) or PCI enabled, recordings are never written to Vapi storage. In that case, false means \"do not use my custom storage\", so nothing is stored at all.\n\n@default true", - "example": true + "model": { + "type": "string", + "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b" }, - "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 + "temperature": { + "type": "number", + "description": "This is the temperature that will be used for calls. Default is 0.5.", + "minimum": 0, + "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 + "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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", + "minimum": 50, + "maximum": 10000 }, - "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\nIf your organization has ZDR (zero data retention) or PCI enabled, packet captures are never written to Vapi storage. In that case, false means \"do not use my custom storage\", so nothing is stored at all.\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": { + "emotionRecognitionEnabled": { "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\nIf your organization has ZDR (zero data retention) or PCI enabled, logs are never written to Vapi storage. In that case, false means \"do not use my custom storage\", so nothing is stored at all.\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 '/'" + "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" }, - "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.", + "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" + ] + }, + "TogetherAIModel": { + "type": "object", + "properties": { + "messages": { + "description": "This is the starting state for the conversation.", "type": "array", "items": { - "type": "string" + "$ref": "#/components/schemas/OpenAIMessage" } }, - "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.", + "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": { - "$ref": "#/components/schemas/CreateStructuredOutputDTO" + "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" + } + ] } }, - "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.", + "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" } }, - "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.", + "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/CreateScorecardDTO" + "$ref": "#/components/schemas/ToolRef" } }, - "loggingPath": { + "knowledgeBase": { + "description": "These are the options for the knowledge base.", + "oneOf": [ + { + "$ref": "#/components/schemas/CreateCustomKnowledgeBaseDTO", + "title": "Custom" + } + ] + }, + "provider": { "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 + "enum": [ + "together-ai" + ] }, - "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 + "model": { + "type": "string", + "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b" }, - "backoffSeconds": { + "temperature": { "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", + "description": "This is the temperature that will be used for calls. Default is 0.5.", "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 + "maximum": 2 }, - "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 + "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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", + "minimum": 50, + "maximum": 10000 }, - "controlAuthenticationEnabled": { + "emotionRecognitionEnabled": { "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 + "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" }, - "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" - } + "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" + ] }, - "KeypadInputPlan": { + "HangupNode": { "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": { "type": "string", - "description": "This is the delimiter(s) that will be used to process the input.\nCan be '#', '*', or an empty array.", "enum": [ - "#", - "*", - "" + "hangup" ] + }, + "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", + "name" + ] }, - "WorkflowUserEditable": { + "WorkflowOpenAIModel": { "type": "object", "properties": { - "nodes": { + "messages": { + "description": "These are the messages used to customize the prompt used for structured output extraction.\n\nWhen provided, these messages replace the default prompts. For text extraction, message contents support LiquidJS templating with the following variables:\n- `{{transcript}}`, `{{messages}}`, or `{{messagesWithConfidence}}` to reference the conversation (one is required)\n- `{{structuredOutput.name}}`, `{{structuredOutput.description}}`, or `{{structuredOutput.schema}}` to reference the structured output definition (one is required)\n- `{{systemPrompt}}`, `{{callEndedReason}}`, `{{duration}}`, `{{startedAt}}`, `{{endedAt}}`, and any `assistantOverrides.variableValues`\n\nIn structured outputs, `{{messages}}` includes conversation text and tool calls/results, but omits caller transcription-confidence fields. For text extraction, `{{messagesWithConfidence}}` includes the original message history with transcription confidence for outputs that explicitly need it. These variables also apply in structured-output schema descriptions. Audio-targeted (`messages-with-audio`) extraction ignores custom messages. Stored call artifacts and API messages retain their confidence data. `{{transcript}}` is the spoken text only, which uses significantly fewer tokens.\n\nIf not provided, default system and user prompts are used.", "type": "array", "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/ConversationNode", - "title": "ConversationNode" - }, - { - "$ref": "#/components/schemas/ToolNode", - "title": "ToolNode" - } - ] + "$ref": "#/components/schemas/OpenAIMessage" } }, - "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" - } - ] - }, - "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/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" - } + "provider": { + "type": "string", + "description": "This is the provider of the model (`openai`).", + "enum": [ + "openai" ] }, - "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/AzureVoice", - "title": "AzureVoice" - }, + "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, + "enum": [ + "gpt-6-luna", + "gpt-5.6-sol", + "gpt-5.6-terra", + "gpt-5.6-luna", + "gpt-5.5", + "chat-latest", + "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-5.6-luna:westus3", + "gpt-5.6-terra:westus3", + "gpt-5.6-sol:westus3", + "gpt-5.4:eastus2", + "gpt-5.4:swedencentral", + "gpt-5.4-mini:eastus2", + "gpt-5.4-mini:swedencentral", + "gpt-5.4-nano:eastus2", + "gpt-5.4-nano:swedencentral", + "gpt-5.2:eastus2", + "gpt-5.2:swedencentral", + "gpt-5.1:eastus2", + "gpt-5.1:swedencentral", + "gpt-5:eastus2", + "gpt-5:swedencentral", + "gpt-5:canadaeast", + "gpt-5:eastus", + "gpt-5:westeurope", + "gpt-5:germanywestcentral", + "gpt-5:polandcentral", + "gpt-5:spaincentral", + "gpt-5-mini:eastus2", + "gpt-5-mini:swedencentral", + "gpt-5-mini:westeurope", + "gpt-5-mini:germanywestcentral", + "gpt-5-mini:polandcentral", + "gpt-5-mini:spaincentral", + "gpt-5-nano:eastus2", + "gpt-5-nano:swedencentral", + "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", + "model" + ] + }, + "WorkflowAnthropicModel": { + "type": "object", + "properties": { + "messages": { + "description": "These are the messages used to customize the prompt used for structured output extraction.\n\nWhen provided, these messages replace the default prompts. For text extraction, message contents support LiquidJS templating with the following variables:\n- `{{transcript}}`, `{{messages}}`, or `{{messagesWithConfidence}}` to reference the conversation (one is required)\n- `{{structuredOutput.name}}`, `{{structuredOutput.description}}`, or `{{structuredOutput.schema}}` to reference the structured output definition (one is required)\n- `{{systemPrompt}}`, `{{callEndedReason}}`, `{{duration}}`, `{{startedAt}}`, `{{endedAt}}`, and any `assistantOverrides.variableValues`\n\nIn structured outputs, `{{messages}}` includes conversation text and tool calls/results, but omits caller transcription-confidence fields. For text extraction, `{{messagesWithConfidence}}` includes the original message history with transcription confidence for outputs that explicitly need it. These variables also apply in structured-output schema descriptions. Audio-targeted (`messages-with-audio`) extraction ignores custom messages. Stored call artifacts and API messages retain their confidence data. `{{transcript}}` is the spoken text only, which uses significantly fewer tokens.\n\nIf not provided, default system and user prompts are used.", + "type": "array", + "items": { + "$ref": "#/components/schemas/OpenAIMessage" + } + }, + "provider": { + "type": "string", + "description": "This is the provider of the model (`anthropic`).", + "enum": [ + "anthropic" + ] + }, + "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-sonnet-5", + "claude-haiku-4-5-20251001", + "claude-haiku-5-5" + ] + }, + "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/CartesiaVoice", - "title": "CartesiaVoice" - }, + "$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", + "model" + ] + }, + "WorkflowAnthropicBedrockModel": { + "type": "object", + "properties": { + "messages": { + "description": "These are the messages used to customize the prompt used for structured output extraction.\n\nWhen provided, these messages replace the default prompts. For text extraction, message contents support LiquidJS templating with the following variables:\n- `{{transcript}}`, `{{messages}}`, or `{{messagesWithConfidence}}` to reference the conversation (one is required)\n- `{{structuredOutput.name}}`, `{{structuredOutput.description}}`, or `{{structuredOutput.schema}}` to reference the structured output definition (one is required)\n- `{{systemPrompt}}`, `{{callEndedReason}}`, `{{duration}}`, `{{startedAt}}`, `{{endedAt}}`, and any `assistantOverrides.variableValues`\n\nIn structured outputs, `{{messages}}` includes conversation text and tool calls/results, but omits caller transcription-confidence fields. For text extraction, `{{messagesWithConfidence}}` includes the original message history with transcription confidence for outputs that explicitly need it. These variables also apply in structured-output schema descriptions. Audio-targeted (`messages-with-audio`) extraction ignores custom messages. Stored call artifacts and API messages retain their confidence data. `{{transcript}}` is the spoken text only, which uses significantly fewer tokens.\n\nIf not provided, default system and user prompts are used.", + "type": "array", + "items": { + "$ref": "#/components/schemas/OpenAIMessage" + } + }, + "provider": { + "type": "string", + "description": "This is the provider of the model (`anthropic-bedrock`).", + "enum": [ + "anthropic-bedrock" + ] + }, + "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", + "claude-haiku-5-5", + "global.anthropic.claude-haiku-4-5-20251001-v1:0" + ] + }, + "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/CustomVoice", - "title": "CustomVoice" - }, + "$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", + "model" + ] + }, + "WorkflowGoogleModel": { + "type": "object", + "properties": { + "messages": { + "description": "These are the messages used to customize the prompt used for structured output extraction.\n\nWhen provided, these messages replace the default prompts. For text extraction, message contents support LiquidJS templating with the following variables:\n- `{{transcript}}`, `{{messages}}`, or `{{messagesWithConfidence}}` to reference the conversation (one is required)\n- `{{structuredOutput.name}}`, `{{structuredOutput.description}}`, or `{{structuredOutput.schema}}` to reference the structured output definition (one is required)\n- `{{systemPrompt}}`, `{{callEndedReason}}`, `{{duration}}`, `{{startedAt}}`, `{{endedAt}}`, and any `assistantOverrides.variableValues`\n\nIn structured outputs, `{{messages}}` includes conversation text and tool calls/results, but omits caller transcription-confidence fields. For text extraction, `{{messagesWithConfidence}}` includes the original message history with transcription confidence for outputs that explicitly need it. These variables also apply in structured-output schema descriptions. Audio-targeted (`messages-with-audio`) extraction ignores custom messages. Stored call artifacts and API messages retain their confidence data. `{{transcript}}` is the spoken text only, which uses significantly fewer tokens.\n\nIf not provided, default system and user prompts are used.", + "type": "array", + "items": { + "$ref": "#/components/schemas/OpenAIMessage" + } + }, + "provider": { + "type": "string", + "description": "This is the provider of the model (`google`).", + "enum": [ + "google" + ] + }, + "model": { + "type": "string", + "description": "This is the name of the model. Ex. cognitivecomputations/dolphin-mixtral-8x7b", + "maxLength": 100, + "enum": [ + "gemini-3.8-flash", + "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", + "model" + ] + }, + "WorkflowCustomModel": { + "type": "object", + "properties": { + "messages": { + "description": "These are the messages used to customize the prompt used for structured output extraction.\n\nWhen provided, these messages replace the default prompts. For text extraction, message contents support LiquidJS templating with the following variables:\n- `{{transcript}}`, `{{messages}}`, or `{{messagesWithConfidence}}` to reference the conversation (one is required)\n- `{{structuredOutput.name}}`, `{{structuredOutput.description}}`, or `{{structuredOutput.schema}}` to reference the structured output definition (one is required)\n- `{{systemPrompt}}`, `{{callEndedReason}}`, `{{duration}}`, `{{startedAt}}`, `{{endedAt}}`, and any `assistantOverrides.variableValues`\n\nIn structured outputs, `{{messages}}` includes conversation text and tool calls/results, but omits caller transcription-confidence fields. For text extraction, `{{messagesWithConfidence}}` includes the original message history with transcription confidence for outputs that explicitly need it. These variables also apply in structured-output schema descriptions. Audio-targeted (`messages-with-audio`) extraction ignores custom messages. Stored call artifacts and API messages retain their confidence data. `{{transcript}}` is the spoken text only, which uses significantly fewer tokens.\n\nIf not provided, default system and user prompts are used.", + "type": "array", + "items": { + "$ref": "#/components/schemas/OpenAIMessage" + } + }, + "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 + }, + "maxTokens": { + "type": "number", + "description": "This is the max tokens of the model.", + "minimum": 50, + "maximum": 10000 + } + }, + "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": { + "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/DeepgramVoice", - "title": "DeepgramVoice" + "$ref": "#/components/schemas/WorkflowOpenAIModel", + "title": "WorkflowOpenAIModel" }, { - "$ref": "#/components/schemas/ElevenLabsVoice", - "title": "ElevenLabsVoice" + "$ref": "#/components/schemas/WorkflowAnthropicModel", + "title": "WorkflowAnthropicModel" }, { - "$ref": "#/components/schemas/HumeVoice", - "title": "HumeVoice" + "$ref": "#/components/schemas/WorkflowAnthropicBedrockModel", + "title": "WorkflowAnthropicBedrockModel" }, { - "$ref": "#/components/schemas/LMNTVoice", - "title": "LMNTVoice" + "$ref": "#/components/schemas/WorkflowGoogleModel", + "title": "WorkflowGoogleModel" }, { - "$ref": "#/components/schemas/NeuphonicVoice", - "title": "NeuphonicVoice" + "$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/OpenAIVoice", - "title": "OpenAIVoice" + "$ref": "#/components/schemas/AzureSpeechTranscriber", + "title": "AzureSpeechTranscriber" }, { - "$ref": "#/components/schemas/PlayHTVoice", - "title": "PlayHTVoice" + "$ref": "#/components/schemas/CustomTranscriber", + "title": "CustomTranscriber" }, { - "$ref": "#/components/schemas/WellSaidVoice", - "title": "WellSaidVoice" + "$ref": "#/components/schemas/DeepgramTranscriber", + "title": "DeepgramTranscriber" }, { - "$ref": "#/components/schemas/RimeAIVoice", - "title": "RimeAIVoice" + "$ref": "#/components/schemas/ElevenLabsTranscriber", + "title": "ElevenLabsTranscriber" }, { - "$ref": "#/components/schemas/SmallestAIVoice", + "$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" + } + ] + }, + "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" }, { @@ -26608,2658 +27511,2504 @@ } ] }, - "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": "string", - "enum": [ - "off", - "office" - ], - "example": "office" - }, - { - "type": "string", - "format": "uri", - "example": "https://example.com/my-sound.mp3" - } - ] - }, - "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" - } - ] - } - }, - "credentials": { + "tools": { "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.", + "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/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/CreateApiRequestToolDTO", + "title": "ApiRequestTool" }, { - "$ref": "#/components/schemas/CreateSmallestAICredentialDTO", - "title": "SmallestAICredential" + "$ref": "#/components/schemas/CreateBashToolDTO", + "title": "BashTool" }, { - "$ref": "#/components/schemas/CreateSpeechmaticsCredentialDTO", - "title": "SpeechmaticsCredential" + "$ref": "#/components/schemas/CreateCodeToolDTO", + "title": "CodeTool" }, { - "$ref": "#/components/schemas/CreateSonioxCredentialDTO", - "title": "SonioxCredential" + "$ref": "#/components/schemas/CreateComputerToolDTO", + "title": "ComputerTool" }, { - "$ref": "#/components/schemas/CreateSupabaseCredentialDTO", - "title": "SupabaseCredential" + "$ref": "#/components/schemas/CreateDtmfToolDTO", + "title": "DtmfTool" }, { - "$ref": "#/components/schemas/CreateTavusCredentialDTO", - "title": "TavusCredential" + "$ref": "#/components/schemas/CreateEndCallToolDTO", + "title": "EndCallTool" }, { - "$ref": "#/components/schemas/CreateTogetherAICredentialDTO", - "title": "TogetherAICredential" + "$ref": "#/components/schemas/CreateFunctionToolDTO", + "title": "FunctionTool" }, { - "$ref": "#/components/schemas/CreateTwilioCredentialDTO", - "title": "TwilioCredential" + "$ref": "#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO", + "title": "GoHighLevelCalendarAvailabilityTool" }, { - "$ref": "#/components/schemas/CreateVonageCredentialDTO", - "title": "VonageCredential" + "$ref": "#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO", + "title": "GoHighLevelCalendarEventCreateTool" }, { - "$ref": "#/components/schemas/CreateWebhookCredentialDTO", - "title": "WebhookCredential" + "$ref": "#/components/schemas/CreateGoHighLevelContactCreateToolDTO", + "title": "GoHighLevelContactCreateTool" }, { - "$ref": "#/components/schemas/CreateCustomCredentialDTO", - "title": "CustomCredential" + "$ref": "#/components/schemas/CreateGoHighLevelContactGetToolDTO", + "title": "GoHighLevelContactGetTool" }, { - "$ref": "#/components/schemas/CreateXAiCredentialDTO", - "title": "XAiCredential" + "$ref": "#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO", + "title": "GoogleCalendarCheckAvailabilityTool" }, { - "$ref": "#/components/schemas/CreateMicrosoftCredentialDTO", - "title": "MicrosoftCredential" + "$ref": "#/components/schemas/CreateGoogleCalendarCreateEventToolDTO", + "title": "GoogleCalendarCreateEventTool" }, { - "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2ClientCredentialDTO", - "title": "GoogleCalendarOAuth2ClientCredential" + "$ref": "#/components/schemas/CreateGoogleSheetsRowAppendToolDTO", + "title": "GoogleSheetsRowAppendTool" }, { - "$ref": "#/components/schemas/CreateGoogleCalendarOAuth2AuthorizationCredentialDTO", - "title": "GoogleCalendarOAuth2AuthorizationCredential" + "$ref": "#/components/schemas/CreateHandoffToolDTO", + "title": "HandoffTool" }, { - "$ref": "#/components/schemas/CreateGoogleSheetsOAuth2AuthorizationCredentialDTO", - "title": "GoogleSheetsOAuth2AuthorizationCredential" + "$ref": "#/components/schemas/CreateMcpToolDTO", + "title": "McpTool" }, { - "$ref": "#/components/schemas/CreateSlackOAuth2AuthorizationCredentialDTO", - "title": "SlackOAuth2AuthorizationCredential" + "$ref": "#/components/schemas/CreateQueryToolDTO", + "title": "QueryTool" }, { - "$ref": "#/components/schemas/CreateGoHighLevelMCPCredentialDTO", - "title": "GoHighLevelMCPCredential" + "$ref": "#/components/schemas/CreateSlackSendMessageToolDTO", + "title": "SlackSendMessageTool" }, { - "$ref": "#/components/schemas/CreateInworldCredentialDTO", - "title": "InworldCredential" + "$ref": "#/components/schemas/CreateSmsToolDTO", + "title": "SmsTool" }, { - "$ref": "#/components/schemas/CreateMinimaxCredentialDTO", - "title": "MinimaxCredential" + "$ref": "#/components/schemas/CreateTextEditorToolDTO", + "title": "TextEditorTool" }, { - "$ref": "#/components/schemas/CreateWellSaidCredentialDTO", - "title": "WellSaidCredential" + "$ref": "#/components/schemas/CreateTransferCallToolDTO", + "title": "TransferCallTool" }, { - "$ref": "#/components/schemas/CreateEmailCredentialDTO", - "title": "EmailCredential" + "$ref": "#/components/schemas/CreateSipRequestToolDTO", + "title": "SipRequestTool" }, { - "$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" + "$ref": "#/components/schemas/CreateVoicemailToolDTO", + "title": "VoicemailTool" } - } + ] } }, - "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": { + "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": { - "$ref": "#/components/schemas/Edge" + "type": "string" } }, - "globalPrompt": { + "prompt": { "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.", + "globalNodePlan": { + "description": "This is the plan for the global node.", "allOf": [ { - "$ref": "#/components/schemas/CompliancePlan" + "$ref": "#/components/schemas/GlobalNodePlan" } ] }, - "analysisPlan": { - "description": "This is the plan for analysis of workflow's calls. Stored in `call.analysis`.", + "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/AnalysisPlan" + "$ref": "#/components/schemas/VariableExtractionPlan" } ] }, - "artifactPlan": { - "description": "This is the plan for artifacts generated during workflow's calls. Stored in `call.artifact`.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactPlan" - } + "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", + "name" + ] + }, + "ToolNode": { + "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" ] }, - "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": [ + "tool": { + "description": "This is the tool to call. To use an existing tool, send `toolId` instead.", + "oneOf": [ { - "$ref": "#/components/schemas/StartSpeakingPlan" + "$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" } ] }, - "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" - } + "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", + "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": { + "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": [ + "google" ] }, - "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`.", + "backoffPlan": { + "description": "This is the backoff plan for the voicemail detection.", "allOf": [ { - "$ref": "#/components/schemas/MonitorPlan" + "$ref": "#/components/schemas/VoicemailDetectionBackoffPlan" } ] }, - "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" - } + "type": { + "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)", + "enum": [ + "audio", + "transcript" ] + } + }, + "required": [ + "provider" + ] + }, + "OpenAIVoicemailDetectionPlan": { + "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 }, - "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" - } + "provider": { + "type": "string", + "description": "This is the provider to use for voicemail detection.", + "enum": [ + "openai" + ] }, - "keypadInputPlan": { - "description": "This is the plan for keypad input handling during workflow calls.", + "backoffPlan": { + "description": "This is the backoff plan for the voicemail detection.", "allOf": [ { - "$ref": "#/components/schemas/KeypadInputPlan" + "$ref": "#/components/schemas/VoicemailDetectionBackoffPlan" } ] }, - "voicemailMessage": { + "type": { "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": "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": [ - "nodes", - "name", - "edges" + "provider" ] }, - "VapiModel": { + "TwilioVoicemailDetectionPlan": { "type": "object", "properties": { - "messages": { - "description": "This is the starting state for the conversation.", - "type": "array", - "items": { - "$ref": "#/components/schemas/OpenAIMessage" - } + "provider": { + "type": "string", + "description": "This is the provider to use for voicemail detection.", + "enum": [ + "twilio" + ] }, - "tools": { + "voicemailDetectionTypes": { "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": "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": { - "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": "string", + "enum": [ + "machine_start", + "human", + "fax", + "unknown", + "machine_end_beep", + "machine_end_silence", + "machine_end_other" ] } }, - "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" - } + "enabled": { + "type": "boolean", + "description": "This sets whether the assistant should detect voicemail. Defaults to true.\n\n@default true" }, - "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" - } + "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 }, - "knowledgeBase": { - "description": "These are the options for the knowledge base.", - "oneOf": [ - { - "$ref": "#/components/schemas/CreateCustomKnowledgeBaseDTO", - "title": "Custom" - } - ] + "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 }, - "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']`)." + "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 }, - "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" - ] + "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" ] }, - "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.", + "backoffPlan": { + "description": "This is the backoff plan for the voicemail detection.", "allOf": [ { - "$ref": "#/components/schemas/WorkflowUserEditable" + "$ref": "#/components/schemas/VoicemailDetectionBackoffPlan" } ] }, - "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 + "type": { + "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)", + "enum": [ + "audio", + "transcript" + ] } }, "required": [ "provider" ] }, - "XaiModel": { + "TransferHookAction": { "type": "object", "properties": { - "messages": { - "description": "This is the starting state for the conversation.", - "type": "array", - "items": { - "$ref": "#/components/schemas/OpenAIMessage" - } + "type": { + "type": "string", + "description": "This is the type of action - must be \"transfer\"", + "enum": [ + "transfer" + ] }, - "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" - }, + "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" + } + ] + } + }, + "required": [ + "type" + ] + }, + "FunctionCallHookAction": { + "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" - } + "type": { + "type": "string", + "enum": [ + "function" + ], + "description": "The type of tool. \"function\" for Function tool." }, - "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).", + "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" + } + ] + }, + "parameters": { + "description": "Static key-value pairs merged into the request body. Values support Liquid templates.", "type": "array", "items": { - "$ref": "#/components/schemas/ToolRef" + "$ref": "#/components/schemas/ToolParameter" } }, - "knowledgeBase": { - "description": "These are the options for the knowledge base.", - "oneOf": [ + "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" } ] }, - "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" + "function": { + "description": "This is the function definition of the tool.", + "allOf": [ + { + "$ref": "#/components/schemas/OpenAIFunction" + } ] - }, - "provider": { + } + }, + "required": [ + "type" + ] + }, + "SayHookAction": { + "type": "object", + "properties": { + "type": { "type": "string", + "description": "This is the type of action - must be \"say\"", "enum": [ - "xai" + "say" ] }, - "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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", - "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" + "exact": { + "description": "This is the exact message to say. When a string array is provided, one is randomly selected.", + "oneOf": [ + { + "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?" + ] + ] }, - "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 + "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": [ - "model", - "provider" + "type" ] }, - "ExactReplacement": { + "MessageAddHookAction": { "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 action - must be \"message.add\"", "enum": [ - "exact" + "message.add" ] }, - "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." + "message": { + "description": "The message to add to the conversation in OpenAI format", + "example": { + "role": "system", + "content": "Context update from hook" + }, + "allOf": [ + { + "$ref": "#/components/schemas/OpenAIMessage" + } + ] }, - "value": { - "type": "string", - "description": "This is the value that will replace the match.", - "maxLength": 1000 + "triggerResponseEnabled": { + "type": "boolean", + "description": "Whether to trigger an assistant response after adding the message", + "default": true } }, "required": [ "type", - "key", - "value" + "message" ] }, - "RegexReplacement": { + "CallHookFilter": { "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 filter - currently only \"oneOf\" is supported", "enum": [ - "regex" - ] + "oneOf" + ], + "maxLength": 1000 }, - "regex": { + "key": { "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." + "description": "This is the key to filter on (e.g. \"call.endedReason\")", + "maxLength": 1000 }, - "options": { - "description": "These are the options for the regex replacement. Defaults to all disabled.\n\n@default []", + "oneOf": { + "description": "This is the array of possible values to match against", "type": "array", "items": { - "$ref": "#/components/schemas/RegexOption" + "type": "string", + "maxLength": 1000 } - }, - "value": { - "type": "string", - "description": "This is the value that will replace the match.", - "maxLength": 1000 } }, "required": [ "type", - "regex", - "value" + "key", + "oneOf" ] }, - "FormatPlan": { + "CallHookCallEnding": { "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 + "on": { + "type": "string", + "description": "This is the event that triggers this hook", + "enum": [ + "call.ending" + ], + "maxLength": 1000 }, - "replacements": { + "do": { "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": "This is the set of actions to perform when the hook triggers", "items": { "oneOf": [ { - "$ref": "#/components/schemas/ExactReplacement", - "title": "ExactReplacement" + "$ref": "#/components/schemas/ToolCallHookAction", + "title": "ToolCallHookAction" }, { - "$ref": "#/components/schemas/RegexReplacement", - "title": "RegexReplacement" + "$ref": "#/components/schemas/MessageAddHookAction", + "title": "MessageAddHookAction" } ] } }, - "formattersEnabled": { + "filters": { + "description": "This is the set of filters that must match for the hook to trigger", "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", + "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": [ - "markdown", - "asterisk", - "quote", - "dash", - "newline", - "colon", - "acronym", - "dollarAmount", - "email", - "date", - "time", - "distance", - "unit", - "percentage", - "phoneNumber", - "number", - "stripAsterisk" + "assistant.speech.interrupted" ], + "maxLength": 1000 + }, + "do": { + "type": "array", + "description": "This is the set of actions to perform when the hook triggers", "items": { - "type": "string", - "enum": [ - "markdown", - "asterisk", - "quote", - "dash", - "newline", - "colon", - "acronym", - "dollarAmount", - "email", - "date", - "time", - "distance", - "unit", - "percentage", - "phoneNumber", - "number", - "stripAsterisk" + "oneOf": [ + { + "$ref": "#/components/schemas/SayHookAction", + "title": "SayHookAction" + }, + { + "$ref": "#/components/schemas/ToolCallHookAction", + "title": "ToolCallHookAction" + }, + { + "$ref": "#/components/schemas/MessageAddHookAction", + "title": "MessageAddHookAction" + } ] } } - } + }, + "required": [ + "on", + "do" + ] }, - "ChunkPlan": { + "CallHookCustomerSpeechInterrupted": { "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.", + "on": { + "type": "string", + "description": "This is the event that triggers this hook", "enum": [ - "。", - ",", - ".", - "!", - "?", - ";", - ")", - "،", - "۔", - "।", - "॥", - "|", - "||", - ",", - ":" + "customer.speech.interrupted" ], - "example": [ - "。", - ",", - ".", - "!", - "?", - ";", - "،", - "۔", - "।", - "॥", - "|", - "||", - ",", - ":" - ], - "items": { - "type": "string", - "enum": [ - "。", - ",", - ".", - "!", - "?", - ";", - ")", - "،", - "۔", - "।", - "॥", - "|", - "||", - ",", - ":" - ] - } + "maxLength": 1000 }, - "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": { + "do": { "type": "array", - "description": "This is the list of voices to fallback to in the event that the primary voice provider fails.", + "description": "This is the set of actions to perform when the hook triggers", "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/SayHookAction", + "title": "SayHookAction" }, { - "$ref": "#/components/schemas/FallbackXaiVoice", - "title": "xAI" + "$ref": "#/components/schemas/ToolCallHookAction", + "title": "ToolCallHookAction" }, { - "$ref": "#/components/schemas/FallbackMicrosoftVoice", - "title": "Microsoft" + "$ref": "#/components/schemas/MessageAddHookAction", + "title": "MessageAddHookAction" } ] } } }, "required": [ - "voices" + "on", + "do" ] }, - "AzureVoice": { + "ToolCallHookAction": { "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": "This is the type of action - must be \"tool\"", "enum": [ - "azure" + "tool" ] }, - "voiceId": { - "description": "This is the provider-specific ID that will be used.", + "tool": { + "description": "This is the tool to call. To use an existing tool, send `toolId` instead.", "oneOf": [ { - "type": "string", - "enum": [ - "andrew", - "brian", - "emma" - ], - "title": "Preset Voice Options" + "$ref": "#/components/schemas/CreateApiRequestToolDTO", + "title": "ApiRequestTool" }, { - "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/CreateBashToolDTO", + "title": "BashTool" + }, { - "$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/CreateCodeToolDTO", + "title": "CodeTool" + }, { - "$ref": "#/components/schemas/FallbackPlan" + "$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" } ] + }, + "toolId": { + "type": "string", + "description": "This is the tool to call. To use a transient tool, send `tool` instead." } }, "required": [ - "provider", - "voiceId" + "type" ] }, - "CartesiaExperimentalControls": { + "CustomerSpeechTimeoutOptions": { "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": { + "triggerResetMode": { "type": "string", + "description": "This is whether the counter for hook trigger resets the user speaks.\n\n@default never", "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" + "onUserSpeech", + "never" ] + }, + "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 } - } - }, - "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 - } - } + }, + "required": [ + "timeoutSeconds" + ] }, - "CartesiaGenerationConfig": { + "CallHookCustomerSpeechTimeout": { "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 + "on": { + "type": "string", + "description": "Must be either \"customer.speech.timeout\" or match the pattern \"customer.speech.timeout[property=value]\"", + "maxLength": 1000 }, - "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 + "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" + } + ] + } }, - "experimental": { - "description": "Experimental model controls for sonic-3. These are subject to breaking changes.", + "options": { + "description": "This is the set of filters that must match for the hook to trigger", "allOf": [ { - "$ref": "#/components/schemas/CartesiaGenerationConfigExperimental" + "$ref": "#/components/schemas/CustomerSpeechTimeoutOptions" } ] + }, + "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" + ] }, - "CartesiaVoice": { + "CallHookModelResponseTimeout": { "type": "object", "properties": { - "cachingEnabled": { - "type": "boolean", - "description": "This is the flag to toggle voice caching for the assistant.", - "example": true, - "default": true + "on": { + "type": "string", + "description": "This is the event that triggers this hook", + "enum": [ + "model.response.timeout" + ], + "maxLength": 1000 }, - "provider": { + "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" + ] + }, + "AIEdgeCondition": { + "type": "object", + "properties": { + "type": { "type": "string", - "description": "This is the voice provider that will be used.", "enum": [ - "cartesia" + "ai" ] }, - "voiceId": { + "prompt": { "type": "string", - "description": "The ID of the particular voice you want to use." + "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": [ + { + "$ref": "#/components/schemas/AIEdgeCondition", + "title": "AIEdgeCondition" + } + ] }, - "model": { + "from": { "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.6", - "sonic-3.6-2026-08-27", - "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-3.5" + "maxLength": 80 }, - "language": { + "to": { "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", - "or", - "pa", - "pl", - "pt", - "ro", - "ru", - "sk", - "sv", - "ta", - "te", - "th", - "tl", - "tr", - "uk", - "ur", - "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" - } - ] + "maxLength": 80 }, - "fallbackPlan": { - "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.", - "allOf": [ - { - "$ref": "#/components/schemas/FallbackPlan" - } - ] + "metadata": { + "type": "object", + "description": "This is for metadata you want to store on the edge." } }, "required": [ - "provider", - "voiceId" + "from", + "to" ] }, - "CustomVoice": { + "WorkflowUserEditable": { "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." + "nodes": { + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/ConversationNode", + "title": "ConversationNode" + }, + { + "$ref": "#/components/schemas/ToolNode", + "title": "ToolNode" + } + ] + } }, - "chunkPlan": { - "description": "This is the plan for chunking the model output before it is sent to the voice provider.", - "allOf": [ + "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/ChunkPlan" + "$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" } ] }, - "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": [ + "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/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" } ] }, - "fallbackPlan": { - "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.", - "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/FallbackPlan" + "$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", - "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", - "viktoria", - "kara", - "fabian", - "julius", - "lara", - "elara", - "aurelia", - "hannah", - "kit", - "alexis", - "cliff", - "sienna", - "cole", - "brooke", - "colin", - "gemma", - "haley", - "heather", - "miles", - "sean", - "bree", - "brittany", - "bruce", - "conor", - "donovan", - "drew", - "elise", - "jack", - "kai", - "kelsey", - "maeve", - "marcelo", - "marcus", - "meena", - "meghan", - "naveen", - "paige", - "priya", - "rufus", - "sharon", - "tanner", - "wade", - "wes" - ], - "title": "This is the Deepgram Voice ID" - }, - "model": { - "type": "string", - "description": "This is the model that will be used. Defaults to 'aura' when not specified.", - "enum": [ - "aura", - "aura-2", - "flux" - ], - "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 only applies to your own Deepgram API key. Requests on Vapi's key always opt out, whatever this is set to.\n\n@default false", - "example": false, - "default": false - }, - "speed": { - "type": "number", - "description": "This is the speed multiplier that will be used. Aura-2 accepts 0.7 to 1.5; Flux accepts 0.5 to 1.5 in steps of 0.05. Aura does not support speed.\n\n@default 1", - "minimum": 0.5, - "maximum": 1.5, - "example": 1.1, - "default": 1 }, - "expressivity": { - "type": "number", - "description": "This is the expressivity level for Flux voices, from -2 (flat) to 2 (lively). Deepgram marks this control as beta and may retune the scale. Aura and Aura-2 do not support it.\n\n@default 0", - "minimum": -2, - "maximum": 2, - "example": 1, - "default": 0 - }, - "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" } - ] - }, - "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" - ] - }, - "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.\n\nOmit to use the dictionary's latest version.", - "title": "This is the ElevenLabs Pronunciation Dictionary Version ID" - } - }, - "required": [ - "pronunciationDictionaryId" - ] - }, - "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.", + "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": [ - "burt", - "marissa", - "andrea", - "sarah", - "phillip", - "steve", - "joseph", - "myra", - "paula", - "ryan", - "drew", - "paul", - "mrb", - "matilda", - "mark" + "off", + "office" ], - "title": "Preset Voice Options" + "example": "office" }, { "type": "string", - "title": "11Labs Voice ID" + "format": "uri", + "example": "https://example.com/my-sound.mp3" } ] }, - "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. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.", - "minimum": 0, - "maximum": 1, - "example": 0.75 - }, - "style": { - "type": "number", - "description": "Defines the style for voice settings. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.", - "minimum": 0, - "maximum": 1, - "example": 0 + "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" + } + ] + } }, - "useSpeakerBoost": { - "type": "boolean", - "description": "Defines the use speaker boost for voice settings. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.", - "example": false + "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" + } + } + } }, - "speed": { - "type": "number", - "description": "Defines the speed for voice settings. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.", - "minimum": 0.7, - "maximum": 1.2, - "example": 0.9 + "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" + } + ] }, - "optimizeStreamingLatency": { + "maxDurationSeconds": { "type": "number", - "description": "Defines the optimize streaming latency for voice settings. Defaults to 3. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.", - "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. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.\n\n@default false", - "example": false - }, - "autoMode": { - "type": "boolean", - "description": "Defines the auto mode for voice settings. Defaults to false. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.", - "example": false + "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 }, - "model": { + "name": { "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", - "eleven_v4_turbo", - "eleven_v3_conversational" - ], - "example": "eleven_turbo_v2_5" + "maxLength": 80 }, - "language": { + "edges": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Edge" + } + }, + "globalPrompt": { "type": "string", - "description": "This is the language (ISO 639-1) that is enforced for the model. Currently only Turbo v2.5, Flash v2.5 and the Text to Dialogue models support language enforcement; other models ignore it." + "maxLength": 5000 }, - "chunkPlan": { - "description": "This is the plan for chunking the model output before it is sent to the voice provider.", + "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/ChunkPlan" + "$ref": "#/components/schemas/Server" } ] }, - "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.", + "compliancePlan": { + "description": "This is the compliance plan for the workflow. It allows you to configure HIPAA and other compliance settings.", "allOf": [ { - "$ref": "#/components/schemas/FallbackPlan" + "$ref": "#/components/schemas/CompliancePlan" } ] - } - }, - "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.", + "analysisPlan": { + "description": "This is the plan for analysis of workflow's calls. Stored in `call.analysis`.", "allOf": [ { - "$ref": "#/components/schemas/ChunkPlan" + "$ref": "#/components/schemas/AnalysisPlan" } ] }, - "fallbackPlan": { - "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.", + "artifactPlan": { + "description": "This is the plan for artifacts generated during workflow's calls. Stored in `call.artifact`.", "allOf": [ { - "$ref": "#/components/schemas/FallbackPlan" + "$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": [ - "provider", - "voiceId" + "nodes", + "name", + "edges" ] }, - "HumeVoice": { + "VapiModel": { "type": "object", "properties": { - "cachingEnabled": { - "type": "boolean", - "description": "This is the flag to toggle voice caching for the assistant.", - "example": true, - "default": true + "messages": { + "description": "This is the starting state for the conversation.", + "type": "array", + "items": { + "$ref": "#/components/schemas/OpenAIMessage" + } }, - "provider": { - "type": "string", - "description": "This is the voice provider that will be used.", - "enum": [ - "hume" + "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 model that will be used.", - "enum": [ - "octave", - "octave2" - ], - "example": "octave2" + "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']`)." }, - "voiceId": { + "version": { "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": "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" + ] }, - "chunkPlan": { - "description": "This is the plan for chunking the model output before it is sent to the voice provider.", - "allOf": [ - { - "$ref": "#/components/schemas/ChunkPlan" - } + "provider": { + "type": "string", + "enum": [ + "vapi" ] }, - "description": { + "workflowId": { "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": "This is the workflow that will be used for the call. To use a transient workflow, use `workflow` instead." }, - "fallbackPlan": { - "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.", + "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/FallbackPlan" + "$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", - "voiceId" + "provider" ] }, - "LMNTVoice": { + "XaiModel": { "type": "object", "properties": { - "cachingEnabled": { - "type": "boolean", - "description": "This is the flag to toggle voice caching for the assistant.", - "example": true, - "default": true + "messages": { + "description": "This is the starting state for the conversation.", + "type": "array", + "items": { + "$ref": "#/components/schemas/OpenAIMessage" + } }, - "provider": { - "type": "string", - "description": "This is the voice provider that will be used.", - "enum": [ - "lmnt" - ] + "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" + } + ] + } }, - "voiceId": { - "description": "This is the provider-specific ID that will be used.", + "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": [ { - "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" + "$ref": "#/components/schemas/CreateCustomKnowledgeBaseDTO", + "title": "Custom" } ] }, - "speed": { + "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 speed multiplier that will be used.", - "minimum": 0.25, - "maximum": 2, - "example": null + "description": "This is the temperature that will be used for calls. Default is 0.5.", + "minimum": 0, + "maximum": 2 }, - "language": { - "description": "Two letter ISO 639-1 language code. Use \"auto\" for auto-detection.", + "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. On gpt-6-luna and claude-haiku-5-5 no cap is applied unless you set one (claude-haiku-5-5 sends its 128,000-token maximum), because reasoning uses output tokens and a small cap can leave the reply empty.", + "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": [ - "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" - } + "exact" ] }, - "chunkPlan": { - "description": "This is the plan for chunking the model output before it is sent to the voice provider.", - "allOf": [ - { - "$ref": "#/components/schemas/ChunkPlan" - } - ] + "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 }, - "fallbackPlan": { - "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.", - "allOf": [ - { - "$ref": "#/components/schemas/FallbackPlan" - } - ] + "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": [ - "provider", - "voiceId" + "type", + "key", + "value" ] }, - "NeuphonicVoice": { + "RegexReplacement": { "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": "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": [ - "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" - } + "regex" ] }, - "model": { + "regex": { "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 + "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." }, - "chunkPlan": { - "description": "This is the plan for chunking the model output before it is sent to the voice provider.", - "allOf": [ - { - "$ref": "#/components/schemas/ChunkPlan" - } - ] + "options": { + "description": "These are the options for the regex replacement. Defaults to all disabled.\n\n@default []", + "type": "array", + "items": { + "$ref": "#/components/schemas/RegexOption" + } }, - "fallbackPlan": { - "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.", - "allOf": [ - { - "$ref": "#/components/schemas/FallbackPlan" - } - ] + "value": { + "type": "string", + "description": "This is the value that will replace the match.", + "maxLength": 1000 } }, "required": [ - "provider", - "voiceId", - "language" + "type", + "regex", + "value" ] }, - "OpenAIVoice": { + "FormatPlan": { "type": "object", "properties": { - "cachingEnabled": { + "enabled": { "type": "boolean", - "description": "This is the flag to toggle voice caching for the assistant.", - "example": true, - "default": true + "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 }, - "provider": { - "type": "string", - "description": "This is the voice provider that will be used.", - "enum": [ - "openai" - ] + "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 }, - "voiceId": { - "description": "This is the provider-specific ID that will be used.\nVoice availability depends on the selected model.\nquartz, ripple, vesper, willow, stone, gleam, meridian, bossa, tempo, beacon, delta, cinder are only supported with GPT-Live models.", - "anyOf": [ - { - "type": "string", - "enum": [ - "alloy", - "echo", - "fable", - "onyx", - "nova", - "shimmer", - "marin", - "cedar", - "ash", - "ballad", - "beacon", - "bossa", - "cinder", - "coral", - "delta", - "gleam", - "meridian", - "quartz", - "ripple", - "sage", - "stone", - "tempo", - "verse", - "vesper", - "willow" - ], - "title": "Preset Voice Options" - }, - { - "type": "string", - "title": "OpenAI Voice ID" - } - ] + "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" + } + ] + } }, - "model": { - "type": "string", - "description": "This is the model that will be used for text-to-speech.", + "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": [ - "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 + "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 }, - "speed": { + "minCharacters": { "type": "number", - "description": "This is the speed multiplier that will be used.", - "minimum": 0.25, - "maximum": 4, - "example": null + "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 }, - "chunkPlan": { - "description": "This is the plan for chunking the model output before it is sent to the voice provider.", - "allOf": [ - { - "$ref": "#/components/schemas/ChunkPlan" - } - ] + "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": [ + "。", + ",", + ".", + "!", + "?", + ";", + ")", + "،", + "۔", + "।", + "॥", + "|", + "||", + ",", + ":" + ] + } }, - "fallbackPlan": { - "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.", + "formatPlan": { + "description": "This is the plan for formatting the chunk before it is sent to the voice provider.", "allOf": [ { - "$ref": "#/components/schemas/FallbackPlan" + "$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": [ - "provider", - "voiceId" + "voices" ] }, - "PlayHTVoice": { + "AzureVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -29272,7 +30021,7 @@ "type": "string", "description": "This is the voice provider that will be used.", "enum": [ - "playht" + "azure" ] }, "voiceId": { @@ -29281,132 +30030,18 @@ { "type": "string", "enum": [ - "jennifer", - "melissa", - "will", - "chris", - "matt", - "jack", - "ruby", - "davis", - "donna", - "michael" + "andrew", + "brian", + "emma" ], "title": "Preset Voice Options" }, { "type": "string", - "title": "PlayHT Voice ID" + "title": "Azure 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": [ @@ -29415,6 +30050,12 @@ } ] }, + "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": [ @@ -29429,152 +30070,214 @@ "voiceId" ] }, - "RimeAIVoice": { + "CartesiaExperimentalControls": { "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.", + "speed": { "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", - "clementine", - "walnut", - "eyre", - "bancroft", - "hesse", - "beatty", - "godfrey" + "slowest", + "slow", + "normal", + "fast", + "fastest" ], - "title": "Suggested Voice Options", - "description": "Popular Rime AI voices across mist, mistv2, mistv3, arcana, and coda models. Any valid Rime AI voice ID is accepted, not just these suggestions." + "example": "normal" }, { - "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." + "type": "number", + "minimum": -1, + "maximum": 1, + "example": 0.5 } ] }, - "model": { + "emotion": { "type": "string", - "description": "This is the model that will be used. Defaults to 'arcana' when not specified.", "enum": [ - "arcana", - "coda", - "mistv2", - "mistv3", - "mist" + "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": "arcana" - }, + "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": "This is the speed multiplier that will be used.", - "minimum": 0.1, - "example": null + "description": "Fine-grained speed control for sonic-3. Only available for sonic-3 model.", + "example": 1, + "minimum": 0.6, + "maximum": 1.5, + "default": 1 }, - "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 + "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 }, - "phonemizeBetweenBrackets": { + "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 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 the flag to toggle voice caching for the assistant.", + "example": true, + "default": true }, - "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 + "provider": { + "type": "string", + "description": "This is the voice provider that will be used.", + "enum": [ + "cartesia" + ] }, - "inlineSpeedAlpha": { + "voiceId": { "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": "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.6", + "sonic-3.6-2026-08-27", + "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-3.5" }, "language": { "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 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", - "de", + "fi", "fr", - "ar", + "gu", + "he", "hi", + "hr", + "hu", + "id", + "it", "ja", - "he", + "ka", + "kn", + "ko", + "ml", + "mr", + "ms", + "nl", + "no", + "or", + "pa", + "pl", "pt", + "ro", + "ru", + "sk", + "sv", "ta", - "si" + "te", + "th", + "tl", + "tr", + "uk", + "ur", + "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": [ @@ -29597,7 +30300,7 @@ "voiceId" ] }, - "SesameVoice": { + "CustomVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -29608,22 +30311,14 @@ }, "provider": { "type": "string", - "description": "This is the voice provider that will be used.", + "description": "This is the voice provider that will be used. Use `custom-voice` for providers that are not natively supported.", "enum": [ - "sesame" + "custom-voice" ] }, "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" - ] + "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.", @@ -29633,6 +30328,14 @@ } ] }, + "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": [ @@ -29644,11 +30347,10 @@ }, "required": [ "provider", - "voiceId", - "model" + "server" ] }, - "SmallestAIVoice": { + "DeepgramVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -29661,60 +30363,153 @@ "type": "string", "description": "This is the voice provider that will be used.", "enum": [ - "smallest-ai" + "deepgram" ] }, "voiceId": { + "type": "string", "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" - } - ] + "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", + "viktoria", + "kara", + "fabian", + "julius", + "lara", + "elara", + "aurelia", + "hannah", + "kit", + "alexis", + "cliff", + "sienna", + "cole", + "brooke", + "colin", + "gemma", + "haley", + "heather", + "miles", + "sean", + "bree", + "brittany", + "bruce", + "conor", + "donovan", + "drew", + "elise", + "jack", + "kai", + "kelsey", + "maeve", + "marcelo", + "marcus", + "meena", + "meghan", + "naveen", + "paige", + "priya", + "rufus", + "sharon", + "tanner", + "wade", + "wes" + ], + "title": "This is the Deepgram Voice ID" }, "model": { "type": "string", - "description": "Smallest AI voice model to use. Defaults to 'lightning' when not specified.", + "description": "This is the model that will be used. Defaults to 'aura' when not specified.", "enum": [ - "lightning" - ] + "aura", + "aura-2", + "flux" + ], + "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 only applies to your own Deepgram API key. Requests on Vapi's key always opt out, whatever this is set to.\n\n@default false", + "example": false, + "default": false }, "speed": { "type": "number", - "description": "This is the speed multiplier that will be used.", - "example": null + "description": "This is the speed multiplier that will be used. Aura-2 accepts 0.7 to 1.5; Flux accepts 0.5 to 1.5 in steps of 0.05. Aura does not support speed.\n\n@default 1", + "minimum": 0.5, + "maximum": 1.5, + "example": 1.1, + "default": 1 + }, + "expressivity": { + "type": "number", + "description": "This is the expressivity level for Flux voices, from -2 (flat) to 2 (lively). Deepgram marks this control as beta and may retune the scale. Aura and Aura-2 do not support it.\n\n@default 0", + "minimum": -2, + "maximum": 2, + "example": 1, + "default": 0 }, "chunkPlan": { "description": "This is the plan for chunking the model output before it is sent to the voice provider.", @@ -29738,52 +30533,25 @@ "voiceId" ] }, - "TavusConversationProperties": { + "ElevenLabsPronunciationDictionaryLocator": { "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": { + "pronunciationDictionaryId": { "type": "string", - "description": "The region of the S3 bucket where the recording will be stored." + "description": "This is the ID of the pronunciation dictionary to use.", + "title": "This is the ElevenLabs Pronunciation Dictionary ID" }, - "awsAssumeRoleArn": { + "versionId": { "type": "string", - "description": "The ARN of the role that will be assumed to access the S3 bucket." + "description": "This is the version ID of the pronunciation dictionary to use.\n\nOmit to use the dictionary's latest version.", + "title": "This is the ElevenLabs Pronunciation Dictionary Version ID" } - } + }, + "required": [ + "pronunciationDictionaryId" + ] }, - "TavusVoice": { + "ElevenLabsVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -29796,230 +30564,129 @@ "type": "string", "description": "This is the voice provider that will be used.", "enum": [ - "tavus" + "11labs" ] }, "voiceId": { - "description": "This is the provider-specific ID that will be used.", + "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": [ - "r52da2535a" + "burt", + "marissa", + "andrea", + "sarah", + "phillip", + "steve", + "joseph", + "myra", + "paula", + "ryan", + "drew", + "paul", + "mrb", + "matilda", + "mark" ], "title": "Preset Voice Options" }, { "type": "string", - "title": "Tavus Voice ID" + "title": "11Labs 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" - } - ] + "stability": { + "type": "number", + "description": "Defines the stability for voice settings.", + "minimum": 0, + "maximum": 1, + "example": 0.5 }, - "personaId": { - "type": "string", - "description": "This is the unique identifier for the persona that the replica will use in the conversation." + "similarityBoost": { + "type": "number", + "description": "Defines the similarity boost for voice settings. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.", + "minimum": 0, + "maximum": 1, + "example": 0.75 }, - "callbackUrl": { - "type": "string", - "description": "This is the url that will receive webhooks with updates regarding the conversation state." + "style": { + "type": "number", + "description": "Defines the style for voice settings. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.", + "minimum": 0, + "maximum": 1, + "example": 0 }, - "conversationName": { - "type": "string", - "description": "This is the name for the conversation." + "useSpeakerBoost": { + "type": "boolean", + "description": "Defines the use speaker boost for voice settings. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.", + "example": false }, - "conversationalContext": { - "type": "string", - "description": "This is the context that will be appended to any context provided in the persona, if one is provided." + "speed": { + "type": "number", + "description": "Defines the speed for voice settings. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.", + "minimum": 0.7, + "maximum": 1.2, + "example": 0.9 }, - "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" + "optimizeStreamingLatency": { + "type": "number", + "description": "Defines the optimize streaming latency for voice settings. Defaults to 3. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.", + "minimum": 0, + "maximum": 4, + "example": 3 }, - "versionId": { - "type": "string", - "description": "Version ID (only used by ElevenLabs, ignored for Cartesia)", - "example": "ver_abc123" + "enableSsmlParsing": { + "type": "boolean", + "description": "This enables the use of https://elevenlabs.io/docs/speech-synthesis/prompting#pronunciation. Defaults to false to save latency. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.\n\n@default false", + "example": false }, - "provider": { - "type": "string", - "description": "Provider that hosts this pronunciation dictionary", - "enum": [ - "cartesia", - "11labs" - ], - "example": "11labs" - } - }, - "required": [ - "pronunciationDictId" - ] - }, - "VapiVoice": { - "type": "object", - "properties": { - "cachingEnabled": { + "autoMode": { "type": "boolean", - "description": "This is the flag to toggle voice caching for the assistant.", - "example": true, - "default": true + "description": "Defines the auto mode for voice settings. Defaults to false. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.", + "example": false }, - "provider": { + "model": { "type": "string", - "description": "This is the voice provider that will be used.", + "description": "This is the model that will be used. Defaults to 'eleven_turbo_v2' if not specified.", "enum": [ - "vapi" - ] + "eleven_multilingual_v2", + "eleven_turbo_v2", + "eleven_turbo_v2_5", + "eleven_flash_v2", + "eleven_flash_v2_5", + "eleven_monolingual_v1", + "eleven_v3", + "eleven_v4_turbo", + "eleven_v3_conversational" + ], + "example": "eleven_turbo_v2_5" }, - "voiceId": { + "language": { "type": "string", - "description": "The voice to use: a built-in Vapi voice name, or a cloned voice id (used with version 2).", - "example": "Clara" + "description": "This is the language (ISO 639-1) that is enforced for the model. Currently only Turbo v2.5, Flash v2.5 and the Text to Dialogue models support language enforcement; other models ignore it." }, - "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" - ] - }, + "chunkPlan": { + "description": "This is the plan for chunking the model output before it is sent to the voice provider.", + "allOf": [ { - "type": "number", - "enum": [ - 1, - 2 - ] + "$ref": "#/components/schemas/ChunkPlan" } ] }, - "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.", + "pronunciationDictionaryLocators": { + "description": "This is the pronunciation dictionary locators to use.", "type": "array", "items": { - "$ref": "#/components/schemas/VapiPronunciationDictionaryLocator" + "$ref": "#/components/schemas/ElevenLabsPronunciationDictionaryLocator" } }, - "chunkPlan": { - "description": "This is the plan for chunking the model output before it is sent to the voice provider.", + "fallbackPlan": { + "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.", "allOf": [ { - "$ref": "#/components/schemas/ChunkPlan" + "$ref": "#/components/schemas/FallbackPlan" } ] } @@ -30029,7 +30696,7 @@ "voiceId" ] }, - "InworldVoice": { + "WellSaidVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -30042,128 +30709,31 @@ "type": "string", "description": "This is the voice provider that will be used.", "enum": [ - "inworld" + "wellsaid" ] }, "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" + "description": "The WellSaid speaker ID to synthesize." }, "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" + "caruso", + "legacy" ] }, - "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 + "enableSsml": { + "type": "boolean", + "description": "Enables limited SSML translation for input text." }, - "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 + "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.", @@ -30187,7 +30757,7 @@ "voiceId" ] }, - "MinimaxVoice": { + "HumeVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -30200,123 +30770,26 @@ "type": "string", "description": "This is the voice provider that will be used.", "enum": [ - "minimax" + "hume" ] }, - "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\".", + "description": "This is the model that will be used.", "enum": [ - "worldwide", - "china" + "octave", + "octave2" ], - "default": "worldwide" + "example": "octave2" }, - "languageBoost": { + "voiceId": { "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": "The ID of the particular voice you want to use." }, - "textNormalizationEnabled": { + "isCustomHumeVoice": { "type": "boolean", - "description": "Enable MiniMax text normalization to improve number reading and formatting.", - "default": true + "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.", @@ -30326,6 +30799,10 @@ } ] }, + "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": [ @@ -30340,7 +30817,7 @@ "voiceId" ] }, - "FallbackMinimaxVoice": { + "LMNTVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -30353,124 +30830,465 @@ "type": "string", "description": "This is the voice provider that will be used.", "enum": [ - "minimax" + "lmnt" ] }, "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 + "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": "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, + "description": "This is the speed multiplier that will be used.", + "minimum": 0.25, "maximum": 2, - "example": 1, - "default": 1 - }, - "region": { - "type": "string", - "description": "The region for Minimax API. Defaults to \"worldwide\".", - "enum": [ - "worldwide", - "china" - ], - "default": "worldwide" + "example": null }, - "languageBoost": { - "type": "string", - "description": "Language hint for MiniMax T2A. Example: yue (Cantonese), zh (Chinese), en (English).", + "language": { + "description": "Two letter ISO 639-1 language code. Use \"auto\" for auto-detection.", "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", + "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" + } ] }, - "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": [ @@ -30478,6 +31296,14 @@ "$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": [ @@ -30485,7 +31311,7 @@ "voiceId" ] }, - "FallbackWellSaidVoice": { + "NeuphonicVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -30498,31 +31324,43 @@ "type": "string", "description": "This is the voice provider that will be used.", "enum": [ - "wellsaid" + "neuphonic" ] }, "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" - ] + "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" + } + ] }, - "enableSsml": { - "type": "boolean", - "description": "Enables limited SSML translation for input text." + "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" }, - "libraryIds": { - "description": "Array of library IDs to use for voice synthesis.", - "type": "array", - "items": { - "type": "string" - } + "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.", @@ -30531,14 +31369,23 @@ "$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" + "voiceId", + "language" ] }, - "XaiVoice": { + "OpenAIVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -30551,57 +31398,78 @@ "type": "string", "description": "This is the voice provider that will be used.", "enum": [ - "xai" + "openai" ] }, "voiceId": { + "description": "This is the provider-specific ID that will be used.\nVoice availability depends on the selected model: voices offered only by GPT-Live are rejected for other models.", + "anyOf": [ + { + "type": "string", + "enum": [ + "alloy", + "echo", + "fable", + "onyx", + "nova", + "shimmer", + "marin", + "cedar", + "ash", + "ballad", + "beacon", + "bossa", + "brise", + "cinder", + "coral", + "delta", + "flitz", + "gleam", + "harema", + "juni", + "meridian", + "nira", + "noeul", + "nuri", + "quartz", + "ripple", + "sage", + "shida", + "sillage", + "stone", + "tempo", + "verse", + "vesper", + "willow" + ], + "title": "Preset Voice Options" + }, + { + "type": "string", + "title": "OpenAI Voice ID" + } + ] + }, + "model": { "type": "string", - "description": "Built-in voices: eve, ara, rex, sal, leo. Cloned voice IDs are also accepted.", - "maxLength": 120, - "title": "xAI Voice ID", + "description": "This is the model that will be used for text-to-speech.", "enum": [ - "eve", - "ara", - "rex", - "sal", - "leo" - ], - "example": "eve" + "tts-1", + "tts-1-hd", + "gpt-4o-mini-tts" + ] }, - "language": { + "instructions": { "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" + "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": "Speed multiplier for xAI TTS synthesis.", - "minimum": 0.7, - "maximum": 1.5, - "default": 1.1 + "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.", @@ -30625,7 +31493,7 @@ "voiceId" ] }, - "MicrosoftVoice": { + "PlayHTVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -30638,119 +31506,140 @@ "type": "string", "description": "This is the voice provider that will be used.", "enum": [ - "microsoft" + "playht" ] }, "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" + "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" + } + ] }, - "style": { + "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": "Speaking style applied via mstts:express-as on every request. Unknown styles are ignored by Azure and fall back to neutral.", + "description": "An emotion to be applied to the speech.", "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" + "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": "happy" + "example": null }, - "styleDegree": { + "voiceGuidance": { "type": "number", - "description": "Style intensity (0.01–2). Default 1 = the predefined style strength. Only applies when `style` is set.", - "minimum": 0.01, + "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, - "default": 1 + "example": null }, - "role": { + "model": { "type": "string", - "description": "Role-play (age/gender imitation). Requires `style` to be set; ignored otherwise.", + "description": "Playht voice model/engine to use.", "enum": [ - "Girl", - "Boy", - "YoungAdultFemale", - "YoungAdultMale", - "OlderAdultFemale", - "OlderAdultMale", - "SeniorFemale", - "SeniorMale" - ], - "example": "YoungAdultFemale" + "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.", @@ -30760,12 +31649,6 @@ } ] }, - "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": [ @@ -30780,7 +31663,7 @@ "voiceId" ] }, - "FallbackAzureVoice": { + "RimeAIVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -30793,7 +31676,7 @@ "type": "string", "description": "This is the voice provider that will be used.", "enum": [ - "azure" + "rime-ai" ] }, "voiceId": { @@ -30802,23 +31685,129 @@ { "type": "string", "enum": [ - "andrew", - "brian", - "emma" + "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", + "clementine", + "walnut", + "eyre", + "bancroft", + "hesse", + "beatty", + "godfrey" ], - "title": "Preset Voice Options" + "title": "Suggested Voice Options", + "description": "Popular Rime AI voices across mist, mistv2, mistv3, arcana, and coda models. Any valid Rime AI voice ID is accepted, not just these suggestions." }, { "type": "string", - "title": "Azure Voice ID" + "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", + "coda", + "mistv2", + "mistv3", + "mist" + ], + "example": "arcana" + }, "speed": { "type": "number", "description": "This is the speed multiplier that will be used.", - "minimum": 0.5, - "maximum": 2 + "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.", @@ -30827,6 +31816,14 @@ "$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": [ @@ -30834,7 +31831,7 @@ "voiceId" ] }, - "FallbackCartesiaVoice": { + "SesameVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -30847,120 +31844,45 @@ "type": "string", "description": "This is the voice provider that will be used.", "enum": [ - "cartesia" + "sesame" ] }, "voiceId": { "type": "string", - "description": "The ID of the particular voice you want to use." + "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. 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.6", - "sonic-3.6-2026-08-27", - "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-3.5" - }, - "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.", + "description": "This is the model that will be used.", "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", - "or", - "pa", - "pl", - "pt", - "ro", - "ru", - "sk", - "sv", - "ta", - "te", - "th", - "tl", - "tr", - "uk", - "ur", - "vi", - "zh" - ], - "example": "en" - }, - "experimentalControls": { - "description": "Experimental controls for Cartesia voice generation", - "allOf": [ - { - "$ref": "#/components/schemas/CartesiaExperimentalControls" - } + "csm-1b" ] }, - "generationConfig": { - "description": "Generation config for fine-grained control of sonic-3 voice output (speed, volume, and experimental controls). Only available for sonic-3 model.", + "chunkPlan": { + "description": "This is the plan for chunking the model output before it is sent to the voice provider.", "allOf": [ { - "$ref": "#/components/schemas/CartesiaGenerationConfig" + "$ref": "#/components/schemas/ChunkPlan" } ] }, - "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.", + "fallbackPlan": { + "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.", "allOf": [ { - "$ref": "#/components/schemas/ChunkPlan" + "$ref": "#/components/schemas/FallbackPlan" } ] } }, "required": [ "provider", - "voiceId" + "voiceId", + "model" ] }, - "FallbackCustomVoice": { + "SmallestAIVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -30971,23 +31893,63 @@ }, "provider": { "type": "string", - "description": "This is the voice provider that will be used. Use `custom-voice` for providers that are not natively supported.", + "description": "This is the voice provider that will be used.", "enum": [ - "custom-voice" + "smallest-ai" ] }, "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": [ + "description": "This is the provider-specific ID that will be used.", + "oneOf": [ { - "$ref": "#/components/schemas/Server" + "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": [ @@ -30995,189 +31957,67 @@ "$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", - "server" + "voiceId" ] }, - "FallbackDeepgramVoice": { + "TavusConversationProperties": { "type": "object", "properties": { - "cachingEnabled": { - "type": "boolean", - "description": "This is the flag to toggle voice caching for the assistant.", - "example": true, - "default": true + "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." }, - "provider": { - "type": "string", - "description": "This is the voice provider that will be used.", - "enum": [ - "deepgram" - ] + "participantLeftTimeout": { + "type": "number", + "description": "The duration in seconds after which the call will be automatically shut down once the last participant leaves." }, - "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", - "viktoria", - "kara", - "fabian", - "julius", - "lara", - "elara", - "aurelia", - "hannah", - "kit", - "alexis", - "cliff", - "sienna", - "cole", - "brooke", - "colin", - "gemma", - "haley", - "heather", - "miles", - "sean", - "bree", - "brittany", - "bruce", - "conor", - "donovan", - "drew", - "elise", - "jack", - "kai", - "kelsey", - "maeve", - "marcelo", - "marcus", - "meena", - "meghan", - "naveen", - "paige", - "priya", - "rufus", - "sharon", - "tanner", - "wade", - "wes" - ], - "title": "This is the Deepgram Voice ID" + "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)." }, - "model": { - "type": "string", - "description": "This is the model that will be used. Defaults to 'aura' when not specified.", - "enum": [ - "aura", - "aura-2", - "flux" - ], - "example": "aura-2" + "enableRecording": { + "type": "boolean", + "description": "If true, the user will be able to record the conversation." }, - "mipOptOut": { + "enableTranscription": { "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 only applies to your own Deepgram API key. Requests on Vapi's key always opt out, whatever this is set to.\n\n@default false", - "example": false, - "default": false + "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`." }, - "speed": { - "type": "number", - "description": "This is the speed multiplier that will be used. Aura-2 accepts 0.7 to 1.5; Flux accepts 0.5 to 1.5 in steps of 0.05. Aura does not support speed.\n\n@default 1", - "minimum": 0.5, - "maximum": 1.5, - "example": 1.1, - "default": 1 + "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." }, - "expressivity": { - "type": "number", - "description": "This is the expressivity level for Flux voices, from -2 (flat) to 2 (lively). Deepgram marks this control as beta and may retune the scale. Aura and Aura-2 do not support it.\n\n@default 0", - "minimum": -2, - "maximum": 2, - "example": 1, - "default": 0 + "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." }, - "chunkPlan": { - "description": "This is the plan for chunking the model output before it is sent to the voice provider.", - "allOf": [ - { - "$ref": "#/components/schemas/ChunkPlan" - } - ] + "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." } - }, - "required": [ - "provider", - "voiceId" - ] + } }, - "FallbackElevenLabsVoice": { + "TavusVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -31190,121 +32030,66 @@ "type": "string", "description": "This is the voice provider that will be used.", "enum": [ - "11labs" + "tavus" ] }, "voiceId": { - "description": "This is the provider-specific ID that will be used. Ensure the Voice is present in your 11Labs Voice Library.", + "description": "This is the provider-specific ID that will be used.", "oneOf": [ { "type": "string", "enum": [ - "burt", - "marissa", - "andrea", - "sarah", - "phillip", - "steve", - "joseph", - "myra", - "paula", - "ryan", - "drew", - "paul", - "mrb", - "matilda", - "mark" + "r52da2535a" ], "title": "Preset Voice Options" }, { "type": "string", - "title": "11Labs Voice ID" + "title": "Tavus 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. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.", - "minimum": 0, - "maximum": 1, - "example": 0.75 - }, - "style": { - "type": "number", - "description": "Defines the style for voice settings. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.", - "minimum": 0, - "maximum": 1, - "example": 0 - }, - "useSpeakerBoost": { - "type": "boolean", - "description": "Defines the use speaker boost for voice settings. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.", - "example": false - }, - "speed": { - "type": "number", - "description": "Defines the speed for voice settings. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.", - "minimum": 0.7, - "maximum": 1.2, - "example": 0.9 + "chunkPlan": { + "description": "This is the plan for chunking the model output before it is sent to the voice provider.", + "allOf": [ + { + "$ref": "#/components/schemas/ChunkPlan" + } + ] }, - "optimizeStreamingLatency": { - "type": "number", - "description": "Defines the optimize streaming latency for voice settings. Defaults to 3. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.", - "minimum": 0, - "maximum": 4, - "example": 3 + "personaId": { + "type": "string", + "description": "This is the unique identifier for the persona that the replica will use in the conversation." }, - "enableSsmlParsing": { - "type": "boolean", - "description": "This enables the use of https://elevenlabs.io/docs/speech-synthesis/prompting#pronunciation. Defaults to false to save latency. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.\n\n@default false", - "example": false + "callbackUrl": { + "type": "string", + "description": "This is the url that will receive webhooks with updates regarding the conversation state." }, - "autoMode": { - "type": "boolean", - "description": "Defines the auto mode for voice settings. Defaults to false. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.", - "example": false + "conversationName": { + "type": "string", + "description": "This is the name for the conversation." }, - "model": { + "conversationalContext": { "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", - "eleven_v4_turbo", - "eleven_v3_conversational" - ], - "example": "eleven_turbo_v2_5" + "description": "This is the context that will be appended to any context provided in the persona, if one is provided." }, - "language": { + "customGreeting": { "type": "string", - "description": "This is the language (ISO 639-1) that is enforced for the model. Currently only Turbo v2.5, Flash v2.5 and the Text to Dialogue models support language enforcement; other models ignore it." + "description": "This is the custom greeting that the replica will give once a participant joines the conversation." }, - "pronunciationDictionaryLocators": { - "description": "This is the pronunciation dictionary locators to use.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ElevenLabsPronunciationDictionaryLocator" - } + "properties": { + "description": "These are optional properties used to customize the conversation.", + "allOf": [ + { + "$ref": "#/components/schemas/TavusConversationProperties" + } + ] }, - "chunkPlan": { - "description": "This is the plan for chunking the model output before it is sent to the voice provider.", + "fallbackPlan": { + "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.", "allOf": [ { - "$ref": "#/components/schemas/ChunkPlan" + "$ref": "#/components/schemas/FallbackPlan" } ] } @@ -31314,59 +32099,34 @@ "voiceId" ] }, - "FallbackHumeVoice": { + "VapiPronunciationDictionaryLocator": { "type": "object", "properties": { - "cachingEnabled": { - "type": "boolean", - "description": "This is the flag to toggle voice caching for the assistant.", - "example": true, - "default": true + "pronunciationDictId": { + "type": "string", + "description": "The pronunciation dictionary ID", + "example": "pdict_abc123" }, - "provider": { + "versionId": { "type": "string", - "description": "This is the voice provider that will be used.", - "enum": [ - "hume" - ] + "description": "Version ID (only used by ElevenLabs, ignored for Cartesia)", + "example": "ver_abc123" }, - "model": { + "provider": { "type": "string", - "description": "This is the model that will be used.", + "description": "Provider that hosts this pronunciation dictionary", "enum": [ - "octave", - "octave2" + "cartesia", + "11labs" ], - "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" - } - ] + "example": "11labs" } }, "required": [ - "provider", - "voiceId" + "pronunciationDictId" ] }, - "FallbackLMNTVoice": { + "VapiVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -31379,470 +32139,279 @@ "type": "string", "description": "This is the voice provider that will be used.", "enum": [ - "lmnt" + "vapi" ] }, "voiceId": { - "description": "This is the provider-specific ID that will be used.", + "type": "string", + "description": "The voice to use: a built-in Vapi voice name, or a cloned voice id (used with version 2).", + "example": "Clara" + }, + "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": [ - "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" + "1", + "2", + "latest" + ] }, { - "type": "string", - "title": "LMNT Voice ID" + "type": "number", + "enum": [ + 1, + 2 + ] } ] }, "speed": { "type": "number", - "description": "This is the speed multiplier that will be used.", + "description": "This is the speed multiplier that will be used.\n\n@default 1", "minimum": 0.25, "maximum": 2, - "example": null + "default": 1 }, "language": { - "description": "Two letter ISO 639-1 language code. Use \"auto\" for auto-detection.", + "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": [ - "aa", - "ab", - "ae", - "af", - "ak", - "am", - "an", - "ar", - "as", - "av", - "ay", - "az", - "ba", - "be", + "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", - "bh", - "bi", - "bm", - "bn", - "bo", - "br", - "bs", - "ca", - "ce", - "ch", - "co", - "cr", + "ro", + "ar-SA", + "ar-AE", "cs", - "cu", - "cv", - "cy", - "da", - "de", - "dv", - "dz", - "ee", "el", + "fi", + "hr", + "ms", + "sk", + "da", + "ta", + "uk", + "ru", + "hu", + "no", + "vi", + "auto", "en", - "eo", + "ar", + "ar-EG", + "bn", "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" + "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": "en", - "oneOf": [ + "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": [ { - "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" + "$ref": "#/components/schemas/ChunkPlan" } ] }, - "chunkPlan": { - "description": "This is the plan for chunking the model output before it is sent to the voice provider.", + "fallbackPlan": { + "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.", "allOf": [ { - "$ref": "#/components/schemas/ChunkPlan" + "$ref": "#/components/schemas/FallbackPlan" } ] } @@ -31852,7 +32421,7 @@ "voiceId" ] }, - "FallbackNeuphonicVoice": { + "MinimaxVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -31865,43 +32434,123 @@ "type": "string", "description": "This is the voice provider that will be used.", "enum": [ - "neuphonic" + "minimax" ] }, "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" - } - ] + "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. Defaults to 'neu_fast' if not specified.", + "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": [ - "neu_hq", - "neu_fast" + "speech-02-hd", + "speech-02-turbo", + "speech-2.5-turbo-preview" ], - "example": "neu_fast" + "example": "speech-02-turbo", + "default": "speech-02-turbo" }, - "language": { - "type": "object", - "description": "This is the language (ISO 639-1) that is enforced for the model.", - "example": "en" + "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": "This is the speed multiplier that will be used.", - "minimum": 0.25, + "description": "Voice speed adjustment. Range from 0.5 to 2.0.\n@default 1.0", + "minimum": 0.5, "maximum": 2, - "example": null + "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.", @@ -31910,15 +32559,22 @@ "$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" + "voiceId" ] }, - "FallbackOpenAIVoice": { + "FallbackMinimaxVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -31931,69 +32587,123 @@ "type": "string", "description": "This is the voice provider that will be used.", "enum": [ - "openai" + "minimax" ] }, "voiceId": { - "description": "This is the provider-specific ID that will be used.\nVoice availability depends on the selected model.\nquartz, ripple, vesper, willow, stone, gleam, meridian, bossa, tempo, beacon, delta, cinder are only supported with GPT-Live models.", - "anyOf": [ - { - "type": "string", - "enum": [ - "alloy", - "echo", - "fable", - "onyx", - "nova", - "shimmer", - "marin", - "cedar", - "ash", - "ballad", - "beacon", - "bossa", - "cinder", - "coral", - "delta", - "gleam", - "meridian", - "quartz", - "ripple", - "sage", - "stone", - "tempo", - "verse", - "vesper", - "willow" - ], - "title": "Preset Voice Options" - }, - { - "type": "string", - "title": "OpenAI Voice ID" - } - ] + "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 for text-to-speech.", + "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": [ - "tts-1", - "tts-1-hd", - "gpt-4o-mini-tts" - ] + "speech-02-hd", + "speech-02-turbo", + "speech-2.5-turbo-preview" + ], + "example": "speech-02-turbo", + "default": "speech-02-turbo" }, - "instructions": { + "emotion": { "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 + "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": "This is the speed multiplier that will be used.", - "minimum": 0.25, - "maximum": 4, - "example": null + "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.", @@ -32009,7 +32719,7 @@ "voiceId" ] }, - "FallbackPlayHTVoice": { + "FallbackWellSaidVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -32022,140 +32732,31 @@ "type": "string", "description": "This is the voice provider that will be used.", "enum": [ - "playht" + "wellsaid" ] }, "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" - } + "type": "string", + "description": "The WellSaid speaker ID to synthesize." + }, + "model": { + "type": "string", + "description": "This is the model that will be used.", + "enum": [ + "caruso", + "legacy" ] }, - "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" - ] + "enableSsml": { + "type": "boolean", + "description": "Enables limited SSML translation for input text." }, - "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" - ] + "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.", @@ -32171,7 +32772,7 @@ "voiceId" ] }, - "FallbackRimeAIVoice": { + "XaiVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -32184,138 +32785,57 @@ "type": "string", "description": "This is the voice provider that will be used.", "enum": [ - "rime-ai" + "xai" ] }, "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", - "clementine", - "walnut", - "eyre", - "bancroft", - "hesse", - "beatty", - "godfrey" - ], - "title": "Suggested Voice Options", - "description": "Popular Rime AI voices across mist, mistv2, mistv3, arcana, and coda 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.", + "description": "Built-in voices: eve, ara, rex, sal, leo. Cloned voice IDs are also accepted.", + "maxLength": 120, + "title": "xAI Voice ID", "enum": [ - "arcana", - "coda", - "mistv2", - "mistv3", - "mist" + "eve", + "ara", + "rex", + "sal", + "leo" ], - "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 + "example": "eve" }, "language": { "type": "string", - "description": "Language for speech synthesis. Uses ISO 639 codes. Supported: en, es, de, fr, ar, hi, ja, he, pt, ta, si.", + "description": "BCP-47 language code for xAI TTS synthesis.", "enum": [ + "auto", "en", - "es", - "de", + "ar-EG", + "ar-SA", + "ar-AE", + "bn", + "zh", "fr", - "ar", + "de", "hi", + "id", + "it", "ja", - "he", - "pt", - "ta", - "si" + "ko", + "pt-BR", + "pt-PT", + "ru", + "es-MX", + "es-ES", + "tr", + "vi" ], - "example": "en" + "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.", @@ -32324,6 +32844,14 @@ "$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": [ @@ -32331,7 +32859,7 @@ "voiceId" ] }, - "FallbackSesameVoice": { + "MicrosoftVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -32344,109 +32872,139 @@ "type": "string", "description": "This is the voice provider that will be used.", "enum": [ - "sesame" + "microsoft" ] }, "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)." + "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" }, - "model": { + "style": { "type": "string", - "description": "This is the model that will be used.", + "description": "Speaking style applied via mstts:express-as on every request. Unknown styles are ignored by Azure and fall back to neutral.", "enum": [ - "csm-1b" - ] + "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" }, - "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 + "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 }, - "provider": { + "role": { "type": "string", - "description": "This is the voice provider that will be used.", + "description": "Role-play (age/gender imitation). Requires `style` to be set; ignored otherwise.", "enum": [ - "smallest-ai" - ] + "Girl", + "Boy", + "YoungAdultFemale", + "YoungAdultMale", + "OlderAdultFemale", + "OlderAdultMale", + "SeniorFemale", + "SeniorMale" + ], + "example": "YoungAdultFemale" }, - "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" - }, + "chunkPlan": { + "description": "This is the plan for chunking the model output before it is sent to the voice provider.", + "allOf": [ { - "type": "string", - "title": "Smallest AI Voice ID" + "$ref": "#/components/schemas/ChunkPlan" } ] }, - "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 + "minimum": 0.5, + "maximum": 2 }, - "chunkPlan": { - "description": "This is the plan for chunking the model output before it is sent to the voice provider.", + "fallbackPlan": { + "description": "This is the plan for voice provider fallbacks in the event that the primary voice provider fails.", "allOf": [ { - "$ref": "#/components/schemas/ChunkPlan" + "$ref": "#/components/schemas/FallbackPlan" } ] } @@ -32456,7 +33014,7 @@ "voiceId" ] }, - "FallbackTavusVoice": { + "FallbackAzureVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -32469,7 +33027,7 @@ "type": "string", "description": "This is the voice provider that will be used.", "enum": [ - "tavus" + "azure" ] }, "voiceId": { @@ -32478,43 +33036,23 @@ { "type": "string", "enum": [ - "r52da2535a" + "andrew", + "brian", + "emma" ], "title": "Preset Voice Options" }, { "type": "string", - "title": "Tavus Voice ID" + "title": "Azure Voice ID" } ] }, - "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" - } - ] + "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.", @@ -32530,7 +33068,7 @@ "voiceId" ] }, - "FallbackVapiVoice": { + "FallbackCartesiaVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -32543,115 +33081,104 @@ "type": "string", "description": "This is the voice provider that will be used.", "enum": [ - "vapi" + "cartesia" ] }, "voiceId": { "type": "string", - "description": "The voice to use: a built-in Vapi voice name, or a cloned voice id (used with version 2).", - "example": "Clara" + "description": "The ID of the particular voice you want to use." }, - "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.", + "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": [ - "1", - "2", - "latest" + "sonic-3.5", + "sonic-3.5-2026-05-04", + "sonic-3.6", + "sonic-3.6-2026-08-27", + "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" ], - "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 + "example": "sonic-3.5" }, "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.", + "description": "This is the language that will be used. This is optional and will default to the correct language for the voiceId.", "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", + "ar", "bg", - "ro", - "ar-SA", - "ar-AE", + "bn", "cs", - "el", - "fi", - "hr", - "ms", - "sk", "da", - "ta", - "uk", - "ru", - "hu", - "no", - "vi", - "auto", + "de", + "el", "en", - "ar", - "ar-EG", - "bn", "es", + "fi", "fr", "gu", "he", + "hi", + "hr", + "hu", + "id", + "it", + "ja", "ka", "kn", + "ko", "ml", "mr", + "ms", + "nl", + "no", + "or", "pa", + "pl", "pt", + "ro", + "ru", + "sk", + "sv", + "ta", "te", "th", - "tl" + "tl", + "tr", + "uk", + "ur", + "vi", + "zh" + ], + "example": "en" + }, + "experimentalControls": { + "description": "Experimental controls for Cartesia voice generation", + "allOf": [ + { + "$ref": "#/components/schemas/CartesiaExperimentalControls" + } ] }, - "pronunciationDictionary": { - "description": "List of pronunciation dictionary locators for custom word pronunciations.", - "type": "array", - "items": { - "$ref": "#/components/schemas/VapiPronunciationDictionaryLocator" - } + "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.", @@ -32667,7 +33194,7 @@ "voiceId" ] }, - "FallbackInworldVoice": { + "FallbackCustomVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -32678,131 +33205,23 @@ }, "provider": { "type": "string", - "description": "This is the voice provider that will be used.", + "description": "This is the voice provider that will be used. Use `custom-voice` for providers that are not natively supported.", "enum": [ - "inworld" + "custom-voice" ] }, "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" + "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." }, - "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" + "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" + } ] }, - "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": [ @@ -32814,10 +33233,10 @@ }, "required": [ "provider", - "voiceId" + "server" ] }, - "FallbackXaiVoice": { + "FallbackDeepgramVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -32830,57 +33249,153 @@ "type": "string", "description": "This is the voice provider that will be used.", "enum": [ - "xai" + "deepgram" ] }, "voiceId": { "type": "string", - "description": "Built-in voices: eve, ara, rex, sal, leo. Cloned voice IDs are also accepted.", - "maxLength": 120, - "title": "xAI Voice ID", + "description": "This is the provider-specific ID that will be used.", "enum": [ - "eve", - "ara", - "rex", - "sal", - "leo" + "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", + "viktoria", + "kara", + "fabian", + "julius", + "lara", + "elara", + "aurelia", + "hannah", + "kit", + "alexis", + "cliff", + "sienna", + "cole", + "brooke", + "colin", + "gemma", + "haley", + "heather", + "miles", + "sean", + "bree", + "brittany", + "bruce", + "conor", + "donovan", + "drew", + "elise", + "jack", + "kai", + "kelsey", + "maeve", + "marcelo", + "marcus", + "meena", + "meghan", + "naveen", + "paige", + "priya", + "rufus", + "sharon", + "tanner", + "wade", + "wes" ], - "example": "eve" + "title": "This is the Deepgram Voice ID" }, - "language": { + "model": { "type": "string", - "description": "BCP-47 language code for xAI TTS synthesis.", + "description": "This is the model that will be used. Defaults to 'aura' when not specified.", "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" + "aura", + "aura-2", + "flux" ], - "default": "en" + "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 only applies to your own Deepgram API key. Requests on Vapi's key always opt out, whatever this is set to.\n\n@default false", + "example": false, + "default": false }, "speed": { "type": "number", - "description": "Speed multiplier for xAI TTS synthesis.", - "minimum": 0.7, + "description": "This is the speed multiplier that will be used. Aura-2 accepts 0.7 to 1.5; Flux accepts 0.5 to 1.5 in steps of 0.05. Aura does not support speed.\n\n@default 1", + "minimum": 0.5, "maximum": 1.5, - "default": 1.1 + "example": 1.1, + "default": 1 + }, + "expressivity": { + "type": "number", + "description": "This is the expressivity level for Flux voices, from -2 (flat) to 2 (lively). Deepgram marks this control as beta and may retune the scale. Aura and Aura-2 do not support it.\n\n@default 0", + "minimum": -2, + "maximum": 2, + "example": 1, + "default": 0 }, "chunkPlan": { "description": "This is the plan for chunking the model output before it is sent to the voice provider.", @@ -32896,7 +33411,7 @@ "voiceId" ] }, - "FallbackMicrosoftVoice": { + "FallbackElevenLabsVoice": { "type": "object", "properties": { "cachingEnabled": { @@ -32909,1369 +33424,1915 @@ "type": "string", "description": "This is the voice provider that will be used.", "enum": [ - "microsoft" + "11labs" ] }, "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" + "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" + } + ] }, - "styleDegree": { + "stability": { "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 + "description": "Defines the stability for voice settings.", + "minimum": 0, + "maximum": 1, + "example": 0.5 }, - "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" + "similarityBoost": { + "type": "number", + "description": "Defines the similarity boost for voice settings. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.", + "minimum": 0, + "maximum": 1, + "example": 0.75 }, - "speed": { + "style": { "type": "number", - "description": "This is the speed multiplier that will be used.", - "minimum": 0.5, - "maximum": 2 + "description": "Defines the style for voice settings. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.", + "minimum": 0, + "maximum": 1, + "example": 0 }, - "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" - ] - }, - "TransportConfigurationTwilio": { - "type": "object", - "properties": { - "provider": { - "type": "string", - "enum": [ - "twilio" - ] + "useSpeakerBoost": { + "type": "boolean", + "description": "Defines the use speaker boost for voice settings. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.", + "example": false }, - "timeout": { + "speed": { "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 + "description": "Defines the speed for voice settings. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.", + "minimum": 0.7, + "maximum": 1.2, + "example": 0.9 }, - "record": { + "optimizeStreamingLatency": { + "type": "number", + "description": "Defines the optimize streaming latency for voice settings. Defaults to 3. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.", + "minimum": 0, + "maximum": 4, + "example": 3 + }, + "enableSsmlParsing": { "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", + "description": "This enables the use of https://elevenlabs.io/docs/speech-synthesis/prompting#pronunciation. Defaults to false to save latency. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.\n\n@default false", "example": false }, - "recordingChannels": { + "autoMode": { + "type": "boolean", + "description": "Defines the auto mode for voice settings. Defaults to false. Ignored by `eleven_v4_turbo` and `eleven_v3_conversational`.", + "example": false + }, + "model": { "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'", + "description": "This is the model that will be used. Defaults to 'eleven_turbo_v2' if not specified.", "enum": [ - "mono", - "dual" + "eleven_multilingual_v2", + "eleven_turbo_v2", + "eleven_turbo_v2_5", + "eleven_flash_v2", + "eleven_flash_v2_5", + "eleven_monolingual_v1", + "eleven_v3", + "eleven_v4_turbo", + "eleven_v3_conversational" ], - "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." + "example": "eleven_turbo_v2_5" }, - "name": { - "type": "string", - "description": "This is the name of credential. This is just for your reference.", - "minLength": 1, - "maxLength": 40 - } - }, - "required": [ - "provider", - "apiKey" - ] - }, - "CreateAnthropicBedrockCredentialDTO": { - "type": "object", - "properties": { - "provider": { + "language": { "type": "string", - "enum": [ - "anthropic-bedrock" - ] + "description": "This is the language (ISO 639-1) that is enforced for the model. Currently only Turbo v2.5, Flash v2.5 and the Text to Dialogue models support language enforcement; other models ignore it." }, - "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" - ] + "pronunciationDictionaryLocators": { + "description": "This is the pronunciation dictionary locators to use.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ElevenLabsPronunciationDictionaryLocator" + } }, - "authenticationPlan": { - "description": "Authentication method - either direct IAM credentials or cross-account role assumption.", - "oneOf": [ - { - "$ref": "#/components/schemas/AWSIAMCredentialsAuthenticationPlan" - }, + "chunkPlan": { + "description": "This is the plan for chunking the model output before it is sent to the voice provider.", + "allOf": [ { - "$ref": "#/components/schemas/AWSStsAuthenticationPlan" + "$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", - "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" + "voiceId" ] }, - "AzureBlobStorageBucketPlan": { + "FallbackHumeVoice": { "type": "object", "properties": { - "connectionString": { - "type": "string", - "description": "This is the blob storage connection string for the Azure resource." - }, - "containerName": { - "type": "string", - "description": "This is the container name for the Azure blob storage." + "cachingEnabled": { + "type": "boolean", + "description": "This is the flag to toggle voice caching for the assistant.", + "example": true, + "default": true }, - "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": "This is the voice provider that will be used.", "enum": [ - "azure" + "hume" ] }, - "service": { + "model": { "type": "string", - "description": "This is the service being used in Azure.", + "description": "This is the model that will be used.", "enum": [ - "speech", - "blob_storage" + "octave", + "octave2" ], - "default": "speech" + "example": "octave2" }, - "region": { + "voiceId": { "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", - "switzerlandnorth", - "switzerlandwest", - "uaenorth", - "uk", - "westeurope", - "westus", - "westus3" - ] + "description": "The ID of the particular voice you want to use." }, - "apiKey": { - "type": "string", - "description": "This is not returned in the API.", - "maxLength": 10000 + "isCustomHumeVoice": { + "type": "boolean", + "description": "Indicates whether the chosen voice is a preset Hume AI voice or a custom voice.", + "example": false }, - "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." + "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." }, - "bucketPlan": { - "description": "This is the bucket plan that can be provided to store call artifacts in Azure Blob Storage.", + "chunkPlan": { + "description": "This is the plan for chunking the model output before it is sent to the voice provider.", "allOf": [ { - "$ref": "#/components/schemas/AzureBlobStorageBucketPlan" + "$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", - "service" + "voiceId" ] }, - "CreateAzureOpenAICredentialDTO": { + "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": [ - "azure-openai" + "lmnt" ] }, - "region": { - "type": "string", - "enum": [ - "australiaeast", - "canadaeast", - "canadacentral", - "centralus", - "eastus2", - "eastus", - "france", - "germanywestcentral", - "india", - "japaneast", - "japanwest", - "northcentralus", - "norway", - "polandcentral", - "southcentralus", - "spaincentral", - "swedencentral", - "switzerland", - "switzerlandnorth", - "switzerlandwest", - "uaenorth", - "uk", - "westeurope", - "westus", - "westus3" + "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" + } ] }, - "models": { - "type": "array", + "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": [ - "gpt-5.6-luna-2026-07-09", - "gpt-5.6-terra-2026-07-09", - "gpt-5.6-sol-2026-07-09", - "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" + "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" ], - "items": { - "type": "string", - "enum": [ - "gpt-5.6-luna-2026-07-09", - "gpt-5.6-terra-2026-07-09", - "gpt-5.6-sol-2026-07-09", - "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", - "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 + "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" + } + ] }, - "name": { - "type": "string", - "description": "This is the name of credential. This is just for your reference.", - "minLength": 1, - "maxLength": 40 + "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", - "region", - "models", - "openAIKey", - "openAIEndpoint" + "voiceId" ] }, - "SipTrunkGateway": { + "FallbackNeuphonicVoice": { "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 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": { + "cachingEnabled": { "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" + "description": "This is the flag to toggle voice caching for the assistant.", + "example": true, + "default": true }, - "outboundProtocol": { + "provider": { "type": "string", - "description": "This is the protocol to use for SIP signaling outbound calls. Default is udp.\n\n@default udp", + "description": "This is the voice provider that will be used.", "enum": [ - "tls/srtp", - "tcp", - "tls", - "udp" + "neuphonic" ] }, - "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": [ + "voiceId": { + "description": "This is the provider-specific ID that will be used.", + "oneOf": [ { - "$ref": "#/components/schemas/SipTrunkOutboundSipRegisterPlan" + "type": "string", + "enum": [], + "title": "Preset Voice Options" + }, + { + "type": "string", + "title": "Neuphonic Voice ID" } ] - } - } - }, - "CreateByoSipTrunkCredentialDTO": { - "type": "object", - "properties": { - "provider": { + }, + "model": { "type": "string", - "description": "This can be used to bring your own SIP trunks or to connect to a Carrier.", + "description": "This is the model that will be used. Defaults to 'neu_fast' if not specified.", "enum": [ - "byo-sip-trunk" - ] + "neu_hq", + "neu_fast" + ], + "example": "neu_fast" }, - "gateways": { - "description": "This is the list of SIP trunk's gateways.", - "type": "array", - "items": { - "$ref": "#/components/schemas/SipTrunkGateway" - } + "language": { + "type": "object", + "description": "This is the language (ISO 639-1) that is enforced for the model.", + "example": "en" }, - "outboundAuthenticationPlan": { - "description": "This can be used to configure the outbound authentication if required by the SIP trunk.", + "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/SipTrunkOutboundAuthenticationPlan" + "$ref": "#/components/schemas/ChunkPlan" } ] - }, - "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": [ - "gateways" - ] - }, - "CreateCartesiaCredentialDTO": { - "type": "object", - "properties": { - "provider": { - "type": "string", - "enum": [ - "cartesia" - ] - }, - "apiKey": { - "type": "string", - "description": "This is not returned in the API." - }, - "apiUrl": { - "type": "string", - "description": "This can be used to point to an onprem Cartesia instance. Defaults to api.cartesia.ai." - }, - "name": { - "type": "string", - "description": "This is the name of credential. This is just for your reference.", - "minLength": 1, - "maxLength": 40 } }, "required": [ "provider", - "apiKey" + "voiceId", + "language" ] }, - "CloudflareR2BucketPlan": { + "FallbackOpenAIVoice": { "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." + "cachingEnabled": { + "type": "boolean", + "description": "This is the flag to toggle voice caching for the assistant.", + "example": true, + "default": true }, - "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", + "description": "This is the voice provider that will be used.", "enum": [ - "cloudflare" - ], - "description": "Credential provider. Only allowed value is cloudflare" + "openai" + ] }, - "accountId": { - "type": "string", - "description": "Cloudflare Account Id." + "voiceId": { + "description": "This is the provider-specific ID that will be used.\nVoice availability depends on the selected model: voices offered only by GPT-Live are rejected for other models.", + "anyOf": [ + { + "type": "string", + "enum": [ + "alloy", + "echo", + "fable", + "onyx", + "nova", + "shimmer", + "marin", + "cedar", + "ash", + "ballad", + "beacon", + "bossa", + "brise", + "cinder", + "coral", + "delta", + "flitz", + "gleam", + "harema", + "juni", + "meridian", + "nira", + "noeul", + "nuri", + "quartz", + "ripple", + "sage", + "shida", + "sillage", + "stone", + "tempo", + "verse", + "vesper", + "willow" + ], + "title": "Preset Voice Options" + }, + { + "type": "string", + "title": "OpenAI Voice ID" + } + ] }, - "apiKey": { + "model": { "type": "string", - "description": "Cloudflare API Key / Token." + "description": "This is the model that will be used for text-to-speech.", + "enum": [ + "tts-1", + "tts-1-hd", + "gpt-4o-mini-tts" + ] }, - "accountEmail": { + "instructions": { "type": "string", - "description": "Cloudflare Account Email." + "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 }, - "fallbackIndex": { + "speed": { "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 the speed multiplier that will be used.", + "minimum": 0.25, + "maximum": 4, + "example": null }, - "bucketPlan": { - "description": "This is the bucket plan that can be provided to store call artifacts in R2", + "chunkPlan": { + "description": "This is the plan for chunking the model output before it is sent to the voice provider.", "allOf": [ { - "$ref": "#/components/schemas/CloudflareR2BucketPlan" + "$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" + "provider", + "voiceId" ] }, - "OAuth2AuthenticationPlan": { + "FallbackPlayHTVoice": { "type": "object", "properties": { - "type": { - "type": "string", - "enum": [ - "oauth2" - ] - }, - "url": { - "type": "string", - "description": "This is the OAuth2 URL." - }, - "clientId": { - "type": "string", - "description": "This is the OAuth2 client ID." - }, - "clientSecret": { - "type": "string", - "description": "This is the OAuth2 client secret." + "cachingEnabled": { + "type": "boolean", + "description": "This is the flag to toggle voice caching for the assistant.", + "example": true, + "default": true }, - "scope": { - "type": "string", - "description": "This is the scope of the OAuth2 token.", - "maxLength": 1000 - } - }, - "required": [ - "type", - "url", - "clientId", - "clientSecret" - ] - }, - "CreateCustomLLMCredentialDTO": { - "type": "object", - "properties": { "provider": { "type": "string", + "description": "This is the voice provider that will be used.", "enum": [ - "custom-llm" + "playht" ] }, - "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": [ + "voiceId": { + "description": "This is the provider-specific ID that will be used.", + "oneOf": [ { - "$ref": "#/components/schemas/OAuth2AuthenticationPlan" + "type": "string", + "enum": [ + "jennifer", + "melissa", + "will", + "chris", + "matt", + "jack", + "ruby", + "davis", + "donna", + "michael" + ], + "title": "Preset Voice Options" + }, + { + "type": "string", + "title": "PlayHT Voice ID" } ] }, - "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": { + "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": [ - "deepgram" - ] + "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 }, - "apiKey": { - "type": "string", - "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 }, - "apiUrl": { - "type": "string", - "description": "This can be used to point to an onprem Deepgram instance. Defaults to api.deepgram.com." + "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 }, - "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": { + "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": [ - "deepinfra" + "PlayHT2.0", + "PlayHT2.0-turbo", + "Play3.0-mini", + "PlayDialog" ] }, - "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" - ] - }, - "CreateDeepSeekCredentialDTO": { - "type": "object", - "properties": { - "provider": { + "language": { "type": "string", + "description": "The language to use for the speech.", "enum": [ - "deep-seek" + "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" ] }, - "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 + "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", - "apiKey" + "voiceId" ] }, - "CreateElevenLabsCredentialDTO": { + "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": [ - "11labs" + "rime-ai" ] }, - "apiKey": { - "type": "string", - "maxLength": 10000, - "description": "This is not returned in the API." + "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", + "clementine", + "walnut", + "eyre", + "bancroft", + "hesse", + "beatty", + "godfrey" + ], + "title": "Suggested Voice Options", + "description": "Popular Rime AI voices across mist, mistv2, mistv3, arcana, and coda 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." + } + ] }, - "apiUrl": { + "model": { "type": "string", + "description": "This is the model that will be used. Defaults to 'arcana' when not specified.", "enum": [ - "https://api.elevenlabs.io", - "https://api.eu.residency.elevenlabs.io" + "arcana", + "coda", + "mistv2", + "mistv3", + "mist" ], - "description": "ElevenLabs-only API environment for this key: the global endpoint or the EU data residency endpoint. In EU deployments, new credentials must explicitly use the EU data residency endpoint; existing credentials may omit this field on update to retain their saved endpoint. Outside EU deployments, Vapi detects an omitted endpoint automatically and null on update clears and re-detects the endpoint.", - "nullable": true - }, - "name": { - "type": "string", - "description": "This is the name of credential. This is just for your reference.", - "minLength": 1, - "maxLength": 40 - } - }, - "required": [ - "provider", - "apiKey" - ] - }, - "GcpKey": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "This is the type of the key. Most likely, this is \"service_account\"." - }, - "projectId": { - "type": "string", - "description": "This is the ID of the Google Cloud project associated with this key." - }, - "privateKeyId": { - "type": "string", - "description": "This is the unique identifier for the private key." - }, - "privateKey": { - "type": "string", - "description": "This is the private key in PEM format.\n\nNote: This is not returned in the API." + "example": "arcana" }, - "clientEmail": { - "type": "string", - "description": "This is the email address associated with the service account." + "speed": { + "type": "number", + "description": "This is the speed multiplier that will be used.", + "minimum": 0.1, + "example": null }, - "clientId": { - "type": "string", - "description": "This is the unique identifier for the client." + "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 }, - "authUri": { - "type": "string", - "description": "This is the URI for the auth provider's authorization endpoint." + "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 }, - "tokenUri": { - "type": "string", - "description": "This is the URI for the auth provider's token endpoint." + "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 }, - "authProviderX509CertUrl": { + "inlineSpeedAlpha": { "type": "string", - "description": "This is the URL of the public x509 certificate for the auth provider." + "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 }, - "clientX509CertUrl": { + "language": { "type": "string", - "description": "This is the URL of the public x509 certificate for the client." + "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" }, - "universeDomain": { - "type": "string", - "description": "This is the domain associated with the universe this service account belongs to." + "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": [ - "type", - "projectId", - "privateKeyId", - "privateKey", - "clientEmail", - "clientId", - "authUri", - "tokenUri", - "authProviderX509CertUrl", - "clientX509CertUrl", - "universeDomain" + "provider", + "voiceId" ] }, - "BucketPlan": { + "FallbackSesameVoice": { "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." + "cachingEnabled": { + "type": "boolean", + "description": "This is the flag to toggle voice caching for the assistant.", + "example": true, + "default": true }, - "path": { + "provider": { "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 \"/\"" + "description": "This is the voice provider that will be used.", + "enum": [ + "sesame" + ] }, - "hmacAccessKey": { + "voiceId": { "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." + "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)." }, - "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": { + "model": { "type": "string", + "description": "This is the model that will be used.", "enum": [ - "gcp" + "csm-1b" ] }, - "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 - }, - "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.", + "chunkPlan": { + "description": "This is the plan for chunking the model output before it is sent to the voice provider.", "allOf": [ { - "$ref": "#/components/schemas/GcpKey" + "$ref": "#/components/schemas/ChunkPlan" } ] - }, - "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" + "voiceId", + "model" ] }, - "CreateGladiaCredentialDTO": { + "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": [ - "gladia" + "smallest-ai" ] }, - "apiKey": { - "type": "string", - "description": "This is not returned in the API." + "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" + } + ] }, - "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": { + "model": { "type": "string", + "description": "Smallest AI voice model to use. Defaults to 'lightning' when not specified.", "enum": [ - "gohighlevel" + "lightning" ] }, - "apiKey": { - "type": "string", - "description": "This is not returned in the API." + "speed": { + "type": "number", + "description": "This is the speed multiplier that will be used.", + "example": null }, - "name": { - "type": "string", - "description": "This is the name of credential. This is just for your reference.", - "minLength": 1, - "maxLength": 40 + "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", - "apiKey" + "voiceId" ] }, - "CreateGroqCredentialDTO": { + "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": [ - "groq" + "tavus" ] }, - "apiKey": { - "type": "string", - "description": "This is not returned in the API." + "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" + } + ] }, - "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": { + "personaId": { "type": "string", - "enum": [ - "langfuse" - ] + "description": "This is the unique identifier for the persona that the replica will use in the conversation." }, - "publicKey": { + "callbackUrl": { "type": "string", - "description": "The public key for Langfuse project. Eg: pk-lf-..." + "description": "This is the url that will receive webhooks with updates regarding the conversation state." }, - "apiKey": { + "conversationName": { "type": "string", - "description": "The secret key for Langfuse project. Eg: sk-lf-... .This is not returned in the API." + "description": "This is the name for the conversation." }, - "apiUrl": { + "conversationalContext": { "type": "string", - "description": "The host URL for Langfuse project. Eg: https://cloud.langfuse.com" + "description": "This is the context that will be appended to any context provided in the persona, if one is provided." }, - "name": { + "customGreeting": { "type": "string", - "description": "This is the name of credential. This is just for your reference.", - "minLength": 1, - "maxLength": 40 + "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" + } + ] + }, + "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", - "publicKey", - "apiKey", - "apiUrl" + "voiceId" ] }, - "CreateLmntCredentialDTO": { + "FallbackVapiVoice": { "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" + "vapi" ] }, - "apiKey": { + "voiceId": { "type": "string", - "description": "This is not returned in the API." + "description": "The voice to use: a built-in Vapi voice name, or a cloned voice id (used with version 2).", + "example": "Clara" }, - "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": { - "type": "string", + "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": [ - "make" + "1", + "2", + "latest" + ], + "oneOf": [ + { + "type": "string", + "enum": [ + "1", + "2", + "latest" + ] + }, + { + "type": "number", + "enum": [ + 1, + 2 + ] + } ] }, - "teamId": { - "type": "string", - "description": "Team ID" + "speed": { + "type": "number", + "description": "This is the speed multiplier that will be used.\n\n@default 1", + "minimum": 0.25, + "maximum": 2, + "default": 1 }, - "region": { + "language": { "type": "string", - "description": "Region of your application. For example: eu1, eu2, us1, us2" + "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" + ] }, - "apiKey": { - "type": "string", - "description": "This is not returned in the API." + "pronunciationDictionary": { + "description": "List of pronunciation dictionary locators for custom word pronunciations.", + "type": "array", + "items": { + "$ref": "#/components/schemas/VapiPronunciationDictionaryLocator" + } }, - "name": { - "type": "string", - "description": "This is the name of credential. This is just for your reference.", - "minLength": 1, - "maxLength": 40 + "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", - "teamId", - "region", - "apiKey" + "voiceId" ] }, - "CreateOpenAICredentialDTO": { + "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": [ - "openai" + "inworld" ] }, - "apiKey": { + "voiceId": { "type": "string", - "description": "This is not returned in the API." + "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" }, - "name": { + "model": { "type": "string", - "description": "This is the name of credential. This is just for your reference.", - "minLength": 1, - "maxLength": 40 + "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" + } + ] } }, "required": [ "provider", - "apiKey" + "voiceId" ] }, - "CreateOpenRouterCredentialDTO": { + "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": [ - "openrouter" + "xai" ] }, - "apiKey": { + "voiceId": { "type": "string", - "description": "This is not returned in the API." + "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" }, - "name": { + "language": { "type": "string", - "description": "This is the name of credential. This is just for your reference.", - "minLength": 1, - "maxLength": 40 + "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" + } + ] } }, "required": [ "provider", - "apiKey" + "voiceId" ] }, - "CreatePerplexityAICredentialDTO": { + "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": [ - "perplexity-ai" + "microsoft" ] }, - "apiKey": { + "voiceId": { "type": "string", - "description": "This is not returned in the API." + "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" }, - "name": { + "style": { "type": "string", - "description": "This is the name of credential. This is just for your reference.", - "minLength": 1, - "maxLength": 40 + "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", - "apiKey" + "voiceId" ] }, - "CreatePlayHTCredentialDTO": { + "TransportConfigurationTwilio": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "playht" + "twilio" ] }, - "apiKey": { - "type": "string", - "description": "This is not returned in the API." + "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 }, - "userId": { - "type": "string" + "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 }, - "name": { + "recordingChannels": { "type": "string", - "description": "This is the name of credential. This is just for your reference.", - "minLength": 1, - "maxLength": 40 + "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", - "apiKey", - "userId" + "provider" ] }, - "CreateRimeAICredentialDTO": { + "CreateAnthropicCredentialDTO": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "rime-ai" + "anthropic" ] }, "apiKey": { "type": "string", + "maxLength": 10000, "description": "This is not returned in the API." }, "name": { @@ -34286,18 +35347,38 @@ "apiKey" ] }, - "CreateRunpodCredentialDTO": { + "CreateAnthropicBedrockCredentialDTO": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "runpod" + "anthropic-bedrock" ] }, - "apiKey": { + "region": { "type": "string", - "description": "This is not returned in the API." + "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": [ + { + "$ref": "#/components/schemas/AWSIAMCredentialsAuthenticationPlan" + }, + { + "$ref": "#/components/schemas/AWSStsAuthenticationPlan" + } + ] }, "name": { "type": "string", @@ -34308,43 +35389,23 @@ }, "required": [ "provider", - "apiKey" + "region", + "authenticationPlan" ] }, - "CreateS3CredentialDTO": { + "CreateAnyscaleCredentialDTO": { "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." + "anyscale" + ] }, - "s3PathPrefix": { + "apiKey": { "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." + "maxLength": 10000, + "description": "This is not returned in the API." }, "name": { "type": "string", @@ -34355,76 +35416,108 @@ }, "required": [ "provider", - "awsAccessKeyId", - "awsSecretAccessKey", - "region", - "s3BucketName", - "s3PathPrefix" + "apiKey" ] }, - "SupabaseBucketPlan": { + "CreateAssemblyAICredentialDTO": { "type": "object", "properties": { - "region": { + "provider": { "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" + "assembly-ai" ] }, - "url": { + "apiKey": { "type": "string", - "description": "This is the S3 compatible URL for Supabase S3\nThis should look like https://.supabase.co/storage/v1/s3" + "description": "This is not returned in the API." }, - "accessKeyId": { + "name": { "type": "string", - "description": "This is the Supabase S3 Access Key ID.\nThe user creates this in the Supabase project Storage settings" - }, - "secretAccessKey": { + "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 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 blob storage connection string for the Azure resource." }, - "name": { + "containerName": { "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 container name for the Azure blob storage." }, "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\"" + "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": [ - "region", - "url", - "accessKeyId", - "secretAccessKey", - "name" + "connectionString", + "containerName" ] }, - "CreateSupabaseCredentialDTO": { + "CreateAzureCredentialDTO": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "supabase" + "azure" + ] + }, + "service": { + "type": "string", + "description": "This is the service being used in Azure.", + "enum": [ + "speech", + "blob_storage" ], - "description": "This is for supabase storage." + "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", + "switzerlandnorth", + "switzerlandwest", + "uaenorth", + "uk", + "westeurope", + "westus", + "westus3" + ] + }, + "apiKey": { + "type": "string", + "description": "This is not returned in the API.", + "maxLength": 10000 }, "fallbackIndex": { "type": "number", @@ -34432,7 +35525,12 @@ "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" + "description": "This is the bucket plan that can be provided to store call artifacts in Azure Blob Storage.", + "allOf": [ + { + "$ref": "#/components/schemas/AzureBlobStorageBucketPlan" + } + ] }, "name": { "type": "string", @@ -34442,22 +35540,134 @@ } }, "required": [ - "provider" + "provider", + "service" ] }, - "CreateSmallestAICredentialDTO": { + "CreateAzureOpenAICredentialDTO": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "smallest-ai" + "azure-openai" ] }, - "apiKey": { + "region": { + "type": "string", + "enum": [ + "australiaeast", + "canadaeast", + "canadacentral", + "centralus", + "eastus2", + "eastus", + "france", + "germanywestcentral", + "india", + "japaneast", + "japanwest", + "northcentralus", + "norway", + "polandcentral", + "southcentralus", + "spaincentral", + "swedencentral", + "switzerland", + "switzerlandnorth", + "switzerlandwest", + "uaenorth", + "uk", + "westeurope", + "westus", + "westus3" + ] + }, + "models": { + "type": "array", + "enum": [ + "gpt-5.6-luna-2026-07-09", + "gpt-5.6-terra-2026-07-09", + "gpt-5.6-sol-2026-07-09", + "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.6-luna-2026-07-09", + "gpt-5.6-terra-2026-07-09", + "gpt-5.6-sol-2026-07-09", + "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", + "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.", @@ -34467,82 +35677,130 @@ }, "required": [ "provider", - "apiKey" + "region", + "models", + "openAIKey", + "openAIEndpoint" ] }, - "CreateTavusCredentialDTO": { + "SipTrunkGateway": { "type": "object", "properties": { - "provider": { + "ip": { "type": "string", - "enum": [ - "tavus" - ] + "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." }, - "apiKey": { - "type": "string", - "description": "This is not returned in the API." + "port": { + "type": "number", + "description": "This is the port number of the gateway. Default is 5060.\n\n@default 5060", + "minimum": 1, + "maximum": 65535 }, - "name": { + "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 name of credential. This is just for your reference.", - "minLength": 1, - "maxLength": 40 + "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": [ - "provider", - "apiKey" + "ip" ] }, - "CreateTogetherAICredentialDTO": { + "SipTrunkOutboundSipRegisterPlan": { "type": "object", "properties": { - "provider": { - "type": "string", - "enum": [ - "together-ai" - ] + "domain": { + "type": "string" }, - "apiKey": { + "username": { + "type": "string" + }, + "realm": { + "type": "string" + } + } + }, + "SipTrunkOutboundAuthenticationPlan": { + "type": "object", + "properties": { + "authPassword": { "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 + "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" + } + ] } - }, - "required": [ - "provider", - "apiKey" - ] + } }, - "CreateTwilioCredentialDTO": { + "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": [ - "twilio" + "byo-sip-trunk" ] }, - "authToken": { - "type": "string", - "description": "This is not returned in the API." + "gateways": { + "description": "This is the list of SIP trunk's gateways.", + "type": "array", + "items": { + "$ref": "#/components/schemas/SipTrunkGateway" + } }, - "apiKey": { - "type": "string", - "description": "This is not returned in the API." + "outboundAuthenticationPlan": { + "description": "This can be used to configure the outbound authentication if required by the SIP trunk.", + "allOf": [ + { + "$ref": "#/components/schemas/SipTrunkOutboundAuthenticationPlan" + } + ] }, - "apiSecret": { + "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 is not returned in the API." + "description": "This can be used to configure the tech prefix on outbound calls. This is an advanced property.", + "maxLength": 10000 }, - "accountSid": { - "type": "string" + "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", @@ -34552,25 +35810,25 @@ } }, "required": [ - "provider", - "accountSid" + "gateways" ] }, - "CreateVonageCredentialDTO": { + "CreateCartesiaCredentialDTO": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "vonage" + "cartesia" ] }, - "apiSecret": { + "apiKey": { "type": "string", "description": "This is not returned in the API." }, - "apiKey": { - "type": "string" + "apiUrl": { + "type": "string", + "description": "This can be used to point to an onprem Cartesia instance. Defaults to api.cartesia.ai." }, "name": { "type": "string", @@ -34581,67 +35839,71 @@ }, "required": [ "provider", - "apiSecret", "apiKey" ] }, - "CreateWebhookCredentialDTO": { + "CloudflareR2BucketPlan": { "type": "object", "properties": { - "provider": { + "accessKeyId": { "type": "string", - "enum": [ - "webhook" - ] + "description": "Cloudflare R2 Access key ID." }, - "authenticationPlan": { - "description": "This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication.", - "oneOf": [ - { - "$ref": "#/components/schemas/OAuth2AuthenticationPlan" - }, - { - "$ref": "#/components/schemas/HMACAuthenticationPlan" - }, - { - "$ref": "#/components/schemas/BearerAuthenticationPlan" - } - ], - "discriminator": { - "propertyName": "type", - "mapping": { - "oauth2": "#/components/schemas/OAuth2AuthenticationPlan", - "hmac": "#/components/schemas/HMACAuthenticationPlan", - "bearer": "#/components/schemas/BearerAuthenticationPlan" - } - } + "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 credential. This is just for your reference.", - "minLength": 1, - "maxLength": 40 + "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": [ - "provider", - "authenticationPlan" + "name" ] }, - "CreateXAiCredentialDTO": { + "CreateCloudflareCredentialDTO": { "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" - ] + "cloudflare" + ], + "description": "Credential provider. Only allowed value is cloudflare" + }, + "accountId": { + "type": "string", + "description": "Cloudflare Account Id." }, "apiKey": { "type": "string", - "maxLength": 10000, - "description": "This is not returned in the API." + "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" + } + ] }, "name": { "type": "string", @@ -34651,17 +35913,63 @@ } }, "required": [ - "provider", - "apiKey" + "provider" ] }, - "CreateGoogleCalendarOAuth2ClientCredentialDTO": { + "OAuth2AuthenticationPlan": { "type": "object", "properties": { - "provider": { + "type": { "type": "string", "enum": [ - "google.calendar.oauth2-client" + "oauth2" + ] + }, + "url": { + "type": "string", + "description": "This is the OAuth2 URL." + }, + "clientId": { + "type": "string", + "description": "This is the OAuth2 client ID." + }, + "clientSecret": { + "type": "string", + "description": "This is the OAuth2 client secret." + }, + "scope": { + "type": "string", + "description": "This is the scope of the OAuth2 token.", + "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." + }, + "authenticationPlan": { + "description": "This is the authentication plan. Currently supports OAuth2 RFC 6749. To use Bearer authentication, use apiKey", + "allOf": [ + { + "$ref": "#/components/schemas/OAuth2AuthenticationPlan" + } ] }, "name": { @@ -34672,21 +35980,26 @@ } }, "required": [ - "provider" + "provider", + "apiKey" ] }, - "CreateGoogleCalendarOAuth2AuthorizationCredentialDTO": { + "CreateDeepgramCredentialDTO": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "google.calendar.oauth2-authorization" + "deepgram" ] }, - "authorizationId": { + "apiKey": { "type": "string", - "description": "The authorization ID for the OAuth2 authorization" + "description": "This is not returned in the API." + }, + "apiUrl": { + "type": "string", + "description": "This can be used to point to an onprem Deepgram instance. Defaults to api.deepgram.com." }, "name": { "type": "string", @@ -34697,21 +36010,21 @@ }, "required": [ "provider", - "authorizationId" + "apiKey" ] }, - "CreateGoogleSheetsOAuth2AuthorizationCredentialDTO": { + "CreateDeepInfraCredentialDTO": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "google.sheets.oauth2-authorization" + "deepinfra" ] }, - "authorizationId": { + "apiKey": { "type": "string", - "description": "The authorization ID for the OAuth2 authorization" + "description": "This is not returned in the API." }, "name": { "type": "string", @@ -34722,21 +36035,21 @@ }, "required": [ "provider", - "authorizationId" + "apiKey" ] }, - "CreateSlackOAuth2AuthorizationCredentialDTO": { + "CreateDeepSeekCredentialDTO": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "slack.oauth2-authorization" + "deep-seek" ] }, - "authorizationId": { + "apiKey": { "type": "string", - "description": "The authorization ID for the OAuth2 authorization" + "description": "This is not returned in the API." }, "name": { "type": "string", @@ -34747,25 +36060,31 @@ }, "required": [ "provider", - "authorizationId" + "apiKey" ] }, - "CreateMinimaxCredentialDTO": { + "CreateElevenLabsCredentialDTO": { "type": "object", "properties": { "provider": { "type": "string", "enum": [ - "minimax" + "11labs" ] }, "apiKey": { "type": "string", + "maxLength": 10000, "description": "This is not returned in the API." }, - "groupId": { + "apiUrl": { "type": "string", - "description": "This is the Minimax Group ID." + "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. In EU deployments, new credentials must explicitly use the EU data residency endpoint; existing credentials may omit this field on update to retain their saved endpoint. Outside EU deployments, Vapi detects an omitted endpoint automatically and null on update clears and re-detects the endpoint.", + "nullable": true }, "name": { "type": "string", @@ -34776,1195 +36095,1122 @@ }, "required": [ "provider", - "apiKey", - "groupId" + "apiKey" ] }, - "EndpointedSpeechLowConfidenceOptions": { + "GcpKey": { "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 + "type": { + "type": "string", + "description": "This is the type of the key. Most likely, this is \"service_account\"." }, - "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 + "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." + }, + "clientId": { + "type": "string", + "description": "This is the unique identifier for the client." + }, + "authUri": { + "type": "string", + "description": "This is the URI for the auth provider's authorization endpoint." + }, + "tokenUri": { + "type": "string", + "description": "This is the URI for the auth provider's token endpoint." + }, + "authProviderX509CertUrl": { + "type": "string", + "description": "This is the URL of the public x509 certificate for the auth provider." + }, + "clientX509CertUrl": { + "type": "string", + "description": "This is the URL of the public x509 certificate for the client." + }, + "universeDomain": { + "type": "string", + "description": "This is the domain associated with the universe this service account belongs to." } - } + }, + "required": [ + "type", + "projectId", + "privateKeyId", + "privateKey", + "clientEmail", + "clientId", + "authUri", + "tokenUri", + "authProviderX509CertUrl", + "clientX509CertUrl", + "universeDomain" + ] }, - "CallHookTranscriberEndpointedSpeechLowConfidence": { + "BucketPlan": { "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" - } - ] - } + "name": { + "type": "string", + "description": "This is the name of the bucket." }, - "on": { + "region": { "type": "string", - "description": "This is the event that triggers this hook", - "maxLength": 1000 + "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." }, - "options": { - "description": "This is the options for the hook including confidence thresholds", + "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" + ] + }, + "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 + }, + "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/EndpointedSpeechLowConfidenceOptions" + "$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": [ - "do", - "on" + "provider", + "gcpKey" ] }, - "SessionCreatedHook": { + "CreateGladiaCredentialDTO": { "type": "object", "properties": { - "on": { + "provider": { "type": "string", - "description": "This is the event that triggers this hook", "enum": [ - "session.created" - ], - "maxLength": 1000 + "gladia" + ] }, - "do": { - "type": "array", - "description": "This is the set of actions to perform when the hook triggers.", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/ToolCallHookAction", - "title": "ToolCallHookAction" - } - ] - } + "apiKey": { + "type": "string", + "description": "This is not returned in the API." }, "name": { "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 + "description": "This is the name of credential. This is just for your reference.", + "minLength": 1, + "maxLength": 40 } }, "required": [ - "on", - "do" + "provider", + "apiKey" ] }, - "SQLInjectionSecurityFilter": { + "CreateGoHighLevelCredentialDTO": { "type": "object", "properties": { - "type": { + "provider": { "type": "string", - "description": "The type of security threat to filter.", "enum": [ - "sql-injection" + "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": [ - "type" + "provider", + "apiKey" ] }, - "XSSSecurityFilter": { + "CreateGroqCredentialDTO": { "type": "object", "properties": { - "type": { + "provider": { "type": "string", - "description": "The type of security threat to filter.", "enum": [ - "xss" + "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": [ - "type" + "provider", + "apiKey" ] }, - "SSRFSecurityFilter": { + "CreateLangfuseCredentialDTO": { "type": "object", "properties": { - "type": { + "provider": { "type": "string", - "description": "The type of security threat to filter.", "enum": [ - "ssrf" + "langfuse" ] + }, + "publicKey": { + "type": "string", + "description": "The public key for Langfuse project. Eg: pk-lf-..." + }, + "apiKey": { + "type": "string", + "description": "The secret key for Langfuse project. Eg: sk-lf-... .This is not returned in the API." + }, + "apiUrl": { + "type": "string", + "description": "The host URL for Langfuse project. Eg: https://cloud.langfuse.com" + }, + "name": { + "type": "string", + "description": "This is the name of credential. This is just for your reference.", + "minLength": 1, + "maxLength": 40 } }, "required": [ - "type" + "provider", + "publicKey", + "apiKey", + "apiUrl" ] }, - "RCESecurityFilter": { + "CreateLmntCredentialDTO": { "type": "object", "properties": { - "type": { + "provider": { "type": "string", - "description": "The type of security threat to filter.", "enum": [ - "rce" + "lmnt" ] + }, + "apiKey": { + "type": "string", + "description": "This is not returned in the API." + }, + "name": { + "type": "string", + "description": "This is the name of credential. This is just for your reference.", + "minLength": 1, + "maxLength": 40 } }, "required": [ - "type" + "provider", + "apiKey" ] }, - "PromptInjectionSecurityFilter": { + "CreateMakeCredentialDTO": { "type": "object", "properties": { - "type": { + "provider": { "type": "string", - "description": "The type of security threat to filter.", "enum": [ - "prompt-injection" + "make" ] + }, + "teamId": { + "type": "string", + "description": "Team ID" + }, + "region": { + "type": "string", + "description": "Region of your application. For example: eu1, eu2, us1, us2" + }, + "apiKey": { + "type": "string", + "description": "This is not returned in the API." + }, + "name": { + "type": "string", + "description": "This is the name of credential. This is just for your reference.", + "minLength": 1, + "maxLength": 40 } }, "required": [ - "type" + "provider", + "teamId", + "region", + "apiKey" ] }, - "RegexSecurityFilter": { + "CreateOpenAICredentialDTO": { "type": "object", "properties": { - "type": { + "provider": { "type": "string", - "description": "The type of security threat to filter.", "enum": [ - "regex" + "openai" ] }, - "regex": { + "apiKey": { "type": "string", - "description": "The regex pattern to filter.", - "example": "badword1|badword2" + "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": [ - "type", - "regex" + "provider", + "apiKey" ] }, - "AssistantOverrides": { + "CreateOpenRouterCredentialDTO": { "type": "object", "properties": { - "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" - } + "provider": { + "type": "string", + "enum": [ + "openrouter" ] }, - "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" - } + "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" ] }, - "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" - } + "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" ] }, - "firstMessage": { + "apiKey": { "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?" + "description": "This is not returned in the API." }, - "firstMessageInterruptionsEnabled": { - "type": "boolean", - "default": false + "userId": { + "type": "string" }, - "firstMessageMode": { + "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", - "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" - } + "rime-ai" ] }, - "clientMessages": { - "type": "array", + "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": [ - "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" - ] - } + "runpod" + ] }, - "serverMessages": { - "type": "array", + "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": [ - "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", - "call.artifact.upload" - ], - "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" + "s3" ], - "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", - "call.artifact.upload" - ] - } + "description": "Credential provider. Only allowed value is s3" }, - "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 + "awsAccessKeyId": { + "type": "string", + "description": "AWS access key ID." }, - "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://example.com/my-sound.mp3" - } - ] + "awsSecretAccessKey": { + "type": "string", + "description": "AWS access key secret. This is not returned in the API." }, - "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 + "region": { + "type": "string", + "description": "AWS region in which the S3 bucket is located." }, - "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" - } - ] - } + "s3BucketName": { + "type": "string", + "description": "AWS S3 bucket name." }, - "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/LangfuseObservabilityPlan" - } - ] + "s3PathPrefix": { + "type": "string", + "description": "The path prefix for the uploaded recording. Ex. \"recordings/\"" }, - "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" - } - } - } + "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." }, - "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, + "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" + ] }, - "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" - } - ] - } + "url": { + "type": "string", + "description": "This is the S3 compatible URL for Supabase S3\nThis should look like https://.supabase.co/storage/v1/s3" }, - "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" + "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" + ], + "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" + ] + }, + "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", + "apiKey" + ] + }, + "CreateTogetherAICredentialDTO": { + "type": "object", + "properties": { + "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 the assistant.\n\nThis is required when you want to transfer between assistants in a call.", + "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" + ] }, - "voicemailMessage": { + "authToken": { "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": "This is not returned in the API." }, - "endCallMessage": { + "apiKey": { "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 + "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 - } + "apiSecret": { + "type": "string", + "description": "This is not returned in the API." }, - "compliancePlan": { - "$ref": "#/components/schemas/CompliancePlan" + "accountSid": { + "type": "string" }, - "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", + "accountSid" + ] + }, + "CreateVonageCredentialDTO": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": [ + "vonage" + ] }, - "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" - } + "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" ] }, - "analysisPlan": { - "description": "This is the plan for analysis of assistant's calls. Stored in `call.analysis`.", - "deprecated": true, - "allOf": [ + "authenticationPlan": { + "description": "This is the authentication plan. Supports OAuth2 RFC 6749, HMAC signing, and Bearer authentication.", + "oneOf": [ { - "$ref": "#/components/schemas/AnalysisPlan" + "$ref": "#/components/schemas/OAuth2AuthenticationPlan" + }, + { + "$ref": "#/components/schemas/HMACAuthenticationPlan" + }, + { + "$ref": "#/components/schemas/BearerAuthenticationPlan" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "oauth2": "#/components/schemas/OAuth2AuthenticationPlan", + "hmac": "#/components/schemas/HMACAuthenticationPlan", + "bearer": "#/components/schemas/BearerAuthenticationPlan" } + } + }, + "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" ] }, - "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", + "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" ] }, - "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" - } + "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" ] }, - "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" - } + "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", + "authorizationId" + ] + }, + "CreateGoogleSheetsOAuth2AuthorizationCredentialDTO": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": [ + "google.sheets.oauth2-authorization" ] }, - "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" - } + "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", + "authorizationId" + ] + }, + "CreateSlackOAuth2AuthorizationCredentialDTO": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": [ + "slack.oauth2-authorization" ] }, - "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.", + "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", + "authorizationId" + ] + }, + "CreateMinimaxCredentialDTO": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": [ + "minimax" + ] + }, + "apiKey": { + "type": "string", + "description": "This is not returned in the API." + }, + "groupId": { + "type": "string", + "description": "This is the Minimax Group ID." + }, + "name": { + "type": "string", + "description": "This is the name of credential. This is just for your reference.", + "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 + }, + "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": { "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" + } + ] } }, - "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", + "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", "allOf": [ { - "$ref": "#/components/schemas/Server" + "$ref": "#/components/schemas/EndpointedSpeechLowConfidenceOptions" } ] + } + }, + "required": [ + "do", + "on" + ] + }, + "SessionCreatedHook": { + "type": "object", + "properties": { + "on": { + "type": "string", + "description": "This is the event that triggers this hook", + "enum": [ + "session.created" + ], + "maxLength": 1000 }, - "keypadInputPlan": { - "$ref": "#/components/schemas/KeypadInputPlan" + "do": { + "type": "array", + "description": "This is the set of actions to perform when the hook triggers.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/ToolCallHookAction", + "title": "ToolCallHookAction" + } + ] + } + }, + "name": { + "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": { + "type": "string", + "description": "The type of security threat to filter.", + "enum": [ + "sql-injection" + ] + } + }, + "required": [ + "type" + ] + }, + "XSSSecurityFilter": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The type of security threat to filter.", + "enum": [ + "xss" + ] + } + }, + "required": [ + "type" + ] + }, + "SSRFSecurityFilter": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The type of security threat to filter.", + "enum": [ + "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": [ + "type" + ] + }, + "RegexSecurityFilter": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The type of security threat to filter.", + "enum": [ + "regex" + ] + }, + "regex": { + "type": "string", + "description": "The regex pattern to filter.", + "example": "badword1|badword2" + } + }, + "required": [ + "type", + "regex" + ] }, "CreateAssistantDTO": { "type": "object", @@ -47729,7 +48975,7 @@ "description": "This is the assistant that will be used for the call. To use an existing assistant, use `assistantId` instead.\n\nTo start a call with:\n- Assistant, use `assistant`\n- Squad, use `squad`\n- Workflow, use `workflow`", "allOf": [ { - "$ref": "#/components/schemas/CreateAssistantDTO" + "$ref": "#/components/schemas/TransientAssistantDTO" } ] }, @@ -48338,7 +49584,7 @@ "description": "This is the assistant that will be used for the call. To use an existing assistant, use `assistantId` instead.\n\nTo start a call with:\n- Assistant, use `assistant`\n- Squad, use `squad`\n- Workflow, use `workflow`", "allOf": [ { - "$ref": "#/components/schemas/CreateAssistantDTO" + "$ref": "#/components/schemas/TransientAssistantDTO" } ] }, @@ -48541,7 +49787,7 @@ "description": "This is the assistant that will be used for the call. To use an existing assistant, use `assistantId` instead.\n\nTo start a call with:\n- Assistant, use `assistant`\n- Squad, use `squad`\n- Workflow, use `workflow`", "allOf": [ { - "$ref": "#/components/schemas/CreateAssistantDTO" + "$ref": "#/components/schemas/TransientAssistantDTO" } ] }, @@ -48644,7 +49890,7 @@ "description": "This is the assistant that will be used for the call. To use an existing assistant, use `assistantId` instead.\n\nTo start a call with:\n- Assistant, use `assistant`\n- Squad, use `squad`\n- Workflow, use `workflow`", "allOf": [ { - "$ref": "#/components/schemas/CreateAssistantDTO" + "$ref": "#/components/schemas/TransientAssistantDTO" } ] }, @@ -48902,7 +50148,7 @@ "description": "This is the assistant that will be used for the chat. To use an existing assistant, use `assistantId` instead.", "allOf": [ { - "$ref": "#/components/schemas/CreateAssistantDTO" + "$ref": "#/components/schemas/TransientAssistantDTO" } ] }, @@ -49147,7 +50393,7 @@ "description": "This is the assistant that will be used for the chat. To use an existing assistant, use `assistantId` instead.", "allOf": [ { - "$ref": "#/components/schemas/CreateAssistantDTO" + "$ref": "#/components/schemas/TransientAssistantDTO" } ] }, @@ -49406,7 +50652,7 @@ "description": "This is the assistant that will be used for the chat. To use an existing assistant, use `assistantId` instead.", "allOf": [ { - "$ref": "#/components/schemas/CreateAssistantDTO" + "$ref": "#/components/schemas/TransientAssistantDTO" } ] }, @@ -49580,7 +50826,7 @@ "description": "This is the transient assistant configuration for this chat. To use an existing assistant, use `assistantId` instead.", "allOf": [ { - "$ref": "#/components/schemas/CreateAssistantDTO" + "$ref": "#/components/schemas/TransientAssistantDTO" } ] }, @@ -49727,7 +50973,7 @@ "description": "This is the transient assistant configuration for this chat. To use an existing assistant, use `assistantId` instead.", "allOf": [ { - "$ref": "#/components/schemas/CreateAssistantDTO" + "$ref": "#/components/schemas/TransientAssistantDTO" } ] }, @@ -51202,7 +52448,7 @@ "description": "This is the assistant configuration for this session. Use this when creating a new assistant configuration.\nIf assistantId is provided, this will be ignored.", "allOf": [ { - "$ref": "#/components/schemas/CreateAssistantDTO" + "$ref": "#/components/schemas/TransientAssistantDTO" } ] }, @@ -51325,7 +52571,7 @@ "description": "This is the assistant configuration for this session. Use this when creating a new assistant configuration.\nIf assistantId is provided, this will be ignored.", "allOf": [ { - "$ref": "#/components/schemas/CreateAssistantDTO" + "$ref": "#/components/schemas/TransientAssistantDTO" } ] }, @@ -60644,7 +61890,7 @@ "description": "Pass a transient assistant to use for the test assistant.\n\nMake sure to write a detailed system prompt for a test assistant, and use the {{test.script}} variable to access the test script.", "allOf": [ { - "$ref": "#/components/schemas/CreateAssistantDTO" + "$ref": "#/components/schemas/TransientAssistantDTO" } ] }, @@ -61459,7 +62705,7 @@ "description": "This is the full assistant configuration for this personality.\nIt defines the tester's voice, model, behavior via system prompt, and other settings.", "allOf": [ { - "$ref": "#/components/schemas/CreateAssistantDTO" + "$ref": "#/components/schemas/TransientAssistantDTO" } ] }, @@ -61509,7 +62755,7 @@ "description": "This is the full assistant configuration for this personality.\nIt defines the tester's voice, model, behavior via system prompt, and other settings.", "allOf": [ { - "$ref": "#/components/schemas/CreateAssistantDTO" + "$ref": "#/components/schemas/TransientAssistantDTO" } ] }, @@ -61542,7 +62788,7 @@ "description": "Complete assistant replacement. Omitted credentials and redacted server secrets are preserved when their endpoint URL is unchanged. Send credentials: [] to clear credentials; omit a server container to remove it.", "allOf": [ { - "$ref": "#/components/schemas/CreateAssistantDTO" + "$ref": "#/components/schemas/TransientAssistantDTO" } ] }, @@ -62179,7 +63425,7 @@ "description": "Inline assistant configuration to test against. Cannot be combined with assistantId.", "allOf": [ { - "$ref": "#/components/schemas/CreateAssistantDTO" + "$ref": "#/components/schemas/TransientAssistantDTO" } ] } @@ -68217,13 +69463,13 @@ "description": "This is the transient assistant that will be run against the eval", "oneOf": [ { - "$ref": "#/components/schemas/CreateAssistantDTO", - "title": "CreateAssistantDTO" + "$ref": "#/components/schemas/TransientAssistantDTO", + "title": "TransientAssistantDTO" } ], "allOf": [ { - "$ref": "#/components/schemas/CreateAssistantDTO" + "$ref": "#/components/schemas/TransientAssistantDTO" } ] }, @@ -83177,7 +84423,7 @@ "description": "This is the assistant that will be used for the call. To use an existing assistant, use `assistantId` instead.\n\nTo start a call with:\n- Assistant, use `assistant`\n- Squad, use `squad`\n- Workflow, use `workflow`", "allOf": [ { - "$ref": "#/components/schemas/CreateAssistantDTO" + "$ref": "#/components/schemas/TransientAssistantDTO" } ] },