import {z} from 'zod' export type FunctionDefinition = {name: string, description?: string | undefined, parameters?: {[key: string]: unknown} | undefined}; export type FunctionTool = {type: 'function', shared?: boolean | undefined, function: FunctionDefinition}; export type WebhookToolParams = {name: string, description: string, url: string, method?: ('GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH') | undefined, headers?: (Array<{name?: string | undefined, value?: string | undefined}>) | undefined, body_parameters?: ({properties?: {[key: string]: unknown} | undefined, required?: Array | undefined, type?: 'object' | undefined}) | undefined, path_parameters?: ({properties?: {[key: string]: unknown} | undefined, required?: Array | undefined, type?: 'object' | undefined}) | undefined, query_parameters?: ({properties?: {[key: string]: unknown} | undefined, required?: Array | undefined, type?: 'object' | undefined}) | undefined, preset_body_fields?: {[key: string]: unknown} | undefined, preset_query_params?: {[key: string]: unknown} | undefined, async?: boolean | undefined, async_timeout_ms?: number | undefined, store_fields_as_variables?: Array<{name: string, value_path: string}> | undefined, messages?: (Array<{type: 'request_start', content: string, timing_ms?: number | undefined} | {type: 'request_response_delayed', content: string, timing_ms: number}>) | undefined}; export type InferenceEmbeddingWebhookTool = {type: 'webhook', timeout_ms?: number | undefined, shared?: boolean | undefined, webhook: WebhookToolParams}; export type ClientSideToolParams = {name: string, description: string, parameters: {properties?: {[key: string]: unknown} | undefined, required?: Array | undefined, type?: 'object' | undefined}}; export type ClientSideTool = {type: 'client_side_tool', shared?: boolean | undefined, client_side_tool: ClientSideToolParams}; export type BucketIds = {bucket_ids: Array, max_num_results?: number | undefined}; export type RetrievalTool = {type: 'retrieval', shared?: boolean | undefined, retrieval: BucketIds}; export type HandoffToolParams = {voice_mode?: ('unified' | 'distinct') | undefined, ai_assistants: Array<{name: string, id: string}>}; export type HandoffTool = {type: 'handoff', shared?: boolean | undefined, handoff: HandoffToolParams}; export type HangupToolParams = {description?: string | undefined}; export type InferenceEmbeddingHangupTool = {type: 'hangup', shared?: boolean | undefined, hangup: HangupToolParams}; export type InferenceEmbeddingTransferToolParams = {targets: Array<{name?: string | undefined, to: string, message?: string | undefined, extension?: string | undefined, sip_auth_username?: string | undefined, sip_auth_password?: string | undefined}> | string, from: string, diversion?: string | undefined, warm_transfer_instructions?: string | undefined, warm_transfer_acceptance?: ({enabled?: boolean | undefined, end_user_target_context_mode?: ('private' | 'shared') | undefined, require_acceptance?: boolean | undefined, timeout_secs?: number | undefined}) | undefined, description?: string | undefined, bridge_beep?: ({enabled?: boolean | undefined, target_legs?: ('self' | 'both') | undefined}) | undefined, warm_message_delay_ms?: (number | null) | undefined, custom_headers?: (Array<{name?: string | undefined, value?: string | undefined}>) | undefined, voicemail_detection?: ({detection_mode?: ('disabled' | 'premium') | undefined, on_voicemail_detected?: ({action?: ('stop_transfer' | 'leave_message_and_stop_transfer') | undefined, voicemail_message?: ({type?: ('message' | 'warm_transfer_instructions') | undefined, message?: string | undefined}) | undefined}) | undefined, detection_config?: ({greeting_silence_duration_millis?: number | undefined, greeting_total_analysis_time_millis?: number | undefined, after_greeting_silence_millis?: number | undefined, between_words_silence_millis?: number | undefined, greeting_duration_millis?: number | undefined, initial_silence_millis?: number | undefined, maximum_number_of_words?: number | undefined, maximum_word_length_millis?: number | undefined, silence_threshold?: number | undefined, total_analysis_time_millis?: number | undefined, min_word_length_millis?: number | undefined}) | undefined}) | undefined}; export type InferenceEmbeddingTransferTool = {type: 'transfer', shared?: boolean | undefined, transfer: InferenceEmbeddingTransferToolParams}; export type InviteToolConfig = {from: string, targets?: (Array<{name?: string | undefined, to: string}> | string | null) | undefined, custom_headers?: (Array<{name?: string | undefined, value?: string | undefined}>) | undefined, voicemail_detection?: ({detection_mode?: ('disabled' | 'premium') | undefined, on_voicemail_detected?: ({action?: 'stop_invite' | undefined}) | undefined}) | undefined}; export type InviteTool = {type: 'invite', shared?: boolean | undefined, invite: InviteToolConfig}; export type SIPReferToolParams = {targets: Array<{name: string, sip_address: string, sip_auth_username?: string | undefined, sip_auth_password?: string | undefined}>, sip_headers?: (Array<{name?: ('User-to-User' | 'Diversion') | undefined, value?: string | undefined}>) | undefined, custom_headers?: (Array<{name?: string | undefined, value?: string | undefined}>) | undefined}; export type SIPReferTool = {type: 'refer', shared?: boolean | undefined, refer: SIPReferToolParams}; export type DTMFTool = {type: 'send_dtmf', shared?: boolean | undefined, send_dtmf: {[key: string]: unknown}}; export type SendMessageTool = {type: 'send_message', shared?: boolean | undefined, send_message: {message_template?: (string | null) | undefined} | {[key: string]: unknown}}; export type SkipTurnToolParams = {description?: string | undefined}; export type SkipTurnTool = {type: 'skip_turn', shared?: boolean | undefined, skip_turn: SkipTurnToolParams}; export type VisionToolParams = {max_frame_age_secs?: number | undefined}; export type VisionTool = {type: 'vision', shared?: boolean | undefined, vision?: VisionToolParams | undefined}; export type PayToolParams = {connector_name: string, currency?: string | undefined, payment_method?: string | undefined, description?: (string | null) | undefined, connector_parameters?: {[key: string]: unknown} | undefined, valid_card_types?: (Array<'visa' | 'mastercard' | 'amex' | 'maestro' | 'discover' | 'optima' | 'jcb' | 'diners-club' | 'enroute'>) | undefined, postal_code?: (string | boolean) | undefined, min_postal_code_length?: number | undefined, max_attempts?: number | undefined, timeout_millis?: number | undefined, inter_digit_timeout_millis?: number | undefined, prompts?: ({'payment-card-number'?: (string | Array<{text: string, attempt?: string | undefined, error_type?: ('timeout' | 'invalid-card-number' | 'invalid-card-type' | 'invalid-date' | 'invalid-security-code' | 'invalid-postal-code' | 'invalid-bank-routing-number' | 'invalid-bank-account-number' | 'input-matching-failed') | undefined, card_type?: ('visa' | 'mastercard' | 'amex' | 'optima' | 'discover' | 'diners-club' | 'jcb' | 'maestro' | 'enroute') | undefined}>) | undefined, 'expiration-date'?: (string | Array<{text: string, attempt?: string | undefined, error_type?: ('timeout' | 'invalid-card-number' | 'invalid-card-type' | 'invalid-date' | 'invalid-security-code' | 'invalid-postal-code' | 'invalid-bank-routing-number' | 'invalid-bank-account-number' | 'input-matching-failed') | undefined, card_type?: ('visa' | 'mastercard' | 'amex' | 'optima' | 'discover' | 'diners-club' | 'jcb' | 'maestro' | 'enroute') | undefined}>) | undefined, 'postal-code'?: (string | Array<{text: string, attempt?: string | undefined, error_type?: ('timeout' | 'invalid-card-number' | 'invalid-card-type' | 'invalid-date' | 'invalid-security-code' | 'invalid-postal-code' | 'invalid-bank-routing-number' | 'invalid-bank-account-number' | 'input-matching-failed') | undefined, card_type?: ('visa' | 'mastercard' | 'amex' | 'optima' | 'discover' | 'diners-club' | 'jcb' | 'maestro' | 'enroute') | undefined}>) | undefined, 'security-code'?: (string | Array<{text: string, attempt?: string | undefined, error_type?: ('timeout' | 'invalid-card-number' | 'invalid-card-type' | 'invalid-date' | 'invalid-security-code' | 'invalid-postal-code' | 'invalid-bank-routing-number' | 'invalid-bank-account-number' | 'input-matching-failed') | undefined, card_type?: ('visa' | 'mastercard' | 'amex' | 'optima' | 'discover' | 'diners-club' | 'jcb' | 'maestro' | 'enroute') | undefined}>) | undefined, 'bank-routing-number'?: (string | Array<{text: string, attempt?: string | undefined, error_type?: ('timeout' | 'invalid-card-number' | 'invalid-card-type' | 'invalid-date' | 'invalid-security-code' | 'invalid-postal-code' | 'invalid-bank-routing-number' | 'invalid-bank-account-number' | 'input-matching-failed') | undefined, card_type?: ('visa' | 'mastercard' | 'amex' | 'optima' | 'discover' | 'diners-club' | 'jcb' | 'maestro' | 'enroute') | undefined}>) | undefined, 'bank-account-number'?: (string | Array<{text: string, attempt?: string | undefined, error_type?: ('timeout' | 'invalid-card-number' | 'invalid-card-type' | 'invalid-date' | 'invalid-security-code' | 'invalid-postal-code' | 'invalid-bank-routing-number' | 'invalid-bank-account-number' | 'input-matching-failed') | undefined, card_type?: ('visa' | 'mastercard' | 'amex' | 'optima' | 'discover' | 'diners-club' | 'jcb' | 'maestro' | 'enroute') | undefined}>) | undefined}) | undefined}; export type PayTool = {type: 'pay', shared?: boolean | undefined, pay: PayToolParams}; export type UpdateDynamicVariablesToolParams = {name: string, description: string, updatable_variables: Array<{name: string, type?: string | undefined, description?: string | undefined}>}; export type UpdateDynamicVariablesTool = {type: 'update_dynamic_variables', shared?: boolean | undefined, update_dynamic_variables: UpdateDynamicVariablesToolParams}; export type AssistantTools = Array; export type AssistantMCPServer = {id: string, allowed_tools?: Array | undefined}; export type A2AAgentHeader = {name: string, value: string}; export type AssistantA2AAgent = {name: string, url: string, headers?: Array | undefined, async?: boolean | undefined, timeout_ms?: number | undefined, poll_interval_ms?: number | undefined, messages?: (Array<{type: 'request_start', content: string, timing_ms?: number | undefined} | {type: 'request_response_delayed', content: string, timing_ms: number}>) | undefined}; export type AuthenticationMethod = 'token' | 'certificate'; export type ExternalLLMReq = {model: string, base_url: string, llm_api_key_ref?: string | undefined, authentication_method?: AuthenticationMethod | undefined, certificate_ref?: string | undefined, token_retrieval_url?: string | undefined, forward_metadata?: boolean | undefined, extra_headers?: ({[key: string]: string} | null) | undefined}; export type FallbackConfigReq = {model?: string | undefined, llm_api_key_ref?: string | undefined, external_llm?: ExternalLLMReq | undefined}; export type InferenceEmbeddingVoiceSettings = {voice: string, voice_speed?: number | undefined, api_key_ref?: string | undefined, temperature?: number | undefined, similarity_boost?: number | undefined, use_speaker_boost?: boolean | undefined, style?: number | undefined, speed?: number | undefined, language?: (string | null) | undefined, language_boost?: ('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' | null) | undefined, expressive_mode?: boolean | undefined, background_audio?: ({type: 'predefined_media', value: 'silence' | 'office', volume?: number | undefined} | {type: 'media_url', value: string} | {type: 'media_name', value: string}) | undefined, tool_call_audio?: ({type: 'predefined_media', value: 'typing', volume?: number | undefined} | {type: 'media_url', value: string} | null) | undefined}; export type AvatarId = string; export type AvatarSettingsRequest = {provider: 'telnyx', avatar_id: AvatarId, background_id: 'office' | 'studio' | 'reception' | 'illustrated_workspace', model: 'foxtrot-1'}; export type TranscriptionSettingsConfig = {smart_format?: boolean | undefined, numerals?: boolean | undefined, eot_threshold?: number | undefined, eot_timeout_ms?: number | undefined, eager_eot_threshold?: number | undefined, keyterm?: string | undefined, remove_disfluencies?: boolean | undefined, end_of_turn_confidence_threshold?: number | undefined, prompt?: string | undefined, min_turn_silence?: number | undefined, max_turn_silence?: number | undefined, interim_results?: boolean | undefined, enable_endpoint_detection?: boolean | undefined, max_endpoint_delay_ms?: number | undefined, context?: string | undefined, language_hints?: Array | undefined}; export type TranscriptionFallbackModel = {model: 'deepgram/flux' | 'deepgram/nova-3' | 'deepgram/nova-2' | 'assemblyai/universal-3-6-pro' | 'assemblyai/universal-3-5-pro' | 'assemblyai/universal-streaming' | 'xai/grok-stt' | 'soniox/stt-rt-v4' | 'soniox/stt-rt-v5' | 'humain/realtime' | 'reson8/turns', language?: (string | null) | undefined, settings?: (TranscriptionSettingsConfig | null) | undefined}; export type TranscriptionChallenger = {model: 'deepgram/flux' | 'deepgram/nova-3' | 'deepgram/nova-2' | 'azure/fast' | 'assemblyai/universal-3-6-pro' | 'assemblyai/universal-3-5-pro' | 'assemblyai/universal-streaming' | 'xai/grok-stt' | 'soniox/stt-rt-v4' | 'soniox/stt-rt-v5' | 'nvidia/parakeet-v3' | 'omi-health/omi-med-stt-v1' | 'humain/realtime' | 'reson8/turns' | 'cohere/ar-stt' | 'telnyx/basira' | 'distil-whisper/distil-large-v2' | 'openai/whisper-large-v3-turbo', language?: (string | null) | undefined, settings?: (TranscriptionSettingsConfig | null) | undefined, rule?: ('best_turn' | 'best_engine' | 'merge_words') | undefined}; export type TranscriptionSettings = {model?: ('deepgram/flux' | 'deepgram/nova-3' | 'deepgram/nova-2' | 'speechmatics/standard' | 'speechmatics/linden-1' | 'azure/fast' | 'assemblyai/universal-3-6-pro' | 'assemblyai/universal-3-5-pro' | 'assemblyai/universal-streaming' | 'xai/grok-stt' | 'soniox/stt-rt-v4' | 'soniox/stt-rt-v5' | 'nvidia/parakeet-v3' | 'omi-health/omi-med-stt-v1' | 'humain/realtime' | 'reson8/turns' | 'cohere/ar-stt' | 'telnyx/basira' | 'distil-whisper/distil-large-v2' | 'openai/whisper-large-v3-turbo') | undefined, language?: string | undefined, api_key_ref?: string | undefined, region?: string | undefined, settings?: TranscriptionSettingsConfig | undefined, fallback_models?: (Array | null) | undefined, challenger?: (TranscriptionChallenger | null) | undefined}; export type TelephonySettings = {default_texml_app_id?: string | undefined, supports_unauthenticated_web_calls?: boolean | undefined, noise_suppression?: ('aicoustics' | 'krisp' | 'deepfilternet' | 'disabled') | undefined, noise_suppression_config?: ({attenuation_limit?: number | undefined, mode?: 'advanced' | undefined, family?: 'quail' | undefined, size?: ('vf' | 'vf_2_0_l') | undefined, enhancement_level?: number | undefined}) | undefined, time_limit_secs?: number | undefined, user_idle_timeout_secs?: number | undefined, user_idle_reply_secs?: number | undefined, fallback_destination?: string | undefined, send_message_history_updates?: boolean | undefined, conversation_ended_full_history?: boolean | undefined, greeting_delay_ms?: (number | null) | undefined, voicemail_detection?: ({on_voicemail_detected?: ({action?: ('stop_assistant' | 'leave_message_and_stop_assistant' | 'continue_assistant') | undefined, voicemail_message?: ({type?: ('prompt' | 'message') | undefined, prompt?: string | undefined, message?: string | undefined}) | undefined}) | undefined}) | undefined, disable_dtmf?: boolean | undefined, recording_settings?: ({enabled?: boolean | undefined, channels?: ('single' | 'dual') | undefined, format?: ('wav' | 'mp3') | undefined, stop_on_conversation_end?: boolean | undefined}) | undefined}; export type MessagingSettings = {default_messaging_profile_id?: string | undefined, delivery_status_webhook_url?: string | undefined, conversation_inactivity_minutes?: number | undefined}; export type EnabledFeatures = 'telephony' | 'messaging'; export type InsightSettings = {insight_group_id?: string | undefined, model?: (string | null) | undefined}; export type PrivacySettings = {data_retention?: boolean | undefined, pii_redaction?: ('disabled' | 'redact') | undefined, in_transit_data_locality?: boolean | undefined}; export type AudioVisualizerConfig = {color?: ('verdant' | 'twilight' | 'bloom' | 'mystic' | 'flare' | 'glacier') | undefined, preset?: string | undefined}; export type WidgetSettings = {theme?: ('light' | 'dark') | undefined, audio_visualizer_config?: AudioVisualizerConfig | undefined, start_call_text?: string | undefined, default_state?: ('expanded' | 'collapsed') | undefined, position?: ('fixed' | 'static') | undefined, view_history_url?: (string | null) | undefined, report_issue_url?: (string | null) | undefined, give_feedback_url?: (string | null) | undefined, agent_thinking_text?: string | undefined, speak_to_interrupt_text?: string | undefined, logo_icon_url?: (string | null) | undefined}; export type TranscriptionEndpointingPlan = {on_punctuation_seconds?: number | undefined, on_no_punctuation_seconds?: number | undefined, on_number_seconds?: number | undefined}; export type StartSpeakingPlan = {wait_seconds?: number | undefined, transcription_endpointing_plan?: (TranscriptionEndpointingPlan | null) | undefined}; export type InferenceEmbeddingInterruptionSettings = {enable?: boolean | undefined, disable_greeting_interruption?: boolean | undefined, start_speaking_plan?: (StartSpeakingPlan | null) | undefined, interrupt_prediction_threshold?: (number | null) | undefined}; export type AssistantIntegration = {integration_id: string, allowed_list?: Array | undefined}; export type ObservabilityStatus = 'enabled' | 'disabled'; export type PromptSyncStatus = 'enabled' | 'disabled'; export type ObservabilityReq = {status?: ObservabilityStatus | undefined, secret_key_ref?: string | undefined, public_key_ref?: string | undefined, host?: string | undefined, prompt_name?: string | undefined, prompt_version?: number | undefined, prompt_label?: string | undefined, prompt_sync?: PromptSyncStatus | undefined}; export type PostConversationSettingsReq = {enabled?: boolean | undefined}; export type ExternalLLM = {model: string, base_url: string, llm_api_key_ref?: string | undefined, authentication_method?: AuthenticationMethod | undefined, certificate_ref?: string | undefined, token_retrieval_url?: string | undefined, forward_metadata?: boolean | undefined, extra_headers?: ({[key: string]: string} | null) | undefined}; export type DelegationSettings = {enabled?: boolean | undefined, mode?: ('telnyx' | 'client') | undefined, model?: string | undefined, llm_api_key_ref?: string | undefined, instructions?: string | undefined, speak_results?: boolean | undefined, external_llm?: ExternalLLM | undefined}; export type WebsocketSettings = {enabled?: boolean | undefined, url?: string | undefined, auth_ref?: string | undefined}; export type LLMCondition = {prompt: string, type: 'llm'}; export type ComparisonExpression = {left: Expression, op: '==' | '!=' | '<' | '<=' | '>' | '>=' | 'contains' | 'not_contains', right: Expression, type: 'comparison'}; export type BooleanOpExpression = {op: 'and' | 'or' | 'not', operands: Array, type: 'bool_op'}; export type ArithmeticExpression = {left: Expression, op: '+' | '-' | '*' | '/' | '%', right: Expression, type: 'arithmetic'}; export type DynamicVariableExpression = {name: string, type: 'variable'}; export type StringLiteralExpression = {type: 'string_literal', value: string}; export type NumberLiteralExpression = {type: 'number_literal', value: number}; export type BooleanLiteralExpression = {type: 'bool_literal', value: boolean}; export type Expression = ComparisonExpression | BooleanOpExpression | ArithmeticExpression | DynamicVariableExpression | StringLiteralExpression | NumberLiteralExpression | BooleanLiteralExpression; export type ExpressionCondition = {expression: Expression, type: 'expression'}; export type DefaultCondition = {type: 'default'}; export type NodeTarget = {node_id: string, type: 'node'}; export type NodePosition = {x: number, y: number}; export type AssistantTarget = {assistant_id: string, position?: NodePosition | undefined, type: 'assistant', voice_mode?: ('unified' | 'distinct') | undefined}; export type FlowEdge = {condition: LLMCondition | ExpressionCondition | DefaultCondition, id: string, start_node_id: string, target: NodeTarget | AssistantTarget}; export type FlowNodeReq = {external_llm?: ExternalLLMReq | undefined, id: string, instructions: string, instructions_mode?: ('replace' | 'append') | undefined, llm_api_key_ref?: string | undefined, model?: string | undefined, name?: string | undefined, position?: NodePosition | undefined, shared_tool_ids?: Array | undefined, tools_mode?: ('replace' | 'append') | undefined, transcription?: TranscriptionSettings | undefined, type?: 'prompt' | undefined, voice_settings?: InferenceEmbeddingVoiceSettings | undefined}; export type ToolNodeReq = {id: string, message?: string | undefined, name?: string | undefined, position?: NodePosition | undefined, shared_tool_id: string, type?: 'tool' | undefined}; export type SpeakNodeReq = {type?: 'speak' | undefined, id: string, name?: string | undefined, message: string, position?: NodePosition | undefined}; export type ConversationFlowReq = {edges?: Array | undefined, nodes: Array, start_node_id: string}; export type CreateAssistantRequest = {name: string, model?: string | undefined, instructions: string, tools?: AssistantTools | undefined, mcp_servers?: Array | undefined, a2a_agents?: Array | undefined, tool_ids?: Array | undefined, description?: string | undefined, greeting?: string | undefined, llm_api_key_ref?: string | undefined, external_llm?: ExternalLLMReq | undefined, fallback_config?: FallbackConfigReq | undefined, voice_settings?: InferenceEmbeddingVoiceSettings | undefined, avatar_settings?: (AvatarSettingsRequest | null) | undefined, transcription?: TranscriptionSettings | undefined, telephony_settings?: TelephonySettings | undefined, messaging_settings?: MessagingSettings | undefined, enabled_features?: Array | undefined, insight_settings?: InsightSettings | undefined, privacy_settings?: PrivacySettings | undefined, dynamic_variables_webhook_url?: string | undefined, dynamic_variables_webhook_timeout_ms?: number | undefined, dynamic_variables?: {[key: string]: unknown} | undefined, widget_settings?: WidgetSettings | undefined, interruption_settings?: InferenceEmbeddingInterruptionSettings | undefined, integrations?: Array | undefined, observability_settings?: ObservabilityReq | undefined, tags?: Array | undefined, post_conversation_settings?: PostConversationSettingsReq | undefined, delegation_settings?: DelegationSettings | undefined, websocket_settings?: WebsocketSettings | undefined, conversation_flow?: ConversationFlowReq | undefined}; export type CreateApiAiAssistantsArgs = {'Idempotency-Key'?: string | undefined, body: CreateAssistantRequest}; export type CreateApiAiAssistantsOptions = {baseUrl?: string | undefined, bearerAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const functionDefinition = z.object({name: z.string(), description: z.string().optional(), parameters: z.record(z.string(), z.unknown()).optional()}); export const functionTool = z.object({type: z.literal("function"), shared: z.boolean().optional(), function: functionDefinition}); export const webhookToolParams = z.object({name: z.string(), description: z.string(), url: z.string(), method: z.enum(["GET", "POST", "PUT", "DELETE", "PATCH"]).optional(), headers: z.array(z.object({name: z.string().optional(), value: z.string().optional()})).optional(), body_parameters: z.object({properties: z.record(z.string(), z.unknown()).optional(), required: z.array(z.string()).optional(), type: z.literal("object").optional()}).optional(), path_parameters: z.object({properties: z.record(z.string(), z.unknown()).optional(), required: z.array(z.string()).optional(), type: z.literal("object").optional()}).optional(), query_parameters: z.object({properties: z.record(z.string(), z.unknown()).optional(), required: z.array(z.string()).optional(), type: z.literal("object").optional()}).optional(), preset_body_fields: z.record(z.string(), z.unknown()).optional(), preset_query_params: z.record(z.string(), z.unknown()).optional(), async: z.boolean().optional(), async_timeout_ms: z.number().int().gte(1).lte(15000).optional(), store_fields_as_variables: z.array(z.object({name: z.string().min(1), value_path: z.string().min(1)})).optional(), messages: z.array(z.union([z.object({type: z.literal("request_start"), content: z.string().min(1), timing_ms: z.number().int().gte(100).lte(120000).optional()}), z.object({type: z.literal("request_response_delayed"), content: z.string().min(1), timing_ms: z.number().int().gte(100).lte(120000)})])).optional()}); export const inferenceEmbeddingWebhookTool = z.object({type: z.literal("webhook"), timeout_ms: z.number().int().lte(60000).optional(), shared: z.boolean().optional(), webhook: webhookToolParams}); export const clientSideToolParams = z.object({name: z.string(), description: z.string(), parameters: z.object({properties: z.record(z.string(), z.unknown()).optional(), required: z.array(z.string()).optional(), type: z.literal("object").optional()})}); export const clientSideTool = z.object({type: z.literal("client_side_tool"), shared: z.boolean().optional(), client_side_tool: clientSideToolParams}); export const bucketIds = z.object({bucket_ids: z.array(z.string()), max_num_results: z.number().int().optional()}); export const retrievalTool = z.object({type: z.literal("retrieval"), shared: z.boolean().optional(), retrieval: bucketIds}); export const handoffToolParams = z.object({voice_mode: z.enum(["unified", "distinct"]).optional(), ai_assistants: z.array(z.object({name: z.string(), id: z.string()}))}); export const handoffTool = z.object({type: z.literal("handoff"), shared: z.boolean().optional(), handoff: handoffToolParams}); export const hangupToolParams = z.object({description: z.string().optional()}); export const inferenceEmbeddingHangupTool = z.object({type: z.literal("hangup"), shared: z.boolean().optional(), hangup: hangupToolParams}); export const inferenceEmbeddingTransferToolParams = z.object({targets: z.union([z.array(z.object({name: z.string().optional(), to: z.string(), message: z.string().optional(), extension: z.string().optional(), sip_auth_username: z.string().optional(), sip_auth_password: z.string().optional()})), z.string()]), from: z.string(), diversion: z.string().optional(), warm_transfer_instructions: z.string().optional(), warm_transfer_acceptance: z.object({enabled: z.boolean().optional(), end_user_target_context_mode: z.enum(["private", "shared"]).optional(), require_acceptance: z.boolean().optional(), timeout_secs: z.number().int().gte(10).lte(600).optional()}).optional(), description: z.string().optional(), bridge_beep: z.object({enabled: z.boolean().optional(), target_legs: z.enum(["self", "both"]).optional()}).optional(), warm_message_delay_ms: z.number().int().nullable().optional(), custom_headers: z.array(z.object({name: z.string().optional(), value: z.string().optional()})).optional(), voicemail_detection: z.object({detection_mode: z.enum(["disabled", "premium"]).optional(), on_voicemail_detected: z.object({action: z.enum(["stop_transfer", "leave_message_and_stop_transfer"]).optional(), voicemail_message: z.object({type: z.enum(["message", "warm_transfer_instructions"]).optional(), message: z.string().optional()}).optional()}).optional(), detection_config: z.object({greeting_silence_duration_millis: z.number().int().gte(500).lte(50000).optional(), greeting_total_analysis_time_millis: z.number().int().gte(500).lte(300000).optional(), after_greeting_silence_millis: z.number().int().gte(100).lte(5000).optional(), between_words_silence_millis: z.number().int().gte(10).lte(5000).optional(), greeting_duration_millis: z.number().int().gte(100).lte(10000).optional(), initial_silence_millis: z.number().int().gte(100).lte(500000).optional(), maximum_number_of_words: z.number().int().gte(1).lte(50).optional(), maximum_word_length_millis: z.number().int().gte(50).lte(5000).optional(), silence_threshold: z.number().int().gte(1).lte(1000).optional(), total_analysis_time_millis: z.number().int().gte(500).lte(60000).optional(), min_word_length_millis: z.number().int().gte(1).lte(1000).optional()}).optional()}).optional()}); export const inferenceEmbeddingTransferTool = z.object({type: z.literal("transfer"), shared: z.boolean().optional(), transfer: inferenceEmbeddingTransferToolParams}); export const inviteToolConfig = z.object({from: z.string(), targets: z.union([z.array(z.object({name: z.string().optional(), to: z.string()})), z.string()]).nullable().optional(), custom_headers: z.array(z.object({name: z.string().optional(), value: z.string().optional()})).optional(), voicemail_detection: z.object({detection_mode: z.enum(["disabled", "premium"]).optional(), on_voicemail_detected: z.object({action: z.literal("stop_invite").optional()}).optional()}).optional()}); export const inviteTool = z.object({type: z.literal("invite"), shared: z.boolean().optional(), invite: inviteToolConfig}); export const sIPReferToolParams = z.object({targets: z.array(z.object({name: z.string(), sip_address: z.string(), sip_auth_username: z.string().optional(), sip_auth_password: z.string().optional()})), sip_headers: z.array(z.object({name: z.enum(["User-to-User", "Diversion"]).optional(), value: z.string().optional()})).optional(), custom_headers: z.array(z.object({name: z.string().optional(), value: z.string().optional()})).optional()}); export const sIPReferTool = z.object({type: z.literal("refer"), shared: z.boolean().optional(), refer: sIPReferToolParams}); export const dTMFTool = z.object({type: z.literal("send_dtmf"), shared: z.boolean().optional(), send_dtmf: z.record(z.string(), z.unknown())}); export const sendMessageTool = z.object({type: z.literal("send_message"), shared: z.boolean().optional(), send_message: z.object({message_template: z.string().nullable().optional()}).and(z.record(z.string(), z.unknown()))}); export const skipTurnToolParams = z.object({description: z.string().optional()}); export const skipTurnTool = z.object({type: z.literal("skip_turn"), shared: z.boolean().optional(), skip_turn: skipTurnToolParams}); export const visionToolParams = z.object({max_frame_age_secs: z.number().int().gte(1).optional()}); export const visionTool = z.object({type: z.literal("vision"), shared: z.boolean().optional(), vision: visionToolParams.optional()}); export const payToolParams = z.object({connector_name: z.string(), currency: z.string().optional(), payment_method: z.string().optional(), description: z.string().nullable().optional(), connector_parameters: z.record(z.string(), z.unknown()).optional(), valid_card_types: z.array(z.enum(["visa", "mastercard", "amex", "maestro", "discover", "optima", "jcb", "diners-club", "enroute"])).optional(), postal_code: z.union([z.string().min(1), z.boolean()]).optional(), min_postal_code_length: z.number().int().gte(1).lte(128).optional(), max_attempts: z.number().int().gte(1).lte(3).optional(), timeout_millis: z.number().int().gte(1).lte(600000).optional(), inter_digit_timeout_millis: z.number().int().gte(1).lte(600000).optional(), prompts: z.object({"payment-card-number": z.union([z.string().min(1), z.array(z.object({text: z.string().min(1), attempt: z.string().optional(), error_type: z.enum(["timeout", "invalid-card-number", "invalid-card-type", "invalid-date", "invalid-security-code", "invalid-postal-code", "invalid-bank-routing-number", "invalid-bank-account-number", "input-matching-failed"]).optional(), card_type: z.enum(["visa", "mastercard", "amex", "optima", "discover", "diners-club", "jcb", "maestro", "enroute"]).optional()}))]).optional(), "expiration-date": z.union([z.string().min(1), z.array(z.object({text: z.string().min(1), attempt: z.string().optional(), error_type: z.enum(["timeout", "invalid-card-number", "invalid-card-type", "invalid-date", "invalid-security-code", "invalid-postal-code", "invalid-bank-routing-number", "invalid-bank-account-number", "input-matching-failed"]).optional(), card_type: z.enum(["visa", "mastercard", "amex", "optima", "discover", "diners-club", "jcb", "maestro", "enroute"]).optional()}))]).optional(), "postal-code": z.union([z.string().min(1), z.array(z.object({text: z.string().min(1), attempt: z.string().optional(), error_type: z.enum(["timeout", "invalid-card-number", "invalid-card-type", "invalid-date", "invalid-security-code", "invalid-postal-code", "invalid-bank-routing-number", "invalid-bank-account-number", "input-matching-failed"]).optional(), card_type: z.enum(["visa", "mastercard", "amex", "optima", "discover", "diners-club", "jcb", "maestro", "enroute"]).optional()}))]).optional(), "security-code": z.union([z.string().min(1), z.array(z.object({text: z.string().min(1), attempt: z.string().optional(), error_type: z.enum(["timeout", "invalid-card-number", "invalid-card-type", "invalid-date", "invalid-security-code", "invalid-postal-code", "invalid-bank-routing-number", "invalid-bank-account-number", "input-matching-failed"]).optional(), card_type: z.enum(["visa", "mastercard", "amex", "optima", "discover", "diners-club", "jcb", "maestro", "enroute"]).optional()}))]).optional(), "bank-routing-number": z.union([z.string().min(1), z.array(z.object({text: z.string().min(1), attempt: z.string().optional(), error_type: z.enum(["timeout", "invalid-card-number", "invalid-card-type", "invalid-date", "invalid-security-code", "invalid-postal-code", "invalid-bank-routing-number", "invalid-bank-account-number", "input-matching-failed"]).optional(), card_type: z.enum(["visa", "mastercard", "amex", "optima", "discover", "diners-club", "jcb", "maestro", "enroute"]).optional()}))]).optional(), "bank-account-number": z.union([z.string().min(1), z.array(z.object({text: z.string().min(1), attempt: z.string().optional(), error_type: z.enum(["timeout", "invalid-card-number", "invalid-card-type", "invalid-date", "invalid-security-code", "invalid-postal-code", "invalid-bank-routing-number", "invalid-bank-account-number", "input-matching-failed"]).optional(), card_type: z.enum(["visa", "mastercard", "amex", "optima", "discover", "diners-club", "jcb", "maestro", "enroute"]).optional()}))]).optional()}).optional()}); export const payTool = z.object({type: z.literal("pay"), shared: z.boolean().optional(), pay: payToolParams}); export const updateDynamicVariablesToolParams = z.object({name: z.string(), description: z.string(), updatable_variables: z.array(z.object({name: z.string().min(1), type: z.string().optional(), description: z.string().optional()}))}); export const updateDynamicVariablesTool = z.object({type: z.literal("update_dynamic_variables"), shared: z.boolean().optional(), update_dynamic_variables: updateDynamicVariablesToolParams}); export const assistantTools = z.array(z.union([functionTool, inferenceEmbeddingWebhookTool, clientSideTool, retrievalTool, handoffTool, inferenceEmbeddingHangupTool, inferenceEmbeddingTransferTool, inviteTool, sIPReferTool, dTMFTool, sendMessageTool, skipTurnTool, visionTool, payTool, updateDynamicVariablesTool])); export const assistantMCPServer = z.object({id: z.string(), allowed_tools: z.array(z.string()).optional()}); export const a2AAgentHeader = z.object({name: z.string(), value: z.string()}); export const assistantA2AAgent = z.object({name: z.string().max(43), url: z.string(), headers: z.array(a2AAgentHeader).optional(), async: z.boolean().optional(), timeout_ms: z.number().int().gte(1).lte(4294967295).optional(), poll_interval_ms: z.number().int().gte(1).lte(4294967295).optional(), messages: z.array(z.union([z.object({type: z.literal("request_start"), content: z.string().min(1), timing_ms: z.number().int().gte(100).lte(120000).optional()}), z.object({type: z.literal("request_response_delayed"), content: z.string().min(1), timing_ms: z.number().int().gte(100).lte(120000)})])).optional()}); export const authenticationMethod = z.enum(["token", "certificate"]); export const externalLLM = z.object({model: z.string(), base_url: z.string(), llm_api_key_ref: z.string().optional(), authentication_method: authenticationMethod.optional(), certificate_ref: z.string().optional(), token_retrieval_url: z.string().optional(), forward_metadata: z.boolean().optional(), extra_headers: z.record(z.string(), z.string().max(4096)).nullable().optional()}); export const fallbackConfig = z.object({model: z.string().optional(), llm_api_key_ref: z.string().optional(), external_llm: externalLLM.optional()}); export const inferenceEmbeddingVoiceSettings = z.object({voice: z.string(), voice_speed: z.number().optional(), api_key_ref: z.string().optional(), temperature: z.number().optional(), similarity_boost: z.number().optional(), use_speaker_boost: z.boolean().optional(), style: z.number().optional(), speed: z.number().optional(), language: z.string().nullable().optional(), language_boost: z.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"]).nullable().optional(), expressive_mode: z.boolean().optional(), background_audio: z.union([z.object({type: z.literal("predefined_media"), value: z.enum(["silence", "office"]), volume: z.number().gte(0.1).lte(1).multipleOf(0.1).optional()}), z.object({type: z.literal("media_url"), value: z.string()}), z.object({type: z.literal("media_name"), value: z.string()})]).optional(), tool_call_audio: z.union([z.object({type: z.literal("predefined_media"), value: z.literal("typing"), volume: z.number().gte(0).lte(1).multipleOf(0.1).optional()}), z.object({type: z.literal("media_url"), value: z.string()})]).nullable().optional()}); export const avatarId = z.string().min(1).max(128); export const avatarSettings = z.object({provider: z.literal("telnyx"), avatar_id: avatarId, background_id: z.enum(["office", "studio", "reception", "illustrated_workspace"]), model: z.literal("foxtrot-1")}); export const transcriptionSettingsConfig = z.object({smart_format: z.boolean().optional(), numerals: z.boolean().optional(), eot_threshold: z.number().gte(0.5).lte(0.9).optional(), eot_timeout_ms: z.number().int().gte(500).lte(10000).optional(), eager_eot_threshold: z.number().gte(0.3).lte(0.9).optional(), keyterm: z.string().max(1000).optional(), remove_disfluencies: z.boolean().optional(), end_of_turn_confidence_threshold: z.number().gte(0).lte(1).optional(), prompt: z.string().max(1750).optional(), min_turn_silence: z.number().int().gte(100).lte(5000).optional(), max_turn_silence: z.number().int().gte(100).lte(5000).optional(), interim_results: z.boolean().optional(), enable_endpoint_detection: z.boolean().optional(), max_endpoint_delay_ms: z.number().int().gte(500).lte(3000).optional(), context: z.string().max(10000).optional(), language_hints: z.array(z.string()).optional()}); export const transcriptionFallbackModel = z.object({model: z.enum(["deepgram/flux", "deepgram/nova-3", "deepgram/nova-2", "assemblyai/universal-3-6-pro", "assemblyai/universal-3-5-pro", "assemblyai/universal-streaming", "xai/grok-stt", "soniox/stt-rt-v4", "soniox/stt-rt-v5", "humain/realtime", "reson8/turns"]), language: z.string().nullable().optional(), settings: transcriptionSettingsConfig.nullable().optional()}); export const transcriptionChallenger = z.object({model: z.enum(["deepgram/flux", "deepgram/nova-3", "deepgram/nova-2", "azure/fast", "assemblyai/universal-3-6-pro", "assemblyai/universal-3-5-pro", "assemblyai/universal-streaming", "xai/grok-stt", "soniox/stt-rt-v4", "soniox/stt-rt-v5", "nvidia/parakeet-v3", "omi-health/omi-med-stt-v1", "humain/realtime", "reson8/turns", "cohere/ar-stt", "telnyx/basira", "distil-whisper/distil-large-v2", "openai/whisper-large-v3-turbo"]), language: z.string().nullable().optional(), settings: transcriptionSettingsConfig.nullable().optional(), rule: z.enum(["best_turn", "best_engine", "merge_words"]).optional()}); export const transcriptionSettings = z.object({model: z.enum(["deepgram/flux", "deepgram/nova-3", "deepgram/nova-2", "speechmatics/standard", "speechmatics/linden-1", "azure/fast", "assemblyai/universal-3-6-pro", "assemblyai/universal-3-5-pro", "assemblyai/universal-streaming", "xai/grok-stt", "soniox/stt-rt-v4", "soniox/stt-rt-v5", "nvidia/parakeet-v3", "omi-health/omi-med-stt-v1", "humain/realtime", "reson8/turns", "cohere/ar-stt", "telnyx/basira", "distil-whisper/distil-large-v2", "openai/whisper-large-v3-turbo"]).optional(), language: z.string().optional(), api_key_ref: z.string().optional(), region: z.string().optional(), settings: transcriptionSettingsConfig.optional(), fallback_models: z.array(transcriptionFallbackModel).nullable().optional(), challenger: transcriptionChallenger.nullable().optional()}); export const telephonySettings = z.object({default_texml_app_id: z.string().optional(), supports_unauthenticated_web_calls: z.boolean().optional(), noise_suppression: z.enum(["aicoustics", "krisp", "deepfilternet", "disabled"]).optional(), noise_suppression_config: z.object({attenuation_limit: z.number().int().gte(0).lte(100).optional(), mode: z.literal("advanced").optional(), family: z.literal("quail").optional(), size: z.enum(["vf", "vf_2_0_l"]).optional(), enhancement_level: z.number().gte(0).lte(1).optional()}).optional(), time_limit_secs: z.number().int().gte(30).lte(14400).optional(), user_idle_timeout_secs: z.number().int().gte(10).lte(14400).optional(), user_idle_reply_secs: z.number().int().gte(0).optional(), fallback_destination: z.string().optional(), send_message_history_updates: z.boolean().optional(), conversation_ended_full_history: z.boolean().optional(), greeting_delay_ms: z.number().int().gte(0).lte(2000).nullable().optional(), voicemail_detection: z.object({on_voicemail_detected: z.object({action: z.enum(["stop_assistant", "leave_message_and_stop_assistant", "continue_assistant"]).optional(), voicemail_message: z.object({type: z.enum(["prompt", "message"]).optional(), prompt: z.string().optional(), message: z.string().optional()}).optional()}).optional()}).optional(), disable_dtmf: z.boolean().optional(), recording_settings: z.object({enabled: z.boolean().optional(), channels: z.enum(["single", "dual"]).optional(), format: z.enum(["wav", "mp3"]).optional(), stop_on_conversation_end: z.boolean().optional()}).optional()}); export const messagingSettings = z.object({default_messaging_profile_id: z.string().optional(), delivery_status_webhook_url: z.string().optional(), conversation_inactivity_minutes: z.number().int().gte(1).lte(10000000).optional()}); export const enabledFeatures = z.enum(["telephony", "messaging"]); export const insightSettings = z.object({insight_group_id: z.string().optional(), model: z.string().nullable().optional()}); export const privacySettings = z.object({data_retention: z.boolean().optional(), pii_redaction: z.enum(["disabled", "redact"]).optional(), in_transit_data_locality: z.boolean().optional()}); export const importMetadata = z.object({import_provider: z.enum(["elevenlabs", "vapi", "retell"]).optional(), import_id: z.string().optional()}); export const audioVisualizerConfig = z.object({color: z.enum(["verdant", "twilight", "bloom", "mystic", "flare", "glacier"]).optional(), preset: z.string().optional()}); export const widgetSettings = z.object({theme: z.enum(["light", "dark"]).optional(), audio_visualizer_config: audioVisualizerConfig.optional(), start_call_text: z.string().optional(), default_state: z.enum(["expanded", "collapsed"]).optional(), position: z.enum(["fixed", "static"]).optional(), view_history_url: z.string().nullable().optional(), report_issue_url: z.string().nullable().optional(), give_feedback_url: z.string().nullable().optional(), agent_thinking_text: z.string().optional(), speak_to_interrupt_text: z.string().optional(), logo_icon_url: z.string().nullable().optional()}); export const transcriptionEndpointingPlan = z.object({on_punctuation_seconds: z.number().optional(), on_no_punctuation_seconds: z.number().optional(), on_number_seconds: z.number().optional()}); export const startSpeakingPlan = z.object({wait_seconds: z.number().gte(0).optional(), transcription_endpointing_plan: transcriptionEndpointingPlan.nullable().optional()}); export const inferenceEmbeddingInterruptionSettings = z.object({enable: z.boolean().optional(), disable_greeting_interruption: z.boolean().optional(), start_speaking_plan: startSpeakingPlan.nullable().optional(), interrupt_prediction_threshold: z.number().gte(0).lte(1).nullable().optional()}); export const assistantIntegration = z.object({integration_id: z.string(), allowed_list: z.array(z.string()).optional()}); export const observabilityStatus = z.enum(["enabled", "disabled"]); export const promptSyncStatus = z.enum(["enabled", "disabled"]); export const observability = z.object({status: observabilityStatus.optional(), secret_key_ref: z.string().optional(), public_key_ref: z.string().optional(), host: z.string().optional(), prompt_name: z.string().optional(), prompt_version: z.number().int().gte(1).optional(), prompt_label: z.string().optional(), prompt_sync: promptSyncStatus.optional()}); export const postConversationSettings = z.object({enabled: z.boolean().optional()}); export const delegationSettings = z.object({enabled: z.boolean().optional(), mode: z.enum(["telnyx", "client"]).optional(), model: z.string().optional(), llm_api_key_ref: z.string().optional(), instructions: z.string().optional(), speak_results: z.boolean().optional(), external_llm: externalLLM.optional()}); export const websocketSettings = z.object({enabled: z.boolean().optional(), url: z.string().optional(), auth_ref: z.string().optional()}); export const lLMCondition = z.object({prompt: z.string(), type: z.literal("llm")}); export const comparisonExpression = z.object({left: z.lazy(() => expression), op: z.enum(["==", "!=", "<", "<=", ">", ">=", "contains", "not_contains"]), right: z.lazy(() => expression), type: z.literal("comparison")}); export const booleanOpExpression = z.object({op: z.enum(["and", "or", "not"]), operands: z.array(z.lazy(() => expression)), type: z.literal("bool_op")}); export const arithmeticExpression = z.object({left: z.lazy(() => expression), op: z.enum(["+", "-", "*", "/", "%"]), right: z.lazy(() => expression), type: z.literal("arithmetic")}); export const dynamicVariableExpression = z.object({name: z.string(), type: z.literal("variable")}); export const stringLiteralExpression = z.object({type: z.literal("string_literal"), value: z.string()}); export const numberLiteralExpression = z.object({type: z.literal("number_literal"), value: z.number()}); export const booleanLiteralExpression = z.object({type: z.literal("bool_literal"), value: z.boolean()}); export const expression: z.ZodType = z.discriminatedUnion("type", [comparisonExpression, booleanOpExpression, arithmeticExpression, dynamicVariableExpression, stringLiteralExpression, numberLiteralExpression, booleanLiteralExpression]); export const expressionCondition = z.object({expression: expression, type: z.literal("expression")}); export const defaultCondition = z.object({type: z.literal("default")}); export const nodeTarget = z.object({node_id: z.string(), type: z.literal("node")}); export const nodePosition = z.object({x: z.number(), y: z.number()}); export const assistantTarget = z.object({assistant_id: z.string(), position: nodePosition.optional(), type: z.literal("assistant"), voice_mode: z.enum(["unified", "distinct"]).optional()}); export const flowEdge = z.object({condition: z.discriminatedUnion("type", [lLMCondition, expressionCondition, defaultCondition]), id: z.string(), start_node_id: z.string(), target: z.discriminatedUnion("type", [nodeTarget, assistantTarget])}); export const flowNode = z.object({external_llm: externalLLM.optional(), id: z.string(), instructions: z.string(), instructions_mode: z.enum(["replace", "append"]).optional(), llm_api_key_ref: z.string().optional(), model: z.string().optional(), name: z.string().optional(), position: nodePosition.optional(), shared_tool_ids: z.array(z.string()).optional(), tools: z.array(assistantTools).optional(), tools_mode: z.enum(["replace", "append"]).optional(), transcription: transcriptionSettings.optional(), type: z.literal("prompt").optional(), voice_settings: inferenceEmbeddingVoiceSettings.optional()}); export const toolNode = z.object({id: z.string(), name: z.string().optional(), position: nodePosition.optional(), shared_tool_id: z.string(), tool: assistantTools.optional(), type: z.literal("tool").optional(), message: z.string().min(1).optional()}); export const speakNode = z.object({type: z.literal("speak").optional(), id: z.string(), name: z.string().optional(), message: z.string(), position: nodePosition.optional()}); export const conversationFlow = z.object({edges: z.array(flowEdge).optional(), nodes: z.array(z.discriminatedUnion("type", [flowNode, toolNode, speakNode])), start_node_id: z.string()}); export const inferenceEmbeddingAssistant = z.object({id: z.string(), name: z.string(), created_at: z.string(), version_id: z.string().optional(), version_created_at: z.string().optional(), description: z.string().optional(), model: z.string(), instructions: z.string(), tools: assistantTools.optional(), mcp_servers: z.array(assistantMCPServer).optional(), a2a_agents: z.array(assistantA2AAgent).optional(), greeting: z.string().optional(), llm_api_key_ref: z.string().optional(), external_llm: externalLLM.optional(), fallback_config: fallbackConfig.optional(), voice_settings: inferenceEmbeddingVoiceSettings.optional(), avatar_settings: avatarSettings.nullable().optional(), transcription: transcriptionSettings.optional(), telephony_settings: telephonySettings.optional(), messaging_settings: messagingSettings.optional(), enabled_features: z.array(enabledFeatures).optional(), insight_settings: insightSettings.optional(), privacy_settings: privacySettings.optional(), dynamic_variables_webhook_url: z.string().optional(), dynamic_variables_webhook_timeout_ms: z.number().int().gte(1).lte(10000).optional(), dynamic_variables: z.record(z.string(), z.unknown()).optional(), import_metadata: importMetadata.optional(), widget_settings: widgetSettings.optional(), interruption_settings: inferenceEmbeddingInterruptionSettings.optional(), integrations: z.array(assistantIntegration).optional(), observability_settings: observability.optional(), version_name: z.string().max(50).optional(), related_mission_ids: z.array(z.string()).optional(), tags: z.array(z.string()).optional(), post_conversation_settings: postConversationSettings.optional(), delegation_settings: delegationSettings.optional(), websocket_settings: websocketSettings.optional(), conversation_flow: conversationFlow.optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Create an assistant * * POST /ai/assistants */ export const createApiAiAssistants = async (args: CreateApiAiAssistantsArgs, options?: CreateApiAiAssistantsOptions) => { const {baseUrl = "https://api.telnyx.com/v2", fetch: fetchFn = fetch, bearerAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args['Idempotency-Key'] != null) headers.set("Idempotency-Key", String(args['Idempotency-Key'])) if (bearerAuth !== undefined) headers.set('authorization', `Bearer ${bearerAuth}`) const url = `${baseUrl.replace(/\/+$/, '')}/ai/assistants${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(inferenceEmbeddingAssistant, await res.json()) };