@mastra/voice-gladia 0.0.0-add-libsql-changeset-20250910154739

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/CHANGELOG.md ADDED
@@ -0,0 +1,265 @@
1
+ # @mastra/voice-gladia
2
+
3
+ ## 0.0.0-add-libsql-changeset-20250910154739
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [[`b4379f7`](https://github.com/mastra-ai/mastra/commit/b4379f703fd74474f253420e8c3a684f2c4b2f8e), [`d34aaa1`](https://github.com/mastra-ai/mastra/commit/d34aaa1da5d3c5f991740f59e2fe6d28d3e2dd91), [`b2babfa`](https://github.com/mastra-ai/mastra/commit/b2babfa9e75b22f2759179e71d8473f6dc5421ed), [`d8c3ba5`](https://github.com/mastra-ai/mastra/commit/d8c3ba516f4173282d293f7e64769cfc8738d360), [`6424c7e`](https://github.com/mastra-ai/mastra/commit/6424c7ec38b6921d66212431db1e0958f441b2a7), [`db94750`](https://github.com/mastra-ai/mastra/commit/db94750a41fd29b43eb1f7ce8e97ba8b9978c91b), [`a66a371`](https://github.com/mastra-ai/mastra/commit/a66a3716b00553d7f01842be9deb34f720b10fab), [`69fc3cd`](https://github.com/mastra-ai/mastra/commit/69fc3cd0fd814901785bdcf49bf536ab1e7fd975)]:
8
+ - @mastra/core@0.0.0-add-libsql-changeset-20250910154739
9
+
10
+ ## 0.11.4
11
+
12
+ ### Patch Changes
13
+
14
+ - 376913a: Update peerdeps
15
+ - Updated dependencies [8fbf79e]
16
+ - Updated dependencies [fd83526]
17
+ - Updated dependencies [d0b90ab]
18
+ - Updated dependencies [6f5eb7a]
19
+ - Updated dependencies [a01cf14]
20
+ - Updated dependencies [a9e50ee]
21
+ - Updated dependencies [5397eb4]
22
+ - Updated dependencies [c9f4e4a]
23
+ - Updated dependencies [0acbc80]
24
+ - @mastra/core@0.16.0
25
+
26
+ ## 0.11.4-alpha.0
27
+
28
+ ### Patch Changes
29
+
30
+ - 376913a: Update peerdeps
31
+ - Updated dependencies [8fbf79e]
32
+ - @mastra/core@0.16.0-alpha.1
33
+
34
+ ## 0.11.3
35
+
36
+ ### Patch Changes
37
+
38
+ - de3cbc6: Update the `package.json` file to include additional fields like `repository`, `homepage` or `files`.
39
+ - f0dfcac: updated core peerdep
40
+ - Updated dependencies [ab48c97]
41
+ - Updated dependencies [85ef90b]
42
+ - Updated dependencies [aedbbfa]
43
+ - Updated dependencies [ff89505]
44
+ - Updated dependencies [637f323]
45
+ - Updated dependencies [de3cbc6]
46
+ - Updated dependencies [c19bcf7]
47
+ - Updated dependencies [4474d04]
48
+ - Updated dependencies [183dc95]
49
+ - Updated dependencies [a1111e2]
50
+ - Updated dependencies [b42a961]
51
+ - Updated dependencies [61debef]
52
+ - Updated dependencies [9beaeff]
53
+ - Updated dependencies [29de0e1]
54
+ - Updated dependencies [f643c65]
55
+ - Updated dependencies [00c74e7]
56
+ - Updated dependencies [fef7375]
57
+ - Updated dependencies [e3d8fea]
58
+ - Updated dependencies [45e4d39]
59
+ - Updated dependencies [9eee594]
60
+ - Updated dependencies [7149d8d]
61
+ - Updated dependencies [822c2e8]
62
+ - Updated dependencies [979912c]
63
+ - Updated dependencies [7dcf4c0]
64
+ - Updated dependencies [4106a58]
65
+ - Updated dependencies [ad78bfc]
66
+ - Updated dependencies [0302f50]
67
+ - Updated dependencies [6ac697e]
68
+ - Updated dependencies [74db265]
69
+ - Updated dependencies [0ce418a]
70
+ - Updated dependencies [af90672]
71
+ - Updated dependencies [8387952]
72
+ - Updated dependencies [7f3b8da]
73
+ - Updated dependencies [905352b]
74
+ - Updated dependencies [599d04c]
75
+ - Updated dependencies [56041d0]
76
+ - Updated dependencies [3412597]
77
+ - Updated dependencies [5eca5d2]
78
+ - Updated dependencies [f2cda47]
79
+ - Updated dependencies [5de1555]
80
+ - Updated dependencies [cfd377a]
81
+ - Updated dependencies [1ed5a3e]
82
+ - @mastra/core@0.15.3
83
+
84
+ ## 0.11.3-alpha.1
85
+
86
+ ### Patch Changes
87
+
88
+ - [#7394](https://github.com/mastra-ai/mastra/pull/7394) [`f0dfcac`](https://github.com/mastra-ai/mastra/commit/f0dfcac4458bdf789b975e2d63e984f5d1e7c4d3) Thanks [@NikAiyer](https://github.com/NikAiyer)! - updated core peerdep
89
+
90
+ - Updated dependencies [[`7149d8d`](https://github.com/mastra-ai/mastra/commit/7149d8d4bdc1edf0008e0ca9b7925eb0b8b60dbe)]:
91
+ - @mastra/core@0.15.3-alpha.7
92
+
93
+ ## 0.11.3-alpha.0
94
+
95
+ ### Patch Changes
96
+
97
+ - [#7343](https://github.com/mastra-ai/mastra/pull/7343) [`de3cbc6`](https://github.com/mastra-ai/mastra/commit/de3cbc61079211431bd30487982ea3653517278e) Thanks [@LekoArts](https://github.com/LekoArts)! - Update the `package.json` file to include additional fields like `repository`, `homepage` or `files`.
98
+
99
+ - Updated dependencies [[`85ef90b`](https://github.com/mastra-ai/mastra/commit/85ef90bb2cd4ae4df855c7ac175f7d392c55c1bf), [`de3cbc6`](https://github.com/mastra-ai/mastra/commit/de3cbc61079211431bd30487982ea3653517278e)]:
100
+ - @mastra/core@0.15.3-alpha.5
101
+
102
+ ## 0.11.2
103
+
104
+ ### Patch Changes
105
+
106
+ - [`c6113ed`](https://github.com/mastra-ai/mastra/commit/c6113ed7f9df297e130d94436ceee310273d6430) Thanks [@wardpeet](https://github.com/wardpeet)! - Fix peerdpes for @mastra/core
107
+
108
+ - Updated dependencies []:
109
+ - @mastra/core@0.15.2
110
+
111
+ ## 0.11.1
112
+
113
+ ### Patch Changes
114
+
115
+ - [`95b2aa9`](https://github.com/mastra-ai/mastra/commit/95b2aa908230919e67efcac0d69005a2d5745298) Thanks [@wardpeet](https://github.com/wardpeet)! - Fix peerdeps @mastra/core
116
+
117
+ - Updated dependencies []:
118
+ - @mastra/core@0.15.1
119
+
120
+ ## 0.11.0
121
+
122
+ ### Minor Changes
123
+
124
+ - [#7028](https://github.com/mastra-ai/mastra/pull/7028) [`da58ccc`](https://github.com/mastra-ai/mastra/commit/da58ccc1f2ac33da0cb97b00443fc6208b45bdec) Thanks [@wardpeet](https://github.com/wardpeet)! - Bump core peerdependency
125
+
126
+ - [#7032](https://github.com/mastra-ai/mastra/pull/7032) [`1191ce9`](https://github.com/mastra-ai/mastra/commit/1191ce946b40ed291e7877a349f8388e3cff7e5c) Thanks [@wardpeet](https://github.com/wardpeet)! - Bump zod peerdep to 3.25.0 to support both v3/v4
127
+
128
+ ### Patch Changes
129
+
130
+ - [#6942](https://github.com/mastra-ai/mastra/pull/6942) [`ca8ec2f`](https://github.com/mastra-ai/mastra/commit/ca8ec2f61884b9dfec5fc0d5f4f29d281ad13c01) Thanks [@wardpeet](https://github.com/wardpeet)! - Add zod as peerdeps for all packages
131
+
132
+ - Updated dependencies [[`0778757`](https://github.com/mastra-ai/mastra/commit/07787570e4addbd501522037bd2542c3d9e26822), [`943a7f3`](https://github.com/mastra-ai/mastra/commit/943a7f3dbc6a8ab3f9b7bc7c8a1c5b319c3d7f56), [`bf504a8`](https://github.com/mastra-ai/mastra/commit/bf504a833051f6f321d832cc7d631f3cb86d657b), [`be49354`](https://github.com/mastra-ai/mastra/commit/be493546dca540101923ec700feb31f9a13939f2), [`d591ab3`](https://github.com/mastra-ai/mastra/commit/d591ab3ecc985c1870c0db347f8d7a20f7360536), [`ba82abe`](https://github.com/mastra-ai/mastra/commit/ba82abe76e869316bb5a9c95e8ea3946f3436fae), [`727f7e5`](https://github.com/mastra-ai/mastra/commit/727f7e5086e62e0dfe3356fb6dcd8bcb420af246), [`e6f5046`](https://github.com/mastra-ai/mastra/commit/e6f50467aff317e67e8bd74c485c3fbe2a5a6db1), [`82d9f64`](https://github.com/mastra-ai/mastra/commit/82d9f647fbe4f0177320e7c05073fce88599aa95), [`2e58325`](https://github.com/mastra-ai/mastra/commit/2e58325beb170f5b92f856e27d915cd26917e5e6), [`1191ce9`](https://github.com/mastra-ai/mastra/commit/1191ce946b40ed291e7877a349f8388e3cff7e5c), [`4189486`](https://github.com/mastra-ai/mastra/commit/4189486c6718fda78347bdf4ce4d3fc33b2236e1), [`ca8ec2f`](https://github.com/mastra-ai/mastra/commit/ca8ec2f61884b9dfec5fc0d5f4f29d281ad13c01), [`9613558`](https://github.com/mastra-ai/mastra/commit/9613558e6475f4710e05d1be7553a32ee7bddc20)]:
133
+ - @mastra/core@0.15.0
134
+
135
+ ## 0.11.0-alpha.2
136
+
137
+ ### Minor Changes
138
+
139
+ - [#7032](https://github.com/mastra-ai/mastra/pull/7032) [`1191ce9`](https://github.com/mastra-ai/mastra/commit/1191ce946b40ed291e7877a349f8388e3cff7e5c) Thanks [@wardpeet](https://github.com/wardpeet)! - Bump zod peerdep to 3.25.0 to support both v3/v4
140
+
141
+ ### Patch Changes
142
+
143
+ - Updated dependencies [[`1191ce9`](https://github.com/mastra-ai/mastra/commit/1191ce946b40ed291e7877a349f8388e3cff7e5c)]:
144
+ - @mastra/core@0.15.0-alpha.4
145
+
146
+ ## 0.11.0-alpha.1
147
+
148
+ ### Minor Changes
149
+
150
+ - [#7028](https://github.com/mastra-ai/mastra/pull/7028) [`da58ccc`](https://github.com/mastra-ai/mastra/commit/da58ccc1f2ac33da0cb97b00443fc6208b45bdec) Thanks [@wardpeet](https://github.com/wardpeet)! - Bump core peerdependency
151
+
152
+ ### Patch Changes
153
+
154
+ - Updated dependencies []:
155
+ - @mastra/core@0.15.0-alpha.3
156
+
157
+ ## 0.10.4-alpha.0
158
+
159
+ ### Patch Changes
160
+
161
+ - [#6942](https://github.com/mastra-ai/mastra/pull/6942) [`ca8ec2f`](https://github.com/mastra-ai/mastra/commit/ca8ec2f61884b9dfec5fc0d5f4f29d281ad13c01) Thanks [@wardpeet](https://github.com/wardpeet)! - Add zod as peerdeps for all packages
162
+
163
+ - Updated dependencies [[`943a7f3`](https://github.com/mastra-ai/mastra/commit/943a7f3dbc6a8ab3f9b7bc7c8a1c5b319c3d7f56), [`be49354`](https://github.com/mastra-ai/mastra/commit/be493546dca540101923ec700feb31f9a13939f2), [`d591ab3`](https://github.com/mastra-ai/mastra/commit/d591ab3ecc985c1870c0db347f8d7a20f7360536), [`ba82abe`](https://github.com/mastra-ai/mastra/commit/ba82abe76e869316bb5a9c95e8ea3946f3436fae), [`727f7e5`](https://github.com/mastra-ai/mastra/commit/727f7e5086e62e0dfe3356fb6dcd8bcb420af246), [`82d9f64`](https://github.com/mastra-ai/mastra/commit/82d9f647fbe4f0177320e7c05073fce88599aa95), [`4189486`](https://github.com/mastra-ai/mastra/commit/4189486c6718fda78347bdf4ce4d3fc33b2236e1), [`ca8ec2f`](https://github.com/mastra-ai/mastra/commit/ca8ec2f61884b9dfec5fc0d5f4f29d281ad13c01)]:
164
+ - @mastra/core@0.14.2-alpha.1
165
+
166
+ ## 0.10.3
167
+
168
+ ### Patch Changes
169
+
170
+ - 4a406ec: fixes TypeScript declaration file imports to ensure proper ESM compatibility
171
+ - Updated dependencies [cb36de0]
172
+ - Updated dependencies [d0496e6]
173
+ - Updated dependencies [a82b851]
174
+ - Updated dependencies [ea0c5f2]
175
+ - Updated dependencies [41a0a0e]
176
+ - Updated dependencies [2871020]
177
+ - Updated dependencies [94f4812]
178
+ - Updated dependencies [e202b82]
179
+ - Updated dependencies [e00f6a0]
180
+ - Updated dependencies [4a406ec]
181
+ - Updated dependencies [b0e43c1]
182
+ - Updated dependencies [5d377e5]
183
+ - Updated dependencies [1fb812e]
184
+ - Updated dependencies [35c5798]
185
+ - @mastra/core@0.13.0
186
+
187
+ ## 0.10.3-alpha.0
188
+
189
+ ### Patch Changes
190
+
191
+ - 4a406ec: fixes TypeScript declaration file imports to ensure proper ESM compatibility
192
+ - Updated dependencies [cb36de0]
193
+ - Updated dependencies [a82b851]
194
+ - Updated dependencies [41a0a0e]
195
+ - Updated dependencies [2871020]
196
+ - Updated dependencies [4a406ec]
197
+ - Updated dependencies [5d377e5]
198
+ - @mastra/core@0.13.0-alpha.2
199
+
200
+ ## 0.10.2
201
+
202
+ ### Patch Changes
203
+
204
+ - 8e1b6e9: dependencies updates:
205
+ - Updated dependency [`zod@^3.25.67` ↗︎](https://www.npmjs.com/package/zod/v/3.25.67) (from `^3.24.3`, in `dependencies`)
206
+ - Updated dependencies [15e9d26]
207
+ - Updated dependencies [d1baedb]
208
+ - Updated dependencies [d8f2d19]
209
+ - Updated dependencies [4d21bf2]
210
+ - Updated dependencies [07d6d88]
211
+ - Updated dependencies [9d52b17]
212
+ - Updated dependencies [2097952]
213
+ - Updated dependencies [792c4c0]
214
+ - Updated dependencies [5d74aab]
215
+ - Updated dependencies [a8b194f]
216
+ - Updated dependencies [4fb0cc2]
217
+ - Updated dependencies [d2a7a31]
218
+ - Updated dependencies [502fe05]
219
+ - Updated dependencies [144eb0b]
220
+ - Updated dependencies [8ba1b51]
221
+ - Updated dependencies [4efcfa0]
222
+ - Updated dependencies [0e17048]
223
+ - @mastra/core@0.10.7
224
+
225
+ ## 0.10.2-alpha.0
226
+
227
+ ### Patch Changes
228
+
229
+ - 8e1b6e9: dependencies updates:
230
+ - Updated dependency [`zod@^3.25.67` ↗︎](https://www.npmjs.com/package/zod/v/3.25.67) (from `^3.24.3`, in `dependencies`)
231
+ - Updated dependencies [15e9d26]
232
+ - Updated dependencies [07d6d88]
233
+ - Updated dependencies [5d74aab]
234
+ - Updated dependencies [144eb0b]
235
+ - @mastra/core@0.10.7-alpha.2
236
+
237
+ ## 0.10.1
238
+
239
+ ### Patch Changes
240
+
241
+ - f4007f8: Add gladia-api speech to text provider
242
+ - Updated dependencies [63f6b7d]
243
+ - Updated dependencies [12a95fc]
244
+ - Updated dependencies [4b0f8a6]
245
+ - Updated dependencies [51264a5]
246
+ - Updated dependencies [8e6f677]
247
+ - Updated dependencies [d70c420]
248
+ - Updated dependencies [ee9af57]
249
+ - Updated dependencies [36f1c36]
250
+ - Updated dependencies [2a16996]
251
+ - Updated dependencies [10d352e]
252
+ - Updated dependencies [9589624]
253
+ - Updated dependencies [53d3c37]
254
+ - Updated dependencies [751c894]
255
+ - Updated dependencies [577ce3a]
256
+ - Updated dependencies [9260b3a]
257
+ - @mastra/core@0.10.6
258
+
259
+ ## 0.10.1-alpha.0
260
+
261
+ ### Patch Changes
262
+
263
+ - f4007f8: Add gladia-api speech to text provider
264
+ - Updated dependencies [4b0f8a6]
265
+ - @mastra/core@0.10.6-alpha.2
package/LICENSE.md ADDED
@@ -0,0 +1,15 @@
1
+ # Apache License 2.0
2
+
3
+ Copyright (c) 2025 Kepler Software, Inc.
4
+
5
+ Licensed under the Apache License, Version 2.0 (the "License");
6
+ you may not use this file except in compliance with the License.
7
+ You may obtain a copy of the License at
8
+
9
+ http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ Unless required by applicable law or agreed to in writing, software
12
+ distributed under the License is distributed on an "AS IS" BASIS,
13
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ See the License for the specific language governing permissions and
15
+ limitations under the License.
package/README.md ADDED
@@ -0,0 +1,72 @@
1
+ # @mastra/voice-gladia
2
+
3
+ Gladia AI Voice integration for Mastra, providing Speech-to-text (STT) capabilities using Gladia's voice technology.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @mastra/voice-gladia
9
+ ```
10
+
11
+ ## Configuration
12
+
13
+ The module requires the following environment variable:
14
+
15
+ ```bash
16
+ GLADIA_API_KEY=your_api_key
17
+ ```
18
+
19
+ ## Usage
20
+
21
+ ```typescript
22
+ import { GladiaVoice } from '@mastra/voice-gladia';
23
+ import { createReadStream } from 'fs';
24
+ import path from 'path';
25
+
26
+ const voice = new GladiaVoice({
27
+ listeningModel: {
28
+ apiKey: process.env.GLADIA_API_KEY!,
29
+ },
30
+ });
31
+
32
+ // Create an agent with voice capabilities
33
+ // Note: Gladia only supports STT, so the agent will only be able to listen.
34
+ export const agent = new Agent({
35
+ name: 'Agent',
36
+ instructions: `You are a helpful assistant with STT capabilities.`,
37
+ model: google('gemini-1.5-pro-latest'),
38
+ voice: voice,
39
+ });
40
+
41
+ // Example usage with a local audio file
42
+ const audioStream = createReadStream(path.join(process.cwd(), 'audio.m4a'));
43
+
44
+ try {
45
+ const text = await voice.listen(audioStream, {
46
+ fileName: 'audio.m4a',
47
+ mimeType: 'audio/mp4',
48
+ });
49
+ console.log('Transcription:', text);
50
+ } catch (error) {
51
+ console.error('Error transcribing audio:', error);
52
+ }
53
+ ```
54
+
55
+ ## Features
56
+
57
+ - High-quality Speech-to-Text recognition
58
+ - Support for various audio formats
59
+ - Advanced diarization and translation options
60
+ - Easy integration with Mastra agents
61
+
62
+ ## Limitations
63
+
64
+ - Only supports Speech-to-Text (STT) functionality. Text-to-Speech (TTS) is not supported.
65
+
66
+ ## Available Voices
67
+
68
+ Gladia does not expose a list of available "voices" in the traditional sense. The service focuses on providing high-quality transcription across various languages and audio characteristics.
69
+
70
+ ### Languages
71
+
72
+ Gladia supports a wide range of languages. For a complete list, please refer to the [Gladia documentation](https://docs.gladia.io/).
package/dist/index.cjs ADDED
@@ -0,0 +1,89 @@
1
+ 'use strict';
2
+
3
+ var voice = require('@mastra/core/voice');
4
+
5
+ // src/index.ts
6
+ var GladiaVoice = class extends voice.MastraVoice {
7
+ apiKey;
8
+ baseUrl = "https://api.gladia.io/v2";
9
+ constructor({ listeningModel } = {}) {
10
+ const defaultApiKey = process.env.GLADIA_API_KEY;
11
+ super({
12
+ listeningModel: {
13
+ name: "gladia",
14
+ apiKey: listeningModel?.apiKey ?? defaultApiKey
15
+ }
16
+ });
17
+ this.apiKey = this.listeningModel?.apiKey;
18
+ if (!this.apiKey) throw new Error("GLADIA_API_KEY is not set.");
19
+ }
20
+ async speak(_input, _options) {
21
+ throw new Error("Gladia does not support text-to-speech.");
22
+ }
23
+ async listen(input, { mimeType, fileName, options }) {
24
+ return this.traced(async () => {
25
+ if (!fileName) {
26
+ throw new Error("fileName is required for audio processing");
27
+ }
28
+ if (!mimeType) {
29
+ throw new Error("mimeType is required for audio processing");
30
+ }
31
+ const chunks = [];
32
+ for await (const chunk of input) {
33
+ chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
34
+ }
35
+ const audioBuffer = Buffer.concat(chunks);
36
+ const form = new FormData();
37
+ form.append("audio", new Blob([audioBuffer], { type: mimeType }), fileName);
38
+ const uploadRes = await fetch(`${this.baseUrl}/upload/`, {
39
+ method: "POST",
40
+ headers: { "x-gladia-key": this.apiKey },
41
+ body: form
42
+ });
43
+ if (!uploadRes.ok) {
44
+ throw new Error(`Upload failed: ${uploadRes.status} ${await uploadRes.text()}`);
45
+ }
46
+ const { audio_url } = await uploadRes.json();
47
+ const opts = {
48
+ diarization: true,
49
+ // <-- default
50
+ ...options
51
+ };
52
+ const transcribeRes = await fetch(`${this.baseUrl}/pre-recorded/`, {
53
+ method: "POST",
54
+ headers: {
55
+ "x-gladia-key": this.apiKey,
56
+ "Content-Type": "application/json"
57
+ },
58
+ body: JSON.stringify({ audio_url, ...opts })
59
+ });
60
+ const { id } = await transcribeRes.json();
61
+ while (true) {
62
+ const pollRes = await fetch(`${this.baseUrl}/pre-recorded/${id}`, {
63
+ method: "GET",
64
+ headers: {
65
+ "x-gladia-key": this.apiKey,
66
+ "Content-Type": "application/json"
67
+ }
68
+ });
69
+ if (!pollRes.ok) {
70
+ throw new Error(`Polling failed: ${pollRes.status} ${await pollRes.text()}`);
71
+ }
72
+ const pollJson = await pollRes.json();
73
+ if (pollJson.status === "done") {
74
+ const transcript = pollJson.result?.transcription?.full_transcript;
75
+ if (!transcript) throw new Error("No transcript found");
76
+ return transcript;
77
+ }
78
+ if (pollJson.status === "error") {
79
+ throw new Error(`Gladia error: ${pollJson.error || "Unknown"}`);
80
+ }
81
+ await new Promise((res) => setTimeout(res, 1e3));
82
+ }
83
+ }, "voice.gladia.listen")();
84
+ }
85
+ };
86
+
87
+ exports.GladiaVoice = GladiaVoice;
88
+ //# sourceMappingURL=index.cjs.map
89
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"names":["MastraVoice"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Readable } from 'stream';\nimport { MastraVoice } from '@mastra/core/voice';\n\ninterface GladiaConfig {\n apiKey: string;\n}\n\ninterface GladiaListenOptions {\n diarization?: boolean;\n diarization_config?: {\n number_of_speakers?: number;\n min_speakers?: number;\n max_speakers?: number;\n };\n translation?: boolean;\n translation_config?: {\n model?: 'base' | 'enhanced';\n target_languages?: string[];\n };\n detect_language?: boolean;\n enable_code_switching?: boolean;\n}\n\ninterface GladiaListenCallParams {\n mimeType: string;\n fileName: string;\n options?: GladiaListenOptions;\n}\n\nexport class GladiaVoice extends MastraVoice {\n private apiKey: string;\n private baseUrl = 'https://api.gladia.io/v2';\n\n constructor({ listeningModel }: { listeningModel?: GladiaConfig } = {}) {\n const defaultApiKey = process.env.GLADIA_API_KEY;\n super({\n listeningModel: {\n name: 'gladia',\n apiKey: listeningModel?.apiKey ?? defaultApiKey,\n },\n });\n\n this.apiKey = this.listeningModel?.apiKey as string;\n if (!this.apiKey) throw new Error('GLADIA_API_KEY is not set.');\n }\n\n async speak(_input: string, _options?: Record<string, unknown>): Promise<any> {\n throw new Error('Gladia does not support text-to-speech.');\n }\n\n async listen(input: Readable, { mimeType, fileName, options }: GladiaListenCallParams): Promise<string> {\n return this.traced(async () => {\n if (!fileName) {\n throw new Error('fileName is required for audio processing');\n }\n if (!mimeType) {\n throw new Error('mimeType is required for audio processing');\n }\n const chunks: Buffer[] = [];\n for await (const chunk of input) {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);\n }\n\n const audioBuffer = Buffer.concat(chunks);\n const form = new FormData();\n form.append('audio', new Blob([audioBuffer], { type: mimeType }), fileName);\n\n const uploadRes: any = await fetch(`${this.baseUrl}/upload/`, {\n method: 'POST',\n headers: { 'x-gladia-key': this.apiKey },\n body: form,\n });\n if (!uploadRes.ok) {\n throw new Error(`Upload failed: ${uploadRes.status} ${await uploadRes.text()}`);\n }\n const { audio_url } = await uploadRes.json();\n const opts: GladiaListenOptions = {\n diarization: true, // <-- default\n ...options,\n };\n\n const transcribeRes: any = await fetch(`${this.baseUrl}/pre-recorded/`, {\n method: 'POST',\n headers: {\n 'x-gladia-key': this.apiKey,\n 'Content-Type': 'application/json',\n },\n\n body: JSON.stringify({ audio_url, ...opts }),\n });\n\n const { id } = await transcribeRes.json();\n\n while (true) {\n const pollRes: any = await fetch(`${this.baseUrl}/pre-recorded/${id}`, {\n method: 'GET',\n headers: {\n 'x-gladia-key': this.apiKey,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!pollRes.ok) {\n throw new Error(`Polling failed: ${pollRes.status} ${await pollRes.text()}`);\n }\n\n const pollJson = await pollRes.json();\n if (pollJson.status === 'done') {\n const transcript = pollJson.result?.transcription?.full_transcript;\n if (!transcript) throw new Error('No transcript found');\n return transcript;\n }\n\n if (pollJson.status === 'error') {\n throw new Error(`Gladia error: ${pollJson.error || 'Unknown'}`);\n }\n\n await new Promise(res => setTimeout(res, 1000));\n }\n }, 'voice.gladia.listen')();\n }\n}\n\nexport type { GladiaConfig, GladiaListenOptions };\nexport type { GladiaListenCallParams };\n"]}
@@ -0,0 +1,37 @@
1
+ import type { Readable } from 'stream';
2
+ import { MastraVoice } from '@mastra/core/voice';
3
+ interface GladiaConfig {
4
+ apiKey: string;
5
+ }
6
+ interface GladiaListenOptions {
7
+ diarization?: boolean;
8
+ diarization_config?: {
9
+ number_of_speakers?: number;
10
+ min_speakers?: number;
11
+ max_speakers?: number;
12
+ };
13
+ translation?: boolean;
14
+ translation_config?: {
15
+ model?: 'base' | 'enhanced';
16
+ target_languages?: string[];
17
+ };
18
+ detect_language?: boolean;
19
+ enable_code_switching?: boolean;
20
+ }
21
+ interface GladiaListenCallParams {
22
+ mimeType: string;
23
+ fileName: string;
24
+ options?: GladiaListenOptions;
25
+ }
26
+ export declare class GladiaVoice extends MastraVoice {
27
+ private apiKey;
28
+ private baseUrl;
29
+ constructor({ listeningModel }?: {
30
+ listeningModel?: GladiaConfig;
31
+ });
32
+ speak(_input: string, _options?: Record<string, unknown>): Promise<any>;
33
+ listen(input: Readable, { mimeType, fileName, options }: GladiaListenCallParams): Promise<string>;
34
+ }
35
+ export type { GladiaConfig, GladiaListenOptions };
36
+ export type { GladiaListenCallParams };
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,mBAAmB;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE;QACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE;QACnB,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;QAC5B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC7B,CAAC;IACF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,UAAU,sBAAsB;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,mBAAmB,CAAC;CAC/B;AAED,qBAAa,WAAY,SAAQ,WAAW;IAC1C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAA8B;gBAEjC,EAAE,cAAc,EAAE,GAAE;QAAE,cAAc,CAAC,EAAE,YAAY,CAAA;KAAO;IAahE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;IAIvE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC;CAuExG;AAED,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAClD,YAAY,EAAE,sBAAsB,EAAE,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,87 @@
1
+ import { MastraVoice } from '@mastra/core/voice';
2
+
3
+ // src/index.ts
4
+ var GladiaVoice = class extends MastraVoice {
5
+ apiKey;
6
+ baseUrl = "https://api.gladia.io/v2";
7
+ constructor({ listeningModel } = {}) {
8
+ const defaultApiKey = process.env.GLADIA_API_KEY;
9
+ super({
10
+ listeningModel: {
11
+ name: "gladia",
12
+ apiKey: listeningModel?.apiKey ?? defaultApiKey
13
+ }
14
+ });
15
+ this.apiKey = this.listeningModel?.apiKey;
16
+ if (!this.apiKey) throw new Error("GLADIA_API_KEY is not set.");
17
+ }
18
+ async speak(_input, _options) {
19
+ throw new Error("Gladia does not support text-to-speech.");
20
+ }
21
+ async listen(input, { mimeType, fileName, options }) {
22
+ return this.traced(async () => {
23
+ if (!fileName) {
24
+ throw new Error("fileName is required for audio processing");
25
+ }
26
+ if (!mimeType) {
27
+ throw new Error("mimeType is required for audio processing");
28
+ }
29
+ const chunks = [];
30
+ for await (const chunk of input) {
31
+ chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
32
+ }
33
+ const audioBuffer = Buffer.concat(chunks);
34
+ const form = new FormData();
35
+ form.append("audio", new Blob([audioBuffer], { type: mimeType }), fileName);
36
+ const uploadRes = await fetch(`${this.baseUrl}/upload/`, {
37
+ method: "POST",
38
+ headers: { "x-gladia-key": this.apiKey },
39
+ body: form
40
+ });
41
+ if (!uploadRes.ok) {
42
+ throw new Error(`Upload failed: ${uploadRes.status} ${await uploadRes.text()}`);
43
+ }
44
+ const { audio_url } = await uploadRes.json();
45
+ const opts = {
46
+ diarization: true,
47
+ // <-- default
48
+ ...options
49
+ };
50
+ const transcribeRes = await fetch(`${this.baseUrl}/pre-recorded/`, {
51
+ method: "POST",
52
+ headers: {
53
+ "x-gladia-key": this.apiKey,
54
+ "Content-Type": "application/json"
55
+ },
56
+ body: JSON.stringify({ audio_url, ...opts })
57
+ });
58
+ const { id } = await transcribeRes.json();
59
+ while (true) {
60
+ const pollRes = await fetch(`${this.baseUrl}/pre-recorded/${id}`, {
61
+ method: "GET",
62
+ headers: {
63
+ "x-gladia-key": this.apiKey,
64
+ "Content-Type": "application/json"
65
+ }
66
+ });
67
+ if (!pollRes.ok) {
68
+ throw new Error(`Polling failed: ${pollRes.status} ${await pollRes.text()}`);
69
+ }
70
+ const pollJson = await pollRes.json();
71
+ if (pollJson.status === "done") {
72
+ const transcript = pollJson.result?.transcription?.full_transcript;
73
+ if (!transcript) throw new Error("No transcript found");
74
+ return transcript;
75
+ }
76
+ if (pollJson.status === "error") {
77
+ throw new Error(`Gladia error: ${pollJson.error || "Unknown"}`);
78
+ }
79
+ await new Promise((res) => setTimeout(res, 1e3));
80
+ }
81
+ }, "voice.gladia.listen")();
82
+ }
83
+ };
84
+
85
+ export { GladiaVoice };
86
+ //# sourceMappingURL=index.js.map
87
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { Readable } from 'stream';\nimport { MastraVoice } from '@mastra/core/voice';\n\ninterface GladiaConfig {\n apiKey: string;\n}\n\ninterface GladiaListenOptions {\n diarization?: boolean;\n diarization_config?: {\n number_of_speakers?: number;\n min_speakers?: number;\n max_speakers?: number;\n };\n translation?: boolean;\n translation_config?: {\n model?: 'base' | 'enhanced';\n target_languages?: string[];\n };\n detect_language?: boolean;\n enable_code_switching?: boolean;\n}\n\ninterface GladiaListenCallParams {\n mimeType: string;\n fileName: string;\n options?: GladiaListenOptions;\n}\n\nexport class GladiaVoice extends MastraVoice {\n private apiKey: string;\n private baseUrl = 'https://api.gladia.io/v2';\n\n constructor({ listeningModel }: { listeningModel?: GladiaConfig } = {}) {\n const defaultApiKey = process.env.GLADIA_API_KEY;\n super({\n listeningModel: {\n name: 'gladia',\n apiKey: listeningModel?.apiKey ?? defaultApiKey,\n },\n });\n\n this.apiKey = this.listeningModel?.apiKey as string;\n if (!this.apiKey) throw new Error('GLADIA_API_KEY is not set.');\n }\n\n async speak(_input: string, _options?: Record<string, unknown>): Promise<any> {\n throw new Error('Gladia does not support text-to-speech.');\n }\n\n async listen(input: Readable, { mimeType, fileName, options }: GladiaListenCallParams): Promise<string> {\n return this.traced(async () => {\n if (!fileName) {\n throw new Error('fileName is required for audio processing');\n }\n if (!mimeType) {\n throw new Error('mimeType is required for audio processing');\n }\n const chunks: Buffer[] = [];\n for await (const chunk of input) {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);\n }\n\n const audioBuffer = Buffer.concat(chunks);\n const form = new FormData();\n form.append('audio', new Blob([audioBuffer], { type: mimeType }), fileName);\n\n const uploadRes: any = await fetch(`${this.baseUrl}/upload/`, {\n method: 'POST',\n headers: { 'x-gladia-key': this.apiKey },\n body: form,\n });\n if (!uploadRes.ok) {\n throw new Error(`Upload failed: ${uploadRes.status} ${await uploadRes.text()}`);\n }\n const { audio_url } = await uploadRes.json();\n const opts: GladiaListenOptions = {\n diarization: true, // <-- default\n ...options,\n };\n\n const transcribeRes: any = await fetch(`${this.baseUrl}/pre-recorded/`, {\n method: 'POST',\n headers: {\n 'x-gladia-key': this.apiKey,\n 'Content-Type': 'application/json',\n },\n\n body: JSON.stringify({ audio_url, ...opts }),\n });\n\n const { id } = await transcribeRes.json();\n\n while (true) {\n const pollRes: any = await fetch(`${this.baseUrl}/pre-recorded/${id}`, {\n method: 'GET',\n headers: {\n 'x-gladia-key': this.apiKey,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!pollRes.ok) {\n throw new Error(`Polling failed: ${pollRes.status} ${await pollRes.text()}`);\n }\n\n const pollJson = await pollRes.json();\n if (pollJson.status === 'done') {\n const transcript = pollJson.result?.transcription?.full_transcript;\n if (!transcript) throw new Error('No transcript found');\n return transcript;\n }\n\n if (pollJson.status === 'error') {\n throw new Error(`Gladia error: ${pollJson.error || 'Unknown'}`);\n }\n\n await new Promise(res => setTimeout(res, 1000));\n }\n }, 'voice.gladia.listen')();\n }\n}\n\nexport type { GladiaConfig, GladiaListenOptions };\nexport type { GladiaListenCallParams };\n"]}
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "@mastra/voice-gladia",
3
+ "version": "0.0.0-add-libsql-changeset-20250910154739",
4
+ "description": "Mastra Gladia AI voice integration",
5
+ "type": "module",
6
+ "files": [
7
+ "dist",
8
+ "CHANGELOG.md"
9
+ ],
10
+ "main": "dist/index.js",
11
+ "types": "dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "import": {
15
+ "types": "./dist/index.d.ts",
16
+ "default": "./dist/index.js"
17
+ },
18
+ "require": {
19
+ "types": "./dist/index.d.ts",
20
+ "default": "./dist/index.cjs"
21
+ }
22
+ },
23
+ "./package.json": "./package.json"
24
+ },
25
+ "license": "Apache-2.0",
26
+ "dependencies": {},
27
+ "devDependencies": {
28
+ "@microsoft/api-extractor": "^7.52.5",
29
+ "@types/node": "^20.17.32",
30
+ "eslint": "^9.30.1",
31
+ "pnpm": "10.12.4",
32
+ "tsup": "^8.4.0",
33
+ "typescript": "^5.8.3",
34
+ "vitest": "^3.2.4",
35
+ "zod": "^3.25.76",
36
+ "@internal/types-builder": "0.0.0-add-libsql-changeset-20250910154739",
37
+ "@internal/lint": "0.0.0-add-libsql-changeset-20250910154739",
38
+ "@mastra/core": "0.0.0-add-libsql-changeset-20250910154739"
39
+ },
40
+ "keywords": [
41
+ "mastra",
42
+ "gladia",
43
+ "stt",
44
+ "speech-to-text",
45
+ "speech-recognition"
46
+ ],
47
+ "peerDependencies": {
48
+ "zod": "^3.25.0 || ^4.0.0",
49
+ "@mastra/core": "0.0.0-add-libsql-changeset-20250910154739"
50
+ },
51
+ "homepage": "https://mastra.ai",
52
+ "repository": {
53
+ "type": "git",
54
+ "url": "git+https://github.com/mastra-ai/mastra.git",
55
+ "directory": "voice/gladia"
56
+ },
57
+ "bugs": {
58
+ "url": "https://github.com/mastra-ai/mastra/issues"
59
+ },
60
+ "scripts": {
61
+ "build": "tsup --silent --config tsup.config.ts",
62
+ "build:watch": "tsup --watch --silent --config tsup.config.ts",
63
+ "test": "vitest run",
64
+ "test:watch": "vitest watch",
65
+ "lint": "eslint ."
66
+ }
67
+ }