@tuteliq/sdk 2.1.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.
- package/LICENSE +21 -0
- package/README.md +1034 -0
- package/dist/cjs/client.js +1283 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/constants.js +179 -0
- package/dist/cjs/constants.js.map +1 -0
- package/dist/cjs/errors.js +129 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.js +37 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/types/account.js +6 -0
- package/dist/cjs/types/account.js.map +1 -0
- package/dist/cjs/types/analysis.js +6 -0
- package/dist/cjs/types/analysis.js.map +1 -0
- package/dist/cjs/types/guidance.js +3 -0
- package/dist/cjs/types/guidance.js.map +1 -0
- package/dist/cjs/types/index.js +28 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/media.js +6 -0
- package/dist/cjs/types/media.js.map +1 -0
- package/dist/cjs/types/policy.js +6 -0
- package/dist/cjs/types/policy.js.map +1 -0
- package/dist/cjs/types/pricing.js +6 -0
- package/dist/cjs/types/pricing.js.map +1 -0
- package/dist/cjs/types/reports.js +3 -0
- package/dist/cjs/types/reports.js.map +1 -0
- package/dist/cjs/types/safety.js +7 -0
- package/dist/cjs/types/safety.js.map +1 -0
- package/dist/cjs/types/voice-stream.js +6 -0
- package/dist/cjs/types/voice-stream.js.map +1 -0
- package/dist/cjs/types/webhooks.js +6 -0
- package/dist/cjs/types/webhooks.js.map +1 -0
- package/dist/cjs/utils/retry.js +64 -0
- package/dist/cjs/utils/retry.js.map +1 -0
- package/dist/cjs/voice-stream.js +184 -0
- package/dist/cjs/voice-stream.js.map +1 -0
- package/dist/client.d.ts +643 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +1280 -0
- package/dist/client.js.map +1 -0
- package/dist/constants.d.ts +141 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +176 -0
- package/dist/constants.js.map +1 -0
- package/dist/errors.d.ts +81 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +116 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/types/account.d.ts +161 -0
- package/dist/types/account.d.ts.map +1 -0
- package/dist/types/account.js +5 -0
- package/dist/types/account.js.map +1 -0
- package/dist/types/analysis.d.ts +41 -0
- package/dist/types/analysis.d.ts.map +1 -0
- package/dist/types/analysis.js +4 -0
- package/dist/types/analysis.js.map +1 -0
- package/dist/types/guidance.d.ts +35 -0
- package/dist/types/guidance.d.ts.map +1 -0
- package/dist/types/guidance.js +2 -0
- package/dist/types/guidance.js.map +1 -0
- package/dist/types/index.d.ts +231 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +12 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/media.d.ts +121 -0
- package/dist/types/media.d.ts.map +1 -0
- package/dist/types/media.js +4 -0
- package/dist/types/media.js.map +1 -0
- package/dist/types/policy.d.ts +54 -0
- package/dist/types/policy.d.ts.map +1 -0
- package/dist/types/policy.js +5 -0
- package/dist/types/policy.js.map +1 -0
- package/dist/types/pricing.d.ts +53 -0
- package/dist/types/pricing.d.ts.map +1 -0
- package/dist/types/pricing.js +5 -0
- package/dist/types/pricing.js.map +1 -0
- package/dist/types/reports.d.ts +44 -0
- package/dist/types/reports.d.ts.map +1 -0
- package/dist/types/reports.js +2 -0
- package/dist/types/reports.js.map +1 -0
- package/dist/types/safety.d.ts +151 -0
- package/dist/types/safety.d.ts.map +1 -0
- package/dist/types/safety.js +4 -0
- package/dist/types/safety.js.map +1 -0
- package/dist/types/voice-stream.d.ts +97 -0
- package/dist/types/voice-stream.d.ts.map +1 -0
- package/dist/types/voice-stream.js +5 -0
- package/dist/types/voice-stream.js.map +1 -0
- package/dist/types/webhooks.d.ts +110 -0
- package/dist/types/webhooks.d.ts.map +1 -0
- package/dist/types/webhooks.js +4 -0
- package/dist/types/webhooks.js.map +1 -0
- package/dist/utils/retry.d.ts +17 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +61 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/voice-stream.d.ts +16 -0
- package/dist/voice-stream.d.ts.map +1 -0
- package/dist/voice-stream.js +148 -0
- package/dist/voice-stream.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withRetry = withRetry;
|
|
4
|
+
const errors_js_1 = require("../errors.js");
|
|
5
|
+
const DEFAULT_OPTIONS = {
|
|
6
|
+
maxRetries: 3,
|
|
7
|
+
initialDelay: 1000,
|
|
8
|
+
maxDelay: 30000,
|
|
9
|
+
backoffMultiplier: 2,
|
|
10
|
+
isRetryable: defaultIsRetryable,
|
|
11
|
+
};
|
|
12
|
+
function defaultIsRetryable(error) {
|
|
13
|
+
// Retry on rate limit, server errors, network errors, and timeouts
|
|
14
|
+
if (error instanceof errors_js_1.RateLimitError)
|
|
15
|
+
return true;
|
|
16
|
+
if (error instanceof errors_js_1.ServerError)
|
|
17
|
+
return true;
|
|
18
|
+
if (error instanceof errors_js_1.NetworkError)
|
|
19
|
+
return true;
|
|
20
|
+
if (error instanceof errors_js_1.TimeoutError)
|
|
21
|
+
return true;
|
|
22
|
+
// Retry on fetch errors (network issues)
|
|
23
|
+
if (error instanceof TypeError && error.message.includes('fetch'))
|
|
24
|
+
return true;
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
function sleep(ms) {
|
|
28
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
29
|
+
}
|
|
30
|
+
function calculateDelay(attempt, options) {
|
|
31
|
+
const delay = options.initialDelay * Math.pow(options.backoffMultiplier, attempt);
|
|
32
|
+
// Add jitter (0-25% of delay)
|
|
33
|
+
const jitter = delay * Math.random() * 0.25;
|
|
34
|
+
return Math.min(delay + jitter, options.maxDelay);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Execute a function with exponential backoff retry
|
|
38
|
+
*/
|
|
39
|
+
async function withRetry(fn, options = {}) {
|
|
40
|
+
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
41
|
+
let lastError;
|
|
42
|
+
for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {
|
|
43
|
+
try {
|
|
44
|
+
return await fn();
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
lastError = error;
|
|
48
|
+
// Check if we should retry
|
|
49
|
+
if (attempt >= opts.maxRetries || !opts.isRetryable(error)) {
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
// Handle rate limit with retry-after header
|
|
53
|
+
if (error instanceof errors_js_1.RateLimitError && error.retryAfter) {
|
|
54
|
+
await sleep(error.retryAfter * 1000);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
const delay = calculateDelay(attempt, opts);
|
|
58
|
+
await sleep(delay);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
throw lastError;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/utils/retry.ts"],"names":[],"mappings":";;AAkDA,8BA8BC;AAhFD,4CAAuF;AAevF,MAAM,eAAe,GAA2B;IAC5C,UAAU,EAAE,CAAC;IACb,YAAY,EAAE,IAAI;IAClB,QAAQ,EAAE,KAAK;IACf,iBAAiB,EAAE,CAAC;IACpB,WAAW,EAAE,kBAAkB;CAClC,CAAC;AAEF,SAAS,kBAAkB,CAAC,KAAc;IACtC,mEAAmE;IACnE,IAAI,KAAK,YAAY,0BAAc;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,KAAK,YAAY,uBAAW;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,KAAK,YAAY,wBAAY;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,KAAK,YAAY,wBAAY;QAAE,OAAO,IAAI,CAAC;IAE/C,yCAAyC;IACzC,IAAI,KAAK,YAAY,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAE/E,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACrB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,cAAc,CAAC,OAAe,EAAE,OAA+B;IACpE,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IAClF,8BAA8B;IAC9B,MAAM,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;IAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,SAAS,CAC3B,EAAoB,EACpB,UAAiC,EAAE;IAEnC,MAAM,IAAI,GAA2B,EAAE,GAAG,eAAe,EAAE,GAAG,OAAO,EAAE,CAAC;IAExE,IAAI,SAAkB,CAAC;IAEvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QAC1D,IAAI,CAAC;YACD,OAAO,MAAM,EAAE,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,SAAS,GAAG,KAAK,CAAC;YAElB,2BAA2B;YAC3B,IAAI,OAAO,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzD,MAAM,KAAK,CAAC;YAChB,CAAC;YAED,4CAA4C;YAC5C,IAAI,KAAK,YAAY,0BAAc,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACtD,MAAM,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACJ,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC5C,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;QACL,CAAC;IACL,CAAC;IAED,MAAM,SAAS,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.createVoiceStream = createVoiceStream;
|
|
37
|
+
/** WebSocket URL for voice streaming */
|
|
38
|
+
const VOICE_STREAM_URL = 'wss://api.tuteliq.ai/voice/stream';
|
|
39
|
+
/**
|
|
40
|
+
* Creates a voice streaming session over WebSocket.
|
|
41
|
+
*
|
|
42
|
+
* Requires the `ws` package to be installed:
|
|
43
|
+
* ```bash
|
|
44
|
+
* npm install ws
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* @param apiKey - Tuteliq API key for authentication
|
|
48
|
+
* @param config - Optional session configuration
|
|
49
|
+
* @param handlers - Optional event handler callbacks
|
|
50
|
+
* @returns A VoiceStreamSession for sending audio and controlling the session
|
|
51
|
+
*/
|
|
52
|
+
function createVoiceStream(apiKey, config, handlers) {
|
|
53
|
+
let ws = null;
|
|
54
|
+
let sessionId = null;
|
|
55
|
+
let active = false;
|
|
56
|
+
let summaryResolve = null;
|
|
57
|
+
let summaryReject = null;
|
|
58
|
+
// Dynamically import ws
|
|
59
|
+
let WebSocketCtor = null;
|
|
60
|
+
const init = async () => {
|
|
61
|
+
try {
|
|
62
|
+
const wsModule = await Promise.resolve().then(() => __importStar(require('ws')));
|
|
63
|
+
WebSocketCtor = wsModule.default || wsModule.WebSocket;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
throw new Error('The "ws" package is required for voice streaming. ' +
|
|
67
|
+
'Install it with: npm install ws');
|
|
68
|
+
}
|
|
69
|
+
return new Promise((resolve, reject) => {
|
|
70
|
+
ws = new WebSocketCtor(VOICE_STREAM_URL, {
|
|
71
|
+
headers: {
|
|
72
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
ws.on('open', () => {
|
|
76
|
+
active = true;
|
|
77
|
+
// Send initial config if provided
|
|
78
|
+
if (config) {
|
|
79
|
+
const configMsg = {
|
|
80
|
+
type: 'config',
|
|
81
|
+
interval_seconds: config.intervalSeconds,
|
|
82
|
+
analysis_types: config.analysisTypes,
|
|
83
|
+
context: config.context,
|
|
84
|
+
};
|
|
85
|
+
ws.send(JSON.stringify(configMsg));
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
ws.on('message', (data) => {
|
|
89
|
+
try {
|
|
90
|
+
const text = data.toString();
|
|
91
|
+
const event = JSON.parse(text);
|
|
92
|
+
switch (event.type) {
|
|
93
|
+
case 'ready':
|
|
94
|
+
sessionId = event.session_id;
|
|
95
|
+
handlers?.onReady?.(event);
|
|
96
|
+
resolve();
|
|
97
|
+
break;
|
|
98
|
+
case 'transcription':
|
|
99
|
+
handlers?.onTranscription?.(event);
|
|
100
|
+
break;
|
|
101
|
+
case 'alert':
|
|
102
|
+
handlers?.onAlert?.(event);
|
|
103
|
+
break;
|
|
104
|
+
case 'session_summary':
|
|
105
|
+
handlers?.onSessionSummary?.(event);
|
|
106
|
+
summaryResolve?.(event);
|
|
107
|
+
summaryResolve = null;
|
|
108
|
+
summaryReject = null;
|
|
109
|
+
break;
|
|
110
|
+
case 'config_updated':
|
|
111
|
+
handlers?.onConfigUpdated?.(event);
|
|
112
|
+
break;
|
|
113
|
+
case 'error':
|
|
114
|
+
handlers?.onError?.(event);
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// Ignore non-JSON messages (e.g. pong frames)
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
ws.on('close', (code, reason) => {
|
|
123
|
+
active = false;
|
|
124
|
+
const reasonStr = reason.toString();
|
|
125
|
+
handlers?.onClose?.(code, reasonStr);
|
|
126
|
+
if (summaryReject) {
|
|
127
|
+
summaryReject(new Error(`Connection closed before session summary (code: ${code})`));
|
|
128
|
+
summaryResolve = null;
|
|
129
|
+
summaryReject = null;
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
ws.on('error', (err) => {
|
|
133
|
+
active = false;
|
|
134
|
+
reject(err);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
};
|
|
138
|
+
// Start connection immediately
|
|
139
|
+
const ready = init();
|
|
140
|
+
const session = {
|
|
141
|
+
sendAudio(data) {
|
|
142
|
+
if (!ws || !active) {
|
|
143
|
+
throw new Error('Voice stream is not connected');
|
|
144
|
+
}
|
|
145
|
+
ws.send(data);
|
|
146
|
+
},
|
|
147
|
+
updateConfig(newConfig) {
|
|
148
|
+
if (!ws || !active) {
|
|
149
|
+
throw new Error('Voice stream is not connected');
|
|
150
|
+
}
|
|
151
|
+
const configMsg = {
|
|
152
|
+
type: 'config',
|
|
153
|
+
interval_seconds: newConfig.intervalSeconds,
|
|
154
|
+
analysis_types: newConfig.analysisTypes,
|
|
155
|
+
context: newConfig.context,
|
|
156
|
+
};
|
|
157
|
+
ws.send(JSON.stringify(configMsg));
|
|
158
|
+
},
|
|
159
|
+
async end() {
|
|
160
|
+
await ready;
|
|
161
|
+
if (!ws || !active) {
|
|
162
|
+
throw new Error('Voice stream is not connected');
|
|
163
|
+
}
|
|
164
|
+
return new Promise((resolve, reject) => {
|
|
165
|
+
summaryResolve = resolve;
|
|
166
|
+
summaryReject = reject;
|
|
167
|
+
ws.send(JSON.stringify({ type: 'end' }));
|
|
168
|
+
});
|
|
169
|
+
},
|
|
170
|
+
close() {
|
|
171
|
+
active = false;
|
|
172
|
+
ws?.close();
|
|
173
|
+
ws = null;
|
|
174
|
+
},
|
|
175
|
+
get sessionId() {
|
|
176
|
+
return sessionId;
|
|
177
|
+
},
|
|
178
|
+
get isActive() {
|
|
179
|
+
return active;
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
return session;
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=voice-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice-stream.js","sourceRoot":"","sources":["../../src/voice-stream.ts"],"names":[],"mappings":"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"}
|