@tanstack/ai-elevenlabs 0.2.26 → 0.2.28

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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"token.js","sources":["../../../src/realtime/token.ts"],"sourcesContent":["import {\n createElevenLabsClient,\n getElevenLabsAgentIdFromEnv,\n} from '../utils/client'\nimport type { RealtimeToken, RealtimeTokenAdapter } from '@tanstack/ai'\nimport type { ElevenLabsRealtimeTokenOptions } from './types'\n\n/**\n * Creates an ElevenLabs realtime token adapter.\n *\n * Uses the official `@elevenlabs/elevenlabs-js` SDK to request a signed URL\n * for client-side conversation connections. The signed URL is valid for\n * 30 minutes.\n *\n * @param options - Configuration. `agentId` falls back to\n * `ELEVENLABS_AGENT_ID` in the environment when omitted.\n * @returns A RealtimeTokenAdapter for use with realtimeToken()\n *\n * @example\n * ```typescript\n * import { realtimeToken } from '@tanstack/ai'\n * import { elevenlabsRealtimeToken } from '@tanstack/ai-elevenlabs'\n *\n * // Reads ELEVENLABS_AGENT_ID from env:\n * const token = await realtimeToken({ adapter: elevenlabsRealtimeToken() })\n *\n * // Or pass explicitly:\n * const token = await realtimeToken({\n * adapter: elevenlabsRealtimeToken({ agentId: 'your-agent-id' }),\n * })\n * ```\n */\nexport function elevenlabsRealtimeToken(\n options: ElevenLabsRealtimeTokenOptions = {},\n): RealtimeTokenAdapter {\n const client = createElevenLabsClient()\n\n return {\n provider: 'elevenlabs',\n\n async generateToken(): Promise<RealtimeToken> {\n const { overrides } = options\n const agentId = options.agentId ?? getElevenLabsAgentIdFromEnv()\n\n const response = await client.conversationalAi.conversations.getSignedUrl(\n { agentId },\n )\n\n // Signed URLs are valid for 30 minutes\n const expiresAt = Date.now() + 30 * 60 * 1000\n\n // Conditionally spread optional fields — the vendor target type\n // (`RealtimeSessionConfig` in `@tanstack/ai`) uses strict\n // `field?: T` semantics under `exactOptionalPropertyTypes`, so we\n // omit keys entirely when the override is absent rather than\n // setting them to `undefined`.\n return {\n provider: 'elevenlabs',\n token: response.signedUrl,\n expiresAt,\n config: {\n ...(overrides?.voiceId !== undefined && { voice: overrides.voiceId }),\n ...(overrides?.systemPrompt !== undefined && {\n instructions: overrides.systemPrompt,\n }),\n providerOptions: {\n agentId,\n ...(overrides?.firstMessage !== undefined && {\n firstMessage: overrides.firstMessage,\n }),\n ...(overrides?.language !== undefined && {\n language: overrides.language,\n }),\n },\n },\n }\n },\n }\n}\n"],"names":[],"mappings":";AAgCO,SAAS,wBACd,UAA0C,IACpB;AACtB,QAAM,SAAS,uBAAA;AAEf,SAAO;AAAA,IACL,UAAU;AAAA,IAEV,MAAM,gBAAwC;AAC5C,YAAM,EAAE,cAAc;AACtB,YAAM,UAAU,QAAQ,WAAW,4BAAA;AAEnC,YAAM,WAAW,MAAM,OAAO,iBAAiB,cAAc;AAAA,QAC3D,EAAE,QAAA;AAAA,MAAQ;AAIZ,YAAM,YAAY,KAAK,IAAA,IAAQ,KAAK,KAAK;AAOzC,aAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO,SAAS;AAAA,QAChB;AAAA,QACA,QAAQ;AAAA,UACN,GAAI,WAAW,YAAY,UAAa,EAAE,OAAO,UAAU,QAAA;AAAA,UAC3D,GAAI,WAAW,iBAAiB,UAAa;AAAA,YAC3C,cAAc,UAAU;AAAA,UAAA;AAAA,UAE1B,iBAAiB;AAAA,YACf;AAAA,YACA,GAAI,WAAW,iBAAiB,UAAa;AAAA,cAC3C,cAAc,UAAU;AAAA,YAAA;AAAA,YAE1B,GAAI,WAAW,aAAa,UAAa;AAAA,cACvC,UAAU,UAAU;AAAA,YAAA;AAAA,UACtB;AAAA,QACF;AAAA,MACF;AAAA,IAEJ;AAAA,EAAA;AAEJ;"}
@@ -1,60 +0,0 @@
1
- import { DebugOption } from '@tanstack/ai';
2
- /**
3
- * Options for the ElevenLabs realtime token adapter
4
- */
5
- export interface ElevenLabsRealtimeTokenOptions {
6
- /**
7
- * Agent ID configured in ElevenLabs dashboard. Falls back to
8
- * `ELEVENLABS_AGENT_ID` in the environment when omitted.
9
- */
10
- agentId?: string;
11
- /** Optional override values for the agent */
12
- overrides?: {
13
- /** Custom voice ID to use */
14
- voiceId?: string;
15
- /** Custom system prompt */
16
- systemPrompt?: string;
17
- /** First message the agent should speak */
18
- firstMessage?: string;
19
- /** Language code (e.g., 'en') */
20
- language?: string;
21
- };
22
- }
23
- /**
24
- * Options for the ElevenLabs realtime client adapter
25
- */
26
- export interface ElevenLabsRealtimeOptions {
27
- /** Connection mode (default: auto-detect) */
28
- connectionMode?: 'websocket' | 'webrtc';
29
- /**
30
- * Enable debug logging for this adapter.
31
- *
32
- * - `true` enables all categories (`request`, `response`, `provider`, `errors`).
33
- * - A {@link DebugConfig} object selects categories and/or a custom sink.
34
- */
35
- debug?: DebugOption;
36
- }
37
- /**
38
- * ElevenLabs conversation mode
39
- */
40
- export type ElevenLabsConversationMode = 'speaking' | 'listening';
41
- /**
42
- * ElevenLabs voice activity detection configuration
43
- */
44
- export interface ElevenLabsVADConfig {
45
- /** VAD threshold (0.1-0.9) */
46
- vadThreshold?: number;
47
- /** Silence threshold in seconds (0.3-3.0) */
48
- vadSilenceThresholdSecs?: number;
49
- /** Minimum speech duration in ms */
50
- minSpeechDurationMs?: number;
51
- /** Minimum silence duration in ms */
52
- minSilenceDurationMs?: number;
53
- }
54
- /**
55
- * Client tool definition for ElevenLabs
56
- */
57
- export interface ElevenLabsClientTool<TParams = unknown, TResult = unknown> {
58
- /** Tool handler function */
59
- handler: (params: TParams) => Promise<TResult> | TResult;
60
- }
@@ -1,63 +0,0 @@
1
- import { ElevenLabsClient } from '@elevenlabs/elevenlabs-js';
2
- import { generateId as sharedGenerateId } from '@tanstack/ai-utils';
3
- import { ElevenLabsOutputFormat } from '../model-meta.js';
4
- /**
5
- * Configuration for any ElevenLabs adapter. When `apiKey` is omitted we read
6
- * `ELEVENLABS_API_KEY` from `process.env` / `window.env` to match the
7
- * pattern the realtime adapters already use.
8
- */
9
- export interface ElevenLabsClientConfig {
10
- apiKey?: string;
11
- /** Override the API base URL — handy for tests + self-hosted proxies. */
12
- baseUrl?: string;
13
- /** Per-request timeout passed through to the SDK (ms). */
14
- timeoutInSeconds?: number;
15
- /** Override the number of SDK-level retries. */
16
- maxRetries?: number;
17
- /** Extra headers attached to every request (e.g. test multiplexing). */
18
- headers?: Record<string, string>;
19
- }
20
- export declare function getElevenLabsApiKeyFromEnv(): string;
21
- export declare function getElevenLabsAgentIdFromEnv(): string;
22
- /**
23
- * Build an `ElevenLabsClient` with env-based or explicit credentials.
24
- * Each adapter calls this once at construction time so unit tests can
25
- * pass in an explicit key without needing `process.env`.
26
- */
27
- export declare function createElevenLabsClient(config?: ElevenLabsClientConfig): ElevenLabsClient;
28
- export declare const generateId: typeof sharedGenerateId;
29
- /**
30
- * Convert an ArrayBuffer to base64 in a cross-runtime way.
31
- *
32
- * The naive `btoa(String.fromCharCode(...bytes))` form blows up V8's argument
33
- * limit (~65k) on realistic audio payloads, so we either use `Buffer`
34
- * (Node / Bun) or walk the byte array in a single loop (browser).
35
- */
36
- export declare function arrayBufferToBase64(buffer: ArrayBuffer): string;
37
- /**
38
- * Drain a `ReadableStream<Uint8Array>` (what the ElevenLabs SDK returns for
39
- * audio endpoints) into a single `Uint8Array`, then expose it as an
40
- * `ArrayBuffer` slice. We concatenate ourselves rather than going through
41
- * `new Response(stream).arrayBuffer()` so we stay runtime-agnostic.
42
- */
43
- export declare function readStreamToArrayBuffer(stream: ReadableStream<Uint8Array>): Promise<ArrayBuffer>;
44
- /**
45
- * Decode a `data:` URL into a Blob for upload to the ElevenLabs STT API
46
- * (which only accepts multipart files or https URLs). Supports base64 and
47
- * URL-encoded payloads. Returns `undefined` for non-data-URL strings so the
48
- * caller can fall through to treating the input as an https URL.
49
- */
50
- export declare function dataUrlToBlob(value: string): Blob | undefined;
51
- /**
52
- * Break an ElevenLabs `output_format` string (`mp3_44100_128`,
53
- * `pcm_24000`, `opus_48000_64`, `ulaw_8000`, ...) into a file extension and
54
- * content-type suitable for `TTSResult` / `AudioGenerationResult` consumers.
55
- *
56
- * Unknown codecs fall back to `mp3` / `audio/mpeg` because the ElevenLabs
57
- * default is `mp3_44100_128` — mispredicting on an exotic format is safer
58
- * than throwing in the adapter.
59
- */
60
- export declare function parseOutputFormat(fmt: ElevenLabsOutputFormat | undefined): {
61
- format: string;
62
- contentType: string;
63
- };
@@ -1,118 +0,0 @@
1
- import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js";
2
- import { getApiKeyFromEnv, generateId as generateId$1 } from "@tanstack/ai-utils";
3
- function getEnvironment() {
4
- if (typeof globalThis !== "undefined") {
5
- const win = globalThis.window;
6
- if (win?.env) return win.env;
7
- }
8
- if (typeof process !== "undefined") {
9
- return process.env;
10
- }
11
- return void 0;
12
- }
13
- function getElevenLabsApiKeyFromEnv() {
14
- return getApiKeyFromEnv("ELEVENLABS_API_KEY");
15
- }
16
- function getElevenLabsAgentIdFromEnv() {
17
- const id = getEnvironment()?.ELEVENLABS_AGENT_ID;
18
- if (!id) {
19
- throw new Error(
20
- "ELEVENLABS_AGENT_ID is required. Please set it in your environment variables or pass `agentId` explicitly to elevenlabsRealtimeToken()."
21
- );
22
- }
23
- return id;
24
- }
25
- function createElevenLabsClient(config) {
26
- const apiKey = config?.apiKey ?? getElevenLabsApiKeyFromEnv();
27
- return new ElevenLabsClient({
28
- apiKey,
29
- ...config?.baseUrl ? { baseUrl: config.baseUrl } : {},
30
- ...config?.timeoutInSeconds != null ? { timeoutInSeconds: config.timeoutInSeconds } : {},
31
- ...config?.maxRetries != null ? { maxRetries: config.maxRetries } : {},
32
- ...config?.headers ? { headers: config.headers } : {}
33
- });
34
- }
35
- const generateId = generateId$1;
36
- function arrayBufferToBase64(buffer) {
37
- if (typeof Buffer !== "undefined" && typeof Buffer.from === "function") {
38
- return Buffer.from(buffer).toString("base64");
39
- }
40
- const view = new Uint8Array(buffer);
41
- let binary = "";
42
- for (const byte of view) {
43
- binary += String.fromCharCode(byte);
44
- }
45
- return btoa(binary);
46
- }
47
- async function readStreamToArrayBuffer(stream) {
48
- const reader = stream.getReader();
49
- const chunks = [];
50
- let total = 0;
51
- try {
52
- let result = await reader.read();
53
- while (!result.done) {
54
- chunks.push(result.value);
55
- total += result.value.byteLength;
56
- result = await reader.read();
57
- }
58
- } finally {
59
- reader.releaseLock();
60
- }
61
- const merged = new Uint8Array(total);
62
- let offset = 0;
63
- for (const chunk of chunks) {
64
- merged.set(chunk, offset);
65
- offset += chunk.byteLength;
66
- }
67
- return merged.buffer.slice(
68
- merged.byteOffset,
69
- merged.byteOffset + merged.byteLength
70
- );
71
- }
72
- function dataUrlToBlob(value) {
73
- if (!value.startsWith("data:")) return void 0;
74
- const commaIndex = value.indexOf(",");
75
- if (commaIndex === -1) return void 0;
76
- const header = value.slice(5, commaIndex);
77
- const payload = value.slice(commaIndex + 1);
78
- const isBase64 = /;base64$/i.test(header);
79
- const mimeType = header.split(";")[0] || "application/octet-stream";
80
- if (isBase64) {
81
- const binary = atob(payload);
82
- const bytes = new Uint8Array(binary.length);
83
- for (let i = 0; i < binary.length; i += 1) {
84
- bytes[i] = binary.charCodeAt(i);
85
- }
86
- return new Blob([bytes], { type: mimeType });
87
- }
88
- return new Blob([decodeURIComponent(payload)], { type: mimeType });
89
- }
90
- function parseOutputFormat(fmt) {
91
- const codec = (fmt || "mp3_44100_128").split("_")[0]?.toLowerCase();
92
- switch (codec) {
93
- case "mp3":
94
- return { format: "mp3", contentType: "audio/mpeg" };
95
- case "pcm":
96
- return { format: "pcm", contentType: "audio/pcm" };
97
- case "opus":
98
- return { format: "opus", contentType: "audio/opus" };
99
- case "ulaw":
100
- return { format: "ulaw", contentType: "audio/basic" };
101
- case "alaw":
102
- return { format: "alaw", contentType: "audio/x-alaw-basic" };
103
- case void 0:
104
- default:
105
- return { format: "mp3", contentType: "audio/mpeg" };
106
- }
107
- }
108
- export {
109
- arrayBufferToBase64,
110
- createElevenLabsClient,
111
- dataUrlToBlob,
112
- generateId,
113
- getElevenLabsAgentIdFromEnv,
114
- getElevenLabsApiKeyFromEnv,
115
- parseOutputFormat,
116
- readStreamToArrayBuffer
117
- };
118
- //# sourceMappingURL=client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sources":["../../../src/utils/client.ts"],"sourcesContent":["import { ElevenLabsClient } from '@elevenlabs/elevenlabs-js'\nimport {\n getApiKeyFromEnv,\n generateId as sharedGenerateId,\n} from '@tanstack/ai-utils'\nimport type { ElevenLabsOutputFormat } from '../model-meta'\n\n/**\n * Configuration for any ElevenLabs adapter. When `apiKey` is omitted we read\n * `ELEVENLABS_API_KEY` from `process.env` / `window.env` to match the\n * pattern the realtime adapters already use.\n */\nexport interface ElevenLabsClientConfig {\n apiKey?: string\n /** Override the API base URL — handy for tests + self-hosted proxies. */\n baseUrl?: string\n /** Per-request timeout passed through to the SDK (ms). */\n timeoutInSeconds?: number\n /** Override the number of SDK-level retries. */\n maxRetries?: number\n /** Extra headers attached to every request (e.g. test multiplexing). */\n headers?: Record<string, string>\n}\n\ninterface EnvObject {\n ELEVENLABS_API_KEY?: string\n ELEVENLABS_AGENT_ID?: string\n}\n\ninterface WindowWithEnv {\n env?: EnvObject\n}\n\nfunction getEnvironment(): EnvObject | undefined {\n if (typeof globalThis !== 'undefined') {\n const win = (globalThis as { window?: WindowWithEnv }).window\n if (win?.env) return win.env\n }\n if (typeof process !== 'undefined') {\n return process.env as EnvObject\n }\n return undefined\n}\n\nexport function getElevenLabsApiKeyFromEnv(): string {\n return getApiKeyFromEnv('ELEVENLABS_API_KEY')\n}\n\nexport function getElevenLabsAgentIdFromEnv(): string {\n const id = getEnvironment()?.ELEVENLABS_AGENT_ID\n if (!id) {\n throw new Error(\n 'ELEVENLABS_AGENT_ID is required. Please set it in your environment ' +\n 'variables or pass `agentId` explicitly to elevenlabsRealtimeToken().',\n )\n }\n return id\n}\n\n/**\n * Build an `ElevenLabsClient` with env-based or explicit credentials.\n * Each adapter calls this once at construction time so unit tests can\n * pass in an explicit key without needing `process.env`.\n */\nexport function createElevenLabsClient(\n config?: ElevenLabsClientConfig,\n): ElevenLabsClient {\n const apiKey = config?.apiKey ?? getElevenLabsApiKeyFromEnv()\n return new ElevenLabsClient({\n apiKey,\n ...(config?.baseUrl ? { baseUrl: config.baseUrl } : {}),\n ...(config?.timeoutInSeconds != null\n ? { timeoutInSeconds: config.timeoutInSeconds }\n : {}),\n ...(config?.maxRetries != null ? { maxRetries: config.maxRetries } : {}),\n ...(config?.headers ? { headers: config.headers } : {}),\n })\n}\n\n// Re-exported from `@tanstack/ai-utils` so existing callers keep working\n// while the implementation stays deduped across provider packages.\nexport const generateId = sharedGenerateId\n\n/**\n * Convert an ArrayBuffer to base64 in a cross-runtime way.\n *\n * The naive `btoa(String.fromCharCode(...bytes))` form blows up V8's argument\n * limit (~65k) on realistic audio payloads, so we either use `Buffer`\n * (Node / Bun) or walk the byte array in a single loop (browser).\n */\nexport function arrayBufferToBase64(buffer: ArrayBuffer): string {\n if (typeof Buffer !== 'undefined' && typeof Buffer.from === 'function') {\n return Buffer.from(buffer).toString('base64')\n }\n const view = new Uint8Array(buffer)\n let binary = ''\n for (const byte of view) {\n binary += String.fromCharCode(byte)\n }\n return btoa(binary)\n}\n\n/**\n * Drain a `ReadableStream<Uint8Array>` (what the ElevenLabs SDK returns for\n * audio endpoints) into a single `Uint8Array`, then expose it as an\n * `ArrayBuffer` slice. We concatenate ourselves rather than going through\n * `new Response(stream).arrayBuffer()` so we stay runtime-agnostic.\n */\nexport async function readStreamToArrayBuffer(\n stream: ReadableStream<Uint8Array>,\n): Promise<ArrayBuffer> {\n const reader = stream.getReader()\n const chunks: Array<Uint8Array> = []\n let total = 0\n try {\n let result = await reader.read()\n while (!result.done) {\n chunks.push(result.value)\n total += result.value.byteLength\n result = await reader.read()\n }\n } finally {\n reader.releaseLock()\n }\n const merged = new Uint8Array(total)\n let offset = 0\n for (const chunk of chunks) {\n merged.set(chunk, offset)\n offset += chunk.byteLength\n }\n return merged.buffer.slice(\n merged.byteOffset,\n merged.byteOffset + merged.byteLength,\n )\n}\n\n/**\n * Decode a `data:` URL into a Blob for upload to the ElevenLabs STT API\n * (which only accepts multipart files or https URLs). Supports base64 and\n * URL-encoded payloads. Returns `undefined` for non-data-URL strings so the\n * caller can fall through to treating the input as an https URL.\n */\nexport function dataUrlToBlob(value: string): Blob | undefined {\n if (!value.startsWith('data:')) return undefined\n const commaIndex = value.indexOf(',')\n if (commaIndex === -1) return undefined\n\n const header = value.slice(5, commaIndex)\n const payload = value.slice(commaIndex + 1)\n const isBase64 = /;base64$/i.test(header)\n const mimeType = header.split(';')[0] || 'application/octet-stream'\n\n if (isBase64) {\n const binary = atob(payload)\n const bytes = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i += 1) {\n bytes[i] = binary.charCodeAt(i)\n }\n return new Blob([bytes], { type: mimeType })\n }\n\n return new Blob([decodeURIComponent(payload)], { type: mimeType })\n}\n\n/**\n * Break an ElevenLabs `output_format` string (`mp3_44100_128`,\n * `pcm_24000`, `opus_48000_64`, `ulaw_8000`, ...) into a file extension and\n * content-type suitable for `TTSResult` / `AudioGenerationResult` consumers.\n *\n * Unknown codecs fall back to `mp3` / `audio/mpeg` because the ElevenLabs\n * default is `mp3_44100_128` — mispredicting on an exotic format is safer\n * than throwing in the adapter.\n */\nexport function parseOutputFormat(fmt: ElevenLabsOutputFormat | undefined): {\n format: string\n contentType: string\n} {\n const codec = (fmt || 'mp3_44100_128').split('_')[0]?.toLowerCase()\n switch (codec) {\n case 'mp3':\n return { format: 'mp3', contentType: 'audio/mpeg' }\n case 'pcm':\n return { format: 'pcm', contentType: 'audio/pcm' }\n case 'opus':\n return { format: 'opus', contentType: 'audio/opus' }\n case 'ulaw':\n return { format: 'ulaw', contentType: 'audio/basic' }\n case 'alaw':\n return { format: 'alaw', contentType: 'audio/x-alaw-basic' }\n case undefined:\n default:\n // `split('_')[0]?.toLowerCase()` can be `undefined` only if `fmt` is\n // an empty string; any other unknown codec also falls back to mp3.\n return { format: 'mp3', contentType: 'audio/mpeg' }\n }\n}\n"],"names":["sharedGenerateId"],"mappings":"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"}
@@ -1 +0,0 @@
1
- export { arrayBufferToBase64, createElevenLabsClient, dataUrlToBlob, generateId, getElevenLabsApiKeyFromEnv, parseOutputFormat, readStreamToArrayBuffer, type ElevenLabsClientConfig, } from './client.js';