@elevenlabs/elevenlabs-js 2.19.0 → 2.20.1

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 (220) hide show
  1. package/Client.js +2 -2
  2. package/api/resources/conversationalAi/resources/agents/client/Client.d.ts +3 -5
  3. package/api/resources/conversationalAi/resources/agents/client/Client.js +11 -15
  4. package/api/resources/conversationalAi/resources/agents/client/requests/AgentsListRequest.d.ts +3 -0
  5. package/api/resources/conversationalAi/resources/agents/client/requests/index.d.ts +0 -1
  6. package/api/resources/studio/client/Client.d.ts +1 -0
  7. package/api/resources/studio/client/Client.js +18 -2
  8. package/api/resources/studio/client/requests/BodyCreatePodcastV1StudioPodcastsPost.d.ts +3 -0
  9. package/api/types/AgentDefinitionSource.d.ts +7 -0
  10. package/api/types/AgentDefinitionSource.js +10 -0
  11. package/api/types/AgentSummaryResponseModel.d.ts +2 -0
  12. package/api/types/ClientToolConfigInput.d.ts +2 -0
  13. package/api/types/ClientToolConfigOutput.d.ts +2 -0
  14. package/api/types/ConversationHistoryMetadataCommonModel.d.ts +3 -0
  15. package/api/types/CreateAgentResponseModel.d.ts +0 -4
  16. package/api/types/GetAgentResponseModel.d.ts +0 -2
  17. package/api/types/ProjectExtendedResponse.d.ts +2 -0
  18. package/api/types/ProjectResponse.d.ts +2 -0
  19. package/api/types/ToolExecutionMode.d.ts +6 -0
  20. package/api/types/ToolExecutionMode.js +9 -0
  21. package/api/types/WebhookToolConfigInput.d.ts +2 -0
  22. package/api/types/WebhookToolConfigOutput.d.ts +2 -0
  23. package/api/types/WhatsAppConversationInfo.d.ts +4 -0
  24. package/api/types/index.d.ts +3 -10
  25. package/api/types/index.js +3 -10
  26. package/dist/Client.js +2 -2
  27. package/dist/api/resources/conversationalAi/resources/agents/client/Client.d.ts +3 -5
  28. package/dist/api/resources/conversationalAi/resources/agents/client/Client.js +11 -15
  29. package/dist/api/resources/conversationalAi/resources/agents/client/requests/AgentsListRequest.d.ts +3 -0
  30. package/dist/api/resources/conversationalAi/resources/agents/client/requests/index.d.ts +0 -1
  31. package/dist/api/resources/studio/client/Client.d.ts +1 -0
  32. package/dist/api/resources/studio/client/Client.js +18 -2
  33. package/dist/api/resources/studio/client/requests/BodyCreatePodcastV1StudioPodcastsPost.d.ts +3 -0
  34. package/dist/api/types/AgentDefinitionSource.d.ts +7 -0
  35. package/dist/api/types/AgentDefinitionSource.js +10 -0
  36. package/dist/api/types/AgentSummaryResponseModel.d.ts +2 -0
  37. package/dist/api/types/ClientToolConfigInput.d.ts +2 -0
  38. package/dist/api/types/ClientToolConfigOutput.d.ts +2 -0
  39. package/dist/api/types/ConversationHistoryMetadataCommonModel.d.ts +3 -0
  40. package/dist/api/types/CreateAgentResponseModel.d.ts +0 -4
  41. package/dist/api/types/GetAgentResponseModel.d.ts +0 -2
  42. package/dist/api/types/ProjectExtendedResponse.d.ts +2 -0
  43. package/dist/api/types/ProjectResponse.d.ts +2 -0
  44. package/dist/api/types/ToolExecutionMode.d.ts +6 -0
  45. package/dist/api/types/ToolExecutionMode.js +9 -0
  46. package/dist/api/types/WebhookToolConfigInput.d.ts +2 -0
  47. package/dist/api/types/WebhookToolConfigOutput.d.ts +2 -0
  48. package/dist/api/types/WhatsAppConversationInfo.d.ts +4 -0
  49. package/dist/api/types/index.d.ts +3 -10
  50. package/dist/api/types/index.js +3 -10
  51. package/dist/serialization/resources/studio/client/requests/BodyCreatePodcastV1StudioPodcastsPost.d.ts +1 -1
  52. package/dist/serialization/types/AgentDefinitionSource.d.ts +7 -0
  53. package/dist/serialization/types/{WhatsAppChangeMessages.js → AgentDefinitionSource.js} +2 -2
  54. package/dist/serialization/types/AgentSummaryResponseModel.d.ts +1 -0
  55. package/dist/serialization/types/AgentSummaryResponseModel.js +1 -0
  56. package/dist/serialization/types/ClientToolConfigInput.d.ts +2 -0
  57. package/dist/serialization/types/ClientToolConfigInput.js +2 -0
  58. package/dist/serialization/types/ClientToolConfigOutput.d.ts +2 -0
  59. package/dist/serialization/types/ClientToolConfigOutput.js +2 -0
  60. package/dist/serialization/types/ConversationHistoryMetadataCommonModel.d.ts +5 -0
  61. package/dist/serialization/types/ConversationHistoryMetadataCommonModel.js +5 -0
  62. package/dist/serialization/types/CreateAgentResponseModel.d.ts +0 -2
  63. package/dist/serialization/types/CreateAgentResponseModel.js +0 -2
  64. package/dist/serialization/types/GetAgentResponseModel.d.ts +0 -1
  65. package/dist/serialization/types/GetAgentResponseModel.js +0 -1
  66. package/dist/serialization/types/ProjectExtendedResponse.d.ts +1 -0
  67. package/dist/serialization/types/ProjectExtendedResponse.js +1 -0
  68. package/dist/serialization/types/ProjectResponse.d.ts +1 -0
  69. package/dist/serialization/types/ProjectResponse.js +1 -0
  70. package/dist/serialization/types/ToolExecutionMode.d.ts +7 -0
  71. package/{serialization/types/WhatsAppCallDirection.js → dist/serialization/types/ToolExecutionMode.js} +2 -2
  72. package/dist/serialization/types/WebhookToolConfigInput.d.ts +2 -0
  73. package/dist/serialization/types/WebhookToolConfigInput.js +2 -0
  74. package/dist/serialization/types/WebhookToolConfigOutput.d.ts +2 -0
  75. package/dist/serialization/types/WebhookToolConfigOutput.js +2 -0
  76. package/dist/serialization/types/WhatsAppConversationInfo.d.ts +10 -0
  77. package/dist/serialization/types/{WhatsAppMetadata.js → WhatsAppConversationInfo.js} +4 -3
  78. package/dist/serialization/types/index.d.ts +3 -10
  79. package/dist/serialization/types/index.js +3 -10
  80. package/dist/version.d.ts +1 -1
  81. package/dist/version.js +1 -1
  82. package/dist/wrapper/ElevenLabsClient.d.ts +3 -0
  83. package/dist/wrapper/ElevenLabsClient.js +8 -1
  84. package/dist/wrapper/index.d.ts +2 -0
  85. package/dist/wrapper/index.js +8 -1
  86. package/dist/wrapper/music.d.ts +74 -3
  87. package/dist/wrapper/music.js +127 -14
  88. package/dist/wrapper/realtime/connection.d.ts +179 -0
  89. package/dist/wrapper/realtime/connection.js +260 -0
  90. package/dist/wrapper/realtime/index.d.ts +2 -0
  91. package/dist/wrapper/realtime/index.js +10 -0
  92. package/dist/wrapper/realtime/scribe.d.ts +112 -0
  93. package/dist/wrapper/realtime/scribe.js +265 -0
  94. package/dist/wrapper/speechToText.d.ts +6 -0
  95. package/dist/wrapper/speechToText.js +14 -0
  96. package/package.json +11 -10
  97. package/reference.md +4 -12
  98. package/serialization/resources/studio/client/requests/BodyCreatePodcastV1StudioPodcastsPost.d.ts +1 -1
  99. package/serialization/types/AgentDefinitionSource.d.ts +7 -0
  100. package/serialization/types/{WhatsAppChangeMessages.js → AgentDefinitionSource.js} +2 -2
  101. package/serialization/types/AgentSummaryResponseModel.d.ts +1 -0
  102. package/serialization/types/AgentSummaryResponseModel.js +1 -0
  103. package/serialization/types/ClientToolConfigInput.d.ts +2 -0
  104. package/serialization/types/ClientToolConfigInput.js +2 -0
  105. package/serialization/types/ClientToolConfigOutput.d.ts +2 -0
  106. package/serialization/types/ClientToolConfigOutput.js +2 -0
  107. package/serialization/types/ConversationHistoryMetadataCommonModel.d.ts +5 -0
  108. package/serialization/types/ConversationHistoryMetadataCommonModel.js +5 -0
  109. package/serialization/types/CreateAgentResponseModel.d.ts +0 -2
  110. package/serialization/types/CreateAgentResponseModel.js +0 -2
  111. package/serialization/types/GetAgentResponseModel.d.ts +0 -1
  112. package/serialization/types/GetAgentResponseModel.js +0 -1
  113. package/serialization/types/ProjectExtendedResponse.d.ts +1 -0
  114. package/serialization/types/ProjectExtendedResponse.js +1 -0
  115. package/serialization/types/ProjectResponse.d.ts +1 -0
  116. package/serialization/types/ProjectResponse.js +1 -0
  117. package/serialization/types/ToolExecutionMode.d.ts +7 -0
  118. package/{dist/serialization/types/WhatsAppCallDirection.js → serialization/types/ToolExecutionMode.js} +2 -2
  119. package/serialization/types/WebhookToolConfigInput.d.ts +2 -0
  120. package/serialization/types/WebhookToolConfigInput.js +2 -0
  121. package/serialization/types/WebhookToolConfigOutput.d.ts +2 -0
  122. package/serialization/types/WebhookToolConfigOutput.js +2 -0
  123. package/serialization/types/WhatsAppConversationInfo.d.ts +10 -0
  124. package/{dist/serialization/types/WhatsAppChangeCalls.js → serialization/types/WhatsAppConversationInfo.js} +4 -4
  125. package/serialization/types/index.d.ts +3 -10
  126. package/serialization/types/index.js +3 -10
  127. package/version.d.ts +1 -1
  128. package/version.js +1 -1
  129. package/wrapper/ElevenLabsClient.d.ts +3 -0
  130. package/wrapper/ElevenLabsClient.js +8 -1
  131. package/wrapper/index.d.ts +2 -0
  132. package/wrapper/index.js +8 -1
  133. package/wrapper/music.d.ts +74 -3
  134. package/wrapper/music.js +127 -14
  135. package/wrapper/realtime/connection.d.ts +179 -0
  136. package/wrapper/realtime/connection.js +260 -0
  137. package/wrapper/realtime/index.d.ts +2 -0
  138. package/wrapper/realtime/index.js +10 -0
  139. package/wrapper/realtime/scribe.d.ts +112 -0
  140. package/wrapper/realtime/scribe.js +265 -0
  141. package/wrapper/speechToText.d.ts +6 -0
  142. package/wrapper/speechToText.js +14 -0
  143. package/api/resources/conversationalAi/resources/agents/client/requests/AgentsGetRequest.d.ts +0 -10
  144. package/api/types/WhatsAppBusinessAccount.d.ts +0 -5
  145. package/api/types/WhatsAppBusinessAccountChangesItem.d.ts +0 -10
  146. package/api/types/WhatsAppBusinessAccountChangesItem.js +0 -3
  147. package/api/types/WhatsAppCall.d.ts +0 -10
  148. package/api/types/WhatsAppCall.js +0 -3
  149. package/api/types/WhatsAppCallDirection.d.ts +0 -5
  150. package/api/types/WhatsAppCallDirection.js +0 -8
  151. package/api/types/WhatsAppCalls.d.ts +0 -5
  152. package/api/types/WhatsAppCalls.js +0 -3
  153. package/api/types/WhatsAppChangeCalls.d.ts +0 -4
  154. package/api/types/WhatsAppChangeCalls.js +0 -3
  155. package/api/types/WhatsAppChangeMessages.d.ts +0 -2
  156. package/api/types/WhatsAppChangeMessages.js +0 -3
  157. package/api/types/WhatsAppEventRequest.d.ts +0 -5
  158. package/api/types/WhatsAppEventRequest.js +0 -3
  159. package/api/types/WhatsAppMetadata.d.ts +0 -3
  160. package/api/types/WhatsAppMetadata.js +0 -3
  161. package/api/types/WhatsAppSession.d.ts +0 -4
  162. package/api/types/WhatsAppSession.js +0 -3
  163. package/dist/api/resources/conversationalAi/resources/agents/client/requests/AgentsGetRequest.d.ts +0 -10
  164. package/dist/api/resources/conversationalAi/resources/agents/client/requests/AgentsGetRequest.js +0 -3
  165. package/dist/api/types/WhatsAppBusinessAccount.d.ts +0 -5
  166. package/dist/api/types/WhatsAppBusinessAccount.js +0 -3
  167. package/dist/api/types/WhatsAppBusinessAccountChangesItem.d.ts +0 -10
  168. package/dist/api/types/WhatsAppBusinessAccountChangesItem.js +0 -3
  169. package/dist/api/types/WhatsAppCall.d.ts +0 -10
  170. package/dist/api/types/WhatsAppCall.js +0 -3
  171. package/dist/api/types/WhatsAppCallDirection.d.ts +0 -5
  172. package/dist/api/types/WhatsAppCallDirection.js +0 -8
  173. package/dist/api/types/WhatsAppCalls.d.ts +0 -5
  174. package/dist/api/types/WhatsAppCalls.js +0 -3
  175. package/dist/api/types/WhatsAppChangeCalls.d.ts +0 -4
  176. package/dist/api/types/WhatsAppChangeCalls.js +0 -3
  177. package/dist/api/types/WhatsAppChangeMessages.d.ts +0 -2
  178. package/dist/api/types/WhatsAppChangeMessages.js +0 -3
  179. package/dist/api/types/WhatsAppEventRequest.d.ts +0 -5
  180. package/dist/api/types/WhatsAppEventRequest.js +0 -3
  181. package/dist/api/types/WhatsAppMetadata.d.ts +0 -3
  182. package/dist/api/types/WhatsAppMetadata.js +0 -3
  183. package/dist/api/types/WhatsAppSession.d.ts +0 -4
  184. package/dist/api/types/WhatsAppSession.js +0 -3
  185. package/dist/serialization/types/WhatsAppBusinessAccount.d.ts +0 -11
  186. package/dist/serialization/types/WhatsAppBusinessAccount.js +0 -43
  187. package/dist/serialization/types/WhatsAppBusinessAccountChangesItem.d.ts +0 -15
  188. package/dist/serialization/types/WhatsAppBusinessAccountChangesItem.js +0 -49
  189. package/dist/serialization/types/WhatsAppCall.d.ts +0 -17
  190. package/dist/serialization/types/WhatsAppCall.js +0 -49
  191. package/dist/serialization/types/WhatsAppCallDirection.d.ts +0 -7
  192. package/dist/serialization/types/WhatsAppCalls.d.ts +0 -12
  193. package/dist/serialization/types/WhatsAppCalls.js +0 -44
  194. package/dist/serialization/types/WhatsAppChangeCalls.d.ts +0 -10
  195. package/dist/serialization/types/WhatsAppChangeMessages.d.ts +0 -8
  196. package/dist/serialization/types/WhatsAppEventRequest.d.ts +0 -11
  197. package/dist/serialization/types/WhatsAppEventRequest.js +0 -43
  198. package/dist/serialization/types/WhatsAppMetadata.d.ts +0 -9
  199. package/dist/serialization/types/WhatsAppSession.d.ts +0 -10
  200. package/dist/serialization/types/WhatsAppSession.js +0 -42
  201. package/serialization/types/WhatsAppBusinessAccount.d.ts +0 -11
  202. package/serialization/types/WhatsAppBusinessAccount.js +0 -43
  203. package/serialization/types/WhatsAppBusinessAccountChangesItem.d.ts +0 -15
  204. package/serialization/types/WhatsAppBusinessAccountChangesItem.js +0 -49
  205. package/serialization/types/WhatsAppCall.d.ts +0 -17
  206. package/serialization/types/WhatsAppCall.js +0 -49
  207. package/serialization/types/WhatsAppCallDirection.d.ts +0 -7
  208. package/serialization/types/WhatsAppCalls.d.ts +0 -12
  209. package/serialization/types/WhatsAppCalls.js +0 -44
  210. package/serialization/types/WhatsAppChangeCalls.d.ts +0 -10
  211. package/serialization/types/WhatsAppChangeCalls.js +0 -42
  212. package/serialization/types/WhatsAppChangeMessages.d.ts +0 -8
  213. package/serialization/types/WhatsAppEventRequest.d.ts +0 -11
  214. package/serialization/types/WhatsAppEventRequest.js +0 -43
  215. package/serialization/types/WhatsAppMetadata.d.ts +0 -9
  216. package/serialization/types/WhatsAppMetadata.js +0 -41
  217. package/serialization/types/WhatsAppSession.d.ts +0 -10
  218. package/serialization/types/WhatsAppSession.js +0 -42
  219. /package/api/{resources/conversationalAi/resources/agents/client/requests/AgentsGetRequest.js → types/WhatsAppConversationInfo.js} +0 -0
  220. /package/{api/types/WhatsAppBusinessAccount.js → dist/api/types/WhatsAppConversationInfo.js} +0 -0
@@ -1,6 +1,7 @@
1
1
  import { Music as GeneratedMusic } from "../api/resources/music/client/Client";
2
2
  import type * as ElevenLabs from "../api";
3
3
  import type { CompositionPlan } from "../api/resources/music/resources/compositionPlan/client/Client";
4
+ import * as core from "../core";
4
5
  export declare namespace Music {
5
6
  interface Options extends GeneratedMusic.Options {
6
7
  }
@@ -22,14 +23,84 @@ export interface MultipartResponse {
22
23
  audio: Buffer;
23
24
  filename: string;
24
25
  }
25
- export declare class Music extends GeneratedMusic {
26
+ export declare class Music {
27
+ private _client;
26
28
  constructor(options?: Music.Options);
29
+ /**
30
+ * Get the composition plan client
31
+ */
32
+ get compositionPlan(): CompositionPlan;
33
+ /**
34
+ * Compose a song from a prompt or a composition plan.
35
+ * @throws {@link ElevenLabs.UnprocessableEntityError}
36
+ */
37
+ compose(request?: ElevenLabs.BodyComposeMusicV1MusicPost, requestOptions?: Music.RequestOptions): core.HttpResponsePromise<ReadableStream<Uint8Array>>;
27
38
  /**
28
39
  * Compose a song from a prompt or a composition plan with detailed response parsing.
29
- * This method calls the original composeDetailed and then parses the stream response.
40
+ *
41
+ * Unlike the standard `compose()` method which returns a raw audio stream, this method
42
+ * automatically parses the multipart response to extract both the audio file and rich
43
+ * metadata about the generated composition.
44
+ *
45
+ * @param request - The music composition request containing either:
46
+ * - `prompt`: A text description of the desired music (e.g., "upbeat electronic dance music")
47
+ * - `compositionPlan`: A detailed composition plan object created via `compositionPlan.create()`
48
+ * - `musicLengthMs`: Optional duration in milliseconds (10000-300000ms)
49
+ *
50
+ * @param requestOptions - Optional request configuration (e.g., timeout, signal, headers)
51
+ *
52
+ * @returns A promise that resolves to a `MultipartResponse` containing:
53
+ * - `json.compositionPlan`: The detailed composition plan structure including sections,
54
+ * styles, and lyrics
55
+ * - `json.songMetadata`: Metadata about the generated song (title, description, genres,
56
+ * languages, explicit content flag)
57
+ * - `audio`: Buffer containing the complete audio file (MP3 format)
58
+ * - `filename`: Suggested filename for the audio file
59
+ *
60
+ * @throws {@link ElevenLabs.UnprocessableEntityError} If the request parameters are invalid
61
+ * or the music generation fails
62
+ *
63
+ * @example
64
+ * ```typescript
65
+ * const client = new ElevenLabs({ apiKey: "your-api-key" });
66
+ *
67
+ * // Generate music from a text prompt
68
+ * const response = await client.music.composeDetailed({
69
+ * prompt: "Epic orchestral music with dramatic strings and powerful brass",
70
+ * musicLengthMs: 60000 // 60 seconds
71
+ * });
72
+ *
73
+ * console.log("Title:", response.json.songMetadata.title);
74
+ * console.log("Genres:", response.json.songMetadata.genres);
75
+ *
76
+ * // Save the audio to a file
77
+ * fs.writeFileSync(response.filename, response.audio);
78
+ * ```
79
+ *
80
+ * @example
81
+ * ```typescript
82
+ * // Generate music from a composition plan
83
+ * const plan = await client.music.compositionPlan.create({
84
+ * prompt: "A progressive rock song about space exploration"
85
+ * });
86
+ *
87
+ * const response = await client.music.composeDetailed({
88
+ * compositionPlan: plan.compositionPlan
89
+ * });
90
+ *
91
+ * // Access detailed section information
92
+ * for (const section of response.json.compositionPlan.sections) {
93
+ * console.log(`${section.sectionName}: ${section.durationMs}ms`);
94
+ * }
95
+ * ```
96
+ */
97
+ composeDetailed(request?: ElevenLabs.BodyComposeMusicWithADetailedResponseV1MusicDetailedPost, requestOptions?: Music.RequestOptions): core.HttpResponsePromise<MultipartResponse>;
98
+ private _composeDetailed;
99
+ /**
100
+ * Stream a composed song from a prompt or a composition plan.
30
101
  * @throws {@link ElevenLabs.UnprocessableEntityError}
31
102
  */
32
- composeDetailed(request?: ElevenLabs.BodyComposeMusicWithADetailedResponseV1MusicDetailedPost, requestOptions?: Music.RequestOptions): Promise<MultipartResponse>;
103
+ stream(request?: ElevenLabs.BodyStreamComposedMusicV1MusicStreamPost, requestOptions?: Music.RequestOptions): core.HttpResponsePromise<ReadableStream<Uint8Array>>;
33
104
  /**
34
105
  * Reads a ReadableStream containing multipart data and parses it into JSON and audio parts
35
106
  * @param stream - ReadableStream from ElevenLabs music API response
package/wrapper/music.js CHANGED
@@ -1,4 +1,37 @@
1
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
+ })();
2
35
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
36
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
37
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -11,28 +44,108 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
44
  Object.defineProperty(exports, "__esModule", { value: true });
12
45
  exports.Music = void 0;
13
46
  const Client_1 = require("../api/resources/music/client/Client");
14
- class Music extends Client_1.Music {
47
+ const core = __importStar(require("../core"));
48
+ class Music {
15
49
  constructor(options = {}) {
16
- super(options);
50
+ this._client = new Client_1.Music(options);
17
51
  }
18
52
  /**
19
- * Compose a song from a prompt or a composition plan with detailed response parsing.
20
- * This method calls the original composeDetailed and then parses the stream response.
53
+ * Get the composition plan client
54
+ */
55
+ get compositionPlan() {
56
+ return this._client.compositionPlan;
57
+ }
58
+ /**
59
+ * Compose a song from a prompt or a composition plan.
21
60
  * @throws {@link ElevenLabs.UnprocessableEntityError}
22
61
  */
23
- // @ts-expect-error - Intentionally overriding parent method with different return type
24
- composeDetailed() {
25
- const _super = Object.create(null, {
26
- composeDetailed: { get: () => super.composeDetailed }
27
- });
62
+ compose(request = {}, requestOptions) {
63
+ return this._client.compose(request, requestOptions);
64
+ }
65
+ /**
66
+ * Compose a song from a prompt or a composition plan with detailed response parsing.
67
+ *
68
+ * Unlike the standard `compose()` method which returns a raw audio stream, this method
69
+ * automatically parses the multipart response to extract both the audio file and rich
70
+ * metadata about the generated composition.
71
+ *
72
+ * @param request - The music composition request containing either:
73
+ * - `prompt`: A text description of the desired music (e.g., "upbeat electronic dance music")
74
+ * - `compositionPlan`: A detailed composition plan object created via `compositionPlan.create()`
75
+ * - `musicLengthMs`: Optional duration in milliseconds (10000-300000ms)
76
+ *
77
+ * @param requestOptions - Optional request configuration (e.g., timeout, signal, headers)
78
+ *
79
+ * @returns A promise that resolves to a `MultipartResponse` containing:
80
+ * - `json.compositionPlan`: The detailed composition plan structure including sections,
81
+ * styles, and lyrics
82
+ * - `json.songMetadata`: Metadata about the generated song (title, description, genres,
83
+ * languages, explicit content flag)
84
+ * - `audio`: Buffer containing the complete audio file (MP3 format)
85
+ * - `filename`: Suggested filename for the audio file
86
+ *
87
+ * @throws {@link ElevenLabs.UnprocessableEntityError} If the request parameters are invalid
88
+ * or the music generation fails
89
+ *
90
+ * @example
91
+ * ```typescript
92
+ * const client = new ElevenLabs({ apiKey: "your-api-key" });
93
+ *
94
+ * // Generate music from a text prompt
95
+ * const response = await client.music.composeDetailed({
96
+ * prompt: "Epic orchestral music with dramatic strings and powerful brass",
97
+ * musicLengthMs: 60000 // 60 seconds
98
+ * });
99
+ *
100
+ * console.log("Title:", response.json.songMetadata.title);
101
+ * console.log("Genres:", response.json.songMetadata.genres);
102
+ *
103
+ * // Save the audio to a file
104
+ * fs.writeFileSync(response.filename, response.audio);
105
+ * ```
106
+ *
107
+ * @example
108
+ * ```typescript
109
+ * // Generate music from a composition plan
110
+ * const plan = await client.music.compositionPlan.create({
111
+ * prompt: "A progressive rock song about space exploration"
112
+ * });
113
+ *
114
+ * const response = await client.music.composeDetailed({
115
+ * compositionPlan: plan.compositionPlan
116
+ * });
117
+ *
118
+ * // Access detailed section information
119
+ * for (const section of response.json.compositionPlan.sections) {
120
+ * console.log(`${section.sectionName}: ${section.durationMs}ms`);
121
+ * }
122
+ * ```
123
+ */
124
+ composeDetailed(request = {}, requestOptions) {
125
+ return core.HttpResponsePromise.fromPromise(this._composeDetailed(request, requestOptions));
126
+ }
127
+ _composeDetailed() {
28
128
  return __awaiter(this, arguments, void 0, function* (request = {}, requestOptions) {
29
- // Call the parent method to get the stream
30
- const response = yield _super.composeDetailed.call(this, request, requestOptions);
31
- // Parse the stream using your existing parsing method
32
- const parsedResponse = yield this.parseMultipart(response);
33
- return parsedResponse;
129
+ // Call the base client method to get the stream with raw response
130
+ try {
131
+ const { data: stream, rawResponse } = yield this._client.composeDetailed(request, requestOptions).withRawResponse();
132
+ // Parse the stream using the existing parsing method
133
+ const parsedResponse = yield this.parseMultipart(stream);
134
+ return { data: parsedResponse, rawResponse };
135
+ }
136
+ catch (error) {
137
+ const message = error instanceof Error ? error.message : String(error);
138
+ throw new Error(`Failed to parse detailed composition response: ${message}`);
139
+ }
34
140
  });
35
141
  }
142
+ /**
143
+ * Stream a composed song from a prompt or a composition plan.
144
+ * @throws {@link ElevenLabs.UnprocessableEntityError}
145
+ */
146
+ stream(request = {}, requestOptions) {
147
+ return this._client.stream(request, requestOptions);
148
+ }
36
149
  /**
37
150
  * Reads a ReadableStream containing multipart data and parses it into JSON and audio parts
38
151
  * @param stream - ReadableStream from ElevenLabs music API response
@@ -0,0 +1,179 @@
1
+ import WebSocket from "ws";
2
+ import type { ChildProcess } from "node:child_process";
3
+ /**
4
+ * Events emitted by the RealtimeConnection.
5
+ */
6
+ export declare enum RealtimeEvents {
7
+ /** Emitted when the session is successfully started */
8
+ SESSION_STARTED = "session_started",
9
+ /** Emitted when a partial (interim) transcript is available */
10
+ PARTIAL_TRANSCRIPT = "partial_transcript",
11
+ /** Emitted when a final transcript is available */
12
+ FINAL_TRANSCRIPT = "final_transcript",
13
+ /** Emitted when a final transcript with timestamps is available */
14
+ FINAL_TRANSCRIPT_WITH_TIMESTAMPS = "final_transcript_with_timestamps",
15
+ /** Emitted when an error occurs */
16
+ ERROR = "error",
17
+ /** Emitted when the WebSocket connection is opened */
18
+ OPEN = "open",
19
+ /** Emitted when the WebSocket connection is closed */
20
+ CLOSE = "close"
21
+ }
22
+ /**
23
+ * Manages a real-time transcription WebSocket connection.
24
+ *
25
+ * @remarks
26
+ * **Node.js only**: This class uses Node.js-specific WebSocket implementation.
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * const connection = await client.speechToText.realtime.connect({
31
+ * modelId: "scribe_realtime_v2",
32
+ * audioFormat: AudioFormat.PCM_16000,
33
+ * sampleRate: 16000,
34
+ * });
35
+ *
36
+ * connection.on(RealtimeEvents.SESSION_STARTED, (data) => {
37
+ * console.log("Session started");
38
+ * });
39
+ *
40
+ * connection.on(RealtimeEvents.PARTIAL_TRANSCRIPT, (data) => {
41
+ * console.log("Partial:", data.transcript);
42
+ * });
43
+ *
44
+ * connection.on(RealtimeEvents.FINAL_TRANSCRIPT, (data) => {
45
+ * console.log("Final:", data.transcript);
46
+ * connection.close();
47
+ * });
48
+ *
49
+ * // Send audio data
50
+ * connection.send({ audioBase64: base64String });
51
+ *
52
+ * // Commit and close
53
+ * connection.commit();
54
+ * ```
55
+ */
56
+ export declare class RealtimeConnection {
57
+ private websocket;
58
+ private eventEmitter;
59
+ private ffmpegProcess;
60
+ private currentSampleRate;
61
+ constructor(sampleRate: number);
62
+ /**
63
+ * @internal
64
+ * Used internally by ScribeRealtime to attach the WebSocket after connection is created.
65
+ */
66
+ setWebSocket(websocket: WebSocket): void;
67
+ /**
68
+ * @internal
69
+ * Used internally by ScribeRealtime to attach ffmpeg process for cleanup.
70
+ */
71
+ setFfmpegProcess(ffmpegProcess: ChildProcess): void;
72
+ /**
73
+ * Attaches an event listener for the specified event.
74
+ *
75
+ * @param event - The event to listen for (use RealtimeEvents enum)
76
+ * @param listener - The callback function to execute when the event fires
77
+ *
78
+ * @example
79
+ * ```typescript
80
+ * connection.on(RealtimeEvents.SESSION_STARTED, (data) => {
81
+ * console.log("Session started", data);
82
+ * });
83
+ *
84
+ * connection.on(RealtimeEvents.PARTIAL_TRANSCRIPT, (data) => {
85
+ * console.log("Partial:", data.transcript);
86
+ * });
87
+ *
88
+ * connection.on(RealtimeEvents.FINAL_TRANSCRIPT, (data) => {
89
+ * console.log("Final:", data.transcript);
90
+ * });
91
+ * ```
92
+ */
93
+ on(event: RealtimeEvents, listener: (...args: unknown[]) => void): void;
94
+ /**
95
+ * Removes an event listener for the specified event.
96
+ *
97
+ * @param event - The event to stop listening for
98
+ * @param listener - The callback function to remove
99
+ *
100
+ * @example
101
+ * ```typescript
102
+ * const handler = (data) => console.log(data);
103
+ * connection.on(RealtimeEvents.PARTIAL_TRANSCRIPT, handler);
104
+ *
105
+ * // Later, remove the listener
106
+ * connection.off(RealtimeEvents.PARTIAL_TRANSCRIPT, handler);
107
+ * ```
108
+ */
109
+ off(event: RealtimeEvents, listener: (...args: unknown[]) => void): void;
110
+ /**
111
+ * Sends audio data to the transcription service.
112
+ *
113
+ * @param data - Audio data configuration
114
+ * @param data.audioBase64 - Base64-encoded audio data
115
+ * @param data.commit - Whether to commit the transcription after this chunk. You likely want to use connection.commit() instead (default: false)
116
+ * @param data.sampleRate - Sample rate of the audio (default: configured sample rate)
117
+ *
118
+ * @throws {Error} If the WebSocket connection is not open
119
+ *
120
+ * @example
121
+ * ```typescript
122
+ * // Send audio chunk without committing
123
+ * connection.send({
124
+ * audioBase64: base64EncodedAudio,
125
+ * });
126
+ *
127
+ * // Send audio chunk with custom sample rate
128
+ * connection.send({
129
+ * audioBase64: base64EncodedAudio,
130
+ * sampleRate: 16000,
131
+ * });
132
+ * ```
133
+ */
134
+ send(data: {
135
+ audioBase64: string;
136
+ commit?: boolean;
137
+ sampleRate?: number;
138
+ }): void;
139
+ /**
140
+ * Commits the transcription, signaling that all audio has been sent.
141
+ * This finalizes the transcription and triggers a FINAL_TRANSCRIPT event.
142
+ *
143
+ * @throws {Error} If the WebSocket connection is not open
144
+ *
145
+ * @remarks
146
+ * Only needed when using CommitStrategy.MANUAL.
147
+ * When using CommitStrategy.VAD, commits are handled automatically by the server.
148
+ *
149
+ * @example
150
+ * ```typescript
151
+ * // Send all audio chunks
152
+ * for (const chunk of audioChunks) {
153
+ * connection.send({ audioBase64: chunk });
154
+ * }
155
+ *
156
+ * // Finalize the transcription
157
+ * connection.commit();
158
+ * ```
159
+ */
160
+ commit(): void;
161
+ /**
162
+ * Closes the WebSocket connection and cleans up resources.
163
+ * This will terminate any ongoing transcription and stop ffmpeg processes if running.
164
+ *
165
+ * @remarks
166
+ * After calling close(), this connection cannot be reused.
167
+ * Create a new connection if you need to start transcribing again.
168
+ *
169
+ * @example
170
+ * ```typescript
171
+ * connection.on(RealtimeEvents.FINAL_TRANSCRIPT, (data) => {
172
+ * console.log("Final:", data.transcript);
173
+ * connection.close();
174
+ * });
175
+ * ```
176
+ */
177
+ close(): void;
178
+ private cleanup;
179
+ }
@@ -0,0 +1,260 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RealtimeConnection = exports.RealtimeEvents = void 0;
7
+ const ws_1 = __importDefault(require("ws"));
8
+ const node_events_1 = require("node:events");
9
+ /**
10
+ * Events emitted by the RealtimeConnection.
11
+ */
12
+ var RealtimeEvents;
13
+ (function (RealtimeEvents) {
14
+ /** Emitted when the session is successfully started */
15
+ RealtimeEvents["SESSION_STARTED"] = "session_started";
16
+ /** Emitted when a partial (interim) transcript is available */
17
+ RealtimeEvents["PARTIAL_TRANSCRIPT"] = "partial_transcript";
18
+ /** Emitted when a final transcript is available */
19
+ RealtimeEvents["FINAL_TRANSCRIPT"] = "final_transcript";
20
+ /** Emitted when a final transcript with timestamps is available */
21
+ RealtimeEvents["FINAL_TRANSCRIPT_WITH_TIMESTAMPS"] = "final_transcript_with_timestamps";
22
+ /** Emitted when an error occurs */
23
+ RealtimeEvents["ERROR"] = "error";
24
+ /** Emitted when the WebSocket connection is opened */
25
+ RealtimeEvents["OPEN"] = "open";
26
+ /** Emitted when the WebSocket connection is closed */
27
+ RealtimeEvents["CLOSE"] = "close";
28
+ })(RealtimeEvents || (exports.RealtimeEvents = RealtimeEvents = {}));
29
+ /**
30
+ * Manages a real-time transcription WebSocket connection.
31
+ *
32
+ * @remarks
33
+ * **Node.js only**: This class uses Node.js-specific WebSocket implementation.
34
+ *
35
+ * @example
36
+ * ```typescript
37
+ * const connection = await client.speechToText.realtime.connect({
38
+ * modelId: "scribe_realtime_v2",
39
+ * audioFormat: AudioFormat.PCM_16000,
40
+ * sampleRate: 16000,
41
+ * });
42
+ *
43
+ * connection.on(RealtimeEvents.SESSION_STARTED, (data) => {
44
+ * console.log("Session started");
45
+ * });
46
+ *
47
+ * connection.on(RealtimeEvents.PARTIAL_TRANSCRIPT, (data) => {
48
+ * console.log("Partial:", data.transcript);
49
+ * });
50
+ *
51
+ * connection.on(RealtimeEvents.FINAL_TRANSCRIPT, (data) => {
52
+ * console.log("Final:", data.transcript);
53
+ * connection.close();
54
+ * });
55
+ *
56
+ * // Send audio data
57
+ * connection.send({ audioBase64: base64String });
58
+ *
59
+ * // Commit and close
60
+ * connection.commit();
61
+ * ```
62
+ */
63
+ class RealtimeConnection {
64
+ constructor(sampleRate) {
65
+ this.websocket = null;
66
+ this.eventEmitter = new node_events_1.EventEmitter();
67
+ this.ffmpegProcess = null;
68
+ this.currentSampleRate = 16000;
69
+ this.currentSampleRate = sampleRate;
70
+ }
71
+ /**
72
+ * @internal
73
+ * Used internally by ScribeRealtime to attach the WebSocket after connection is created.
74
+ */
75
+ setWebSocket(websocket) {
76
+ this.websocket = websocket;
77
+ // If WebSocket is already open, emit OPEN event immediately
78
+ if (this.websocket.readyState === ws_1.default.OPEN) {
79
+ this.eventEmitter.emit(RealtimeEvents.OPEN);
80
+ }
81
+ else {
82
+ // Otherwise, wait for the open event
83
+ this.websocket.on("open", () => {
84
+ this.eventEmitter.emit(RealtimeEvents.OPEN);
85
+ });
86
+ }
87
+ this.websocket.on("message", (event) => {
88
+ const data = JSON.parse(event.toString());
89
+ switch (data.message_type) {
90
+ case "session_started":
91
+ this.eventEmitter.emit(RealtimeEvents.SESSION_STARTED, data);
92
+ break;
93
+ case "partial_transcript":
94
+ this.eventEmitter.emit(RealtimeEvents.PARTIAL_TRANSCRIPT, data);
95
+ break;
96
+ case "final_transcript":
97
+ this.eventEmitter.emit(RealtimeEvents.FINAL_TRANSCRIPT, data);
98
+ break;
99
+ case "final_transcript_with_timestamps":
100
+ this.eventEmitter.emit(RealtimeEvents.FINAL_TRANSCRIPT_WITH_TIMESTAMPS, data);
101
+ break;
102
+ }
103
+ });
104
+ this.websocket.on("error", (error) => {
105
+ this.eventEmitter.emit(RealtimeEvents.ERROR, error);
106
+ });
107
+ this.websocket.on("close", () => {
108
+ this.eventEmitter.emit(RealtimeEvents.CLOSE);
109
+ this.cleanup();
110
+ });
111
+ }
112
+ /**
113
+ * @internal
114
+ * Used internally by ScribeRealtime to attach ffmpeg process for cleanup.
115
+ */
116
+ setFfmpegProcess(ffmpegProcess) {
117
+ this.ffmpegProcess = ffmpegProcess;
118
+ }
119
+ /**
120
+ * Attaches an event listener for the specified event.
121
+ *
122
+ * @param event - The event to listen for (use RealtimeEvents enum)
123
+ * @param listener - The callback function to execute when the event fires
124
+ *
125
+ * @example
126
+ * ```typescript
127
+ * connection.on(RealtimeEvents.SESSION_STARTED, (data) => {
128
+ * console.log("Session started", data);
129
+ * });
130
+ *
131
+ * connection.on(RealtimeEvents.PARTIAL_TRANSCRIPT, (data) => {
132
+ * console.log("Partial:", data.transcript);
133
+ * });
134
+ *
135
+ * connection.on(RealtimeEvents.FINAL_TRANSCRIPT, (data) => {
136
+ * console.log("Final:", data.transcript);
137
+ * });
138
+ * ```
139
+ */
140
+ on(event, listener) {
141
+ this.eventEmitter.on(event, listener);
142
+ }
143
+ /**
144
+ * Removes an event listener for the specified event.
145
+ *
146
+ * @param event - The event to stop listening for
147
+ * @param listener - The callback function to remove
148
+ *
149
+ * @example
150
+ * ```typescript
151
+ * const handler = (data) => console.log(data);
152
+ * connection.on(RealtimeEvents.PARTIAL_TRANSCRIPT, handler);
153
+ *
154
+ * // Later, remove the listener
155
+ * connection.off(RealtimeEvents.PARTIAL_TRANSCRIPT, handler);
156
+ * ```
157
+ */
158
+ off(event, listener) {
159
+ this.eventEmitter.off(event, listener);
160
+ }
161
+ /**
162
+ * Sends audio data to the transcription service.
163
+ *
164
+ * @param data - Audio data configuration
165
+ * @param data.audioBase64 - Base64-encoded audio data
166
+ * @param data.commit - Whether to commit the transcription after this chunk. You likely want to use connection.commit() instead (default: false)
167
+ * @param data.sampleRate - Sample rate of the audio (default: configured sample rate)
168
+ *
169
+ * @throws {Error} If the WebSocket connection is not open
170
+ *
171
+ * @example
172
+ * ```typescript
173
+ * // Send audio chunk without committing
174
+ * connection.send({
175
+ * audioBase64: base64EncodedAudio,
176
+ * });
177
+ *
178
+ * // Send audio chunk with custom sample rate
179
+ * connection.send({
180
+ * audioBase64: base64EncodedAudio,
181
+ * sampleRate: 16000,
182
+ * });
183
+ * ```
184
+ */
185
+ send(data) {
186
+ var _a, _b;
187
+ if (!this.websocket || this.websocket.readyState !== ws_1.default.OPEN) {
188
+ throw new Error("WebSocket is not connected");
189
+ }
190
+ const message = {
191
+ message_type: "input_audio_chunk",
192
+ audio_base_64: data.audioBase64,
193
+ commit: (_a = data.commit) !== null && _a !== void 0 ? _a : false,
194
+ sample_rate: (_b = data.sampleRate) !== null && _b !== void 0 ? _b : this.currentSampleRate,
195
+ };
196
+ this.websocket.send(JSON.stringify(message));
197
+ }
198
+ /**
199
+ * Commits the transcription, signaling that all audio has been sent.
200
+ * This finalizes the transcription and triggers a FINAL_TRANSCRIPT event.
201
+ *
202
+ * @throws {Error} If the WebSocket connection is not open
203
+ *
204
+ * @remarks
205
+ * Only needed when using CommitStrategy.MANUAL.
206
+ * When using CommitStrategy.VAD, commits are handled automatically by the server.
207
+ *
208
+ * @example
209
+ * ```typescript
210
+ * // Send all audio chunks
211
+ * for (const chunk of audioChunks) {
212
+ * connection.send({ audioBase64: chunk });
213
+ * }
214
+ *
215
+ * // Finalize the transcription
216
+ * connection.commit();
217
+ * ```
218
+ */
219
+ commit() {
220
+ if (!this.websocket || this.websocket.readyState !== ws_1.default.OPEN) {
221
+ throw new Error("WebSocket is not connected");
222
+ }
223
+ const message = {
224
+ message_type: "input_audio_chunk",
225
+ audio_base_64: "",
226
+ commit: true,
227
+ sample_rate: this.currentSampleRate,
228
+ };
229
+ this.websocket.send(JSON.stringify(message));
230
+ }
231
+ /**
232
+ * Closes the WebSocket connection and cleans up resources.
233
+ * This will terminate any ongoing transcription and stop ffmpeg processes if running.
234
+ *
235
+ * @remarks
236
+ * After calling close(), this connection cannot be reused.
237
+ * Create a new connection if you need to start transcribing again.
238
+ *
239
+ * @example
240
+ * ```typescript
241
+ * connection.on(RealtimeEvents.FINAL_TRANSCRIPT, (data) => {
242
+ * console.log("Final:", data.transcript);
243
+ * connection.close();
244
+ * });
245
+ * ```
246
+ */
247
+ close() {
248
+ this.cleanup();
249
+ if (this.websocket) {
250
+ this.websocket.close();
251
+ }
252
+ }
253
+ cleanup() {
254
+ if (this.ffmpegProcess) {
255
+ this.ffmpegProcess.kill();
256
+ this.ffmpegProcess = null;
257
+ }
258
+ }
259
+ }
260
+ exports.RealtimeConnection = RealtimeConnection;