@framers/agentos 0.1.194 → 0.1.196
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/dist/core/providers/ApiKeyPoolRegistry.d.ts +18 -0
- package/dist/core/providers/ApiKeyPoolRegistry.d.ts.map +1 -0
- package/dist/core/providers/ApiKeyPoolRegistry.js +28 -0
- package/dist/core/providers/ApiKeyPoolRegistry.js.map +1 -0
- package/dist/core/providers/index.d.ts +4 -0
- package/dist/core/providers/index.d.ts.map +1 -0
- package/dist/core/providers/index.js +4 -0
- package/dist/core/providers/index.js.map +1 -0
- package/dist/core/providers/quotaErrors.d.ts +15 -0
- package/dist/core/providers/quotaErrors.d.ts.map +1 -0
- package/dist/core/providers/quotaErrors.js +33 -0
- package/dist/core/providers/quotaErrors.js.map +1 -0
- package/dist/media/audio/providers/ElevenLabsSFXProvider.d.ts +2 -0
- package/dist/media/audio/providers/ElevenLabsSFXProvider.d.ts.map +1 -1
- package/dist/media/audio/providers/ElevenLabsSFXProvider.js +17 -2
- package/dist/media/audio/providers/ElevenLabsSFXProvider.js.map +1 -1
- package/dist/speech/providers/ElevenLabsTextToSpeechProvider.d.ts +2 -0
- package/dist/speech/providers/ElevenLabsTextToSpeechProvider.d.ts.map +1 -1
- package/dist/speech/providers/ElevenLabsTextToSpeechProvider.js +37 -26
- package/dist/speech/providers/ElevenLabsTextToSpeechProvider.js.map +1 -1
- package/dist/voice-pipeline/providers/ElevenLabsBatchTTS.d.ts +2 -2
- package/dist/voice-pipeline/providers/ElevenLabsBatchTTS.d.ts.map +1 -1
- package/dist/voice-pipeline/providers/ElevenLabsBatchTTS.js +17 -3
- package/dist/voice-pipeline/providers/ElevenLabsBatchTTS.js.map +1 -1
- package/dist/voice-pipeline/providers/ElevenLabsStreamingSTT.d.ts +2 -0
- package/dist/voice-pipeline/providers/ElevenLabsStreamingSTT.d.ts.map +1 -1
- package/dist/voice-pipeline/providers/ElevenLabsStreamingSTT.js +5 -1
- package/dist/voice-pipeline/providers/ElevenLabsStreamingSTT.js.map +1 -1
- package/dist/voice-pipeline/providers/ElevenLabsStreamingTTS.d.ts +2 -0
- package/dist/voice-pipeline/providers/ElevenLabsStreamingTTS.d.ts.map +1 -1
- package/dist/voice-pipeline/providers/ElevenLabsStreamingTTS.js +5 -1
- package/dist/voice-pipeline/providers/ElevenLabsStreamingTTS.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module core/providers/ApiKeyPoolRegistry
|
|
3
|
+
*
|
|
4
|
+
* Singleton registry for API key pools keyed by environment variable name.
|
|
5
|
+
* Providers that share the same env var (e.g., all ElevenLabs providers
|
|
6
|
+
* share ELEVENLABS_API_KEY) get the same pool instance so exhaustion
|
|
7
|
+
* state is consistent across the process.
|
|
8
|
+
*/
|
|
9
|
+
import { ApiKeyPool, type ApiKeyPoolConfig } from './ApiKeyPool.js';
|
|
10
|
+
/**
|
|
11
|
+
* Get or create an ApiKeyPool for the given environment variable.
|
|
12
|
+
* Returns a singleton -- the same pool is returned on subsequent calls
|
|
13
|
+
* with the same env var name.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getKeyPool(envVar: string, config?: ApiKeyPoolConfig): ApiKeyPool;
|
|
16
|
+
/** Reset all pools. For testing only. */
|
|
17
|
+
export declare function resetAllPools(): void;
|
|
18
|
+
//# sourceMappingURL=ApiKeyPoolRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiKeyPoolRegistry.d.ts","sourceRoot":"","sources":["../../../src/core/providers/ApiKeyPoolRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAIpE;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,UAAU,CAOhF;AAED,yCAAyC;AACzC,wBAAgB,aAAa,IAAI,IAAI,CAEpC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module core/providers/ApiKeyPoolRegistry
|
|
3
|
+
*
|
|
4
|
+
* Singleton registry for API key pools keyed by environment variable name.
|
|
5
|
+
* Providers that share the same env var (e.g., all ElevenLabs providers
|
|
6
|
+
* share ELEVENLABS_API_KEY) get the same pool instance so exhaustion
|
|
7
|
+
* state is consistent across the process.
|
|
8
|
+
*/
|
|
9
|
+
import { ApiKeyPool } from './ApiKeyPool.js';
|
|
10
|
+
const pools = new Map();
|
|
11
|
+
/**
|
|
12
|
+
* Get or create an ApiKeyPool for the given environment variable.
|
|
13
|
+
* Returns a singleton -- the same pool is returned on subsequent calls
|
|
14
|
+
* with the same env var name.
|
|
15
|
+
*/
|
|
16
|
+
export function getKeyPool(envVar, config) {
|
|
17
|
+
let pool = pools.get(envVar);
|
|
18
|
+
if (!pool) {
|
|
19
|
+
pool = new ApiKeyPool(process.env[envVar] ?? '', config);
|
|
20
|
+
pools.set(envVar, pool);
|
|
21
|
+
}
|
|
22
|
+
return pool;
|
|
23
|
+
}
|
|
24
|
+
/** Reset all pools. For testing only. */
|
|
25
|
+
export function resetAllPools() {
|
|
26
|
+
pools.clear();
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=ApiKeyPoolRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiKeyPoolRegistry.js","sourceRoot":"","sources":["../../../src/core/providers/ApiKeyPoolRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAyB,MAAM,iBAAiB,CAAC;AAEpE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;AAE5C;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,MAAyB;IAClE,IAAI,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;QACzD,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,aAAa;IAC3B,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAyB,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module core/providers/quotaErrors
|
|
3
|
+
*
|
|
4
|
+
* Detects quota-exhaustion and rate-limit errors across all provider APIs.
|
|
5
|
+
* Used by providers to decide when to rotate to the next API key.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Check if an HTTP error response indicates quota exhaustion or rate limiting.
|
|
9
|
+
*
|
|
10
|
+
* @param status - HTTP status code from the response.
|
|
11
|
+
* @param body - Response body text (can be empty).
|
|
12
|
+
* @returns `true` if this looks like a quota/rate-limit error.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isQuotaError(status: number, body: string): boolean;
|
|
15
|
+
//# sourceMappingURL=quotaErrors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quotaErrors.d.ts","sourceRoot":"","sources":["../../../src/core/providers/quotaErrors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAKlE"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module core/providers/quotaErrors
|
|
3
|
+
*
|
|
4
|
+
* Detects quota-exhaustion and rate-limit errors across all provider APIs.
|
|
5
|
+
* Used by providers to decide when to rotate to the next API key.
|
|
6
|
+
*/
|
|
7
|
+
/** Status codes that always indicate quota/rate-limit exhaustion. */
|
|
8
|
+
const QUOTA_STATUS_CODES = new Set([429, 402, 456]);
|
|
9
|
+
/** Substrings in response bodies that indicate quota exhaustion. */
|
|
10
|
+
const QUOTA_BODY_SIGNALS = [
|
|
11
|
+
'quota_exceeded',
|
|
12
|
+
'rate_limit_exceeded',
|
|
13
|
+
'insufficient_quota',
|
|
14
|
+
'overloaded_error',
|
|
15
|
+
'resource_exhausted',
|
|
16
|
+
'rate_limit',
|
|
17
|
+
];
|
|
18
|
+
/**
|
|
19
|
+
* Check if an HTTP error response indicates quota exhaustion or rate limiting.
|
|
20
|
+
*
|
|
21
|
+
* @param status - HTTP status code from the response.
|
|
22
|
+
* @param body - Response body text (can be empty).
|
|
23
|
+
* @returns `true` if this looks like a quota/rate-limit error.
|
|
24
|
+
*/
|
|
25
|
+
export function isQuotaError(status, body) {
|
|
26
|
+
if (QUOTA_STATUS_CODES.has(status))
|
|
27
|
+
return true;
|
|
28
|
+
if (!body)
|
|
29
|
+
return false;
|
|
30
|
+
const lower = body.toLowerCase();
|
|
31
|
+
return QUOTA_BODY_SIGNALS.some((signal) => lower.includes(signal));
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=quotaErrors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quotaErrors.js","sourceRoot":"","sources":["../../../src/core/providers/quotaErrors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qEAAqE;AACrE,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAEpD,oEAAoE;AACpE,MAAM,kBAAkB,GAAG;IACzB,gBAAgB;IAChB,qBAAqB;IACrB,oBAAoB;IACpB,kBAAkB;IAClB,oBAAoB;IACpB,YAAY;CACb,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,IAAY;IACvD,IAAI,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AACrE,CAAC"}
|
|
@@ -69,6 +69,8 @@ export declare class ElevenLabsSFXProvider implements IAudioGenerator {
|
|
|
69
69
|
defaultModelId?: string;
|
|
70
70
|
/** Internal resolved configuration. */
|
|
71
71
|
private _config;
|
|
72
|
+
/** API key pool for round-robin rotation and quota failover. */
|
|
73
|
+
private keyPool;
|
|
72
74
|
/**
|
|
73
75
|
* Initialize the provider with API credentials and optional configuration.
|
|
74
76
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ElevenLabsSFXProvider.d.ts","sourceRoot":"","sources":["../../../../src/media/audio/providers/ElevenLabsSFXProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ElevenLabsSFXProvider.d.ts","sourceRoot":"","sources":["../../../../src/media/audio/providers/ElevenLabsSFXProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAQzF;;;;;;;;;GASG;AACH,MAAM,WAAW,2BAA2B;IAC1C,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,qBAAsB,YAAW,eAAe;IAC3D,kBAAkB;IAClB,SAAgB,UAAU,oBAAoB;IAE9C,kBAAkB;IACX,aAAa,UAAS;IAE7B,kBAAkB;IACX,cAAc,CAAC,EAAE,MAAM,CAAC;IAE/B,uCAAuC;IACvC,OAAO,CAAC,OAAO,CAAqE;IAEpF,gEAAgE;IAChE,OAAO,CAAC,OAAO,CAAc;IAM7B;;;;;OAKG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBhE;;;;OAIG;IACG,aAAa,CAAC,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC;IAMzE;;;;;;;;OAQG;IACG,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC;IAkEpE;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,EAAE,OAAO,GAAG,KAAK,GAAG,OAAO;IAI9C;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAGhC"}
|
|
@@ -18,6 +18,8 @@
|
|
|
18
18
|
*
|
|
19
19
|
* @see {@link IAudioGenerator} for the provider interface contract.
|
|
20
20
|
*/
|
|
21
|
+
import { ApiKeyPool } from '../../../core/providers/ApiKeyPool.js';
|
|
22
|
+
import { isQuotaError } from '../../../core/providers/quotaErrors.js';
|
|
21
23
|
// ---------------------------------------------------------------------------
|
|
22
24
|
// Implementation
|
|
23
25
|
// ---------------------------------------------------------------------------
|
|
@@ -69,6 +71,7 @@ export class ElevenLabsSFXProvider {
|
|
|
69
71
|
? config.baseURL.trim()
|
|
70
72
|
: 'https://api.elevenlabs.io/v1',
|
|
71
73
|
};
|
|
74
|
+
this.keyPool = new ApiKeyPool(apiKey);
|
|
72
75
|
this.isInitialized = true;
|
|
73
76
|
}
|
|
74
77
|
// -------------------------------------------------------------------------
|
|
@@ -102,14 +105,26 @@ export class ElevenLabsSFXProvider {
|
|
|
102
105
|
};
|
|
103
106
|
if (request.durationSec !== undefined)
|
|
104
107
|
body.duration_seconds = request.durationSec;
|
|
105
|
-
const
|
|
108
|
+
const doFetch = (key) => fetch(url, {
|
|
106
109
|
method: 'POST',
|
|
107
110
|
headers: {
|
|
108
|
-
'xi-api-key':
|
|
111
|
+
'xi-api-key': key,
|
|
109
112
|
'Content-Type': 'application/json',
|
|
110
113
|
},
|
|
111
114
|
body: JSON.stringify(body),
|
|
112
115
|
});
|
|
116
|
+
const key = this.keyPool.next();
|
|
117
|
+
let response = await doFetch(key);
|
|
118
|
+
if (!response.ok && this.keyPool.size > 1) {
|
|
119
|
+
const errBody = await response.text().catch(() => '');
|
|
120
|
+
if (isQuotaError(response.status, errBody)) {
|
|
121
|
+
this.keyPool.markExhausted(key);
|
|
122
|
+
response = await doFetch(this.keyPool.next());
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
throw new Error(`ElevenLabs SFX generation failed (${response.status}): ${errBody}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
113
128
|
if (!response.ok) {
|
|
114
129
|
const errorText = await response.text();
|
|
115
130
|
throw new Error(`ElevenLabs SFX generation failed (${response.status}): ${errorText}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ElevenLabsSFXProvider.js","sourceRoot":"","sources":["../../../../src/media/audio/providers/ElevenLabsSFXProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;
|
|
1
|
+
{"version":3,"file":"ElevenLabsSFXProvider.js","sourceRoot":"","sources":["../../../../src/media/audio/providers/ElevenLabsSFXProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -94,6 +94,8 @@ export declare class ElevenLabsTextToSpeechProvider implements TextToSpeechProvi
|
|
|
94
94
|
readonly supportsStreaming = true;
|
|
95
95
|
/** Fetch implementation — injected for testability, defaults to global fetch. */
|
|
96
96
|
private readonly fetchImpl;
|
|
97
|
+
/** API key pool for round-robin rotation and quota failover. */
|
|
98
|
+
private readonly keyPool;
|
|
97
99
|
/**
|
|
98
100
|
* Creates a new ElevenLabsTextToSpeechProvider.
|
|
99
101
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ElevenLabsTextToSpeechProvider.d.ts","sourceRoot":"","sources":["../../../src/speech/providers/ElevenLabsTextToSpeechProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACrB,WAAW,EACX,oBAAoB,EACrB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ElevenLabsTextToSpeechProvider.d.ts","sourceRoot":"","sources":["../../../src/speech/providers/ElevenLabsTextToSpeechProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACrB,WAAW,EACX,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAIrB;;;;;GAKG;AACH,MAAM,WAAW,oCAAoC;IACnD;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,qBAAa,8BAA+B,YAAW,oBAAoB;IAiC7D,OAAO,CAAC,QAAQ,CAAC,MAAM;IAhCnC,uEAAuE;IACvE,SAAgB,EAAE,gBAAgB;IAElC,sDAAsD;IACtD,SAAgB,WAAW,gBAAgB;IAE3C;;;OAGG;IACH,SAAgB,iBAAiB,QAAQ;IAEzC,iFAAiF;IACjF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IAEzC,gEAAgE;IAChE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IAErC;;;;;;;;;;;;;OAaG;gBAC0B,MAAM,EAAE,oCAAoC;IAKzE;;;;;;;;;OASG;IACH,eAAe,IAAI,MAAM;IAIzB;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACG,UAAU,CACd,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,qBAAqB,CAAC;IAgFjC;;;;;;;;;;;;;;;;;;OAkBG;IACG,mBAAmB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;CA6CpD"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { ApiKeyPool } from '../../core/providers/ApiKeyPool.js';
|
|
2
|
+
import { isQuotaError } from '../../core/providers/quotaErrors.js';
|
|
1
3
|
/**
|
|
2
4
|
* Text-to-speech provider that uses the ElevenLabs TTS API.
|
|
3
5
|
*
|
|
@@ -74,6 +76,7 @@ export class ElevenLabsTextToSpeechProvider {
|
|
|
74
76
|
*/
|
|
75
77
|
this.supportsStreaming = true;
|
|
76
78
|
this.fetchImpl = config.fetchImpl ?? fetch;
|
|
79
|
+
this.keyPool = new ApiKeyPool(config.apiKey);
|
|
77
80
|
}
|
|
78
81
|
/**
|
|
79
82
|
* Returns the human-readable provider name.
|
|
@@ -122,38 +125,46 @@ export class ElevenLabsTextToSpeechProvider {
|
|
|
122
125
|
: undefined) ??
|
|
123
126
|
'EXAVITQu4vr4xnSDxMaL'; // Default "Sarah" voice
|
|
124
127
|
const model = options.model ?? this.config.model ?? 'eleven_multilingual_v2';
|
|
125
|
-
const
|
|
128
|
+
const baseUrl = this.config.baseUrl ?? 'https://api.elevenlabs.io/v1';
|
|
129
|
+
const requestBody = JSON.stringify({
|
|
130
|
+
text,
|
|
131
|
+
model_id: model,
|
|
132
|
+
voice_settings: {
|
|
133
|
+
stability: typeof options.providerSpecificOptions?.stability === 'number'
|
|
134
|
+
? options.providerSpecificOptions.stability
|
|
135
|
+
: 0.5,
|
|
136
|
+
similarity_boost: typeof options.providerSpecificOptions?.similarityBoost === 'number'
|
|
137
|
+
? options.providerSpecificOptions.similarityBoost
|
|
138
|
+
: 0.75,
|
|
139
|
+
style: typeof options.providerSpecificOptions?.style === 'number'
|
|
140
|
+
? options.providerSpecificOptions.style
|
|
141
|
+
: undefined,
|
|
142
|
+
use_speaker_boost: typeof options.providerSpecificOptions?.useSpeakerBoost === 'boolean'
|
|
143
|
+
? options.providerSpecificOptions.useSpeakerBoost
|
|
144
|
+
: true,
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
const doFetch = (key) => this.fetchImpl(`${baseUrl}/text-to-speech/${voiceId}`, {
|
|
126
148
|
method: 'POST',
|
|
127
149
|
headers: {
|
|
128
|
-
|
|
129
|
-
'xi-api-key': this.config.apiKey,
|
|
150
|
+
'xi-api-key': key,
|
|
130
151
|
'Content-Type': 'application/json',
|
|
131
|
-
// Request MP3 format in the response
|
|
132
152
|
Accept: 'audio/mpeg',
|
|
133
153
|
},
|
|
134
|
-
body:
|
|
135
|
-
text,
|
|
136
|
-
model_id: model,
|
|
137
|
-
voice_settings: {
|
|
138
|
-
// Extract provider-specific settings with sensible defaults.
|
|
139
|
-
// These defaults produce natural-sounding output for most voices.
|
|
140
|
-
stability: typeof options.providerSpecificOptions?.stability === 'number'
|
|
141
|
-
? options.providerSpecificOptions.stability
|
|
142
|
-
: 0.5,
|
|
143
|
-
similarity_boost: typeof options.providerSpecificOptions?.similarityBoost === 'number'
|
|
144
|
-
? options.providerSpecificOptions.similarityBoost
|
|
145
|
-
: 0.75,
|
|
146
|
-
// Style is only meaningful for v2+ models; omit if not specified
|
|
147
|
-
style: typeof options.providerSpecificOptions?.style === 'number'
|
|
148
|
-
? options.providerSpecificOptions.style
|
|
149
|
-
: undefined,
|
|
150
|
-
// Speaker boost enhances vocal clarity and similarity
|
|
151
|
-
use_speaker_boost: typeof options.providerSpecificOptions?.useSpeakerBoost === 'boolean'
|
|
152
|
-
? options.providerSpecificOptions.useSpeakerBoost
|
|
153
|
-
: true,
|
|
154
|
-
},
|
|
155
|
-
}),
|
|
154
|
+
body: requestBody,
|
|
156
155
|
});
|
|
156
|
+
const key = this.keyPool.next();
|
|
157
|
+
let response = await doFetch(key);
|
|
158
|
+
if (!response.ok && this.keyPool.size > 1) {
|
|
159
|
+
const errBody = await response.text().catch(() => '');
|
|
160
|
+
if (isQuotaError(response.status, errBody)) {
|
|
161
|
+
this.keyPool.markExhausted(key);
|
|
162
|
+
response = await doFetch(this.keyPool.next());
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
throw new Error(`ElevenLabs synthesis failed (${response.status}): ${errBody}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
157
168
|
if (!response.ok) {
|
|
158
169
|
const message = await response.text();
|
|
159
170
|
throw new Error(`ElevenLabs synthesis failed (${response.status}): ${message}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ElevenLabsTextToSpeechProvider.js","sourceRoot":"","sources":["../../../src/speech/providers/ElevenLabsTextToSpeechProvider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ElevenLabsTextToSpeechProvider.js","sourceRoot":"","sources":["../../../src/speech/providers/ElevenLabsTextToSpeechProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,8 +24,8 @@ export interface ElevenLabsBatchTTSConfig {
|
|
|
24
24
|
*/
|
|
25
25
|
export declare class ElevenLabsBatchTTS implements IBatchTTS {
|
|
26
26
|
readonly providerId = "elevenlabs-batch";
|
|
27
|
-
/**
|
|
28
|
-
private readonly
|
|
27
|
+
/** API key pool for round-robin rotation and quota failover. */
|
|
28
|
+
private readonly keyPool;
|
|
29
29
|
/** Default voice ID when none is provided in the synthesis config. */
|
|
30
30
|
private readonly defaultVoiceId;
|
|
31
31
|
/** Model identifier sent with each request. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ElevenLabsBatchTTS.d.ts","sourceRoot":"","sources":["../../../src/voice-pipeline/providers/ElevenLabsBatchTTS.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ElevenLabsBatchTTS.d.ts","sourceRoot":"","sources":["../../../src/voice-pipeline/providers/ElevenLabsBatchTTS.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAI7E,2DAA2D;AAC3D,MAAM,WAAW,wBAAwB;IACvC,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAKD;;;;;GAKG;AACH,qBAAa,kBAAmB,YAAW,SAAS;IAClD,QAAQ,CAAC,UAAU,sBAAsB;IAEzC,gEAAgE;IAChE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IAErC,sEAAsE;IACtE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC,+CAA+C;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAE/B,qCAAqC;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,EAAE,wBAAwB;IAO5C;;;;;;;OAOG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;CA+CjF"}
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* Batch text-to-speech via ElevenLabs' REST API. Implements {@link IBatchTTS}
|
|
5
5
|
* for one-shot narration synthesis with voice settings control.
|
|
6
6
|
*/
|
|
7
|
+
import { ApiKeyPool } from '../../core/providers/ApiKeyPool.js';
|
|
8
|
+
import { isQuotaError } from '../../core/providers/quotaErrors.js';
|
|
7
9
|
/** Approximate bytes per second for 128kbps MP3 audio. */
|
|
8
10
|
const BYTES_PER_SEC_MP3 = 16000;
|
|
9
11
|
/**
|
|
@@ -15,7 +17,7 @@ const BYTES_PER_SEC_MP3 = 16000;
|
|
|
15
17
|
export class ElevenLabsBatchTTS {
|
|
16
18
|
constructor(config) {
|
|
17
19
|
this.providerId = 'elevenlabs-batch';
|
|
18
|
-
this.
|
|
20
|
+
this.keyPool = new ApiKeyPool(config.apiKey);
|
|
19
21
|
this.defaultVoiceId = config.voiceId ?? 'EXAVITQu4vr4xnSDxMaL';
|
|
20
22
|
this.model = config.model ?? 'eleven_multilingual_v2';
|
|
21
23
|
this.baseUrl = config.baseUrl ?? 'https://api.elevenlabs.io/v1';
|
|
@@ -31,10 +33,10 @@ export class ElevenLabsBatchTTS {
|
|
|
31
33
|
async synthesize(text, config) {
|
|
32
34
|
const voiceId = config?.voice ?? this.defaultVoiceId;
|
|
33
35
|
const opts = config?.providerOptions ?? {};
|
|
34
|
-
const
|
|
36
|
+
const doFetch = (key) => fetch(`${this.baseUrl}/text-to-speech/${voiceId}`, {
|
|
35
37
|
method: 'POST',
|
|
36
38
|
headers: {
|
|
37
|
-
'xi-api-key':
|
|
39
|
+
'xi-api-key': key,
|
|
38
40
|
'Content-Type': 'application/json',
|
|
39
41
|
Accept: 'audio/mpeg',
|
|
40
42
|
},
|
|
@@ -49,6 +51,18 @@ export class ElevenLabsBatchTTS {
|
|
|
49
51
|
},
|
|
50
52
|
}),
|
|
51
53
|
});
|
|
54
|
+
const key = this.keyPool.next();
|
|
55
|
+
let res = await doFetch(key);
|
|
56
|
+
if (!res.ok && this.keyPool.size > 1) {
|
|
57
|
+
const body = await res.text().catch(() => '');
|
|
58
|
+
if (isQuotaError(res.status, body)) {
|
|
59
|
+
this.keyPool.markExhausted(key);
|
|
60
|
+
res = await doFetch(this.keyPool.next());
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
throw new Error(`ElevenLabs TTS failed: ${res.status} ${body.slice(0, 200)}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
52
66
|
if (!res.ok) {
|
|
53
67
|
const detail = await res.text().catch(() => '');
|
|
54
68
|
throw new Error(`ElevenLabs TTS failed: ${res.status} ${detail.slice(0, 200)}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ElevenLabsBatchTTS.js","sourceRoot":"","sources":["../../../src/voice-pipeline/providers/ElevenLabsBatchTTS.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"ElevenLabsBatchTTS.js","sourceRoot":"","sources":["../../../src/voice-pipeline/providers/ElevenLabsBatchTTS.ts"],"names":[],"mappings":"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"}
|
|
@@ -60,10 +60,12 @@ export declare class ElevenLabsStreamingSTT implements IStreamingSTT {
|
|
|
60
60
|
private readonly config;
|
|
61
61
|
readonly providerId = "elevenlabs-streaming-stt";
|
|
62
62
|
readonly isStreaming = true;
|
|
63
|
+
private readonly keyPool;
|
|
63
64
|
constructor(config: ElevenLabsStreamingSTTConfig);
|
|
64
65
|
/**
|
|
65
66
|
* Create a new STT session. Uses chunked REST calls to ElevenLabs'
|
|
66
67
|
* batch STT endpoint for near-realtime transcription.
|
|
68
|
+
* Each session gets a fresh key from the round-robin pool.
|
|
67
69
|
*/
|
|
68
70
|
startSession(config?: StreamingSTTConfig): Promise<StreamingSTTSession>;
|
|
69
71
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ElevenLabsStreamingSTT.d.ts","sourceRoot":"","sources":["../../../src/voice-pipeline/providers/ElevenLabsStreamingSTT.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAInB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ElevenLabsStreamingSTT.d.ts","sourceRoot":"","sources":["../../../src/voice-pipeline/providers/ElevenLabsStreamingSTT.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAInB,MAAM,aAAa,CAAC;AAOrB;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAoQD;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,sBAAuB,YAAW,aAAa;IAK9C,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,QAAQ,CAAC,UAAU,8BAA8B;IACjD,QAAQ,CAAC,WAAW,QAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;gBAER,MAAM,EAAE,4BAA4B;IAIjE;;;;OAIG;IACG,YAAY,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAI9E"}
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
* @see https://elevenlabs.io/docs/api-reference/speech-to-text
|
|
24
24
|
*/
|
|
25
25
|
import { EventEmitter } from 'node:events';
|
|
26
|
+
import { ApiKeyPool } from '../../core/providers/ApiKeyPool.js';
|
|
26
27
|
// ---------------------------------------------------------------------------
|
|
27
28
|
// Session Implementation — Chunked REST fallback
|
|
28
29
|
// ---------------------------------------------------------------------------
|
|
@@ -236,13 +237,16 @@ export class ElevenLabsStreamingSTT {
|
|
|
236
237
|
this.config = config;
|
|
237
238
|
this.providerId = 'elevenlabs-streaming-stt';
|
|
238
239
|
this.isStreaming = true;
|
|
240
|
+
this.keyPool = new ApiKeyPool(config.apiKey);
|
|
239
241
|
}
|
|
240
242
|
/**
|
|
241
243
|
* Create a new STT session. Uses chunked REST calls to ElevenLabs'
|
|
242
244
|
* batch STT endpoint for near-realtime transcription.
|
|
245
|
+
* Each session gets a fresh key from the round-robin pool.
|
|
243
246
|
*/
|
|
244
247
|
async startSession(config) {
|
|
245
|
-
|
|
248
|
+
const resolvedConfig = { ...this.config, apiKey: this.keyPool.next() };
|
|
249
|
+
return new ElevenLabsChunkedSTTSession(resolvedConfig, config ?? {});
|
|
246
250
|
}
|
|
247
251
|
}
|
|
248
252
|
//# sourceMappingURL=ElevenLabsStreamingSTT.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ElevenLabsStreamingSTT.js","sourceRoot":"","sources":["../../../src/voice-pipeline/providers/ElevenLabsStreamingSTT.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ElevenLabsStreamingSTT.js","sourceRoot":"","sources":["../../../src/voice-pipeline/providers/ElevenLabsStreamingSTT.ts"],"names":[],"mappings":"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"}
|
|
@@ -63,10 +63,12 @@ export interface ElevenLabsStreamingTTSConfig {
|
|
|
63
63
|
export declare class ElevenLabsStreamingTTS implements IStreamingTTS {
|
|
64
64
|
private readonly config;
|
|
65
65
|
readonly providerId = "elevenlabs-streaming";
|
|
66
|
+
private readonly keyPool;
|
|
66
67
|
constructor(config: ElevenLabsStreamingTTSConfig);
|
|
67
68
|
/**
|
|
68
69
|
* Create a new streaming TTS session connected to ElevenLabs.
|
|
69
70
|
* The session opens a WebSocket and is ready to receive text tokens.
|
|
71
|
+
* Each session gets a fresh key from the round-robin pool.
|
|
70
72
|
*/
|
|
71
73
|
startSession(config?: StreamingTTSConfig): Promise<StreamingTTSSession>;
|
|
72
74
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ElevenLabsStreamingTTS.d.ts","sourceRoot":"","sources":["../../../src/voice-pipeline/providers/ElevenLabsStreamingTTS.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAEnB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ElevenLabsStreamingTTS.d.ts","sourceRoot":"","sources":["../../../src/voice-pipeline/providers/ElevenLabsStreamingTTS.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAEnB,MAAM,aAAa,CAAC;AAOrB;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA8OD;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,sBAAuB,YAAW,aAAa;IAI9C,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,QAAQ,CAAC,UAAU,0BAA0B;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;gBAER,MAAM,EAAE,4BAA4B;IAIjE;;;;OAIG;IACG,YAAY,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAM9E"}
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
*/
|
|
24
24
|
import { EventEmitter } from 'node:events';
|
|
25
25
|
import WebSocket from 'ws';
|
|
26
|
+
import { ApiKeyPool } from '../../core/providers/ApiKeyPool.js';
|
|
26
27
|
// ---------------------------------------------------------------------------
|
|
27
28
|
// Session Implementation
|
|
28
29
|
// ---------------------------------------------------------------------------
|
|
@@ -227,13 +228,16 @@ export class ElevenLabsStreamingTTS {
|
|
|
227
228
|
constructor(config) {
|
|
228
229
|
this.config = config;
|
|
229
230
|
this.providerId = 'elevenlabs-streaming';
|
|
231
|
+
this.keyPool = new ApiKeyPool(config.apiKey);
|
|
230
232
|
}
|
|
231
233
|
/**
|
|
232
234
|
* Create a new streaming TTS session connected to ElevenLabs.
|
|
233
235
|
* The session opens a WebSocket and is ready to receive text tokens.
|
|
236
|
+
* Each session gets a fresh key from the round-robin pool.
|
|
234
237
|
*/
|
|
235
238
|
async startSession(config) {
|
|
236
|
-
const
|
|
239
|
+
const resolvedConfig = { ...this.config, apiKey: this.keyPool.next() };
|
|
240
|
+
const session = new ElevenLabsStreamingTTSSession(resolvedConfig, config ?? {});
|
|
237
241
|
await session.connect();
|
|
238
242
|
return session;
|
|
239
243
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ElevenLabsStreamingTTS.js","sourceRoot":"","sources":["../../../src/voice-pipeline/providers/ElevenLabsStreamingTTS.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,SAAS,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"ElevenLabsStreamingTTS.js","sourceRoot":"","sources":["../../../src/voice-pipeline/providers/ElevenLabsStreamingTTS.ts"],"names":[],"mappings":"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"}
|