Compare commits

..

1 Commits

Author SHA1 Message Date
Quan HL
e557b9ac3d add support for dual streams in rest:dial 2023-09-20 14:16:45 +07:00
6 changed files with 752 additions and 2867 deletions

View File

@@ -1,4 +1,4 @@
# verb-specifications
# verb-specificiations
Jambonz Verb Specification Utilities
#### Running the test suite

View File

@@ -58,8 +58,7 @@ function validateVerb(name, data, logger) {
const dSpec = specData.properties[dKey];
debug(`Task:validate validating property ${dKey} with value ${JSON.stringify(dVal)}`);
if (typeof dVal === 'undefined') continue;
else if (typeof dSpec === 'string' && dSpec === 'array') {
if (typeof dSpec === 'string' && dSpec === 'array') {
if (!Array.isArray(dVal)) throw new Error(`${name}: property ${dKey} is not an array`);
}
else if (typeof dSpec === 'string' && dSpec.includes('|')) {

2592
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "@jambonz/verb-specifications",
"version": "0.0.129",
"version": "0.0.34",
"description": "Jambonz Verb Specification Utilities",
"main": "index.js",
"scripts": {
@@ -20,7 +20,7 @@
"devDependencies": {
"eslint": "^7.32.0",
"eslint-plugin-promise": "^4.3.1",
"tape": "^5.7.5"
"tape": "^5.6.1"
},
"dependencies": {
"debug": "^4.3.4",

View File

@@ -1,20 +1,4 @@
{
"alert" : {
"properties": {
"id": "string",
"message": "string"
},
"required": [
"message"
]
},
"answer": {
"properties": {
"id": "string"
},
"required": [
]
},
"sip:decline": {
"properties": {
"id": "string",
@@ -43,7 +27,6 @@
"id": "string",
"referTo": "string",
"referredBy": "string",
"referredByDisplayName": "string",
"headers": "object",
"actionHook": "object|string",
"eventHook": "object|string"
@@ -58,40 +41,15 @@
"synthesizer": "#synthesizer",
"recognizer": "#recognizer",
"bargeIn": "#bargeIn",
"ttsStream": "#ttsStream",
"record": "#recordOptions",
"listen": "#listenOptions",
"stream": "#listenOptions",
"transcribe": "#transcribeOptions",
"amd": "#amd",
"fillerNoise": "#fillerNoise",
"notifyEvents": "boolean",
"notifySttLatency": "boolean",
"reset": "string|array",
"onHoldMusic": "string",
"actionHookDelayAction": "#actionHookDelayAction",
"sipRequestWithinDialogHook": "object|string",
"boostAudioSignal": "number|string",
"vad":"#vad",
"referHook": "object|string",
"earlyMedia": "boolean",
"autoStreamTts": "boolean",
"disableTtsCache": "boolean",
"noiseIsolation": "#noiseIsolation",
"turnTaking": "#turnTaking"
"onHoldMusic": "string"
},
"required": []
},
"fillerNoise": {
"properties": {
"enable": "boolean",
"url": "string",
"startDelaySecs": "number"
},
"required": [
"enable"
]
},
"listenOptions": {
"properties": {
"enable": "boolean",
@@ -107,28 +65,17 @@
"passDtmf": "boolean",
"playBeep": "boolean",
"disableBidirectionalAudio": "boolean",
"bidirectionalAudio": "#bidirectionalAudio",
"timeout": "number"
},
"required": [
"enable"
]
},
"ttsStream": {
"properties": {
"enable": "boolean",
"synthesizer": "#synthesizer"
},
"required": [
"enable"
]
},
"bargeIn": {
"properties": {
"enable": "boolean",
"sticky": "boolean",
"actionHook": "object|string",
"partialResultHook": "object|string",
"input": "array",
"finishOnKey": "string",
"numDigits": "number",
@@ -142,34 +89,6 @@
"enable"
]
},
"transcribeOptions": {
"properties": {
"enable": "boolean",
"transcriptionHook": "string",
"recognizer": "#recognizer"
},
"required": [
"enable"
]
},
"dub": {
"properties": {
"id": "string",
"action": {
"type": "string",
"enum": ["addTrack", "removeTrack", "silenceTrack", "playOnTrack", "sayOnTrack"]
},
"track": "string",
"play": "string",
"say": "string|object",
"loop": "boolean",
"gain": "number|string"
},
"required": [
"action",
"track"
]
},
"dequeue": {
"properties": {
"id": "string",
@@ -227,15 +146,13 @@
"properties": {
"id": "string",
"text": "string|array",
"instructions": "string",
"stream": "boolean",
"loop": "number|string",
"synthesizer": "#synthesizer",
"earlyMedia": "boolean",
"disableTtsCache": "boolean",
"closeStreamOnEmpty": "boolean"
"disableTtsCache": "boolean"
},
"required": [
"text"
]
},
"gather": {
@@ -257,9 +174,7 @@
"timeout": "number",
"recognizer": "#recognizer",
"play": "#play",
"say": "#say",
"fillerNoise": "#fillerNoise",
"actionHookDelayAction": "#actionHookDelayAction"
"say": "#say"
},
"required": [
]
@@ -269,8 +184,6 @@
"id": "string",
"name": "string",
"beep": "boolean",
"memberTag": "string",
"speakOnlyTo": "string",
"startConferenceOnEnter": "boolean",
"endConferenceOnExit": "boolean",
"endConferenceDuration": "number",
@@ -281,9 +194,7 @@
"statusEvents": "array",
"statusHook": "object|string",
"enterHook": "object|string",
"record": "#record",
"listen": "#listen",
"distributeDtmf": "boolean"
"record": "#record"
},
"required": [
"name"
@@ -304,19 +215,13 @@
"dtmfHook": "object|string",
"headers": "object",
"anchorMedia": "boolean",
"exitMediaPath": "boolean",
"boostAudioSignal": "number|string",
"listen": "#listen",
"stream": "#listen",
"target": ["#target"],
"timeLimit": "number",
"timeout": "number",
"proxy": "string",
"transcribe": "#transcribe",
"amd": "#amd",
"dub": ["#dub"],
"tag": "object",
"forwardPAI": "boolean"
"amd": "#amd"
},
"required": [
"target"
@@ -327,17 +232,15 @@
"id": "string",
"credentials": "object|string",
"project": "string",
"agent": "string",
"environment": "string",
"region": "string",
"model": {
"region": {
"type": "string",
"enum": ["es", "cx"]
"enum": ["europe-west1", "europe-west2", "australia-southeast1", "asia-northeast1"]
},
"lang": "string",
"actionHook": "object|string",
"eventHook": "object|string",
"events": "array",
"events": "[string]",
"welcomeEvent": "string",
"welcomeEventParams": "object",
"noInputTimeout": "number",
@@ -345,8 +248,7 @@
"passDtmfAsTextInput": "boolean",
"thinkingMusic": "string",
"tts": "#synthesizer",
"bargein": "boolean",
"queryInput": "#queryInput"
"bargein": "boolean"
},
"required": [
"project",
@@ -354,16 +256,6 @@
"lang"
]
},
"queryInput": {
"properties": {
"text": "string",
"intent": "string",
"event": "string",
"dtmf": "string"
},
"required": [
]
},
"dtmf": {
"properties": {
"id": "string",
@@ -414,35 +306,6 @@
"passDtmf": "boolean",
"playBeep": "boolean",
"disableBidirectionalAudio": "boolean",
"bidirectionalAudio": "#bidirectionalAudio",
"sampleRate": "number",
"timeout": "number",
"transcribe": "#transcribe",
"url": "string",
"wsAuth": "#auth",
"earlyMedia": "boolean",
"channel": "number"
},
"required": [
"url"
]
},
"stream": {
"properties": {
"id": "string",
"actionHook": "object|string",
"auth": "#auth",
"finishOnKey": "string",
"maxLength": "number",
"metadata": "object",
"mixType": {
"type": "string",
"enum": ["mono", "stereo", "mixed"]
},
"passDtmf": "boolean",
"playBeep": "boolean",
"disableBidirectionalAudio": "boolean",
"bidirectionalAudio": "#bidirectionalAudio",
"sampleRate": "number",
"timeout": "number",
"transcribe": "#transcribe",
@@ -454,35 +317,6 @@
"url"
]
},
"llm": {
"properties": {
"id": "string",
"vendor": "string",
"model": "string",
"auth": "object",
"connectOptions": "object",
"mcpServers": ["#mcpServer"],
"actionHook": "object|string",
"eventHook": "object|string",
"toolHook": "object|string",
"events": "array",
"llmOptions": "object"
},
"required": [
"vendor",
"llmOptions"
]
},
"mcpServer": {
"properties": {
"url": "string",
"auth": "object",
"roots": ["#root"]
},
"required": [
"url"
]
},
"message": {
"properties": {
"id": "string",
@@ -537,11 +371,6 @@
"type": "string",
"enum": ["startCallRecording", "stopCallRecording", "pauseCallRecording", "resumeCallRecording"]
},
"type" : {
"type" : "string",
"enum" : ["cloud", "siprec"]
},
"recordingID": "string",
"siprecServerURL": "string|array",
"headers": "object"
@@ -553,8 +382,7 @@
"redirect": {
"properties": {
"id": "string",
"actionHook": "object|string",
"statusHook": "object|string"
"actionHook": "object|string"
},
"required": [
"actionHook"
@@ -580,10 +408,7 @@
"headers": "object",
"timeout": "number",
"amd": "#amd",
"dual_streams": "boolean",
"sipRequestWithinDialogHook": "string",
"referHook": "object|string",
"timeLimit": "number"
"dual_streams" : "boolean"
},
"required": [
"call_hook",
@@ -604,12 +429,11 @@
"properties": {
"id": "string",
"transcriptionHook": "string",
"translationHook": "string",
"recognizer": "#recognizer",
"earlyMedia": "boolean",
"channel": "number"
"earlyMedia": "boolean"
},
"required": [
"transcriptionHook"
]
},
"target": {
@@ -632,8 +456,7 @@
"vmail": "boolean",
"tenant": "string",
"trunk": "string",
"overrideTo": "string",
"proxy": "string"
"overrideTo": "string"
},
"required": [
"type"
@@ -662,14 +485,14 @@
"vendor": "string",
"label": "string",
"language": "string",
"voice": "string|object",
"voice": "string",
"fallbackVendor": "string",
"fallbackLabel": "string",
"fallbackLanguage": "string",
"fallbackVoice": "string|object",
"fallbackVoice": "string",
"engine": {
"type": "string",
"enum": ["standard", "neural", "generative", "long-form"]
"enum": ["standard", "neural"]
},
"gender": {
"type": "string",
@@ -752,24 +575,13 @@
"asrDtmfTerminationDigit": "string",
"asrTimeout": "number",
"fastRecognitionTimeout": "number",
"minConfidence": "number",
"nuanceOptions": "#nuanceOptions",
"deepgramOptions": "#deepgramOptions",
"ibmOptions": "#ibmOptions",
"nvidiaOptions": "#nvidiaOptions",
"sonioxOptions": "#sonioxOptions",
"cobaltOptions": "#cobaltOptions",
"awsOptions": "#awsOptions",
"azureOptions": "#azureOptions",
"assemblyAiOptions": "#assemblyAiOptions",
"googleOptions": "#googleOptions",
"customOptions": "#customOptions",
"verbioOptions": "#verbioOptions",
"speechmaticsOptions": "#speechmaticsOptions",
"openaiOptions": "#openaiOptions",
"houndifyOptions": "#houndifyOptions",
"gladiaOptions": "object",
"elevenlabsOptions": "#elevenlabsOptions"
"customOptions": "#customOptions"
},
"required": [
"vendor"
@@ -779,131 +591,11 @@
"properties": {
"authToken": "string",
"uri": "string",
"sampleRate": "number",
"options": "object"
},
"required": [
]
},
"awsOptions": {
"properties": {
"accessKey": "string",
"secretKey": "string",
"securityToken": "string",
"region": "string",
"vocabularyName": "string",
"vocabularyFilterName": "string",
"vocabularyFilterMethod": {
"type": "string",
"enum": [
"remove",
"mask",
"tag"
]
},
"languageModelName": "string",
"piiEntityTypes": "array",
"piiIdentifyEntities": "boolean"
},
"required": [
]
},
"azureOptions": {
"properties": {
"speechSegmentationSilenceTimeoutMs": "number",
"postProcessing" : "string",
"audioLogging" : "boolean",
"languageIdMode": {
"type": "string",
"enum": [
"AtStart",
"Continuous"
]
},
"speechRecognitionMode": {
"type": "string",
"enum": [
"CONVERSATION",
"DICTATION",
"INTERACTIVE"
]
}
},
"required": [
]
},
"googleOptions" : {
"properties": {
"serviceVersion": {
"type": "string",
"enum": [
"v1",
"v2"
]
},
"recognizerId": "string",
"speechStartTimeoutMs": "number",
"speechEndTimeoutMs": "number",
"enableVoiceActivityEvents": "boolean",
"transcriptNormalization": "array"
}
},
"houndifyOptions": {
"properties": {
"requestInfo": "object",
"sampleRate": "number",
"latitude": "number",
"longitude": "number",
"city": "string",
"state": "string",
"country": "string",
"timeZone": "string",
"domain": "string",
"audioEndpoint": "string",
"maxSilenceSeconds": "number",
"maxSilenceAfterFullQuerySeconds": "number",
"maxSilenceAfterPartialQuerySeconds": "number",
"vadSensitivity": "number",
"vadTimeout": "number",
"vadMode": "string",
"vadVoiceMs": "number",
"vadSilenceMs": "number",
"vadDebug": "boolean",
"audioFormat": "string",
"enableNoiseReduction": "boolean",
"enableProfanityFilter": "boolean",
"enablePunctuation": "boolean",
"enableCapitalization": "boolean",
"confidenceThreshold": "number",
"enableDisfluencyFilter": "boolean",
"maxResults": "number",
"enableWordTimestamps": "boolean",
"maxAlternatives": "number",
"partialTranscriptInterval": "number",
"sessionTimeout": "number",
"connectionTimeout": "number",
"customVocabulary": "array",
"languageModel": "string",
"audioQueryAbsoluteTimeout": "number"
}
},
"elevenlabsOptions": {
"properties": {
"includeTimestamps": "boolean",
"commitStrategy": {
"type": "string",
"enum": [
"manual",
"vad"
]
},
"vadSilenceThresholdSecs": "number",
"vadThreshold": "number",
"minSpeechDurationMs": "number",
"minSilenceDurationMs": "number",
"enableLogging": "boolean"
}
},
"cobaltOptions": {
"properties": {
"serverUri": "string",
@@ -948,16 +640,12 @@
},
"deepgramOptions": {
"properties": {
"deepgramSttUri": "string",
"deepgramSttUseTls": "boolean",
"apiKey": "string",
"tier": "string",
"model": "string",
"customModel": "string",
"version": "string",
"punctuate": "boolean",
"smartFormatting": "boolean",
"noDelay": "boolean",
"profanityFilter": "boolean",
"redact": {
"type": "string",
@@ -977,18 +665,9 @@
"search": "array",
"replace": "array",
"keywords": "array",
"keyterms": "array",
"endpointing": "boolean | number",
"utteranceEndMs": "number",
"shortUtterance": "boolean",
"vadTurnoff": "number",
"tag": "string",
"fillerWords" : "boolean",
"eotThreshold": "number",
"eotTimeoutMs": "number",
"mipOptOut": "boolean",
"entityPrompt": "string",
"eagerEotThreshold":"number"
"tag": "string"
}
},
"sonioxOptions": {
@@ -1004,173 +683,6 @@
"required": [
]
},
"verbioOptions": {
"properties": {
"enable_formatting": "boolean",
"enable_diarization": "boolean",
"topic": "number",
"inline_grammar": "string",
"grammar_uri": "string",
"label": "string",
"recognition_timeout": "number",
"speech_complete_timeout": "number",
"speech_incomplete_timeout": "number"
},
"required": [
]
},
"openaiOptions": {
"properties": {
"apiKey": "string",
"model": "string",
"prompt": "string",
"promptTemplates": "#promptTemplates",
"language": "string",
"input_audio_noise_reduction": {
"type": "string",
"enum": [
"near_field",
"far_field"
]
},
"turn_detection": "#turnDetection"
},
"required": [
]
},
"promptTemplates": {
"properties": {
"hintsTemplate": "string",
"conversationHistoryTemplate": "string"
},
"required": [
]
},
"turnDetection": {
"properties": {
"type": {
"type": "string",
"enum": [
"none",
"server_vad",
"semantic_vad"
]
},
"eagerness": {
"type": "string",
"enum": [
"low",
"medium",
"high",
"auto"
]
},
"threshold": "number",
"prefix_padding_ms": "number",
"silence_duration_ms": "number"
},
"required": [
"type"
]
},
"speechmaticsOptions": {
"properties": {
"transcription_config": "#sm_transcriptionConfig",
"translation_config": "#sm_translationConfig",
"audio_events_config_config": "#sm_audioEventsConfig"
},
"required": [
]
},
"sm_transcriptionConfig": {
"properties": {
"language": "string",
"domain": "string",
"additional_vocab": "array",
"diarization": "string",
"speaker_diarization_config": "#sm_speakerDiarizationConfig",
"conversation_config": "#sm_conversationConfig",
"enable_partials": "boolean",
"max_delay": "number",
"max_delay_mode": {
"type": "string",
"enum": [
"fixed",
"flexible"
]
},
"output_locale": "string",
"punctuation_overrides": "#sm_puctuationOverrides",
"operating_point": "string",
"enable_entities": "boolean",
"audio_filtering_config": "#sm_audioFilteringConfig",
"transcript_filtering_config": "#sm_transcriptFilteringConfig"
},
"required": [
]
},
"sm_speakerDiarizationConfig": {
"properties": {
"speaker_sensitivity": "number",
"max_speakers": "number"
},
"required": [
]
},
"sm_conversationConfig": {
"properties": {
"end_of_utterance_silence_trigger": "number"
},
"required": [
]
},
"sm_puctuationOverrides": {
"properties": {
"permitted_marks": "array",
"sensitivity": "number"
},
"required": [
]
},
"sm_audioFilteringConfig": {
"properties": {
"volume_threshold": "number"
},
"required": [
"volume_threshold"
]
},
"sm_transcriptFilteringConfig": {
"properties": {
"remove_disfluencies": "boolean"
},
"required": [
"remove_disfluencies"
]
},
"sm_translationConfig": {
"properties": {
"target_languages": "array",
"enable_partials": "boolean"
},
"required": [
"target_languages"
]
},
"sm_audioEventsConfig": {
"properties": {
"types": {
"type": "array",
"enum": [
"applause",
"music",
"laughter"
]
}
},
"required": [
]
},
"sonioxStorage": {
"properties": {
"id": "string",
@@ -1228,22 +740,6 @@
"required": [
]
},
"assemblyAiOptions": {
"properties": {
"apiKey": "string",
"serviceVersion": {
"type": "string",
"enum": [
"v2",
"v3"
]
},
"formatTurns": "boolean",
"endOfTurnConfidenceThreshold": "number",
"minEndOfTurnSilenceWhenConfident": "number",
"maxTurnSilence": "number"
}
},
"resource": {
"properties": {
"externalReference": "#resourceReference",
@@ -1320,27 +816,16 @@
"properties": {
"enable": "boolean",
"voiceMs": "number",
"silenceMs": "number",
"strategy": "string",
"mode": "number",
"vendor": {
"type": "string",
"enum": [
"webrtc",
"silero"
]
},
"threshold": "number",
"speechPadMs": "number"
"mode": "number"
},
"required": [
"enable"
]
},
"amd": {
"properties": {
"actionHook": "object|string",
"thresholdWordCount": "number",
"digitCount": "number",
"timers": "#amdTimers",
"recognizer": "#recognizer"
},
@@ -1355,70 +840,5 @@
"toneTimeoutMs": "number",
"greetingCompletionTimeoutMs": "number"
}
},
"actionHookDelayAction" : {
"properties": {
"enabled": "boolean",
"noResponseTimeout": "number",
"noResponseGiveUpTimeout": "number",
"retries": "number",
"actions": "array",
"giveUpActions": "array"
}
},
"bidirectionalAudio" : {
"properties": {
"enabled": "boolean",
"streaming": "boolean",
"sampleRate": "number"
}
},
"pipeline": {
"properties": {
"id": "string",
"stt": "#recognizer",
"tts": "#synthesizer",
"vad": "#vad",
"turnDetection": "#turnDetectionPipeline",
"llm": "#llm",
"preflightLlm": "boolean",
"actionHook": "object|string",
"eventHook": "object|string",
"toolHook": "object|string"
},
"required": [
"stt",
"llm",
"tts"
]
},
"turnDetectionPipeline": {
"properties": {
"vendor": {
"type": "string",
"enum": ["krisp"]
},
"threshold": "number",
"eagerEotThreshold": "number"
},
"required": [
"vendor"
]
},
"noiseIsolation" : {
"properties": {
"enable": "boolean",
"vendor": "string",
"level": "number",
"model": "string"
}
},
"turnTaking": {
"properties": {
"enable": "boolean",
"vendor": "string",
"threshold": "number",
"model": "string"
}
}
}
}

View File

@@ -37,76 +37,7 @@ test("validate correct verbs", async (t) => {
"input" : ["speech"],
"actionHook": "/userInput"
},
"transcribe": {
"enable": true,
"transcriptionHook": "http://server.com/hook",
"recognizer": {
"vendor": "google",
"language": "de-DE",
}
},
"onHoldMusic": "http://server.com/hold",
"actionHookDelayAction": {
"enabled": true,
"noResponseTimeout": 5,
"noResponseGiveUpTimeout": 10,
"retries": 3,
"actions": [
{
"verb": "say",
"text": "To speak to Sales press 1 or say Sales. To speak to customer support press 2 or say Support",
"synthesizer": {
"vendor": "google",
"language": "en-US"
}
},
{
"verb": "play",
"url": "https://example.com/example.mp3",
"timeoutSecs": 10,
"seekOffset": 8000,
"actionHook": "/play/action"
}
]
}
},
{
"verb": "config",
"notifySttLatency": true,
"recognizer": {
"vendor": "google",
"language": "de-DE",
"label": "label1",
"assemblyAiOptions": {
"apiKey": "apikey",
"serviceVersion": "v3",
"formatTurns": true,
"endOfTurnConfidenceThreshold": 0.5,
"minEndOfTurnSilenceWhenConfident": 500,
"maxTurnSilence": 2000
}
}
},
{
"verb": "config",
"referHook": "https://referhook.com"
},
{
"verb": "config",
"referHook": {
"url": "https://referhook.com"
}
},
{
"verb": "config",
"recognizer": {
"vendor": "google",
"language": "de-DE",
"label": "label1",
"azureOptions": {
"languageIdMode": "Continuous"
}
}
"onHoldMusic": "http://server.com/hold"
},
{
"verb": "config",
@@ -119,10 +50,6 @@ test("validate correct verbs", async (t) => {
}
}
},
{
"verb": "config",
"sipRequestWithinDialogHook": "https://jambonz.or/sipIndialogActionHook"
},
{
"verb": "config",
"record": {
@@ -145,7 +72,6 @@ test("validate correct verbs", async (t) => {
"callerName": "Tom",
"answerOnBridge": true,
"dtmfCapture": ["*2", "*3"],
"timeLimit": 10,
"dtmfHook": {
"url": "/dtmf",
"method": "GET"
@@ -211,12 +137,7 @@ test("validate correct verbs", async (t) => {
"hintsBoost": 10,
"fastRecognitionTimeout": 2000,
"deepgramOptions": {
"endpointing": 500,
"noDelay": true,
"eotThreshold": 500,
"eotTimeoutMs": 5000,
"eagerEotThreshold": 200,
"mipOptOut": true
"endpointing": 500
}
},
"say": {
@@ -230,119 +151,8 @@ test("validate correct verbs", async (t) => {
"fallbackLabel": "label1",
"fallbackVoice": "voice"
}
},
"say": {
"text": "To speak to Sales press 1 or say Sales. To speak to customer support press 2 or say Support",
"instructions": "Voice: High-energy, upbeat, and encouraging, projecting enthusiasm and motivation."
},
"say": {
"text": "To speak to Sales press 1 or say Sales. To speak to customer support press 2 or say Support",
"synthesizer": {
"vendor": "google",
"language": "en-US",
"voice": {
"reportedUsage":"REALTIME",
"model":"path/to/model",
},
"fallbackVendor": "google",
"fallbackLanguage": "en-US",
"fallbackLabel": "label1",
"fallbackVoice": {
"reportedUsage":"REALTIME",
"model":"path/to/model",
}
}
}
},
{
"verb": "gather",
"actionHook": "http://example.com/collect",
"input": ["digits", "speech"],
"bargein": true,
"dtmfBargein": true,
"finishOnKey": "#",
"numDigits": 5,
"timeout": 8,
"recognizer": {
"vendor": "verbio",
"language": "en-US",
"verbioOptions": {
"enable_formatting": true,
"enable_diarization": true,
"topic": 0,
"inline_grammar": "this is inline grammar",
"grammar_uri": "https://grammar_uri.com",
"label": "label",
"recognition_timeout": 500,
"speech_complete_timeout": 500,
"speech_incomplete_timeout": 500,
}
},
},
{
"verb": "gather",
"actionHook": "http://example.com/collect",
"input": ["digits", "speech"],
"bargein": true,
"dtmfBargein": true,
"finishOnKey": "#",
"numDigits": 5,
"timeout": 8,
"recognizer": {
"vendor": "houndify",
"language": "en-US",
"houndifyOptions": {
"requestInfo": {
"Latitude": 30.6,
"Longitude": 30.6,
"City": "Huston"
},
"sampleRate": 16000,
"latitude": 30.6,
"longitude": 30.6,
"city": "Huston",
"state": "CA",
"country": "US",
"timeZone": "GMT",
"domain": "Voice",
"audioEndpoint": "https://api.houndify.com/v1/audio",
"maxSilenceSeconds": 5,
"maxSilenceAfterFullQuerySeconds": 3,
"maxSilenceAfterPartialQuerySeconds": 2,
"vadSensitivity": 0.5,
"vadTimeout": 1000,
"vadMode": "auto",
"vadVoiceMs": 250,
"vadSilenceMs": 500,
"vadDebug": true,
"audioFormat": "PCM16",
"enableNoiseReduction": true,
"enableProfanityFilter": false,
"enablePunctuation": true,
"enableCapitalization": true,
"confidenceThreshold": 0.7,
"enableDisfluencyFilter": true,
"maxResults": 5,
"enableWordTimestamps": true,
"maxAlternatives": 3,
"partialTranscriptInterval": 100,
"sessionTimeout": 30000,
"connectionTimeout": 5000,
"customVocabulary": ["jambonz", "telephony", "voip"],
"languageModel": "enhanced",
"audioQueryAbsoluteTimeout": 5
},
"gladiaOptions": {
"post_processing": {
"summarization": false,
"summarization_config": {
"type": "general"
},
"chapterization": false
},
}
},
},
{
"verb": "gather",
"actionHook": "http://example.com/collect",
@@ -364,28 +174,6 @@ test("validate correct verbs", async (t) => {
"endpointing": true
}
},
"actionHookDelayAction": {
"noResponseTimeout": 5,
"noResponseGiveUpTimeout": 10,
"retries": 3,
"actions": [
{
"verb": "say",
"text": "To speak to Sales press 1 or say Sales. To speak to customer support press 2 or say Support",
"synthesizer": {
"vendor": "google",
"language": "en-US"
}
},
{
"verb": "play",
"url": "https://example.com/example.mp3",
"timeoutSecs": 10,
"seekOffset": 8000,
"actionHook": "/play/action"
}
]
}
},
{
"verb": "hangup",
@@ -429,64 +217,6 @@ test("validate correct verbs", async (t) => {
"url": "wss://myrecorder.example.com/calls",
"mixType" : "stereo"
},
{
"verb": "listen",
"url": "wss://myrecorder.example.com/calls",
"mixType" : "stereo",
"bidirectionalAudio": {
enabled: true,
streaming: true,
sampleRate: 8000
}
},
{
"verb": "config",
"listen": {
"enable": true,
"url": "wss://myrecorder.example.com/calls",
"mixType" : "stereo",
"bidirectionalAudio": {
enabled: true,
streaming: true,
sampleRate: 8000
}
}
},
{
"verb": "config",
"autoStreamTts": true
},
{
"verb": "config",
"vad": {
"enable": true,
"voiceMs": 250,
"silenceMs": 150,
"strategy": "one-shot",
"mode": 2,
"vendor": "webrtc",
"threshold": 0.5,
"speechPadMs": 1000
}
},
{
"verb": "config",
"noiseIsolation": {
"enable": true,
"vendor": "krisp",
"level": 3,
"model": "custom-model"
}
},
{
"verb": "config",
"turnTaking": {
"enable": true,
"vendor": "krisp",
"threshold": 0.5,
"model": "turn-taking-model"
}
},
{
"verb": "message",
"to": "15083084809",
@@ -545,12 +275,6 @@ test("validate correct verbs", async (t) => {
"referTo": "+15083084809",
"actionHook": "/action"
},
{
"verb": "sip:refer",
"referTo": "+15083084809",
"referredByDisplayName": "Alice",
"actionHook": "/action"
},
{
"verb": "tag",
"data": {
@@ -568,57 +292,6 @@ test("validate correct verbs", async (t) => {
"interim": true
}
},
{
"verb": "transcribe",
"transcriptionHook": "http://example.com/transcribe",
"recognizer": {
"vendor": "nvidia",
"language" : "en-US",
"interim": true,
"elevenlabsOptions": {
"includeTimestamps": true,
"commitStrategy": "vad",
"vadSilenceThresholdSecs": 0.8,
"vadThreshold": 0.5,
"minSpeechDurationMs": 300,
"minSilenceDurationMs": 500,
"enableLogging": false
}
}
},
{
"verb": "transcribe",
"transcriptionHook": "http://example.com/transcribe",
"recognizer": {
"vendor": "nvidia",
"language" : "en-US",
"customOptions": {
"sampleRate": 16000
}
}
},
{
"verb": "transcribe",
"transcriptionHook": "http://example.com/transcribe",
"recognizer": {
"vendor": "nvidia",
"language" : "en-US",
"interim": true,
"googleOptions": {
"serviceVersion": "v2",
"speechStartTimeoutMs": 500,
"speechEndTimeoutMs": 1000,
"enableVoiceActivityEvents": true,
"transcriptNormalization" : [
{
"search": "dog",
"replace": "cat",
"case_sensitive": true
}
]
}
}
},
{
"verb": "rest:dial",
"account_sid": "1291964182631236912836123912",
@@ -641,66 +314,7 @@ test("validate correct verbs", async (t) => {
"actionHook": "/answeringMachineDetection",
},
"dual_streams": true,
"timeLimit" : 10
},
{
"verb": "llm",
"vendor": 'ultravox',
"model": 'fixie-ai/ultravox',
"auth": {
"apiKey": "sk-1234567890abcdefg"
},
"llmOptions": {
"firstSpeaker": 'FIRST_SPEAKER_AGENT',
},
"mcpServers": [
{
"url": 'https://mcp.example.com',
"auth": {
"username": 'username',
"password": 'password'
}
}
]
},
{
"verb": "pipeline",
"stt": {
"vendor": "google",
"language": "en-US"
},
"tts": {
"vendor": "google",
"language": "en-US"
},
"llm": {
"vendor": "openai",
"llmOptions": {
"model": "gpt-4o"
}
},
"actionHook": "/pipeline/action",
"eventHook": "/pipeline/event",
"toolHook": "/pipeline/tool"
},
{
"verb": "transcribe",
"transcriptionHook": "http://example.com/transcribe",
"recognizer": {
"vendor": "speechmatics",
"language": "en",
"speechmaticsOptions": {
"transcription_config": {
"language": "en",
"enable_partials": true,
"max_delay": 2,
"conversation_config": {
"end_of_utterance_silence_trigger": 0.5
}
}
}
}
"dual_streams": true
}
];
try {