diff --git a/fern/apis/api/openapi.json b/fern/apis/api/openapi.json index 6dd509d73..7748d5731 100644 --- a/fern/apis/api/openapi.json +++ b/fern/apis/api/openapi.json @@ -3785,102 +3785,6 @@ ] } }, - "/tool/code/test": { - "post": { - "operationId": "ToolController_testCodeExecution", - "summary": "Test Code Tool Execution", - "parameters": [], - "responses": { - "200": { - "description": "Code execution test result", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "success": { - "type": "boolean" - }, - "result": { - "type": "object" - }, - "error": { - "type": "string" - }, - "logs": { - "type": "string" - }, - "executionTimeMs": { - "type": "number" - } - } - } - } - } - }, - "201": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object" - } - } - } - } - }, - "tags": [ - "Tools" - ], - "security": [ - { - "bearer": [] - } - ] - } - }, - "/tool/{id}/mcp-children": { - "post": { - "operationId": "ToolController_mcpChildToolsDiscover", - "summary": "Discover MCP Child Tools", - "parameters": [ - { - "name": "id", - "required": true, - "in": "path", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/McpTool" - } - } - } - } - }, - "201": { - "description": "" - } - }, - "tags": [ - "Tools" - ], - "security": [ - { - "bearer": [] - } - ] - } - }, "/file": { "post": { "operationId": "FileController_create", @@ -8171,6 +8075,7 @@ "enum": [ "auto", "ar", + "ar_en", "ba", "eu", "be", @@ -10225,6 +10130,7 @@ "enum": [ "auto", "ar", + "ar_en", "ba", "eu", "be", @@ -13702,6 +13608,42 @@ "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.", + "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" + } + ] + } + } + }, + "required": [ + "name" + ] + }, "McpToolMetadata": { "type": "object", "properties": { @@ -13757,6 +13699,13 @@ } ] }, + "toolMessages": { + "description": "Per-tool message overrides for individual tools loaded from the MCP server. Set messages to an empty array to suppress messages for a specific tool. Tools not listed here will use the default messages from the parent tool.", + "type": "array", + "items": { + "$ref": "#/components/schemas/McpToolMessages" + } + }, "metadata": { "$ref": "#/components/schemas/McpToolMetadata" }, @@ -15843,6 +15792,172 @@ "provider" ] }, + "MinimaxLLMModel": { + "type": "object", + "properties": { + "messages": { + "description": "This is the starting state for the conversation.", + "type": "array", + "items": { + "$ref": "#/components/schemas/OpenAIMessage" + } + }, + "tools": { + "type": "array", + "description": "These are the tools that the assistant can use during the call. To use existing tools, use `toolIds`.\n\nBoth `tools` and `toolIds` can be used together.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/CreateApiRequestToolDTO", + "title": "ApiRequestTool" + }, + { + "$ref": "#/components/schemas/CreateBashToolDTO", + "title": "BashTool" + }, + { + "$ref": "#/components/schemas/CreateCodeToolDTO", + "title": "CodeTool" + }, + { + "$ref": "#/components/schemas/CreateComputerToolDTO", + "title": "ComputerTool" + }, + { + "$ref": "#/components/schemas/CreateDtmfToolDTO", + "title": "DtmfTool" + }, + { + "$ref": "#/components/schemas/CreateEndCallToolDTO", + "title": "EndCallTool" + }, + { + "$ref": "#/components/schemas/CreateFunctionToolDTO", + "title": "FunctionTool" + }, + { + "$ref": "#/components/schemas/CreateGoHighLevelCalendarAvailabilityToolDTO", + "title": "GoHighLevelCalendarAvailabilityTool" + }, + { + "$ref": "#/components/schemas/CreateGoHighLevelCalendarEventCreateToolDTO", + "title": "GoHighLevelCalendarEventCreateTool" + }, + { + "$ref": "#/components/schemas/CreateGoHighLevelContactCreateToolDTO", + "title": "GoHighLevelContactCreateTool" + }, + { + "$ref": "#/components/schemas/CreateGoHighLevelContactGetToolDTO", + "title": "GoHighLevelContactGetTool" + }, + { + "$ref": "#/components/schemas/CreateGoogleCalendarCheckAvailabilityToolDTO", + "title": "GoogleCalendarCheckAvailabilityTool" + }, + { + "$ref": "#/components/schemas/CreateGoogleCalendarCreateEventToolDTO", + "title": "GoogleCalendarCreateEventTool" + }, + { + "$ref": "#/components/schemas/CreateGoogleSheetsRowAppendToolDTO", + "title": "GoogleSheetsRowAppendTool" + }, + { + "$ref": "#/components/schemas/CreateHandoffToolDTO", + "title": "HandoffTool" + }, + { + "$ref": "#/components/schemas/CreateMcpToolDTO", + "title": "McpTool" + }, + { + "$ref": "#/components/schemas/CreateQueryToolDTO", + "title": "QueryTool" + }, + { + "$ref": "#/components/schemas/CreateSlackSendMessageToolDTO", + "title": "SlackSendMessageTool" + }, + { + "$ref": "#/components/schemas/CreateSmsToolDTO", + "title": "SmsTool" + }, + { + "$ref": "#/components/schemas/CreateTextEditorToolDTO", + "title": "TextEditorTool" + }, + { + "$ref": "#/components/schemas/CreateTransferCallToolDTO", + "title": "TransferCallTool" + }, + { + "$ref": "#/components/schemas/CreateSipRequestToolDTO", + "title": "SipRequestTool" + }, + { + "$ref": "#/components/schemas/CreateVoicemailToolDTO", + "title": "VoicemailTool" + } + ] + } + }, + "toolIds": { + "description": "These are the tools that the assistant can use during the call. To use transient tools, use `tools`.\n\nBoth `tools` and `toolIds` can be used together.", + "type": "array", + "items": { + "type": "string" + } + }, + "knowledgeBase": { + "description": "These are the options for the knowledge base.", + "oneOf": [ + { + "$ref": "#/components/schemas/CreateCustomKnowledgeBaseDTO", + "title": "Custom" + } + ] + }, + "provider": { + "type": "string", + "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 to leverage caching for lower latency.", + "minimum": 0, + "maximum": 2 + }, + "maxTokens": { + "type": "number", + "description": "This is the max number of tokens that the assistant will be allowed to generate in each turn of the conversation. Default is 250.", + "minimum": 50, + "maximum": 10000 + }, + "emotionRecognitionEnabled": { + "type": "boolean", + "description": "This determines whether we detect user's emotion while they speak and send it as an additional info to model.\n\nDefault `false` because the model is usually are good at understanding the user's emotion from text.\n\n@default false" + }, + "numFastTurns": { + "type": "number", + "description": "This sets how many turns at the start of the conversation to use a smaller, faster model from the same provider before switching to the primary model. Example, gpt-3.5-turbo if provider is openai.\n\nDefault is 0.\n\n@default 0", + "minimum": 0 + } + }, + "required": [ + "provider", + "model" + ] + }, "OpenAIModel": { "type": "object", "properties": { @@ -15980,6 +16095,9 @@ "type": "string", "description": "This is the OpenAI model that will be used.\n\nWhen using Vapi OpenAI or your own Azure Credentials, you have the option to specify the region for the selected model. This shouldn't be specified unless you have a specific reason to do so. Vapi will automatically find the fastest region that make sense.\nThis is helpful when you are required to comply with Data Residency rules. Learn more about Azure regions here https://azure.microsoft.com/en-us/explore/global-infrastructure/data-residency/.\n\n@default undefined", "enum": [ + "gpt-5.4", + "gpt-5.4-mini", + "gpt-5.4-nano", "gpt-5.2", "gpt-5.2-chat-latest", "gpt-5.1", @@ -16107,6 +16225,9 @@ "items": { "type": "string", "enum": [ + "gpt-5.4", + "gpt-5.4-mini", + "gpt-5.4-nano", "gpt-5.2", "gpt-5.2-chat-latest", "gpt-5.1", @@ -16235,7 +16356,7 @@ }, "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.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')", + "description": "This controls the prompt cache retention policy for models that support extended caching (GPT-4.1, GPT-5 series).\n\n- `in_memory`: Default behavior, cache retained in GPU memory only\n- `24h`: Extended caching, keeps cached prefixes active for up to 24 hours by offloading to GPU-local storage\n\nOnly applies to models: gpt-5.4, gpt-5.4-mini, gpt-5.4-nano, gpt-5.2, gpt-5.1, gpt-5.1-codex, gpt-5.1-codex-mini, gpt-5.1-chat-latest, gpt-5, gpt-5-codex, gpt-4.1\n\n@default undefined (uses API default which is 'in_memory')", "enum": [ "in_memory", "24h" @@ -16804,6 +16925,9 @@ "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-5.4", + "gpt-5.4-mini", + "gpt-5.4-nano", "gpt-5.2", "gpt-5.2-chat-latest", "gpt-5.1", @@ -18841,11 +18965,13 @@ "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@default 2", + "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" @@ -18854,6 +18980,7 @@ }, "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" @@ -18862,6 +18989,7 @@ }, "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" @@ -18869,6 +18997,7 @@ }, "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" @@ -18877,6 +19006,7 @@ }, "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" @@ -22252,103 +22382,64 @@ { "type": "string", "enum": [ - "abbie", - "allison", - "ally", - "alona", - "amber", - "ana", - "antoine", - "armon", - "brenda", - "brittany", - "carol", - "colin", - "courtney", - "elena", - "elliot", + "cove", + "moon", + "wildflower", "eva", - "geoff", - "gerald", - "hank", + "amber", + "maya", + "lagoon", + "breeze", "helen", - "hera", - "jen", - "joe", "joy", - "juan", - "kendra", - "kendrick", - "kenneth", - "kevin", - "kris", - "linda", - "madison", - "marge", - "marina", - "marissa", - "marta", - "maya", - "nicholas", - "nyles", - "phil", - "reba", - "rex", - "rick", - "ritu", - "rob", - "rodney", - "rohan", - "rosco", - "samantha", - "sandy", - "selena", - "seth", - "sharon", - "stan", - "tamra", - "tanya", - "tibur", - "tj", - "tyler", - "viv", - "yadira", "marsh", - "bayou", "creek", - "brook", - "flower", - "spore", - "glacier", - "gulch", + "cedar", "alpine", - "cove", - "lagoon", - "tundra", - "steppe", - "mesa", - "grove", - "rainforest", + "summit", + "nicholas", + "tyler", + "colin", + "hank", + "thunder", + "astra", + "eucalyptus", "moraine", - "wildflower", "peak", - "boulder", - "gypsum", - "zest", + "tundra", + "mesa_extra", + "talon", + "marlu", + "glacier", + "falcon", "luna", "celeste", - "orion", - "ursa", - "astra", - "esther", "estelle", - "andromeda" + "andromeda", + "esther", + "lyra", + "lintel", + "oculus", + "vespera", + "transom", + "bond", + "arcade", + "atrium", + "cupola", + "fern", + "sirius", + "orion", + "masonry", + "albion", + "parapet" ], - "title": "Preset Voice Options" + "title": "Suggested Voice Options", + "description": "Popular Rime AI voices across mist, mistv2, and arcana models. Any valid Rime AI voice ID is accepted, not just these suggestions." }, { "type": "string", - "title": "RimeAI 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." } ] }, @@ -22388,6 +22479,24 @@ "description": "This is a string that allows inline speed control using alpha notation. https://docs.rime.ai/api-reference/endpoint/websockets#param-inline-speed-alpha", "example": null }, + "language": { + "type": "string", + "description": "Language for speech synthesis. Uses ISO 639 codes. Supported: en, es, de, fr, ar, hi, ja, he, pt, ta, si.", + "enum": [ + "en", + "es", + "de", + "fr", + "ar", + "hi", + "ja", + "he", + "pt", + "ta", + "si" + ], + "example": "en" + }, "chunkPlan": { "description": "This is the plan for chunking the model output before it is sent to the voice provider.", "allOf": [ @@ -22718,6 +22827,9 @@ "enum": [ "Clara", "Godfrey", + "Layla", + "Sid", + "Gustavo", "Elliot", "Kylie", "Rohan", @@ -22976,6 +23088,15 @@ "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", @@ -23120,6 +23241,15 @@ "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", @@ -24600,103 +24730,64 @@ { "type": "string", "enum": [ - "abbie", - "allison", - "ally", - "alona", - "amber", - "ana", - "antoine", - "armon", - "brenda", - "brittany", - "carol", - "colin", - "courtney", - "elena", - "elliot", + "cove", + "moon", + "wildflower", "eva", - "geoff", - "gerald", - "hank", + "amber", + "maya", + "lagoon", + "breeze", "helen", - "hera", - "jen", - "joe", "joy", - "juan", - "kendra", - "kendrick", - "kenneth", - "kevin", - "kris", - "linda", - "madison", - "marge", - "marina", - "marissa", - "marta", - "maya", - "nicholas", - "nyles", - "phil", - "reba", - "rex", - "rick", - "ritu", - "rob", - "rodney", - "rohan", - "rosco", - "samantha", - "sandy", - "selena", - "seth", - "sharon", - "stan", - "tamra", - "tanya", - "tibur", - "tj", - "tyler", - "viv", - "yadira", "marsh", - "bayou", "creek", - "brook", - "flower", - "spore", - "glacier", - "gulch", + "cedar", "alpine", - "cove", - "lagoon", - "tundra", - "steppe", - "mesa", - "grove", - "rainforest", + "summit", + "nicholas", + "tyler", + "colin", + "hank", + "thunder", + "astra", + "eucalyptus", "moraine", - "wildflower", "peak", - "boulder", - "gypsum", - "zest", + "tundra", + "mesa_extra", + "talon", + "marlu", + "glacier", + "falcon", "luna", "celeste", - "orion", - "ursa", - "astra", - "esther", "estelle", - "andromeda" + "andromeda", + "esther", + "lyra", + "lintel", + "oculus", + "vespera", + "transom", + "bond", + "arcade", + "atrium", + "cupola", + "fern", + "sirius", + "orion", + "masonry", + "albion", + "parapet" ], - "title": "Preset Voice Options" + "title": "Suggested Voice Options", + "description": "Popular Rime AI voices across mist, mistv2, and arcana models. Any valid Rime AI voice ID is accepted, not just these suggestions." }, { "type": "string", - "title": "RimeAI 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." } ] }, @@ -24736,6 +24827,24 @@ "description": "This is a string that allows inline speed control using alpha notation. https://docs.rime.ai/api-reference/endpoint/websockets#param-inline-speed-alpha", "example": null }, + "language": { + "type": "string", + "description": "Language for speech synthesis. Uses ISO 639 codes. Supported: en, es, de, fr, ar, hi, ja, he, pt, ta, si.", + "enum": [ + "en", + "es", + "de", + "fr", + "ar", + "hi", + "ja", + "he", + "pt", + "ta", + "si" + ], + "example": "en" + }, "chunkPlan": { "description": "This is the plan for chunking the model output before it is sent to the voice provider.", "allOf": [ @@ -24971,6 +25080,9 @@ "enum": [ "Clara", "Godfrey", + "Layla", + "Sid", + "Gustavo", "Elliot", "Kylie", "Rohan", @@ -25379,6 +25491,7 @@ "australiaeast", "canadaeast", "canadacentral", + "centralus", "eastus2", "eastus", "france", @@ -25445,6 +25558,7 @@ "australiaeast", "canadaeast", "canadacentral", + "centralus", "eastus2", "eastus", "france", @@ -25469,6 +25583,9 @@ "models": { "type": "array", "enum": [ + "gpt-5.4", + "gpt-5.4-mini", + "gpt-5.4-nano", "gpt-5.2", "gpt-5.2-chat", "gpt-5.1", @@ -25497,6 +25614,9 @@ "items": { "type": "string", "enum": [ + "gpt-5.4", + "gpt-5.4-mini", + "gpt-5.4-nano", "gpt-5.2", "gpt-5.2-chat", "gpt-5.1", @@ -27175,6 +27295,10 @@ "$ref": "#/components/schemas/InflectionAIModel", "title": "InflectionAI" }, + { + "$ref": "#/components/schemas/MinimaxLLMModel", + "title": "MiniMaxLLM" + }, { "$ref": "#/components/schemas/OpenAIModel", "title": "OpenAI" @@ -27324,6 +27448,7 @@ "type": "array", "enum": [ "conversation-update", + "assistant.speechStarted", "function-call", "function-call-result", "hang", @@ -27362,6 +27487,7 @@ "type": "string", "enum": [ "conversation-update", + "assistant.speechStarted", "function-call", "function-call-result", "hang", @@ -27386,6 +27512,7 @@ "type": "array", "enum": [ "assistant.started", + "assistant.speechStarted", "conversation-update", "end-of-call-report", "function-call", @@ -27430,6 +27557,7 @@ "type": "string", "enum": [ "assistant.started", + "assistant.speechStarted", "conversation-update", "end-of-call-report", "function-call", @@ -27979,6 +28107,7 @@ }, "analysisPlan": { "description": "This is the plan for analysis of assistant's calls. Stored in `call.analysis`.", + "deprecated": true, "allOf": [ { "$ref": "#/components/schemas/AnalysisPlan" @@ -28136,6 +28265,10 @@ "$ref": "#/components/schemas/InflectionAIModel", "title": "InflectionAI" }, + { + "$ref": "#/components/schemas/MinimaxLLMModel", + "title": "MiniMaxLLM" + }, { "$ref": "#/components/schemas/OpenAIModel", "title": "OpenAI" @@ -28285,6 +28418,7 @@ "type": "array", "enum": [ "conversation-update", + "assistant.speechStarted", "function-call", "function-call-result", "hang", @@ -28323,6 +28457,7 @@ "type": "string", "enum": [ "conversation-update", + "assistant.speechStarted", "function-call", "function-call-result", "hang", @@ -28347,6 +28482,7 @@ "type": "array", "enum": [ "assistant.started", + "assistant.speechStarted", "conversation-update", "end-of-call-report", "function-call", @@ -28391,6 +28527,7 @@ "type": "string", "enum": [ "assistant.started", + "assistant.speechStarted", "conversation-update", "end-of-call-report", "function-call", @@ -28837,6 +28974,7 @@ }, "analysisPlan": { "description": "This is the plan for analysis of assistant's calls. Stored in `call.analysis`.", + "deprecated": true, "allOf": [ { "$ref": "#/components/schemas/AnalysisPlan" @@ -28994,6 +29132,10 @@ "$ref": "#/components/schemas/InflectionAIModel", "title": "InflectionAI" }, + { + "$ref": "#/components/schemas/MinimaxLLMModel", + "title": "MiniMaxLLM" + }, { "$ref": "#/components/schemas/OpenAIModel", "title": "OpenAI" @@ -29143,6 +29285,7 @@ "type": "array", "enum": [ "conversation-update", + "assistant.speechStarted", "function-call", "function-call-result", "hang", @@ -29181,6 +29324,7 @@ "type": "string", "enum": [ "conversation-update", + "assistant.speechStarted", "function-call", "function-call-result", "hang", @@ -29205,6 +29349,7 @@ "type": "array", "enum": [ "assistant.started", + "assistant.speechStarted", "conversation-update", "end-of-call-report", "function-call", @@ -29249,6 +29394,7 @@ "type": "string", "enum": [ "assistant.started", + "assistant.speechStarted", "conversation-update", "end-of-call-report", "function-call", @@ -29695,6 +29841,7 @@ }, "analysisPlan": { "description": "This is the plan for analysis of assistant's calls. Stored in `call.analysis`.", + "deprecated": true, "allOf": [ { "$ref": "#/components/schemas/AnalysisPlan" @@ -29942,6 +30089,10 @@ "$ref": "#/components/schemas/InflectionAIModel", "title": "InflectionAI" }, + { + "$ref": "#/components/schemas/MinimaxLLMModel", + "title": "MiniMaxLLM" + }, { "$ref": "#/components/schemas/OpenAIModel", "title": "OpenAI" @@ -30091,6 +30242,7 @@ "type": "array", "enum": [ "conversation-update", + "assistant.speechStarted", "function-call", "function-call-result", "hang", @@ -30129,6 +30281,7 @@ "type": "string", "enum": [ "conversation-update", + "assistant.speechStarted", "function-call", "function-call-result", "hang", @@ -30153,6 +30306,7 @@ "type": "array", "enum": [ "assistant.started", + "assistant.speechStarted", "conversation-update", "end-of-call-report", "function-call", @@ -30197,6 +30351,7 @@ "type": "string", "enum": [ "assistant.started", + "assistant.speechStarted", "conversation-update", "end-of-call-report", "function-call", @@ -30643,6 +30798,7 @@ }, "analysisPlan": { "description": "This is the plan for analysis of assistant's calls. Stored in `call.analysis`.", + "deprecated": true, "allOf": [ { "$ref": "#/components/schemas/AnalysisPlan" @@ -33949,6 +34105,7 @@ "call.in-progress.error-providerfault-google-llm-failed", "call.in-progress.error-providerfault-xai-llm-failed", "call.in-progress.error-providerfault-mistral-llm-failed", + "call.in-progress.error-providerfault-minimax-llm-failed", "call.in-progress.error-providerfault-inflection-ai-llm-failed", "call.in-progress.error-providerfault-cerebras-llm-failed", "call.in-progress.error-providerfault-deep-seek-llm-failed", @@ -34038,6 +34195,19 @@ "call.in-progress.error-vapifault-mistral-429-exceeded-quota", "call.in-progress.error-providerfault-mistral-500-server-error", "call.in-progress.error-providerfault-mistral-503-server-overloaded-error", + "pipeline-error-minimax-400-bad-request-validation-failed", + "pipeline-error-minimax-401-unauthorized", + "pipeline-error-minimax-403-model-access-denied", + "pipeline-error-minimax-429-exceeded-quota", + "pipeline-error-minimax-500-server-error", + "pipeline-error-minimax-503-server-overloaded-error", + "pipeline-error-minimax-llm-failed", + "call.in-progress.error-vapifault-minimax-400-bad-request-validation-failed", + "call.in-progress.error-vapifault-minimax-401-unauthorized", + "call.in-progress.error-vapifault-minimax-403-model-access-denied", + "call.in-progress.error-vapifault-minimax-429-exceeded-quota", + "call.in-progress.error-providerfault-minimax-500-server-error", + "call.in-progress.error-providerfault-minimax-503-server-overloaded-error", "pipeline-error-inflection-ai-400-bad-request-validation-failed", "pipeline-error-inflection-ai-401-unauthorized", "pipeline-error-inflection-ai-403-model-access-denied", @@ -34651,6 +34821,107 @@ "errors" ] }, + "AssistantSpeechWordAlignmentTiming": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Discriminator for exact per-word timing (e.g. ElevenLabs alignment).", + "enum": [ + "word-alignment" + ] + }, + "words": { + "description": "The individual words in this audio segment.", + "type": "array", + "items": { + "type": "string" + } + }, + "wordsStartTimesMs": { + "description": "Start time in milliseconds for each word (parallel to `words`).", + "type": "array", + "items": { + "type": "number" + } + }, + "wordsEndTimesMs": { + "description": "End time in milliseconds for each word (parallel to `words`).", + "type": "array", + "items": { + "type": "number" + } + } + }, + "required": [ + "type", + "words", + "wordsStartTimesMs", + "wordsEndTimesMs" + ] + }, + "AssistantSpeechWordTimestamp": { + "type": "object", + "properties": { + "word": { + "type": "string", + "description": "The full word text (syllables aggregated into complete words)." + }, + "startMs": { + "type": "number", + "description": "Start time in milliseconds relative to the segment start." + }, + "endMs": { + "type": "number", + "description": "End time in milliseconds relative to the segment start." + } + }, + "required": [ + "word", + "startMs", + "endMs" + ] + }, + "AssistantSpeechWordProgressTiming": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Discriminator for cursor-based word progress (e.g. Minimax subtitle data).", + "enum": [ + "word-progress" + ] + }, + "wordsSpoken": { + "type": "number", + "description": "Number of words spoken so far in this turn." + }, + "totalWords": { + "type": "number", + "description": "Total number of words sent to the TTS provider for this turn.\n\n**Important**: this value grows across events within a single turn because\nMinimax synthesizes audio incrementally as the LLM streams tokens. Treat\nit as \"best known total so far\" — it will stabilize once synthesis is\ncomplete.\n\nA value of `0` is a valid sentinel meaning \"not yet known\". This can occur\non the very first `assistant-speech` event of a turn if audio begins\nplaying before the TTS provider has confirmed word-count data. Clients\n**must** guard against divide-by-zero when computing a progress fraction:\n\n```ts\nconst pct = totalWords > 0 ? wordsSpoken / totalWords : 0;\n```" + }, + "segment": { + "type": "string", + "description": "The text of the latest spoken segment (sentence or clause). Use this\nfor caption display — it corresponds to the chunk just confirmed by\nthe TTS provider, unlike `text` on the parent message which carries\nthe full turn text." + }, + "segmentDurationMs": { + "type": "number", + "description": "Audio duration in milliseconds for the latest spoken segment. Pair\nwith `segment` to animate karaoke-style word reveals — divide the\nsegment text across this duration for approximate per-word timing." + }, + "words": { + "description": "Per-word timestamps for the latest spoken segment. Available when the\nTTS provider supports word-level timing (e.g. Minimax with\nsubtitle_type: \"word\"). Syllables from the provider are aggregated\ninto whole words with start/end times relative to the segment start.\n\nUse these for precise karaoke-style highlighting instead of\ninterpolating from segmentDurationMs.", + "type": "array", + "items": { + "$ref": "#/components/schemas/AssistantSpeechWordTimestamp" + } + } + }, + "required": [ + "type", + "wordsSpoken", + "totalWords" + ] + }, "CreateCallDTO": { "type": "object", "properties": { @@ -40871,6 +41142,13 @@ } ] }, + "toolMessages": { + "description": "Per-tool message overrides for individual tools loaded from the MCP server. Set messages to an empty array to suppress messages for a specific tool. Tools not listed here will use the default messages from the parent tool.", + "type": "array", + "items": { + "$ref": "#/components/schemas/McpToolMessages" + } + }, "id": { "type": "string", "description": "This is the unique identifier for the tool." @@ -43050,6 +43328,13 @@ } ] }, + "toolMessages": { + "description": "Per-tool message overrides for individual tools loaded from the MCP server. Set messages to an empty array to suppress messages for a specific tool. Tools not listed here will use the default messages from the parent tool.", + "type": "array", + "items": { + "$ref": "#/components/schemas/McpToolMessages" + } + }, "rejectionPlan": { "description": "This is the plan to reject a tool call based on the conversation state.\n\n// Example 1: Reject endCall if user didn't say goodbye\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '(?i)\\\\b(bye|goodbye|farewell|see you later|take care)\\\\b',\n target: { position: -1, role: 'user' },\n negate: true // Reject if pattern does NOT match\n }]\n}\n```\n\n// Example 2: Reject transfer if user is actually asking a question\n```json\n{\n conditions: [{\n type: 'regex',\n regex: '\\\\?',\n target: { position: -1, role: 'user' }\n }]\n}\n```\n\n// Example 3: Reject transfer if user didn't mention transfer recently\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 5 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' %}\n{% assign mentioned = false %}\n{% for msg in userMessages %}\n {% if msg.content contains 'transfer' or msg.content contains 'connect' or msg.content contains 'speak to' %}\n {% assign mentioned = true %}\n {% break %}\n {% endif %}\n{% endfor %}\n{% if mentioned %}\n false\n{% else %}\n true\n{% endif %}`\n }]\n}\n```\n\n// Example 4: Reject endCall if the bot is looping and trying to exit\n```json\n{\n conditions: [{\n type: 'liquid',\n liquid: `{% assign recentMessages = messages | last: 6 %}\n{% assign userMessages = recentMessages | where: 'role', 'user' | reverse %}\n{% if userMessages.size < 3 %}\n false\n{% else %}\n {% assign msg1 = userMessages[0].content | downcase %}\n {% assign msg2 = userMessages[1].content | downcase %}\n {% assign msg3 = userMessages[2].content | downcase %}\n {% comment %} Check for repetitive messages {% endcomment %}\n {% if msg1 == msg2 or msg1 == msg3 or msg2 == msg3 %}\n true\n {% comment %} Check for common loop phrases {% endcomment %}\n {% elsif msg1 contains 'cool thanks' or msg2 contains 'cool thanks' or msg3 contains 'cool thanks' %}\n true\n {% elsif msg1 contains 'okay thanks' or msg2 contains 'okay thanks' or msg3 contains 'okay thanks' %}\n true\n {% elsif msg1 contains 'got it' or msg2 contains 'got it' or msg3 contains 'got it' %}\n true\n {% else %}\n false\n {% endif %}\n{% endif %}`\n }]\n}\n```", "allOf": [ @@ -45071,6 +45356,20 @@ ] } }, + "targetOverrides": { + "description": "Overrides to inject into the simulated target assistant or squad", + "example": { + "variableValues": { + "customerName": "Alice", + "orderId": "12345" + } + }, + "allOf": [ + { + "$ref": "#/components/schemas/AssistantOverrides" + } + ] + }, "toolMocks": { "description": "Scenario-level tool call mocks to use during simulations.", "type": "array", @@ -45150,6 +45449,20 @@ ] } }, + "targetOverrides": { + "description": "Overrides to inject into the simulated target assistant or squad", + "example": { + "variableValues": { + "customerName": "Alice", + "orderId": "12345" + } + }, + "allOf": [ + { + "$ref": "#/components/schemas/AssistantOverrides" + } + ] + }, "toolMocks": { "description": "Scenario-level tool call mocks to use during simulations.", "type": "array", @@ -45211,6 +45524,20 @@ ] } }, + "targetOverrides": { + "description": "Overrides to inject into the simulated target assistant or squad", + "example": { + "variableValues": { + "customerName": "Alice", + "orderId": "12345" + } + }, + "allOf": [ + { + "$ref": "#/components/schemas/AssistantOverrides" + } + ] + }, "toolMocks": { "type": "array", "items": { @@ -48976,6 +49303,9 @@ "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-5.4", + "gpt-5.4-mini", + "gpt-5.4-nano", "gpt-5.2", "gpt-5.2-chat-latest", "gpt-5.1", @@ -50172,7 +50502,8 @@ "daily", "default", "weekly", - "intuit" + "intuit", + "hcs" ] }, "billingLimit": { @@ -50541,7 +50872,8 @@ "daily", "default", "weekly", - "intuit" + "intuit", + "hcs" ] }, "billingLimit": { @@ -50604,7 +50936,8 @@ "daily", "default", "weekly", - "intuit" + "intuit", + "hcs" ] }, "billingLimit": { @@ -51193,6 +51526,7 @@ "australiaeast", "canadaeast", "canadacentral", + "centralus", "eastus2", "eastus", "france", @@ -51281,6 +51615,7 @@ "australiaeast", "canadaeast", "canadacentral", + "centralus", "eastus2", "eastus", "france", @@ -51305,6 +51640,9 @@ "models": { "type": "array", "enum": [ + "gpt-5.4", + "gpt-5.4-mini", + "gpt-5.4-nano", "gpt-5.2", "gpt-5.2-chat", "gpt-5.1", @@ -51333,6 +51671,9 @@ "items": { "type": "string", "enum": [ + "gpt-5.4", + "gpt-5.4-mini", + "gpt-5.4-nano", "gpt-5.2", "gpt-5.2-chat", "gpt-5.1", @@ -54577,6 +54918,7 @@ "australiaeast", "canadaeast", "canadacentral", + "centralus", "eastus2", "eastus", "france", @@ -54633,6 +54975,7 @@ "australiaeast", "canadaeast", "canadacentral", + "centralus", "eastus2", "eastus", "france", @@ -54657,6 +55000,9 @@ "models": { "type": "array", "enum": [ + "gpt-5.4", + "gpt-5.4-mini", + "gpt-5.4-nano", "gpt-5.2", "gpt-5.2-chat", "gpt-5.1", @@ -54685,6 +55031,9 @@ "items": { "type": "string", "enum": [ + "gpt-5.4", + "gpt-5.4-mini", + "gpt-5.4-nano", "gpt-5.2", "gpt-5.2-chat", "gpt-5.1", @@ -56785,6 +57134,10 @@ "type": "string", "description": "The preview URL of the voice." }, + "sortOrder": { + "type": "number", + "description": "The sort order of the voice for display purposes. Lower values appear first." + }, "description": { "type": "string", "description": "The description of the voice." @@ -58411,10 +58764,83 @@ } }, "required": [ - "type" + "type" + ] + }, + "ClientMessageLanguageChangeDetected": { + "type": "object", + "properties": { + "phoneNumber": { + "description": "This is the phone number that the message is associated with.", + "oneOf": [ + { + "$ref": "#/components/schemas/CreateByoPhoneNumberDTO", + "title": "ByoPhoneNumber" + }, + { + "$ref": "#/components/schemas/CreateTwilioPhoneNumberDTO", + "title": "TwilioPhoneNumber" + }, + { + "$ref": "#/components/schemas/CreateVonagePhoneNumberDTO", + "title": "VonagePhoneNumber" + }, + { + "$ref": "#/components/schemas/CreateVapiPhoneNumberDTO", + "title": "VapiPhoneNumber" + }, + { + "$ref": "#/components/schemas/CreateTelnyxPhoneNumberDTO", + "title": "TelnyxPhoneNumber" + } + ] + }, + "type": { + "type": "string", + "description": "This is the type of the message. \"language-change-detected\" is sent when the transcriber is automatically switched based on the detected language.", + "enum": [ + "language-change-detected" + ] + }, + "timestamp": { + "type": "number", + "description": "This is the timestamp of the message." + }, + "call": { + "description": "This is the call that the message is associated with.", + "allOf": [ + { + "$ref": "#/components/schemas/Call" + } + ] + }, + "customer": { + "description": "This is the customer that the message is associated with.", + "allOf": [ + { + "$ref": "#/components/schemas/CreateCustomerDTO" + } + ] + }, + "assistant": { + "description": "This is the assistant that the message is associated with.", + "allOf": [ + { + "$ref": "#/components/schemas/CreateAssistantDTO" + } + ] + }, + "language": { + "type": "string", + "description": "This is the language the transcriber is switched to." + } + }, + "required": [ + "type", + "language" ] }, - "ClientMessageLanguageChangeDetected": { + "ClientMessageVoiceInput": { "type": "object", "properties": { "phoneNumber": { @@ -58444,9 +58870,9 @@ }, "type": { "type": "string", - "description": "This is the type of the message. \"language-change-detected\" is sent when the transcriber is automatically switched based on the detected language.", + "description": "This is the type of the message. \"voice-input\" is sent when a generation is requested from voice provider.", "enum": [ - "language-change-detected" + "voice-input" ] }, "timestamp": { @@ -58477,17 +58903,17 @@ } ] }, - "language": { + "input": { "type": "string", - "description": "This is the language the transcriber is switched to." + "description": "This is the voice input content" } }, "required": [ "type", - "language" + "input" ] }, - "ClientMessageVoiceInput": { + "ClientMessageAssistantSpeech": { "type": "object", "properties": { "phoneNumber": { @@ -58517,11 +58943,44 @@ }, "type": { "type": "string", - "description": "This is the type of the message. \"voice-input\" is sent when a generation is requested from voice provider.", + "description": "This is the type of the message. \"assistant-speech\" is sent as assistant audio is being played.", "enum": [ - "voice-input" + "assistant.speechStarted" ] }, + "text": { + "type": "string", + "description": "The full assistant text for the current turn. This is the complete text,\nnot an incremental delta — consumers should use `timing` metadata (e.g.\n`wordsSpoken`) to determine which portion has been spoken so far." + }, + "turn": { + "type": "number", + "description": "This is the turn number of the assistant speech event (0-indexed)." + }, + "source": { + "type": "string", + "description": "Indicates how the text was sourced.", + "enum": [ + "model", + "force-say", + "custom-voice" + ] + }, + "timing": { + "description": "Optional timing metadata. Shape depends on `timing.type`:\n\n- `word-alignment` (ElevenLabs): per-character timing at playback\n cadence. words[] includes space entries. Best consumed by tracking\n a running character count: join timing.words, add to a char cursor,\n and highlight text up to that position. No interpolation needed.\n\n- `word-progress` (Minimax with voice.subtitleType: 'word'): cursor-\n based word count per TTS segment. Use wordsSpoken as the anchor,\n interpolate forward using segmentDurationMs or timing.words until\n the next event arrives.\n\nWhen absent, the event is a text-only fallback for providers without\nword-level timing (e.g. Cartesia, Deepgram, Azure). Text emits once\nper TTS chunk when audio is playing. Optionally interpolate a word\ncursor at ~3.5 words/sec between events for approximate tracking.", + "oneOf": [ + { + "$ref": "#/components/schemas/AssistantSpeechWordAlignmentTiming", + "title": "WordAlignmentTiming" + }, + { + "$ref": "#/components/schemas/AssistantSpeechWordProgressTiming", + "title": "WordProgressTiming" + } + ], + "discriminator": { + "propertyName": "type" + } + }, "timestamp": { "type": "number", "description": "This is the timestamp of the message." @@ -58549,15 +59008,11 @@ "$ref": "#/components/schemas/CreateAssistantDTO" } ] - }, - "input": { - "type": "string", - "description": "This is the voice input content" } }, "required": [ "type", - "input" + "text" ] }, "ClientMessageChatCreated": { @@ -59143,6 +59598,10 @@ "$ref": "#/components/schemas/ClientMessageVoiceInput", "title": "VoiceInput" }, + { + "$ref": "#/components/schemas/ClientMessageAssistantSpeech", + "title": "AssistantSpeech" + }, { "$ref": "#/components/schemas/ClientMessageChatCreated", "title": "ChatCreated" @@ -59559,6 +60018,7 @@ "call.in-progress.error-providerfault-google-llm-failed", "call.in-progress.error-providerfault-xai-llm-failed", "call.in-progress.error-providerfault-mistral-llm-failed", + "call.in-progress.error-providerfault-minimax-llm-failed", "call.in-progress.error-providerfault-inflection-ai-llm-failed", "call.in-progress.error-providerfault-cerebras-llm-failed", "call.in-progress.error-providerfault-deep-seek-llm-failed", @@ -59648,6 +60108,19 @@ "call.in-progress.error-vapifault-mistral-429-exceeded-quota", "call.in-progress.error-providerfault-mistral-500-server-error", "call.in-progress.error-providerfault-mistral-503-server-overloaded-error", + "pipeline-error-minimax-400-bad-request-validation-failed", + "pipeline-error-minimax-401-unauthorized", + "pipeline-error-minimax-403-model-access-denied", + "pipeline-error-minimax-429-exceeded-quota", + "pipeline-error-minimax-500-server-error", + "pipeline-error-minimax-503-server-overloaded-error", + "pipeline-error-minimax-llm-failed", + "call.in-progress.error-vapifault-minimax-400-bad-request-validation-failed", + "call.in-progress.error-vapifault-minimax-401-unauthorized", + "call.in-progress.error-vapifault-minimax-403-model-access-denied", + "call.in-progress.error-vapifault-minimax-429-exceeded-quota", + "call.in-progress.error-providerfault-minimax-500-server-error", + "call.in-progress.error-providerfault-minimax-503-server-overloaded-error", "pipeline-error-inflection-ai-400-bad-request-validation-failed", "pipeline-error-inflection-ai-401-unauthorized", "pipeline-error-inflection-ai-403-model-access-denied", @@ -60924,6 +61397,7 @@ "call.in-progress.error-providerfault-google-llm-failed", "call.in-progress.error-providerfault-xai-llm-failed", "call.in-progress.error-providerfault-mistral-llm-failed", + "call.in-progress.error-providerfault-minimax-llm-failed", "call.in-progress.error-providerfault-inflection-ai-llm-failed", "call.in-progress.error-providerfault-cerebras-llm-failed", "call.in-progress.error-providerfault-deep-seek-llm-failed", @@ -61013,6 +61487,19 @@ "call.in-progress.error-vapifault-mistral-429-exceeded-quota", "call.in-progress.error-providerfault-mistral-500-server-error", "call.in-progress.error-providerfault-mistral-503-server-overloaded-error", + "pipeline-error-minimax-400-bad-request-validation-failed", + "pipeline-error-minimax-401-unauthorized", + "pipeline-error-minimax-403-model-access-denied", + "pipeline-error-minimax-429-exceeded-quota", + "pipeline-error-minimax-500-server-error", + "pipeline-error-minimax-503-server-overloaded-error", + "pipeline-error-minimax-llm-failed", + "call.in-progress.error-vapifault-minimax-400-bad-request-validation-failed", + "call.in-progress.error-vapifault-minimax-401-unauthorized", + "call.in-progress.error-vapifault-minimax-403-model-access-denied", + "call.in-progress.error-vapifault-minimax-429-exceeded-quota", + "call.in-progress.error-providerfault-minimax-500-server-error", + "call.in-progress.error-providerfault-minimax-503-server-overloaded-error", "pipeline-error-inflection-ai-400-bad-request-validation-failed", "pipeline-error-inflection-ai-401-unauthorized", "pipeline-error-inflection-ai-403-model-access-denied", @@ -61633,9 +62120,219 @@ }, "type": { "type": "string", - "description": "This is the type of the message. \"transfer-destination-request\" is sent when the model is requesting transfer but destination is unknown.", + "description": "This is the type of the message. \"transfer-destination-request\" is sent when the model is requesting transfer but destination is unknown.", + "enum": [ + "transfer-destination-request" + ] + }, + "timestamp": { + "type": "number", + "description": "This is the timestamp of the message." + }, + "artifact": { + "description": "This is a live version of the `call.artifact`.\n\nThis matches what is stored on `call.artifact` after the call.", + "allOf": [ + { + "$ref": "#/components/schemas/Artifact" + } + ] + }, + "assistant": { + "description": "This is the assistant that the message is associated with.", + "allOf": [ + { + "$ref": "#/components/schemas/CreateAssistantDTO" + } + ] + }, + "customer": { + "description": "This is the customer that the message is associated with.", + "allOf": [ + { + "$ref": "#/components/schemas/CreateCustomerDTO" + } + ] + }, + "call": { + "description": "This is the call that the message is associated with.", + "allOf": [ + { + "$ref": "#/components/schemas/Call" + } + ] + }, + "chat": { + "description": "This is the chat object.", + "allOf": [ + { + "$ref": "#/components/schemas/Chat" + } + ] + } + }, + "required": [ + "type" + ] + }, + "ServerMessageTransferUpdate": { + "type": "object", + "properties": { + "phoneNumber": { + "description": "This is the phone number that the message is associated with.", + "oneOf": [ + { + "$ref": "#/components/schemas/CreateByoPhoneNumberDTO", + "title": "ByoPhoneNumber" + }, + { + "$ref": "#/components/schemas/CreateTwilioPhoneNumberDTO", + "title": "TwilioPhoneNumber" + }, + { + "$ref": "#/components/schemas/CreateVonagePhoneNumberDTO", + "title": "VonagePhoneNumber" + }, + { + "$ref": "#/components/schemas/CreateVapiPhoneNumberDTO", + "title": "VapiPhoneNumber" + }, + { + "$ref": "#/components/schemas/CreateTelnyxPhoneNumberDTO", + "title": "TelnyxPhoneNumber" + } + ] + }, + "type": { + "type": "string", + "description": "This is the type of the message. \"transfer-update\" is sent whenever a transfer happens.", + "enum": [ + "transfer-update" + ] + }, + "destination": { + "description": "This is the destination of the transfer.", + "oneOf": [ + { + "$ref": "#/components/schemas/TransferDestinationAssistant", + "title": "Assistant" + }, + { + "$ref": "#/components/schemas/TransferDestinationNumber", + "title": "Number" + }, + { + "$ref": "#/components/schemas/TransferDestinationSip", + "title": "Sip" + } + ] + }, + "timestamp": { + "type": "number", + "description": "This is the timestamp of the message." + }, + "artifact": { + "description": "This is a live version of the `call.artifact`.\n\nThis matches what is stored on `call.artifact` after the call.", + "allOf": [ + { + "$ref": "#/components/schemas/Artifact" + } + ] + }, + "assistant": { + "description": "This is the assistant that the message is associated with.", + "allOf": [ + { + "$ref": "#/components/schemas/CreateAssistantDTO" + } + ] + }, + "customer": { + "description": "This is the customer that the message is associated with.", + "allOf": [ + { + "$ref": "#/components/schemas/CreateCustomerDTO" + } + ] + }, + "call": { + "description": "This is the call that the message is associated with.", + "allOf": [ + { + "$ref": "#/components/schemas/Call" + } + ] + }, + "chat": { + "description": "This is the chat object.", + "allOf": [ + { + "$ref": "#/components/schemas/Chat" + } + ] + }, + "toAssistant": { + "description": "This is the assistant that the call is being transferred to. This is only sent if `destination.type` is \"assistant\".", + "allOf": [ + { + "$ref": "#/components/schemas/CreateAssistantDTO" + } + ] + }, + "fromAssistant": { + "description": "This is the assistant that the call is being transferred from. This is only sent if `destination.type` is \"assistant\".", + "allOf": [ + { + "$ref": "#/components/schemas/CreateAssistantDTO" + } + ] + }, + "toStepRecord": { + "type": "object", + "description": "This is the step that the conversation moved to." + }, + "fromStepRecord": { + "type": "object", + "description": "This is the step that the conversation moved from. =" + } + }, + "required": [ + "type" + ] + }, + "ServerMessageTranscript": { + "type": "object", + "properties": { + "phoneNumber": { + "description": "This is the phone number that the message is associated with.", + "oneOf": [ + { + "$ref": "#/components/schemas/CreateByoPhoneNumberDTO", + "title": "ByoPhoneNumber" + }, + { + "$ref": "#/components/schemas/CreateTwilioPhoneNumberDTO", + "title": "TwilioPhoneNumber" + }, + { + "$ref": "#/components/schemas/CreateVonagePhoneNumberDTO", + "title": "VonagePhoneNumber" + }, + { + "$ref": "#/components/schemas/CreateVapiPhoneNumberDTO", + "title": "VapiPhoneNumber" + }, + { + "$ref": "#/components/schemas/CreateTelnyxPhoneNumberDTO", + "title": "TelnyxPhoneNumber" + } + ] + }, + "type": { + "type": "string", + "description": "This is the type of the message. \"transcript\" is sent as transcriber outputs partial or final transcript.", "enum": [ - "transfer-destination-request" + "transcript", + "transcript[transcriptType=\"final\"]" ] }, "timestamp": { @@ -61681,13 +62378,51 @@ "$ref": "#/components/schemas/Chat" } ] + }, + "role": { + "type": "string", + "description": "This is the role for which the transcript is for.", + "enum": [ + "assistant", + "user" + ] + }, + "transcriptType": { + "type": "string", + "description": "This is the type of the transcript.", + "enum": [ + "partial", + "final" + ] + }, + "transcript": { + "type": "string", + "description": "This is the transcript content." + }, + "isFiltered": { + "type": "boolean", + "description": "Indicates if the transcript was filtered for security reasons." + }, + "detectedThreats": { + "description": "List of detected security threats if the transcript was filtered.", + "type": "array", + "items": { + "type": "string" + } + }, + "originalTranscript": { + "type": "string", + "description": "The original transcript before filtering (only included if content was filtered)." } }, "required": [ - "type" + "type", + "role", + "transcriptType", + "transcript" ] }, - "ServerMessageTransferUpdate": { + "ServerMessageUserInterrupted": { "type": "object", "properties": { "phoneNumber": { @@ -61717,27 +62452,14 @@ }, "type": { "type": "string", - "description": "This is the type of the message. \"transfer-update\" is sent whenever a transfer happens.", + "description": "This is the type of the message. \"user-interrupted\" is sent when the user interrupts the assistant.", "enum": [ - "transfer-update" + "user-interrupted" ] }, - "destination": { - "description": "This is the destination of the transfer.", - "oneOf": [ - { - "$ref": "#/components/schemas/TransferDestinationAssistant", - "title": "Assistant" - }, - { - "$ref": "#/components/schemas/TransferDestinationNumber", - "title": "Number" - }, - { - "$ref": "#/components/schemas/TransferDestinationSip", - "title": "Sip" - } - ] + "turnId": { + "type": "string", + "description": "This is the turnId of the LLM response that was interrupted. Matches the turnId\non model-output messages so clients can discard the interrupted turn's tokens." }, "timestamp": { "type": "number", @@ -61782,37 +62504,13 @@ "$ref": "#/components/schemas/Chat" } ] - }, - "toAssistant": { - "description": "This is the assistant that the call is being transferred to. This is only sent if `destination.type` is \"assistant\".", - "allOf": [ - { - "$ref": "#/components/schemas/CreateAssistantDTO" - } - ] - }, - "fromAssistant": { - "description": "This is the assistant that the call is being transferred from. This is only sent if `destination.type` is \"assistant\".", - "allOf": [ - { - "$ref": "#/components/schemas/CreateAssistantDTO" - } - ] - }, - "toStepRecord": { - "type": "object", - "description": "This is the step that the conversation moved to." - }, - "fromStepRecord": { - "type": "object", - "description": "This is the step that the conversation moved from. =" } }, "required": [ "type" ] }, - "ServerMessageTranscript": { + "ServerMessageLanguageChangeDetected": { "type": "object", "properties": { "phoneNumber": { @@ -61842,10 +62540,9 @@ }, "type": { "type": "string", - "description": "This is the type of the message. \"transcript\" is sent as transcriber outputs partial or final transcript.", + "description": "This is the type of the message. \"language-change-detected\" is sent when the transcriber is automatically switched based on the detected language.", "enum": [ - "transcript", - "transcript[transcriptType=\"final\"]" + "language-change-detected" ] }, "timestamp": { @@ -61892,50 +62589,17 @@ } ] }, - "role": { - "type": "string", - "description": "This is the role for which the transcript is for.", - "enum": [ - "assistant", - "user" - ] - }, - "transcriptType": { - "type": "string", - "description": "This is the type of the transcript.", - "enum": [ - "partial", - "final" - ] - }, - "transcript": { - "type": "string", - "description": "This is the transcript content." - }, - "isFiltered": { - "type": "boolean", - "description": "Indicates if the transcript was filtered for security reasons." - }, - "detectedThreats": { - "description": "List of detected security threats if the transcript was filtered.", - "type": "array", - "items": { - "type": "string" - } - }, - "originalTranscript": { + "language": { "type": "string", - "description": "The original transcript before filtering (only included if content was filtered)." + "description": "This is the language the transcriber is switched to." } }, "required": [ "type", - "role", - "transcriptType", - "transcript" + "language" ] }, - "ServerMessageUserInterrupted": { + "ServerMessageVoiceInput": { "type": "object", "properties": { "phoneNumber": { @@ -61965,15 +62629,11 @@ }, "type": { "type": "string", - "description": "This is the type of the message. \"user-interrupted\" is sent when the user interrupts the assistant.", + "description": "This is the type of the message. \"voice-input\" is sent when a generation is requested from voice provider.", "enum": [ - "user-interrupted" + "voice-input" ] }, - "turnId": { - "type": "string", - "description": "This is the turnId of the LLM response that was interrupted. Matches the turnId\non model-output messages so clients can discard the interrupted turn's tokens." - }, "timestamp": { "type": "number", "description": "This is the timestamp of the message." @@ -62017,13 +62677,18 @@ "$ref": "#/components/schemas/Chat" } ] + }, + "input": { + "type": "string", + "description": "This is the voice input content" } }, "required": [ - "type" + "type", + "input" ] }, - "ServerMessageLanguageChangeDetected": { + "ServerMessageAssistantSpeech": { "type": "object", "properties": { "phoneNumber": { @@ -62053,99 +62718,43 @@ }, "type": { "type": "string", - "description": "This is the type of the message. \"language-change-detected\" is sent when the transcriber is automatically switched based on the detected language.", + "description": "This is the type of the message. \"assistant-speech\" is sent as assistant audio is being played.", "enum": [ - "language-change-detected" - ] - }, - "timestamp": { - "type": "number", - "description": "This is the timestamp of the message." - }, - "artifact": { - "description": "This is a live version of the `call.artifact`.\n\nThis matches what is stored on `call.artifact` after the call.", - "allOf": [ - { - "$ref": "#/components/schemas/Artifact" - } - ] - }, - "assistant": { - "description": "This is the assistant that the message is associated with.", - "allOf": [ - { - "$ref": "#/components/schemas/CreateAssistantDTO" - } + "assistant.speechStarted" ] }, - "customer": { - "description": "This is the customer that the message is associated with.", - "allOf": [ - { - "$ref": "#/components/schemas/CreateCustomerDTO" - } - ] + "text": { + "type": "string", + "description": "The full assistant text for the current turn. This is the complete text,\nnot an incremental delta — consumers should use `timing` metadata (e.g.\n`wordsSpoken`) to determine which portion has been spoken so far." }, - "call": { - "description": "This is the call that the message is associated with.", - "allOf": [ - { - "$ref": "#/components/schemas/Call" - } - ] + "turn": { + "type": "number", + "description": "This is the turn number of the assistant speech event (0-indexed)." }, - "chat": { - "description": "This is the chat object.", - "allOf": [ - { - "$ref": "#/components/schemas/Chat" - } + "source": { + "type": "string", + "description": "Indicates how the text was sourced.", + "enum": [ + "model", + "force-say", + "custom-voice" ] }, - "language": { - "type": "string", - "description": "This is the language the transcriber is switched to." - } - }, - "required": [ - "type", - "language" - ] - }, - "ServerMessageVoiceInput": { - "type": "object", - "properties": { - "phoneNumber": { - "description": "This is the phone number that the message is associated with.", + "timing": { + "description": "Optional timing metadata. Shape depends on `timing.type`:\n\n- `word-alignment` (ElevenLabs): per-character timing at playback\n cadence. words[] includes space entries. Best consumed by tracking\n a running character count: join timing.words, add to a char cursor,\n and highlight text up to that position. No interpolation needed.\n\n- `word-progress` (Minimax with voice.subtitleType: 'word'): cursor-\n based word count per TTS segment. Use wordsSpoken as the anchor,\n interpolate forward using segmentDurationMs or timing.words until\n the next event arrives.\n\nWhen absent, the event is a text-only fallback for providers without\nword-level timing (e.g. Cartesia, Deepgram, Azure). Text emits once\nper TTS chunk when audio is playing. Optionally interpolate a word\ncursor at ~3.5 words/sec between events for approximate tracking.", "oneOf": [ { - "$ref": "#/components/schemas/CreateByoPhoneNumberDTO", - "title": "ByoPhoneNumber" - }, - { - "$ref": "#/components/schemas/CreateTwilioPhoneNumberDTO", - "title": "TwilioPhoneNumber" - }, - { - "$ref": "#/components/schemas/CreateVonagePhoneNumberDTO", - "title": "VonagePhoneNumber" - }, - { - "$ref": "#/components/schemas/CreateVapiPhoneNumberDTO", - "title": "VapiPhoneNumber" + "$ref": "#/components/schemas/AssistantSpeechWordAlignmentTiming", + "title": "WordAlignmentTiming" }, { - "$ref": "#/components/schemas/CreateTelnyxPhoneNumberDTO", - "title": "TelnyxPhoneNumber" + "$ref": "#/components/schemas/AssistantSpeechWordProgressTiming", + "title": "WordProgressTiming" } - ] - }, - "type": { - "type": "string", - "description": "This is the type of the message. \"voice-input\" is sent when a generation is requested from voice provider.", - "enum": [ - "voice-input" - ] + ], + "discriminator": { + "propertyName": "type" + } }, "timestamp": { "type": "number", @@ -62190,15 +62799,11 @@ "$ref": "#/components/schemas/Chat" } ] - }, - "input": { - "type": "string", - "description": "This is the voice input content" } }, "required": [ "type", - "input" + "text" ] }, "ServerMessageVoiceRequest": { @@ -63106,6 +63711,10 @@ "$ref": "#/components/schemas/ServerMessageVoiceInput", "title": "VoiceInput" }, + { + "$ref": "#/components/schemas/ServerMessageAssistantSpeech", + "title": "AssistantSpeech" + }, { "$ref": "#/components/schemas/ServerMessageVoiceRequest", "title": "VoiceRequest"