{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://raw.githubusercontent.com/api-evangelist/telnyx/main/json-schema/telnyx-inference-embedding-assistant-schema.json", "title": "inference-embedding_Assistant", "x-generated": "2026-10-08", "x-method": "derived", "x-generator": "derive-json-schema.py", "x-source": "openapi/telnyx-assistants-api-openapi.yml#/components/schemas/inference-embedding_Assistant", "properties": { "created_at": { "format": "date-time", "type": "string" }, "description": { "type": "string" }, "dynamic_variables": { "additionalProperties": true, "description": "Map of dynamic variables and their values", "type": "object" }, "dynamic_variables_webhook_timeout_ms": { "default": 1500, "description": "Timeout in milliseconds for the dynamic variables webhook. Must be between 1 and 10000 ms. If the webhook does not respond within this timeout, the call proceeds with default values. See the [dynamic variables guide](https://developers.telnyx.com/docs/inference/ai-assistants/dynamic-variables).", "maximum": 10000, "minimum": 1, "type": "integer" }, "dynamic_variables_webhook_url": { "description": "If `dynamic_variables_webhook_url` is set, Telnyx sends a POST request to this URL at the start of the conversation to resolve dynamic variables. **Gotcha:** the webhook response must wrap variables under a top-level `dynamic_variables` object, e.g. `{\"dynamic_variables\": {\"customer_name\": \"Jane\"}}`. Returning a flat object will be ignored and variables will fall back to their defaults. See the [dynamic variables guide](https://developers.telnyx.com/docs/inference/ai-assistants/dynamic-variables) for the full request/response format and timeout behavior.", "type": "string" }, "enabled_features": { "items": { "$ref": "#/$defs/EnabledFeatures" }, "title": "Enabled Features", "type": "array", "uniqueItems": true }, "external_llm": { "$ref": "#/$defs/ExternalLLM" }, "fallback_config": { "$ref": "#/$defs/FallbackConfig" }, "greeting": { "description": "Text that the assistant will use to start the conversation. This may be templated with [dynamic variables](https://developers.telnyx.com/docs/inference/ai-assistants/dynamic-variables). Use an empty string to have the assistant wait for the user to speak first. Use the special value `` to have the assistant generate the greeting based on the system instructions.", "type": "string" }, "id": { "type": "string" }, "import_metadata": { "$ref": "#/$defs/ImportMetadata" }, "insight_settings": { "$ref": "#/$defs/InsightSettings" }, "instructions": { "description": "System instructions for the assistant. These may be templated with [dynamic variables](https://developers.telnyx.com/docs/inference/ai-assistants/dynamic-variables)", "type": "string" }, "integrations": { "default": [], "description": "Connected integrations attached to the assistant. The catalog of available integrations is at `/ai/integrations`; the user's connected integrations are at `/ai/integrations/connections`. Each item references a catalog integration by `integration_id`.", "items": { "$ref": "#/$defs/AssistantIntegration" }, "type": "array" }, "interruption_settings": { "$ref": "#/$defs/inference-embedding_InterruptionSettings" }, "llm_api_key_ref": { "description": "This is only needed when using third-party inference providers selected by `model`. The `identifier` for an integration secret [/v2/integration_secrets](https://developers.telnyx.com/api-reference/integration-secrets/create-a-secret) that refers to your LLM provider's API key. For bring-your-own endpoint authentication, use `external_llm.llm_api_key_ref` instead. Warning: Free plans are unlikely to work with this integration.", "type": "string" }, "mcp_servers": { "default": [], "description": "MCP servers attached to the assistant. Create MCP servers with `/ai/mcp_servers`, then reference them by `id` here.", "items": { "$ref": "#/$defs/AssistantMCPServer" }, "type": "array" }, "messaging_settings": { "$ref": "#/$defs/MessagingSettings" }, "model": { "description": "ID of the model to use when `external_llm` is not set. You can use the [Get models API](https://developers.telnyx.com/api-reference/chat/get-available-models) to see available models. If `external_llm` is provided, the assistant uses `external_llm` instead of this field. If neither `model` nor `external_llm` is provided, Telnyx applies the default model.", "type": "string" }, "name": { "type": "string" }, "observability_settings": { "$ref": "#/$defs/Observability" }, "post_conversation_settings": { "$ref": "#/$defs/PostConversationSettings" }, "privacy_settings": { "$ref": "#/$defs/PrivacySettings" }, "related_mission_ids": { "default": [], "description": "IDs of missions related to this assistant.", "items": { "type": "string" }, "type": "array" }, "tags": { "default": [], "description": "Tags associated with the assistant. Tags can also be managed with the assistant tag endpoints.", "items": { "type": "string" }, "type": "array" }, "telephony_settings": { "$ref": "#/$defs/TelephonySettings" }, "tools": { "$ref": "#/$defs/AssistantTools", "description": "Deprecated for new integrations. Inline tool definitions available to the assistant. Prefer `tool_ids` to attach shared tools created with the AI Tools endpoints." }, "transcription": { "$ref": "#/$defs/TranscriptionSettings" }, "version_created_at": { "description": "Timestamp when this assistant version was created.", "format": "date-time", "type": "string" }, "version_id": { "description": "Identifier for the assistant version returned by version-aware assistant endpoints.", "type": "string" }, "version_name": { "default": "New assistant", "description": "Human-readable name for the assistant version.", "maxLength": 50, "type": "string" }, "voice_settings": { "$ref": "#/$defs/VoiceSettings" }, "widget_settings": { "$ref": "#/$defs/WidgetSettings" } }, "required": [ "id", "name", "created_at", "model", "instructions" ], "type": "object", "$defs": { "AssistantIntegration": { "description": "Reference to a connected integration attached to an assistant. Discover available integrations with `/ai/integrations` and connected integrations with `/ai/integrations/connections`.", "properties": { "allowed_list": { "description": "Optional per-assistant allowlist of integration tool names. When omitted or empty, all tools allowed by the connected integration are available to the assistant.", "items": { "type": "string" }, "type": "array" }, "integration_id": { "description": "Catalog integration ID to attach. This is the `id` from the integrations catalog at `/ai/integrations` (the same value also appears as `integration_id` on entries returned by `/ai/integrations/connections`). It is **not** the connection-level `id` from `/ai/integrations/connections`.", "type": "string" } }, "required": [ "integration_id" ], "title": "AssistantIntegration", "type": "object" }, "AssistantMCPServer": { "description": "Reference to an MCP server attached to an assistant. Create and manage MCP servers with the `/ai/mcp_servers` endpoints, then attach them to assistants by ID.", "properties": { "allowed_tools": { "description": "Optional per-assistant allowlist of MCP tool names. When omitted, the assistant uses the MCP server's configured `allowed_tools`.", "items": { "type": "string" }, "type": "array" }, "id": { "description": "ID of the MCP server to attach. This must be the `id` of an MCP server returned by the `/ai/mcp_servers` endpoints.", "type": "string" } }, "required": [ "id" ], "title": "AssistantMCPServer", "type": "object" }, "AssistantTools": { "description": "Deprecated for new integrations. Inline tool definitions available to the assistant. Prefer `tool_ids` to attach shared tools created with the AI Tools endpoints.", "items": { "oneOf": [ { "$ref": "#/$defs/inference-embedding_WebhookTool" }, { "$ref": "#/$defs/RetrievalTool" }, { "$ref": "#/$defs/HandoffTool" }, { "$ref": "#/$defs/HangupTool" }, { "$ref": "#/$defs/inference-embedding_TransferTool" }, { "$ref": "#/$defs/InviteTool" }, { "$ref": "#/$defs/SIPReferTool" }, { "$ref": "#/$defs/DTMFTool" }, { "$ref": "#/$defs/SendMessageTool" }, { "$ref": "#/$defs/SkipTurnTool" } ] }, "type": "array" }, "AudioVisualizerConfig": { "properties": { "color": { "description": "The color theme for the audio visualizer.", "enum": [ "verdant", "twilight", "bloom", "mystic", "flare", "glacier" ], "type": "string" }, "preset": { "description": "The preset style for the audio visualizer.", "type": "string" } }, "title": "AudioVisualizerConfig", "type": "object" }, "AuthenticationMethod": { "default": "token", "description": "Authentication method used when connecting to the external LLM endpoint.", "enum": [ "token", "certificate" ], "title": "AuthenticationMethod", "type": "string" }, "BucketIds": { "properties": { "bucket_ids": { "description": "List of [embedded storage buckets](https://developers.telnyx.com/api-reference/embeddings/embed-documents) to use for retrieval-augmented generation.", "items": { "type": "string" }, "type": "array" }, "max_num_results": { "description": "The maximum number of results to retrieve as context for the language model.", "type": "integer" } }, "required": [ "bucket_ids" ], "title": "BucketIds", "type": "object" }, "DTMFTool": { "properties": { "send_dtmf": { "additionalProperties": true, "type": "object" }, "type": { "enum": [ "send_dtmf" ], "type": "string" } }, "required": [ "type", "send_dtmf" ], "title": "DTMFTool", "type": "object" }, "EnabledFeatures": { "description": "If `telephony` is enabled, the assistant will be able to make and receive calls. If `messaging` is enabled, the assistant will be able to send and receive messages.", "enum": [ "telephony", "messaging" ], "type": "string" }, "ExternalLLM": { "properties": { "authentication_method": { "$ref": "#/$defs/AuthenticationMethod" }, "base_url": { "description": "Base URL for the external LLM endpoint.", "type": "string" }, "certificate_ref": { "description": "Integration secret identifier for the client certificate used with certificate authentication.", "type": "string" }, "forward_metadata": { "default": false, "description": "When `true`, Telnyx forwards the assistant's dynamic variables to the external LLM endpoint as a top-level `extra_metadata` object on the chat completion request body. Defaults to `false`. Example payload sent to the external endpoint: `{\"extra_metadata\": {\"customer_name\": \"Jane\", \"account_id\": \"acct_789\", \"telnyx_agent_target\": \"+13125550100\", \"telnyx_end_user_target\": \"+13125550123\"}}`. Distinct from OpenAI's native `metadata` field, which has its own size and type limits.", "type": "boolean" }, "llm_api_key_ref": { "description": "Integration secret identifier for the external LLM API key.", "type": "string" }, "model": { "description": "Model identifier to use with the external LLM endpoint.", "type": "string" }, "token_retrieval_url": { "description": "URL used to retrieve an access token when certificate authentication is enabled.", "type": "string" } }, "required": [ "model", "base_url" ], "title": "ExternalLLM", "type": "object" }, "FallbackConfig": { "properties": { "external_llm": { "$ref": "#/$defs/ExternalLLM" }, "llm_api_key_ref": { "description": "Integration secret identifier for the fallback model API key.", "type": "string" }, "model": { "description": "Fallback Telnyx-hosted model to use when the primary LLM provider is unavailable.", "type": "string" } }, "title": "FallbackConfig", "type": "object" }, "HandoffTool": { "description": "The handoff tool allows the assistant to hand off control of the conversation to another AI assistant. By default, this will happen transparently to the end user.", "properties": { "handoff": { "$ref": "#/$defs/HandoffToolParams" }, "type": { "enum": [ "handoff" ], "type": "string" } }, "required": [ "type", "handoff" ], "title": "HandoffTool", "type": "object" }, "HandoffToolParams": { "properties": { "ai_assistants": { "description": "List of possible assistants that can receive a handoff.", "items": { "properties": { "id": { "description": "The ID of the assistant to hand off to.", "type": "string" }, "name": { "description": "Helpful name for giving context on when to handoff to the assistant.", "type": "string" } }, "required": [ "name", "id" ], "type": "object" }, "type": "array" }, "voice_mode": { "description": "With the unified voice mode all assistants share the same voice, making the handoff transparent to the user. With the distinct voice mode all assistants retain their voice configuration, providing the experience of a conference call with a team of assistants.", "enum": [ "unified", "distinct" ], "type": "string" } }, "required": [ "ai_assistants" ], "title": "HandoffToolParams", "type": "object" }, "HangupTool": { "properties": { "hangup": { "$ref": "#/$defs/HangupToolParams" }, "type": { "enum": [ "hangup" ], "type": "string" } }, "required": [ "type", "hangup" ], "title": "HangupTool", "type": "object" }, "HangupToolParams": { "properties": { "description": { "default": "This tool is used to hang up the call.", "description": "The description of the function that will be passed to the assistant.", "type": "string" } }, "title": "HangupToolParams", "type": "object" }, "ImportMetadata": { "properties": { "import_id": { "description": "ID of the assistant in the provider's system.", "type": "string" }, "import_provider": { "description": "Provider the assistant was imported from.", "enum": [ "elevenlabs", "vapi", "retell" ], "type": "string" } }, "type": "object" }, "InferenceEmbeddingTransferToolParams": { "properties": { "custom_headers": { "description": "Custom headers to be added to the SIP INVITE for the transfer command.", "items": { "properties": { "name": { "type": "string" }, "value": { "description": "The value of the header. Note that we support mustache templating for the value. For example you can use `{{#integration_secret}}test-secret{{/integration_secret}}` to pass the value of the integration secret.", "type": "string" } }, "type": "object" }, "type": "array" }, "from": { "description": "Number or SIP URI placing the call.", "type": "string" }, "targets": { "description": "The different possible targets of the transfer. The assistant will be able to choose one of the targets to transfer the call to. This can also be a dynamic variable string like `{{ targets }}` where `targets` is returned by the dynamic variables webhook and resolves to an array of target objects at runtime.", "oneOf": [ { "items": { "properties": { "name": { "description": "The name of the target.", "type": "string" }, "to": { "description": "The destination number or SIP URI of the call.", "type": "string" } }, "required": [ "to" ], "type": "object" }, "type": "array" }, { "description": "A dynamic variable string like `{{ targets }}` where `targets` is returned by the dynamic variables webhook and resolves to an array of target objects at runtime.", "type": "string" } ] }, "voicemail_detection": { "description": "Configuration for voicemail detection (AMD - Answering Machine Detection) on the transferred call. Allows the assistant to detect when a voicemail system answers the transferred call and take appropriate action.", "properties": { "detection_config": { "description": "Advanced AMD detection configuration parameters. All values are optional - Telnyx will use defaults if not specified.", "properties": { "after_greeting_silence_millis": { "description": "Duration of silence after greeting detection before finalizing the result.", "maximum": 5000, "minimum": 100, "type": "integer" }, "between_words_silence_millis": { "description": "Maximum silence duration between words during greeting.", "maximum": 5000, "minimum": 10, "type": "integer" }, "greeting_duration_millis": { "description": "Expected duration of greeting speech.", "maximum": 10000, "minimum": 100, "type": "integer" }, "greeting_silence_duration_millis": { "description": "Duration of silence after the greeting to wait before considering the greeting complete.", "maximum": 50000, "minimum": 500, "type": "integer" }, "greeting_total_analysis_time_millis": { "description": "Maximum time to spend analyzing the greeting.", "maximum": 300000, "minimum": 500, "type": "integer" }, "initial_silence_millis": { "description": "Maximum silence duration at the start of the call before speech.", "maximum": 500000, "minimum": 100, "type": "integer" }, "maximum_number_of_words": { "description": "Maximum number of words expected in a human greeting.", "maximum": 50, "minimum": 1, "type": "integer" }, "maximum_word_length_millis": { "description": "Maximum duration of a single word.", "maximum": 5000, "minimum": 50, "type": "integer" }, "min_word_length_millis": { "description": "Minimum duration for audio to be considered a word.", "maximum": 1000, "minimum": 1, "type": "integer" }, "silence_threshold": { "description": "Audio level threshold for silence detection.", "maximum": 1000, "minimum": 1, "type": "integer" }, "total_analysis_time_millis": { "description": "Total time allowed for AMD analysis.", "maximum": 60000, "minimum": 500, "type": "integer" } }, "type": "object" }, "detection_mode": { "description": "The AMD detection mode to use. 'premium' enables premium answering machine detection. 'disabled' turns off AMD detection.", "enum": [ "disabled", "premium" ], "type": "string" }, "on_voicemail_detected": { "description": "Action to take when voicemail is detected on the transferred call.", "properties": { "action": { "description": "The action to take when voicemail is detected. 'stop_transfer' hangs up immediately. 'leave_message_and_stop_transfer' leaves a message then hangs up.", "enum": [ "stop_transfer", "leave_message_and_stop_transfer" ], "type": "string" }, "voicemail_message": { "description": "Configuration for the voicemail message to leave. Only applicable when action is 'leave_message_and_stop_transfer'.", "properties": { "message": { "description": "The specific message to leave as voicemail (converted to speech). Only applicable when type is 'message'.", "type": "string" }, "type": { "description": "The type of voicemail message. Use 'message' to leave a specific TTS message, or 'warm_transfer_instructions' to play the warm transfer audio.", "enum": [ "message", "warm_transfer_instructions" ], "type": "string" } }, "type": "object" } }, "type": "object" } }, "type": "object" }, "warm_message_delay_ms": { "description": "Optional delay in milliseconds before playing the warm message audio when the transferred call is answered. When set, the audio_url is not included in the dial command; instead, playback starts after the specified delay. When not set, existing behavior (audio_url in dial) is preserved.", "type": [ "integer", "null" ] }, "warm_transfer_instructions": { "description": "Natural language instructions for your agent for how to provide context for the transfer recipient.", "type": "string" } }, "required": [ "targets", "from" ], "title": "TransferToolParams", "type": "object" }, "InsightSettings": { "properties": { "insight_group_id": { "description": "Reference to an Insight Group. Insights in this group will be run automatically for all the assistant's conversations.", "type": "string" } }, "type": "object" }, "InviteTool": { "properties": { "invite": { "$ref": "#/$defs/InviteToolConfig", "title": "InviteToolConfig" }, "type": { "enum": [ "invite" ], "type": "string" } }, "required": [ "type", "invite" ], "title": "InviteTool", "type": "object" }, "InviteToolConfig": { "properties": { "custom_headers": { "description": "Custom headers to be added to the SIP INVITE for the invite command.", "items": { "properties": { "name": { "type": "string" }, "value": { "description": "The value of the header. Note that we support mustache templating for the value. For example you can use `{{#integration_secret}}test-secret{{/integration_secret}}` to pass the value of the integration secret.", "type": "string" } }, "type": "object" }, "type": "array" }, "from": { "description": "Number or SIP URI placing the call.", "type": "string" }, "targets": { "description": "The different possible targets of the invite. The assistant will be able to choose one of the targets to invite to the call. This can also be a dynamic variable string like `{{ targets }}` where `targets` is returned by the dynamic variables webhook and resolves to an array of target objects at runtime. If omitted or null, the invite tool can still be configured and targets may be supplied dynamically at runtime.", "oneOf": [ { "items": { "properties": { "name": { "description": "The name of the target.", "type": "string" }, "to": { "description": "The destination number or SIP URI of the call.", "type": "string" } }, "required": [ "to" ], "type": "object" }, "type": "array" }, { "description": "A dynamic variable string like `{{ targets }}` where `targets` is returned by the dynamic variables webhook and resolves to an array of target objects at runtime.", "type": "string" }, { "type": "null" } ] }, "voicemail_detection": { "description": "Configuration for voicemail detection (AMD - Answering Machine Detection) on the invited call.", "properties": { "detection_mode": { "description": "The AMD detection mode to use. 'premium' enables premium answering machine detection. 'disabled' turns off AMD detection.", "enum": [ "disabled", "premium" ], "type": "string" }, "on_voicemail_detected": { "description": "Action to take when voicemail is detected on the invited call.", "properties": { "action": { "description": "The action to take when voicemail is detected.", "enum": [ "stop_invite" ], "type": "string" } }, "type": "object" } }, "type": "object" } }, "required": [ "from" ], "title": "InviteToolConfig", "type": "object" }, "MessagingSettings": { "properties": { "conversation_inactivity_minutes": { "description": "If more than this many minutes have passed since the last message, the assistant will start a new conversation instead of continuing the existing one.", "maximum": 10000000, "minimum": 1, "type": "integer" }, "default_messaging_profile_id": { "description": "Default Messaging Profile used for messaging exchanges with your assistant. This will be created automatically on assistant creation.", "type": "string" }, "delivery_status_webhook_url": { "description": "The URL where webhooks related to delivery statused for assistant messages will be sent.", "type": "string" } }, "type": "object" }, "Observability": { "properties": { "host": { "title": "Host", "type": "string" }, "prompt_label": { "title": "Prompt Label", "type": "string" }, "prompt_name": { "title": "Prompt Name", "type": "string" }, "prompt_sync": { "$ref": "#/$defs/PromptSyncStatus", "default": "disabled" }, "prompt_version": { "minimum": 1.0, "title": "Prompt Version", "type": "integer" }, "public_key_ref": { "title": "Public Key Ref", "type": "string" }, "secret_key_ref": { "title": "Secret Key Ref", "type": "string" }, "status": { "$ref": "#/$defs/ObservabilityStatus", "default": "disabled" } }, "title": "Observability", "type": "object" }, "ObservabilityStatus": { "enum": [ "enabled", "disabled" ], "title": "ObservabilityStatus", "type": "string" }, "PostConversationSettings": { "description": "Configuration for post-conversation processing. When enabled, the assistant receives one additional LLM turn after the conversation ends, allowing it to execute tool calls such as logging to a CRM or sending a summary. The assistant can execute multiple parallel or sequential tools during this phase. Telephony-control tools (e.g. hangup, transfer) are unavailable post-conversation. Beta feature.", "properties": { "enabled": { "default": false, "description": "Whether post-conversation processing is enabled. When true, the assistant will be invoked after the conversation ends to perform any final tool calls. Defaults to false.", "type": "boolean" } }, "type": "object" }, "PrivacySettings": { "properties": { "data_retention": { "description": "If true, conversation history and insights will be stored. If false, they will not be stored. This in‑tool toggle governs solely the retention of conversation history and insights via the AI assistant. It has no effect on any separate recording, transcription, or storage configuration that you have set at the account, number, or application level. All such external settings remain in force regardless of your selection here.", "type": "boolean" } }, "type": "object" }, "PromptSyncStatus": { "description": "Whether to auto-publish the assistant's instructions as a Langfuse prompt.\n\nWhen ENABLED + prompt_name set, every assistant create/update pushes\n`instructions` to Langfuse via create_prompt and stores the returned\nversion in prompt_version.", "enum": [ "enabled", "disabled" ], "title": "PromptSyncStatus", "type": "string" }, "RetrievalTool": { "properties": { "retrieval": { "$ref": "#/$defs/BucketIds" }, "type": { "enum": [ "retrieval" ], "type": "string" } }, "required": [ "type", "retrieval" ], "title": "RetrievalTool", "type": "object" }, "SIPReferTool": { "properties": { "refer": { "$ref": "#/$defs/SIPReferToolParams" }, "type": { "enum": [ "refer" ], "type": "string" } }, "required": [ "type", "refer" ], "title": "SIPReferTool", "type": "object" }, "SIPReferToolParams": { "properties": { "custom_headers": { "description": "Custom headers to be added to the SIP REFER.", "items": { "properties": { "name": { "type": "string" }, "value": { "description": "The value of the header. Note that we support mustache templating for the value. For example you can use `{{#integration_secret}}test-secret{{/integration_secret}}` to pass the value of the integration secret.", "type": "string" } }, "type": "object" }, "type": "array" }, "sip_headers": { "description": "SIP headers to be added to the SIP REFER. Currently only User-to-User and Diversion headers are supported.", "items": { "properties": { "name": { "enum": [ "User-to-User", "Diversion" ], "type": "string" }, "value": { "description": "The value of the header. Note that we support mustache templating for the value. For example you can use `{{#integration_secret}}test-secret{{/integration_secret}}` to pass the value of the integration secret.", "type": "string" } }, "type": "object" }, "type": "array" }, "targets": { "description": "The different possible targets of the SIP refer. The assistant will be able to choose one of the targets to refer the call to.", "items": { "properties": { "name": { "description": "The name of the target.", "type": "string" }, "sip_address": { "description": "The SIP URI to which the call will be referred.", "type": "string" }, "sip_auth_password": { "description": "SIP Authentication password used for SIP challenges.", "type": "string" }, "sip_auth_username": { "description": "SIP Authentication username used for SIP challenges.", "type": "string" } }, "required": [ "name", "sip_address" ], "type": "object" }, "type": "array" } }, "required": [ "targets" ], "title": "SIPReferToolParams", "type": "object" }, "SendMessageTool": { "description": "The send_message tool allows the assistant to send SMS or MMS messages to the end user. The 'to' and 'from' addresses are automatically determined from the conversation context, and the message text is generated by the assistant unless a message_template is provided for runtime variable substitution.", "properties": { "send_message": { "additionalProperties": true, "properties": { "message_template": { "description": "Optional message template with dynamic variable support using mustache syntax (e.g., {{variable_name}}). When set, the assistant will use this template for the SMS body instead of generating one. Dynamic variables like {{telnyx_end_user_target}}, {{telnyx_agent_target}}, and custom webhook-provided variables will be resolved at runtime.", "type": [ "string", "null" ] } }, "type": "object" }, "type": { "enum": [ "send_message" ], "type": "string" } }, "required": [ "type", "send_message" ], "title": "SendMessageTool", "type": "object" }, "SkipTurnTool": { "properties": { "skip_turn": { "$ref": "#/$defs/SkipTurnToolParams" }, "type": { "enum": [ "skip_turn" ], "type": "string" } }, "required": [ "type", "skip_turn" ], "title": "SkipTurnTool", "type": "object" }, "SkipTurnToolParams": { "properties": { "description": { "default": "This tool is used to skip the assistant turn without producing a response.", "description": "The description of the function that will be passed to the assistant.", "type": "string" } }, "title": "SkipTurnToolParams", "type": "object" }, "StartSpeakingPlan": { "description": "Controls when the assistant starts speaking after the user stops. These thresholds primarily apply to non turn-taking transcription models. For turn-taking models like `deepgram/flux`, end-of-turn detection is driven by the transcription end-of-turn settings under `transcription.settings` instead.", "properties": { "transcription_endpointing_plan": { "$ref": "#/$defs/TranscriptionEndpointingPlan" }, "wait_seconds": { "default": 0.4, "description": "Minimum seconds to wait before the assistant starts speaking.", "format": "float", "minimum": 0.0, "type": "number" } }, "title": "StartSpeakingPlan", "type": "object" }, "TelephonySettings": { "properties": { "default_texml_app_id": { "description": "Default Texml App used for voice calls with your assistant. This will be created automatically on assistant creation.", "type": "string" }, "noise_suppression": { "description": "The noise suppression engine to use. Use 'disabled' to turn off noise suppression.", "enum": [ "krisp", "deepfilternet", "disabled" ], "type": "string" }, "noise_suppression_config": { "description": "Configuration for noise suppression. Only applicable when noise_suppression is 'deepfilternet'.", "properties": { "attenuation_limit": { "default": 100, "description": "Attenuation limit for noise suppression. Range: 0-100.", "maximum": 100, "minimum": 0, "type": "integer" }, "mode": { "description": "Mode for noise suppression configuration.", "enum": [ "advanced" ], "type": "string" } }, "type": "object" }, "recording_settings": { "description": "Configuration for call recording format and channel settings.", "properties": { "channels": { "default": "dual", "description": "The number of channels for the recording. 'single' for mono, 'dual' for stereo.", "enum": [ "single", "dual" ], "type": "string" }, "enabled": { "default": true, "description": "Whether call recording is enabled. When set to false, calls will not be recorded regardless of other recording configuration.", "type": "boolean" }, "format": { "default": "mp3", "description": "The format of the recording file.", "enum": [ "wav", "mp3" ], "type": "string" } }, "type": "object" }, "supports_unauthenticated_web_calls": { "description": "When enabled, allows users to interact with your AI assistant directly from your website without requiring authentication. This is required for FE widgets that work with assistants that have telephony enabled.", "type": "boolean" }, "time_limit_secs": { "default": 1800, "description": "Maximum duration in seconds for the AI assistant to participate on the call. When this limit is reached the assistant will be stopped. This limit does not apply to portions of a call without an active assistant (for instance, a call transferred to a human representative).", "maximum": 14400, "minimum": 30, "type": "integer" }, "user_idle_reply_secs": { "default": 10, "description": "Duration in seconds of end user silence before the assistant checks in on the user. When this limit is reached the assistant will prompt the user to respond. This is distinct from user_idle_timeout_secs which stops the assistant entirely.", "minimum": 0, "type": "integer" }, "user_idle_timeout_secs": { "description": "Maximum duration in seconds of end user silence on the call. When this limit is reached the assistant will be stopped. This limit does not apply to portions of a call without an active assistant (for instance, a call transferred to a human representative).", "maximum": 14400, "minimum": 10, "type": "integer" }, "voicemail_detection": { "description": "Configuration for voicemail detection (AMD - Answering Machine Detection) on outgoing calls. These settings only apply if AMD is enabled on the Dial command. See [TeXML Dial documentation](https://developers.telnyx.com/api-reference/texml-rest-commands/initiate-an-outbound-call) for enabling AMD. Recommended settings: MachineDetection=Enable, AsyncAmd=true, DetectionMode=Premium.", "properties": { "on_voicemail_detected": { "description": "Action to take when voicemail is detected.", "properties": { "action": { "description": "The action to take when voicemail is detected.", "enum": [ "stop_assistant", "leave_message_and_stop_assistant", "continue_assistant" ], "type": "string" }, "voicemail_message": { "description": "Configuration for the voicemail message to leave. Only applicable when action is 'leave_message_and_stop_assistant'.", "properties": { "message": { "description": "The specific message to leave as voicemail. Only applicable when type is 'message'.", "type": "string" }, "prompt": { "description": "The prompt to use for generating the voicemail message. Only applicable when type is 'prompt'.", "type": "string" }, "type": { "description": "The type of voicemail message. Use 'prompt' to have the assistant generate a message based on a prompt, or 'message' to leave a specific message.", "enum": [ "prompt", "message" ], "type": "string" } }, "type": "object" } }, "type": "object" } }, "type": "object" } }, "title": "TelephonySettings", "type": "object" }, "TranscriptionEndpointingPlan": { "description": "Endpointing thresholds used to decide when the user has finished speaking. Applies to non turn-taking transcription models. For `deepgram/flux`, use `transcription.settings.eot_threshold` / `eot_timeout_ms` / `eager_eot_threshold`.", "properties": { "on_no_punctuation_seconds": { "default": 1.5, "description": "Seconds to wait after the transcript ends without punctuation.", "format": "float", "type": "number" }, "on_number_seconds": { "default": 0.5, "description": "Seconds to wait after the transcript ends with a number.", "format": "float", "type": "number" }, "on_punctuation_seconds": { "default": 0.1, "description": "Seconds to wait after the transcript ends with punctuation.", "format": "float", "type": "number" } }, "title": "TranscriptionEndpointingPlan", "type": "object" }, "TranscriptionSettings": { "properties": { "api_key_ref": { "description": "Integration secret identifier for the transcription provider API key. Currently used for Azure transcription regions that require a customer-provided API key.", "title": "Api Key Ref", "type": "string" }, "language": { "description": "The language of the audio to be transcribed. If not set, or if set to `auto`, supported models will automatically detect the language. For `deepgram/flux`, supported values are: `auto` (Telnyx language detection controls the language hint), `multi` (no language hint), and language-specific hints `en`, `es`, `fr`, `de`, `hi`, `ru`, `pt`, `ja`, `it`, and `nl`.", "type": "string" }, "model": { "description": "The speech to text model to be used by the voice assistant. All Deepgram models are run on-premise.\n\n- `deepgram/flux` is optimized for turn-taking with multilingual language hints.\n- `deepgram/nova-3` is multilingual with automatic language detection.\n- `deepgram/nova-2` is Deepgram's previous-generation multilingual model.\n- `azure/fast` is a multilingual Azure transcription model.\n- `assemblyai/universal-streaming` is a multilingual streaming model with configurable turn detection.\n- `xai/grok-stt` is a multilingual Grok STT model.", "enum": [ "deepgram/flux", "deepgram/nova-3", "deepgram/nova-2", "azure/fast", "assemblyai/universal-streaming", "xai/grok-stt", "distil-whisper/distil-large-v2", "openai/whisper-large-v3-turbo" ], "type": "string" }, "region": { "description": "Region on third party cloud providers (currently Azure) if using one of their models. Some regions require `api_key_ref`.", "title": "Region", "type": "string" }, "settings": { "$ref": "#/$defs/TranscriptionSettingsConfig" } }, "type": "object" }, "TranscriptionSettingsConfig": { "properties": { "eager_eot_threshold": { "default": 0.4, "description": "Available only for deepgram/flux. Confidence threshold for eager end of turn detection. Must be lower than or equal to eot_threshold. Setting this equal to eot_threshold effectively disables eager end of turn.", "maximum": 0.9, "minimum": 0.3, "title": "Eager Eot Threshold", "type": "number" }, "end_of_turn_confidence_threshold": { "default": 0.4, "description": "Available only for assemblyai/universal-streaming. Confidence level required to trigger an end of turn. Higher values require more certainty before ending a turn.", "maximum": 1, "minimum": 0, "title": "End Of Turn Confidence Threshold", "type": "number" }, "eot_threshold": { "default": 0.8, "description": "Available only for deepgram/flux. Confidence required to trigger an end of turn. Higher values = more reliable turn detection but slightly increased latency.", "maximum": 0.9, "minimum": 0.5, "title": "Eot Threshold", "type": "number" }, "eot_timeout_ms": { "default": 5000, "description": "Available only for deepgram/flux. Maximum milliseconds of silence before forcing an end of turn, regardless of confidence.", "maximum": 10000, "minimum": 500, "title": "Eot Timeout Ms", "type": "integer" }, "keyterm": { "description": "Available only for deepgram/nova-3 and deepgram/flux. A comma-separated list of key terms to boost for recognition during transcription. Helps improve accuracy for domain-specific terminology, proper nouns, or uncommon words. This field may be templated with [dynamic variables](https://developers.telnyx.com/docs/inference/ai-assistants/dynamic-variables) using mustache syntax (e.g. `Telnyx,{{customer_name}},VoIP`). Variables are resolved at call time before the value is sent to the speech-to-text engine.", "title": "Keyterm", "type": "string" }, "max_turn_silence": { "default": 1280, "description": "Available only for assemblyai/universal-streaming. Maximum duration of silence in milliseconds before forcing an end of turn.", "maximum": 5000, "minimum": 100, "title": "Max Turn Silence", "type": "integer" }, "min_turn_silence": { "default": 400, "description": "Available only for assemblyai/universal-streaming. Minimum duration of silence in milliseconds before a turn can end. Must be less than or equal to max_turn_silence.", "maximum": 5000, "minimum": 100, "title": "Min Turn Silence", "type": "integer" }, "numerals": { "title": "Numerals", "type": "boolean" }, "smart_format": { "title": "Smart Format", "type": "boolean" } }, "title": "TranscriptionSettingsConfig", "type": "object" }, "VoiceSettings": { "properties": { "api_key_ref": { "description": "The `identifier` for an integration secret [/v2/integration_secrets](https://developers.telnyx.com/api-reference/integration-secrets/create-a-secret) that refers to your ElevenLabs API key. Warning: Free plans are unlikely to work with this integration.", "type": "string" }, "background_audio": { "description": "Optional background audio to play on the call. Use a predefined media bed, or supply a looped MP3 URL. If a media URL is chosen in the portal, customers can preview it before saving.", "oneOf": [ { "properties": { "type": { "description": "Select from predefined media options.", "enum": [ "predefined_media" ], "type": "string" }, "value": { "default": "silence", "description": "The predefined media to use. `silence` disables background audio.", "enum": [ "silence", "office" ], "type": "string" } }, "required": [ "type", "value" ], "type": "object" }, { "properties": { "type": { "description": "Provide a direct URL to an MP3 file. The audio will loop during the call.", "enum": [ "media_url" ], "type": "string" }, "value": { "description": "HTTPS URL to an MP3 file.", "format": "uri", "type": "string" } }, "required": [ "type", "value" ], "type": "object" }, { "properties": { "type": { "description": "Reference a previously uploaded media by its name from Telnyx Media Storage.", "enum": [ "media_name" ], "type": "string" }, "value": { "description": "The `name` of a media asset created via [Media Storage API](https://developers.telnyx.com/api/media-storage/create-media-storage). The audio will loop during the call.", "type": "string" } }, "required": [ "type", "value" ], "type": "object" } ] }, "expressive_mode": { "default": false, "description": "Enables emotionally expressive speech using SSML emotion tags. When enabled, the assistant uses audio tags like angry, excited, content, and sad to add emotional nuance. Only supported for Telnyx Ultra voices.", "type": "boolean" }, "language_boost": { "default": null, "description": "Enhances recognition for specific languages and dialects during MiniMax TTS synthesis. Default is null (no boost). Set to 'auto' for automatic language detection. Only applicable when using MiniMax voices.", "enum": [ null, "auto", "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" ], "type": [ "string", "null" ] }, "similarity_boost": { "default": 0.75, "description": "Determines how closely the AI should adhere to the original voice when attempting to replicate it. Only applicable when using ElevenLabs.", "type": "number" }, "speed": { "default": 1.0, "description": "Adjusts speech velocity. 1.0 is default speed; values less than 1.0 slow speech; values greater than 1.0 accelerate it. Only applicable when using ElevenLabs.", "type": "number" }, "style": { "default": 0, "description": "Determines the style exaggeration of the voice. Amplifies speaker style but consumes additional resources when set above 0. Only applicable when using ElevenLabs.", "type": "number" }, "temperature": { "default": 0.5, "description": "Determines how stable the voice is and the randomness between each generation. Lower values create a broader emotional range; higher values produce more consistent, monotonous output. Only applicable when using ElevenLabs.", "type": "number" }, "use_speaker_boost": { "default": true, "description": "Amplifies similarity to the original speaker voice. Increases computational load and latency slightly. Only applicable when using ElevenLabs.", "type": "boolean" }, "voice": { "description": "The voice to be used by the voice assistant. Check the full list of [available voices](https://developers.telnyx.com/docs/tts-stt/tts-available-voices) via our voices API.\nTo use ElevenLabs, you must reference your ElevenLabs API key as an integration secret under the `api_key_ref` field. See [integration secrets documentation](https://developers.telnyx.com/api-reference/integration-secrets/create-a-secret) for details. For Telnyx voices, use `Telnyx..` (e.g. Telnyx.KokoroTTS.af_heart).\nThe voice portion of the identifier supports [dynamic variables](https://developers.telnyx.com/docs/inference/ai-assistants/dynamic-variables) using mustache syntax (e.g. `Telnyx.Ultra.{{voice_id}}`). The variable is resolved at call time from your dynamic variables webhook, allowing you to select the voice dynamically per call.", "type": "string" }, "voice_speed": { "default": 1, "description": "The speed of the voice in the range [0.25, 2.0]. 1.0 is deafult speed. Larger numbers make the voice faster, smaller numbers make it slower. This is only applicable for Telnyx Natural voices.", "type": "number" } }, "required": [ "voice" ], "type": "object" }, "WebhookToolParams": { "properties": { "async": { "default": false, "description": "If async, the assistant will move forward without waiting for your server to respond.", "type": "boolean" }, "body_parameters": { "description": "The body parameters the webhook tool accepts, described as a JSON Schema object. These parameters will be passed to the webhook as the body of the request. See the [JSON Schema reference](https://json-schema.org/understanding-json-schema) for documentation about the format", "properties": { "properties": { "additionalProperties": true, "description": "The properties of the body parameters.", "type": "object" }, "required": { "description": "The required properties of the body parameters.", "items": { "type": "string" }, "type": "array" }, "type": { "enum": [ "object" ], "type": "string" } }, "type": "object" }, "description": { "description": "The description of the tool.", "type": "string" }, "headers": { "description": "The headers to be sent to the external tool.", "items": { "properties": { "name": { "type": "string" }, "value": { "description": "The value of the header. Note that we support mustache templating for the value. For example you can use `Bearer {{#integration_secret}}test-secret{{/integration_secret}}` to pass the value of the integration secret as the bearer token. [Telnyx signature headers](https://developers.telnyx.com/docs/voice/programmable-voice/voice-api-webhooks) will be automatically added to the request.", "type": "string" } }, "type": "object" }, "type": "array" }, "method": { "default": "POST", "description": "The HTTP method to be used when calling the external tool.", "enum": [ "GET", "POST", "PUT", "DELETE", "PATCH" ], "type": "string" }, "name": { "description": "The name of the tool.", "type": "string" }, "path_parameters": { "description": "The path parameters the webhook tool accepts, described as a JSON Schema object. These parameters will be passed to the webhook as the path of the request if the URL contains a placeholder for a value. See the [JSON Schema reference](https://json-schema.org/understanding-json-schema) for documentation about the format", "properties": { "properties": { "additionalProperties": true, "description": "The properties of the path parameters.", "type": "object" }, "required": { "description": "The required properties of the path parameters.", "items": { "type": "string" }, "type": "array" }, "type": { "enum": [ "object" ], "type": "string" } }, "type": "object" }, "query_parameters": { "description": "The query parameters the webhook tool accepts, described as a JSON Schema object. These parameters will be passed to the webhook as the query of the request. See the [JSON Schema reference](https://json-schema.org/understanding-json-schema) for documentation about the format", "properties": { "properties": { "additionalProperties": true, "description": "The properties of the query parameters.", "type": "object" }, "required": { "description": "The required properties of the query parameters.", "items": { "type": "string" }, "type": "array" }, "type": { "enum": [ "object" ], "type": "string" } }, "type": "object" }, "store_fields_as_variables": { "description": "A list of mappings that extract values from the webhook response and store them as dynamic variables. Each mapping specifies a dynamic variable name and a dot-notation path to the value in the response body.", "items": { "additionalProperties": false, "properties": { "name": { "description": "The name of the dynamic variable to store the extracted value in.", "minLength": 1, "type": "string" }, "value_path": { "description": "A dot-notation path to the value in the webhook response body (e.g. 'customer.name' or 'id').", "minLength": 1, "type": "string" } }, "required": [ "name", "value_path" ], "type": "object" }, "type": "array" }, "timeout_ms": { "description": "The maximum number of milliseconds to wait for the webhook to respond. Only applicable when async is false.", "maximum": 10000, "minimum": 500, "type": "integer" }, "url": { "description": "The URL of the external tool to be called. This URL is going to be used by the assistant. The URL can be templated like: `https://example.com/api/v1/{id}`, where `{id}` is a placeholder for a value that will be provided by the assistant if `path_parameters` are provided with the `id` attribute.", "type": "string" } }, "required": [ "url", "name", "description" ], "title": "WebhookToolParams", "type": "object" }, "WidgetSettings": { "description": "Configuration settings for the assistant's web widget.", "properties": { "agent_thinking_text": { "description": "Text displayed while the agent is processing.", "type": "string" }, "audio_visualizer_config": { "$ref": "#/$defs/AudioVisualizerConfig" }, "default_state": { "description": "The default state of the widget.", "enum": [ "expanded", "collapsed" ], "type": "string" }, "give_feedback_url": { "description": "URL for users to give feedback.", "type": [ "string", "null" ] }, "logo_icon_url": { "description": "URL to a custom logo icon for the widget.", "type": [ "string", "null" ] }, "position": { "description": "The positioning style for the widget.", "enum": [ "fixed", "static" ], "type": "string" }, "report_issue_url": { "description": "URL for users to report issues.", "type": [ "string", "null" ] }, "speak_to_interrupt_text": { "description": "Text prompting users to speak to interrupt.", "type": "string" }, "start_call_text": { "description": "Custom text displayed on the start call button.", "type": "string" }, "theme": { "description": "The visual theme for the widget.", "enum": [ "light", "dark" ], "type": "string" }, "view_history_url": { "description": "URL to view conversation history.", "type": [ "string", "null" ] } }, "title": "WidgetSettings", "type": "object" }, "inference-embedding_InterruptionSettings": { "description": "Settings for interruptions and how the assistant decides the user has finished speaking. These timings are most relevant when using non turn-taking transcription models. For turn-taking models like `deepgram/flux`, end-of-turn behavior is controlled by the transcription end-of-turn settings under `transcription.settings` (`eot_threshold`, `eot_timeout_ms`, `eager_eot_threshold`).", "properties": { "disable_greeting_interruption": { "description": "When true, disables user interruptions while the assistant greeting is playing.", "type": "boolean" }, "enable": { "default": true, "description": "Whether users can interrupt the assistant while it is speaking.", "type": "boolean" }, "start_speaking_plan": { "$ref": "#/$defs/StartSpeakingPlan" } }, "title": "InterruptionSettings", "type": "object" }, "inference-embedding_TransferTool": { "properties": { "transfer": { "$ref": "#/$defs/InferenceEmbeddingTransferToolParams" }, "type": { "enum": [ "transfer" ], "type": "string" } }, "required": [ "type", "transfer" ], "title": "TransferTool", "type": "object" }, "inference-embedding_WebhookTool": { "properties": { "type": { "enum": [ "webhook" ], "type": "string" }, "webhook": { "$ref": "#/$defs/WebhookToolParams" } }, "required": [ "type", "webhook" ], "title": "WebhookTool", "type": "object" } } }