@tryhakim/voice 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.
- package/LICENSE +21 -0
- package/README.md +188 -0
- package/dist/audio/speech-stream-ws.d.ts +40 -0
- package/dist/audio/speech-stream-ws.d.ts.map +1 -0
- package/dist/audio/speech-stream-ws.js +565 -0
- package/dist/audio/speech-stream-ws.js.map +1 -0
- package/dist/audio/speech.d.ts +46 -0
- package/dist/audio/speech.d.ts.map +1 -0
- package/dist/audio/speech.js +125 -0
- package/dist/audio/speech.js.map +1 -0
- package/dist/audio/stream.d.ts +38 -0
- package/dist/audio/stream.d.ts.map +1 -0
- package/dist/audio/stream.js +452 -0
- package/dist/audio/stream.js.map +1 -0
- package/dist/audio/to-blob.d.ts +10 -0
- package/dist/audio/to-blob.d.ts.map +1 -0
- package/dist/audio/to-blob.js +78 -0
- package/dist/audio/to-blob.js.map +1 -0
- package/dist/audio/transcriptions.d.ts +35 -0
- package/dist/audio/transcriptions.d.ts.map +1 -0
- package/dist/audio/transcriptions.js +105 -0
- package/dist/audio/transcriptions.js.map +1 -0
- package/dist/audio/translate-stream-ws.d.ts +37 -0
- package/dist/audio/translate-stream-ws.d.ts.map +1 -0
- package/dist/audio/translate-stream-ws.js +665 -0
- package/dist/audio/translate-stream-ws.js.map +1 -0
- package/dist/audio/translate.d.ts +36 -0
- package/dist/audio/translate.d.ts.map +1 -0
- package/dist/audio/translate.js +39 -0
- package/dist/audio/translate.js.map +1 -0
- package/dist/audio/voices.d.ts +47 -0
- package/dist/audio/voices.d.ts.map +1 -0
- package/dist/audio/voices.js +91 -0
- package/dist/audio/voices.js.map +1 -0
- package/dist/chat/completions.d.ts +76 -0
- package/dist/chat/completions.d.ts.map +1 -0
- package/dist/chat/completions.js +114 -0
- package/dist/chat/completions.js.map +1 -0
- package/dist/chat/index.d.ts +2 -0
- package/dist/chat/index.d.ts.map +1 -0
- package/dist/chat/index.js +2 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/chat/sse.d.ts +12 -0
- package/dist/chat/sse.d.ts.map +1 -0
- package/dist/chat/sse.js +142 -0
- package/dist/chat/sse.js.map +1 -0
- package/dist/client.d.ts +63 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +80 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +99 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +158 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs.d.ts +34 -0
- package/dist/jobs.d.ts.map +1 -0
- package/dist/jobs.js +62 -0
- package/dist/jobs.js.map +1 -0
- package/dist/observability.d.ts +28 -0
- package/dist/observability.d.ts.map +1 -0
- package/dist/observability.js +107 -0
- package/dist/observability.js.map +1 -0
- package/dist/settings.d.ts +49 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +84 -0
- package/dist/settings.js.map +1 -0
- package/dist/transport.d.ts +82 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +289 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +969 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -0
- package/dist/usage.d.ts +43 -0
- package/dist/usage.d.ts.map +1 -0
- package/dist/usage.js +85 -0
- package/dist/usage.js.map +1 -0
- package/dist/version.d.ts +13 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +13 -0
- package/dist/version.js.map +1 -0
- package/dist/webhooks.d.ts +84 -0
- package/dist/webhooks.d.ts.map +1 -0
- package/dist/webhooks.js +157 -0
- package/dist/webhooks.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP transport for the SDK.
|
|
3
|
+
*
|
|
4
|
+
* Contract:
|
|
5
|
+
* - Uses native `fetch` (Node 18+ builds it in). No `axios` / `undici`
|
|
6
|
+
* dependency so the SDK bundle stays small.
|
|
7
|
+
* - Every call attaches Authorization + User-Agent + X-Request-Id.
|
|
8
|
+
* - Mutating calls (POST) auto-generate an `Idempotency-Key` unless
|
|
9
|
+
* the caller supplied one (T39).
|
|
10
|
+
* - Retries on transient failures: 5xx, 429, 408, 503, and low-level
|
|
11
|
+
* connection errors. Back-off is exponential with jitter, honoring
|
|
12
|
+
* the server's `Retry-After` when present. Max 3 attempts by default.
|
|
13
|
+
* - 4xx (except 408 / 429) is NOT retried — those are caller errors.
|
|
14
|
+
* - Stream responses (TTS streaming, raw binary) are returned as a
|
|
15
|
+
* `Response` object so callers can `body.getReader()` or iterate
|
|
16
|
+
* via our adapter without us buffering the entire audio in memory.
|
|
17
|
+
*
|
|
18
|
+
* Error shape: every non-2xx raises a `HakimError` subclass built from
|
|
19
|
+
* the server's uniform `ApiError` JSON body. Network-level
|
|
20
|
+
* failures raise `ConnectionError`.
|
|
21
|
+
*/
|
|
22
|
+
import { ConnectionError, errorFromPayload, HakimError, } from './errors.js';
|
|
23
|
+
import { SDK_NAME, SDK_VERSION } from './version.js';
|
|
24
|
+
/** HTTP methods considered mutating for auto-idempotency. GET / HEAD
|
|
25
|
+
* don't get an auto key; POST / PUT / PATCH / DELETE do. */
|
|
26
|
+
const MUTATING_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);
|
|
27
|
+
export class Transport {
|
|
28
|
+
/** Exposed for the realtime WSS helper which needs to build a `wss://`
|
|
29
|
+
* URL and set the Authorization header on a raw WebSocket. Treat as
|
|
30
|
+
* read-only; regular HTTP calls should never touch this directly. */
|
|
31
|
+
apiKey;
|
|
32
|
+
baseURL;
|
|
33
|
+
timeoutMs;
|
|
34
|
+
maxRetries;
|
|
35
|
+
userAgent;
|
|
36
|
+
fetchImpl;
|
|
37
|
+
random;
|
|
38
|
+
sleep;
|
|
39
|
+
generateIdempotencyKey;
|
|
40
|
+
constructor(options) {
|
|
41
|
+
if (!options.apiKey) {
|
|
42
|
+
throw new TypeError('Hakim SDK: `apiKey` is required. Set it when constructing Hakim().');
|
|
43
|
+
}
|
|
44
|
+
this.apiKey = options.apiKey;
|
|
45
|
+
this.baseURL = trimTrailingSlash(options.baseURL);
|
|
46
|
+
this.timeoutMs = options.timeoutMs;
|
|
47
|
+
this.maxRetries = options.maxRetries;
|
|
48
|
+
this.userAgent = buildUserAgent(options.userAgentSuffix);
|
|
49
|
+
this.fetchImpl =
|
|
50
|
+
options.fetchImpl ??
|
|
51
|
+
(typeof fetch === 'function' ? fetch : undefined);
|
|
52
|
+
if (!this.fetchImpl) {
|
|
53
|
+
throw new TypeError('Hakim SDK: global `fetch` is not available. Upgrade to Node >= 18 or pass a `fetchImpl` option.');
|
|
54
|
+
}
|
|
55
|
+
this.random = options.random ?? Math.random;
|
|
56
|
+
this.sleep = options.sleep ?? defaultSleep;
|
|
57
|
+
this.generateIdempotencyKey = options.generateIdempotencyKey ?? defaultIdempotencyKey;
|
|
58
|
+
}
|
|
59
|
+
async request(opts) {
|
|
60
|
+
const url = this.buildURL(opts.path, opts.query);
|
|
61
|
+
const headers = this.buildHeaders(opts);
|
|
62
|
+
// Build the body. We serialize JSON here (rather than relying on
|
|
63
|
+
// fetch's coercion) so the Content-Length header is correct and the
|
|
64
|
+
// body survives a retry — fetch consumes the body on each attempt.
|
|
65
|
+
let body;
|
|
66
|
+
if (opts.json !== undefined) {
|
|
67
|
+
body = JSON.stringify(opts.json);
|
|
68
|
+
if (!headers['content-type'])
|
|
69
|
+
headers['content-type'] = 'application/json';
|
|
70
|
+
}
|
|
71
|
+
else if (opts.formData !== undefined) {
|
|
72
|
+
body = opts.formData;
|
|
73
|
+
// Let fetch set the multipart boundary — do NOT set content-type.
|
|
74
|
+
}
|
|
75
|
+
else if (opts.body !== undefined) {
|
|
76
|
+
body = opts.body;
|
|
77
|
+
}
|
|
78
|
+
const timeoutMs = opts.timeoutMs ?? this.timeoutMs;
|
|
79
|
+
let attempt = 0;
|
|
80
|
+
let lastErr;
|
|
81
|
+
while (attempt <= this.maxRetries) {
|
|
82
|
+
const controller = new AbortController();
|
|
83
|
+
const onAbort = () => controller.abort();
|
|
84
|
+
if (opts.signal) {
|
|
85
|
+
if (opts.signal.aborted)
|
|
86
|
+
controller.abort();
|
|
87
|
+
else
|
|
88
|
+
opts.signal.addEventListener('abort', onAbort);
|
|
89
|
+
}
|
|
90
|
+
const timer = setTimeout(() => controller.abort(new Error('request_timeout')), timeoutMs);
|
|
91
|
+
try {
|
|
92
|
+
const init = {
|
|
93
|
+
method: opts.method,
|
|
94
|
+
headers,
|
|
95
|
+
signal: controller.signal,
|
|
96
|
+
};
|
|
97
|
+
if (body !== undefined)
|
|
98
|
+
init.body = body;
|
|
99
|
+
const res = await this.fetchImpl(url, init);
|
|
100
|
+
if (res.ok) {
|
|
101
|
+
return res;
|
|
102
|
+
}
|
|
103
|
+
// Non-2xx: decide whether to retry. Retryable statuses mirror
|
|
104
|
+
// connection errors + 5xx + 429.
|
|
105
|
+
const shouldRetry = isRetryableStatus(res.status) && attempt < this.maxRetries;
|
|
106
|
+
if (shouldRetry) {
|
|
107
|
+
const retryAfterMs = readRetryAfterMs(res.headers);
|
|
108
|
+
const waitMs = retryAfterMs ?? this.backoffMs(attempt);
|
|
109
|
+
attempt++;
|
|
110
|
+
// Consume body to free the connection before retrying.
|
|
111
|
+
await res.arrayBuffer().catch(() => undefined);
|
|
112
|
+
await this.sleep(waitMs);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
throw await parseErrorResponse(res);
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
if (err instanceof HakimError)
|
|
119
|
+
throw err;
|
|
120
|
+
lastErr = err;
|
|
121
|
+
const code = classifyTransportError(err);
|
|
122
|
+
if (code && attempt < this.maxRetries) {
|
|
123
|
+
attempt++;
|
|
124
|
+
await this.sleep(this.backoffMs(attempt - 1));
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
throw new ConnectionError({
|
|
128
|
+
message: toErrorMessage(err),
|
|
129
|
+
requestId: headers['x-request-id'],
|
|
130
|
+
cause: err,
|
|
131
|
+
...(code !== undefined ? { code } : {}),
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
finally {
|
|
135
|
+
clearTimeout(timer);
|
|
136
|
+
if (opts.signal)
|
|
137
|
+
opts.signal.removeEventListener('abort', onAbort);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Loop exited without `return`/`throw`, meaning retries exhausted on
|
|
141
|
+
// a transient failure. Surface the last error.
|
|
142
|
+
throw new ConnectionError({
|
|
143
|
+
message: `Hakim SDK: request failed after ${this.maxRetries} retries`,
|
|
144
|
+
requestId: headers['x-request-id'],
|
|
145
|
+
cause: lastErr,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
buildURL(path, query) {
|
|
149
|
+
const url = new URL(path.replace(/^\/+/, ''), this.baseURL + '/');
|
|
150
|
+
if (query) {
|
|
151
|
+
for (const [k, v] of Object.entries(query)) {
|
|
152
|
+
if (v === undefined)
|
|
153
|
+
continue;
|
|
154
|
+
url.searchParams.set(k, String(v));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return url.toString();
|
|
158
|
+
}
|
|
159
|
+
buildHeaders(opts) {
|
|
160
|
+
const headers = {
|
|
161
|
+
authorization: `Bearer ${this.apiKey}`,
|
|
162
|
+
'user-agent': this.userAgent,
|
|
163
|
+
...(opts.headers ?? {}),
|
|
164
|
+
};
|
|
165
|
+
// X-Request-Id: always send; the server will echo it back. Not
|
|
166
|
+
// regenerated on retry — that would defeat idempotency if the server
|
|
167
|
+
// already saw it.
|
|
168
|
+
if (!headers['x-request-id']) {
|
|
169
|
+
headers['x-request-id'] = generateRequestId();
|
|
170
|
+
}
|
|
171
|
+
// Accept header defaults. Stream / binary callers override.
|
|
172
|
+
if (!headers['accept']) {
|
|
173
|
+
headers['accept'] = opts.accept ?? 'application/json';
|
|
174
|
+
}
|
|
175
|
+
// Auto-idempotency (T39). Only attach on mutating methods that carry
|
|
176
|
+
// a JSON body — multipart STT uploads are single-shot writes where
|
|
177
|
+
// `Idempotency-Key` would be silently ignored by the server anyway.
|
|
178
|
+
if (MUTATING_METHODS.has(opts.method) && opts.json !== undefined) {
|
|
179
|
+
headers['idempotency-key'] = opts.idempotencyKey ?? this.generateIdempotencyKey();
|
|
180
|
+
}
|
|
181
|
+
else if (opts.idempotencyKey !== undefined) {
|
|
182
|
+
headers['idempotency-key'] = opts.idempotencyKey;
|
|
183
|
+
}
|
|
184
|
+
return headers;
|
|
185
|
+
}
|
|
186
|
+
/** Base backoff: 200ms, 600ms, 1400ms; with ±25% jitter. Cap at 10s. */
|
|
187
|
+
backoffMs(attempt) {
|
|
188
|
+
const base = Math.min(200 * Math.pow(3, attempt), 10_000);
|
|
189
|
+
const jitter = base * (this.random() - 0.5) * 0.5;
|
|
190
|
+
return Math.max(0, Math.round(base + jitter));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
function trimTrailingSlash(url) {
|
|
194
|
+
return url.endsWith('/') ? url.slice(0, -1) : url;
|
|
195
|
+
}
|
|
196
|
+
function buildUserAgent(suffix) {
|
|
197
|
+
const nodeVersion = typeof process !== 'undefined' && process.versions
|
|
198
|
+
? `node/${process.versions.node}`
|
|
199
|
+
: 'node/unknown';
|
|
200
|
+
const base = `${SDK_NAME.replace('@', '').replace('/', '-')}/${SDK_VERSION} (${nodeVersion})`;
|
|
201
|
+
return suffix ? `${base} ${suffix}` : base;
|
|
202
|
+
}
|
|
203
|
+
function isRetryableStatus(status) {
|
|
204
|
+
// 408 Request Timeout, 425 Too Early, 429 Too Many Requests,
|
|
205
|
+
// 5xx (transient server-side failures). 501 / 505 are not retried —
|
|
206
|
+
// those are "your request will never succeed" errors.
|
|
207
|
+
if (status === 408 || status === 425 || status === 429)
|
|
208
|
+
return true;
|
|
209
|
+
if (status === 501 || status === 505)
|
|
210
|
+
return false;
|
|
211
|
+
return status >= 500 && status <= 599;
|
|
212
|
+
}
|
|
213
|
+
function readRetryAfterMs(headers) {
|
|
214
|
+
const raw = headers.get('retry-after');
|
|
215
|
+
if (!raw)
|
|
216
|
+
return undefined;
|
|
217
|
+
const num = Number(raw);
|
|
218
|
+
if (Number.isFinite(num) && num >= 0)
|
|
219
|
+
return num * 1000;
|
|
220
|
+
const date = Date.parse(raw);
|
|
221
|
+
if (!Number.isNaN(date))
|
|
222
|
+
return Math.max(0, date - Date.now());
|
|
223
|
+
return undefined;
|
|
224
|
+
}
|
|
225
|
+
async function parseErrorResponse(res) {
|
|
226
|
+
const requestId = res.headers.get('x-request-id') ?? undefined;
|
|
227
|
+
const retryAfterMs = readRetryAfterMs(res.headers);
|
|
228
|
+
const contentType = res.headers.get('content-type') ?? '';
|
|
229
|
+
if (contentType.includes('application/json')) {
|
|
230
|
+
try {
|
|
231
|
+
const json = (await res.json());
|
|
232
|
+
if (json && json.error && json.error.type && json.error.message) {
|
|
233
|
+
return errorFromPayload(json.error, res.status, requestId, retryAfterMs);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
// fall through to generic handling
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
let text = '';
|
|
241
|
+
try {
|
|
242
|
+
text = await res.text();
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
text = res.statusText;
|
|
246
|
+
}
|
|
247
|
+
return errorFromPayload({
|
|
248
|
+
type: res.status >= 500 ? 'api_error' : 'invalid_request_error',
|
|
249
|
+
code: `http_${res.status}`,
|
|
250
|
+
message: text || res.statusText || `HTTP ${res.status}`,
|
|
251
|
+
}, res.status, requestId, retryAfterMs);
|
|
252
|
+
}
|
|
253
|
+
function classifyTransportError(err) {
|
|
254
|
+
if (err instanceof HakimError)
|
|
255
|
+
return undefined;
|
|
256
|
+
if (err instanceof Error) {
|
|
257
|
+
const name = err.name;
|
|
258
|
+
const msg = err.message;
|
|
259
|
+
if (name === 'AbortError' && /request_timeout/.test(msg))
|
|
260
|
+
return 'request_timeout';
|
|
261
|
+
if (name === 'AbortError')
|
|
262
|
+
return 'aborted';
|
|
263
|
+
if (/ECONNRESET|ECONNREFUSED|ETIMEDOUT|ENOTFOUND|EAI_AGAIN|socket hang up|network/i.test(msg)) {
|
|
264
|
+
return 'network_error';
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return 'network_error';
|
|
268
|
+
}
|
|
269
|
+
function toErrorMessage(err) {
|
|
270
|
+
if (err instanceof Error)
|
|
271
|
+
return err.message;
|
|
272
|
+
return typeof err === 'string' ? err : 'unknown transport error';
|
|
273
|
+
}
|
|
274
|
+
async function defaultSleep(ms) {
|
|
275
|
+
await new Promise((resolve) => setTimeout(resolve, ms));
|
|
276
|
+
}
|
|
277
|
+
function defaultIdempotencyKey() {
|
|
278
|
+
if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
|
|
279
|
+
return crypto.randomUUID();
|
|
280
|
+
}
|
|
281
|
+
// Fallback: timestamp + random. We only get here on platforms where
|
|
282
|
+
// `globalThis.crypto` is missing (very old runtimes). Good enough to
|
|
283
|
+
// satisfy the server-side uniqueness check.
|
|
284
|
+
return `${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
285
|
+
}
|
|
286
|
+
function generateRequestId() {
|
|
287
|
+
return `sdk-${defaultIdempotencyKey()}`;
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
|