aillom-vox-client 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +272 -0
  3. package/dist/AillomVox.d.ts +36 -0
  4. package/dist/AillomVox.js +152 -0
  5. package/dist/index.d.ts +2 -0
  6. package/dist/index.js +18 -0
  7. package/dist/types.d.ts +36 -0
  8. package/dist/types.js +2 -0
  9. package/docs/ASTERISK.md +411 -0
  10. package/docs/PROTOCOL.md +156 -0
  11. package/docs/PROVIDERS.md +40 -0
  12. package/docs/TOOLS.md +314 -0
  13. package/docs/TROUBLESHOOTING.md +86 -0
  14. package/docs/VOICES.md +219 -0
  15. package/docs/providers/AILLOMVOX.md +185 -0
  16. package/docs/providers/AWS.md +32 -0
  17. package/docs/providers/GEMINI.md +33 -0
  18. package/docs/providers/GROK.md +25 -0
  19. package/docs/providers/OPENAI.md +39 -0
  20. package/docs/providers/QWEN.md +27 -0
  21. package/docs/providers/ULTRAVOX.md +29 -0
  22. package/examples/01-basic/app.js +196 -0
  23. package/examples/01-basic/index.html +27 -0
  24. package/examples/02-advanced-dashboard/app.js +465 -0
  25. package/examples/02-advanced-dashboard/index.html +200 -0
  26. package/examples/02-advanced-dashboard/style.css +501 -0
  27. package/examples/03-smart-home/index.html +377 -0
  28. package/examples/04-customer-support/index.html +474 -0
  29. package/examples/sdk-usage.ts +44 -0
  30. package/integrations/n8n-nodes-aillomvox/README.md +56 -0
  31. package/integrations/n8n-nodes-aillomvox/credentials/AillomVoxApi.credentials.ts +29 -0
  32. package/integrations/n8n-nodes-aillomvox/dist/credentials/AillomVoxApi.credentials.js +30 -0
  33. package/integrations/n8n-nodes-aillomvox/dist/nodes/AillomVox/AillomVox.node.js +219 -0
  34. package/integrations/n8n-nodes-aillomvox/dist/nodes/AillomVox/aillomvox.svg +6 -0
  35. package/integrations/n8n-nodes-aillomvox/gulpfile.js +10 -0
  36. package/integrations/n8n-nodes-aillomvox/nodes/AillomVox/AillomVox.node.ts +229 -0
  37. package/integrations/n8n-nodes-aillomvox/nodes/AillomVox/aillomvox.svg +6 -0
  38. package/integrations/n8n-nodes-aillomvox/package-lock.json +11741 -0
  39. package/integrations/n8n-nodes-aillomvox/package.json +56 -0
  40. package/integrations/n8n-nodes-aillomvox/tsconfig.json +32 -0
  41. package/package.json +55 -0
  42. package/src/AillomVox.ts +169 -0
  43. package/src/index.ts +2 -0
  44. package/src/types.ts +50 -0
  45. package/tsconfig.json +23 -0
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AillomVox = void 0;
4
+ class AillomVox {
5
+ constructor() {
6
+ this.description = {
7
+ displayName: 'AillomVox',
8
+ name: 'aillomVox',
9
+ icon: 'file:aillomvox.svg',
10
+ group: ['transform'],
11
+ version: 1,
12
+ subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
13
+ description: 'Interact with AillomVox API (Voices, Providers, Recordings)',
14
+ defaults: {
15
+ name: 'AillomVox',
16
+ },
17
+ inputs: ['main'],
18
+ outputs: ['main'],
19
+ credentials: [
20
+ {
21
+ name: 'aillomVoxApi',
22
+ required: true,
23
+ },
24
+ ],
25
+ properties: [
26
+ {
27
+ displayName: 'Resource',
28
+ name: 'resource',
29
+ type: 'options',
30
+ noDataExpression: true,
31
+ options: [
32
+ {
33
+ name: 'Info',
34
+ value: 'info',
35
+ },
36
+ {
37
+ name: 'Recording',
38
+ value: 'recording',
39
+ },
40
+ ],
41
+ default: 'info',
42
+ },
43
+ // ----------------------------------
44
+ // Resource: Info
45
+ // ----------------------------------
46
+ {
47
+ displayName: 'Operation',
48
+ name: 'operation',
49
+ type: 'options',
50
+ noDataExpression: true,
51
+ displayOptions: {
52
+ show: {
53
+ resource: [
54
+ 'info',
55
+ ],
56
+ },
57
+ },
58
+ options: [
59
+ {
60
+ name: 'Get Voices',
61
+ value: 'getVoices',
62
+ description: 'Returns the list of available voices',
63
+ action: 'Get voices',
64
+ },
65
+ {
66
+ name: 'Get Providers',
67
+ value: 'getProviders',
68
+ description: 'Returns the list of AI providers and pricing',
69
+ action: 'Get providers',
70
+ },
71
+ ],
72
+ default: 'getVoices',
73
+ },
74
+ // ----------------------------------
75
+ // Resource: Recording
76
+ // ----------------------------------
77
+ {
78
+ displayName: 'Operation',
79
+ name: 'operation',
80
+ type: 'options',
81
+ noDataExpression: true,
82
+ displayOptions: {
83
+ show: {
84
+ resource: [
85
+ 'recording',
86
+ ],
87
+ },
88
+ },
89
+ options: [
90
+ {
91
+ name: 'Get Download URL',
92
+ value: 'getDownloadUrl',
93
+ description: 'Generates a temporary link to download the recording',
94
+ action: 'Get download url',
95
+ },
96
+ ],
97
+ default: 'getDownloadUrl',
98
+ },
99
+ // ----------------------------------
100
+ // Fields: getVoices
101
+ // ----------------------------------
102
+ {
103
+ displayName: 'Provider (Optional)',
104
+ name: 'provider',
105
+ type: 'options',
106
+ displayOptions: {
107
+ show: {
108
+ resource: [
109
+ 'info',
110
+ ],
111
+ operation: [
112
+ 'getVoices',
113
+ ],
114
+ },
115
+ },
116
+ options: [
117
+ {
118
+ name: 'AillomVox (Default)',
119
+ value: 'aillomvox',
120
+ },
121
+ {
122
+ name: 'ElevenLabs',
123
+ value: 'elevenlabs',
124
+ },
125
+ {
126
+ name: 'PlayHT',
127
+ value: 'playht',
128
+ },
129
+ {
130
+ name: 'Inworld',
131
+ value: 'inworld',
132
+ },
133
+ {
134
+ name: 'Azure',
135
+ value: 'azure',
136
+ },
137
+ ],
138
+ default: 'aillomvox',
139
+ description: 'Filter voices by specific provider',
140
+ },
141
+ // ----------------------------------
142
+ // Fields: getDownloadUrl
143
+ // ----------------------------------
144
+ {
145
+ displayName: 'Recording ID',
146
+ name: 'recordingId',
147
+ type: 'string',
148
+ default: '',
149
+ required: true,
150
+ displayOptions: {
151
+ show: {
152
+ resource: [
153
+ 'recording',
154
+ ],
155
+ operation: [
156
+ 'getDownloadUrl',
157
+ ],
158
+ },
159
+ },
160
+ description: 'The recording ID (UUID) or the S3/Supabase file path',
161
+ },
162
+ ],
163
+ };
164
+ }
165
+ async execute() {
166
+ const items = this.getInputData();
167
+ const returnData = [];
168
+ const resource = this.getNodeParameter('resource', 0);
169
+ const operation = this.getNodeParameter('operation', 0);
170
+ for (let i = 0; i < items.length; i++) {
171
+ try {
172
+ if (resource === 'info') {
173
+ if (operation === 'getVoices') {
174
+ const provider = this.getNodeParameter('provider', i);
175
+ const qs = {};
176
+ if (provider) {
177
+ qs.provider = provider;
178
+ }
179
+ const response = await this.helpers.requestWithAuthentication.call(this, 'aillomVoxApi', {
180
+ method: 'GET',
181
+ uri: '/api/voices',
182
+ qs,
183
+ json: true,
184
+ });
185
+ returnData.push(response);
186
+ }
187
+ else if (operation === 'getProviders') {
188
+ const response = await this.helpers.requestWithAuthentication.call(this, 'aillomVoxApi', {
189
+ method: 'GET',
190
+ uri: '/api/providers',
191
+ json: true,
192
+ });
193
+ returnData.push(response);
194
+ }
195
+ }
196
+ else if (resource === 'recording') {
197
+ if (operation === 'getDownloadUrl') {
198
+ const recordingId = this.getNodeParameter('recordingId', i);
199
+ const response = await this.helpers.requestWithAuthentication.call(this, 'aillomVoxApi', {
200
+ method: 'GET',
201
+ uri: `/api/recording/${recordingId}`,
202
+ json: true,
203
+ });
204
+ returnData.push(response);
205
+ }
206
+ }
207
+ }
208
+ catch (error) {
209
+ if (this.continueOnFail()) {
210
+ returnData.push({ error: error.message });
211
+ continue;
212
+ }
213
+ throw error;
214
+ }
215
+ }
216
+ return [this.helpers.returnJsonArray(returnData)];
217
+ }
218
+ }
219
+ exports.AillomVox = AillomVox;
@@ -0,0 +1,6 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
2
+ <circle cx="50" cy="50" r="45" fill="#4A90E2" />
3
+ <path d="M30 50 Q50 20 70 50 T30 50" stroke="white" stroke-width="5" fill="none" />
4
+ <circle cx="30" cy="50" r="5" fill="white" />
5
+ <circle cx="70" cy="50" r="5" fill="white" />
6
+ </svg>
@@ -0,0 +1,10 @@
1
+ const { src, dest } = require('gulp');
2
+ const path = require('path');
3
+
4
+ function copyIcons() {
5
+ return src('nodes/**/*.svg')
6
+ .pipe(dest('dist/nodes'));
7
+ }
8
+
9
+ exports['build:icons'] = copyIcons;
10
+ exports.default = copyIcons;
@@ -0,0 +1,229 @@
1
+ import {
2
+ IExecuteFunctions,
3
+ IDataObject,
4
+ INodeExecutionData,
5
+ INodeType,
6
+ INodeTypeDescription,
7
+ } from 'n8n-workflow';
8
+
9
+ export class AillomVox implements INodeType {
10
+ description: INodeTypeDescription = {
11
+ displayName: 'AillomVox',
12
+ name: 'aillomVox',
13
+ icon: 'file:aillomvox.svg',
14
+ group: ['transform'],
15
+ version: 1,
16
+ subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
17
+ description: 'Interact with AillomVox API (Voices, Providers, Recordings)',
18
+ defaults: {
19
+ name: 'AillomVox',
20
+ },
21
+ inputs: ['main'],
22
+ outputs: ['main'],
23
+ credentials: [
24
+ {
25
+ name: 'aillomVoxApi',
26
+ required: true,
27
+ },
28
+ ],
29
+ properties: [
30
+ {
31
+ displayName: 'Resource',
32
+ name: 'resource',
33
+ type: 'options',
34
+ noDataExpression: true,
35
+ options: [
36
+ {
37
+ name: 'Info',
38
+ value: 'info',
39
+ },
40
+ {
41
+ name: 'Recording',
42
+ value: 'recording',
43
+ },
44
+ ],
45
+ default: 'info',
46
+ },
47
+
48
+ // ----------------------------------
49
+ // Resource: Info
50
+ // ----------------------------------
51
+ {
52
+ displayName: 'Operation',
53
+ name: 'operation',
54
+ type: 'options',
55
+ noDataExpression: true,
56
+ displayOptions: {
57
+ show: {
58
+ resource: [
59
+ 'info',
60
+ ],
61
+ },
62
+ },
63
+ options: [
64
+ {
65
+ name: 'Get Voices',
66
+ value: 'getVoices',
67
+ description: 'Returns the list of available voices',
68
+ action: 'Get voices',
69
+ },
70
+ {
71
+ name: 'Get Providers',
72
+ value: 'getProviders',
73
+ description: 'Returns the list of AI providers and pricing',
74
+ action: 'Get providers',
75
+ },
76
+ ],
77
+ default: 'getVoices',
78
+ },
79
+
80
+ // ----------------------------------
81
+ // Resource: Recording
82
+ // ----------------------------------
83
+ {
84
+ displayName: 'Operation',
85
+ name: 'operation',
86
+ type: 'options',
87
+ noDataExpression: true,
88
+ displayOptions: {
89
+ show: {
90
+ resource: [
91
+ 'recording',
92
+ ],
93
+ },
94
+ },
95
+ options: [
96
+ {
97
+ name: 'Get Download URL',
98
+ value: 'getDownloadUrl',
99
+ description: 'Generates a temporary link to download the recording',
100
+ action: 'Get download url',
101
+ },
102
+ ],
103
+ default: 'getDownloadUrl',
104
+ },
105
+
106
+ // ----------------------------------
107
+ // Fields: getVoices
108
+ // ----------------------------------
109
+ {
110
+ displayName: 'Provider (Optional)',
111
+ name: 'provider',
112
+ type: 'options',
113
+ displayOptions: {
114
+ show: {
115
+ resource: [
116
+ 'info',
117
+ ],
118
+ operation: [
119
+ 'getVoices',
120
+ ],
121
+ },
122
+ },
123
+ options: [
124
+ {
125
+ name: 'AillomVox (Default)',
126
+ value: 'aillomvox',
127
+ },
128
+ {
129
+ name: 'ElevenLabs',
130
+ value: 'elevenlabs',
131
+ },
132
+ {
133
+ name: 'PlayHT',
134
+ value: 'playht',
135
+ },
136
+ {
137
+ name: 'Inworld',
138
+ value: 'inworld',
139
+ },
140
+ {
141
+ name: 'Azure',
142
+ value: 'azure',
143
+ },
144
+ ],
145
+ default: 'aillomvox',
146
+ description: 'Filter voices by specific provider',
147
+ },
148
+
149
+ // ----------------------------------
150
+ // Fields: getDownloadUrl
151
+ // ----------------------------------
152
+ {
153
+ displayName: 'Recording ID',
154
+ name: 'recordingId',
155
+ type: 'string',
156
+ default: '',
157
+ required: true,
158
+ displayOptions: {
159
+ show: {
160
+ resource: [
161
+ 'recording',
162
+ ],
163
+ operation: [
164
+ 'getDownloadUrl',
165
+ ],
166
+ },
167
+ },
168
+ description: 'The recording ID (UUID) or the S3/Supabase file path',
169
+ },
170
+ ],
171
+ };
172
+
173
+ async execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]> {
174
+ const items = this.getInputData();
175
+ const returnData: IDataObject[] = [];
176
+ const resource = this.getNodeParameter('resource', 0) as string;
177
+ const operation = this.getNodeParameter('operation', 0) as string;
178
+
179
+ for (let i = 0; i < items.length; i++) {
180
+ try {
181
+ if (resource === 'info') {
182
+ if (operation === 'getVoices') {
183
+ const provider = this.getNodeParameter('provider', i) as string;
184
+ const qs: IDataObject = {};
185
+ if (provider) {
186
+ qs.provider = provider;
187
+ }
188
+
189
+ const response = await this.helpers.requestWithAuthentication.call(this, 'aillomVoxApi', {
190
+ method: 'GET',
191
+ uri: '/api/voices',
192
+ qs,
193
+ json: true,
194
+ });
195
+
196
+ returnData.push(response as IDataObject);
197
+ } else if (operation === 'getProviders') {
198
+ const response = await this.helpers.requestWithAuthentication.call(this, 'aillomVoxApi', {
199
+ method: 'GET',
200
+ uri: '/api/providers',
201
+ json: true,
202
+ });
203
+ returnData.push(response as IDataObject);
204
+ }
205
+ } else if (resource === 'recording') {
206
+ if (operation === 'getDownloadUrl') {
207
+ const recordingId = this.getNodeParameter('recordingId', i) as string;
208
+
209
+ const response = await this.helpers.requestWithAuthentication.call(this, 'aillomVoxApi', {
210
+ method: 'GET',
211
+ uri: `/api/recording/${recordingId}`,
212
+ json: true,
213
+ });
214
+
215
+ returnData.push(response as IDataObject);
216
+ }
217
+ }
218
+ } catch (error) {
219
+ if (this.continueOnFail()) {
220
+ returnData.push({ error: error.message });
221
+ continue;
222
+ }
223
+ throw error;
224
+ }
225
+ }
226
+
227
+ return [this.helpers.returnJsonArray(returnData)];
228
+ }
229
+ }
@@ -0,0 +1,6 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
2
+ <circle cx="50" cy="50" r="45" fill="#4A90E2" />
3
+ <path d="M30 50 Q50 20 70 50 T30 50" stroke="white" stroke-width="5" fill="none" />
4
+ <circle cx="30" cy="50" r="5" fill="white" />
5
+ <circle cx="70" cy="50" r="5" fill="white" />
6
+ </svg>