@ai-sdk/lmnt 0.0.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.
package/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # @ai-sdk/lmnt
2
+
3
+ ## 0.0.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 0d7291a: feat(providers/lmnt): add speech
package/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ Copyright 2023 Vercel, Inc.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
package/README.md ADDED
@@ -0,0 +1,36 @@
1
+ # AI SDK - LMNT Provider
2
+
3
+ The **[LMNT provider](https://sdk.vercel.ai/providers/ai-sdk-providers/lmnt)** for the [AI SDK](https://sdk.vercel.ai/docs)
4
+ contains language model support for the LMNT API.
5
+
6
+ ## Setup
7
+
8
+ The LMNT provider is available in the `@ai-sdk/lmnt` module. You can install it with
9
+
10
+ ```bash
11
+ npm i @ai-sdk/lmnt
12
+ ```
13
+
14
+ ## Provider Instance
15
+
16
+ You can import the default provider instance `lmnt` from `@ai-sdk/lmnt`:
17
+
18
+ ```ts
19
+ import { lmnt } from '@ai-sdk/lmnt';
20
+ ```
21
+
22
+ ## Example
23
+
24
+ ```ts
25
+ import { lmnt } from '@ai-sdk/lmnt';
26
+ import { experimental_generateSpeech as generateSpeech } from 'ai';
27
+
28
+ const result = await generateSpeech({
29
+ model: lmnt.speech('aurora'),
30
+ text: 'Hello, world!',
31
+ });
32
+ ```
33
+
34
+ ## Documentation
35
+
36
+ Please check out the **[LMNT provider documentation](https://sdk.vercel.ai/providers/ai-sdk-providers/lmnt)** for more information.
@@ -0,0 +1,65 @@
1
+ import { SpeechModelV1, ProviderV1 } from '@ai-sdk/provider';
2
+ import { FetchFunction } from '@ai-sdk/provider-utils';
3
+
4
+ type LMNTConfig = {
5
+ provider: string;
6
+ url: (options: {
7
+ modelId: string;
8
+ path: string;
9
+ }) => string;
10
+ headers: () => Record<string, string | undefined>;
11
+ fetch?: FetchFunction;
12
+ generateId?: () => string;
13
+ };
14
+
15
+ type LMNTSpeechModelId = 'aurora' | 'blizzard' | (string & {});
16
+
17
+ interface LMNTSpeechModelConfig extends LMNTConfig {
18
+ _internal?: {
19
+ currentDate?: () => Date;
20
+ };
21
+ }
22
+ declare class LMNTSpeechModel implements SpeechModelV1 {
23
+ readonly modelId: LMNTSpeechModelId;
24
+ private readonly config;
25
+ readonly specificationVersion = "v1";
26
+ get provider(): string;
27
+ constructor(modelId: LMNTSpeechModelId, config: LMNTSpeechModelConfig);
28
+ private getArgs;
29
+ doGenerate(options: Parameters<SpeechModelV1['doGenerate']>[0]): Promise<Awaited<ReturnType<SpeechModelV1['doGenerate']>>>;
30
+ }
31
+
32
+ interface LMNTProvider extends Pick<ProviderV1, 'speechModel'> {
33
+ (modelId: 'aurora', settings?: {}): {
34
+ speech: LMNTSpeechModel;
35
+ };
36
+ /**
37
+ Creates a model for speech synthesis.
38
+ */
39
+ speech(modelId: LMNTSpeechModelId): SpeechModelV1;
40
+ }
41
+ interface LMNTProviderSettings {
42
+ /**
43
+ API key for authenticating requests.
44
+ */
45
+ apiKey?: string;
46
+ /**
47
+ Custom headers to include in the requests.
48
+ */
49
+ headers?: Record<string, string>;
50
+ /**
51
+ Custom fetch implementation. You can use it as a middleware to intercept requests,
52
+ or to provide a custom fetch implementation for e.g. testing.
53
+ */
54
+ fetch?: FetchFunction;
55
+ }
56
+ /**
57
+ Create an LMNT provider instance.
58
+ */
59
+ declare function createLMNT(options?: LMNTProviderSettings): LMNTProvider;
60
+ /**
61
+ Default LMNT provider instance.
62
+ */
63
+ declare const lmnt: LMNTProvider;
64
+
65
+ export { type LMNTProvider, type LMNTProviderSettings, createLMNT, lmnt };
@@ -0,0 +1,65 @@
1
+ import { SpeechModelV1, ProviderV1 } from '@ai-sdk/provider';
2
+ import { FetchFunction } from '@ai-sdk/provider-utils';
3
+
4
+ type LMNTConfig = {
5
+ provider: string;
6
+ url: (options: {
7
+ modelId: string;
8
+ path: string;
9
+ }) => string;
10
+ headers: () => Record<string, string | undefined>;
11
+ fetch?: FetchFunction;
12
+ generateId?: () => string;
13
+ };
14
+
15
+ type LMNTSpeechModelId = 'aurora' | 'blizzard' | (string & {});
16
+
17
+ interface LMNTSpeechModelConfig extends LMNTConfig {
18
+ _internal?: {
19
+ currentDate?: () => Date;
20
+ };
21
+ }
22
+ declare class LMNTSpeechModel implements SpeechModelV1 {
23
+ readonly modelId: LMNTSpeechModelId;
24
+ private readonly config;
25
+ readonly specificationVersion = "v1";
26
+ get provider(): string;
27
+ constructor(modelId: LMNTSpeechModelId, config: LMNTSpeechModelConfig);
28
+ private getArgs;
29
+ doGenerate(options: Parameters<SpeechModelV1['doGenerate']>[0]): Promise<Awaited<ReturnType<SpeechModelV1['doGenerate']>>>;
30
+ }
31
+
32
+ interface LMNTProvider extends Pick<ProviderV1, 'speechModel'> {
33
+ (modelId: 'aurora', settings?: {}): {
34
+ speech: LMNTSpeechModel;
35
+ };
36
+ /**
37
+ Creates a model for speech synthesis.
38
+ */
39
+ speech(modelId: LMNTSpeechModelId): SpeechModelV1;
40
+ }
41
+ interface LMNTProviderSettings {
42
+ /**
43
+ API key for authenticating requests.
44
+ */
45
+ apiKey?: string;
46
+ /**
47
+ Custom headers to include in the requests.
48
+ */
49
+ headers?: Record<string, string>;
50
+ /**
51
+ Custom fetch implementation. You can use it as a middleware to intercept requests,
52
+ or to provide a custom fetch implementation for e.g. testing.
53
+ */
54
+ fetch?: FetchFunction;
55
+ }
56
+ /**
57
+ Create an LMNT provider instance.
58
+ */
59
+ declare function createLMNT(options?: LMNTProviderSettings): LMNTProvider;
60
+ /**
61
+ Default LMNT provider instance.
62
+ */
63
+ declare const lmnt: LMNTProvider;
64
+
65
+ export { type LMNTProvider, type LMNTProviderSettings, createLMNT, lmnt };
package/dist/index.js ADDED
@@ -0,0 +1,230 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ createLMNT: () => createLMNT,
24
+ lmnt: () => lmnt
25
+ });
26
+ module.exports = __toCommonJS(src_exports);
27
+
28
+ // src/lmnt-provider.ts
29
+ var import_provider_utils3 = require("@ai-sdk/provider-utils");
30
+
31
+ // src/lmnt-speech-model.ts
32
+ var import_provider_utils2 = require("@ai-sdk/provider-utils");
33
+ var import_zod2 = require("zod");
34
+
35
+ // src/lmnt-error.ts
36
+ var import_zod = require("zod");
37
+ var import_provider_utils = require("@ai-sdk/provider-utils");
38
+ var lmntErrorDataSchema = import_zod.z.object({
39
+ error: import_zod.z.object({
40
+ message: import_zod.z.string(),
41
+ code: import_zod.z.number()
42
+ })
43
+ });
44
+ var lmntFailedResponseHandler = (0, import_provider_utils.createJsonErrorResponseHandler)({
45
+ errorSchema: lmntErrorDataSchema,
46
+ errorToMessage: (data) => data.error.message
47
+ });
48
+
49
+ // src/lmnt-speech-model.ts
50
+ var lmntSpeechCallOptionsSchema = import_zod2.z.object({
51
+ /**
52
+ * The model to use for speech synthesis e.g. 'aurora' or 'blizzard'.
53
+ * @default 'aurora'
54
+ */
55
+ model: import_zod2.z.union([import_zod2.z.enum(["aurora", "blizzard"]), import_zod2.z.string()]).nullish().default("aurora"),
56
+ /**
57
+ * The language of the input text.
58
+ * @default 'auto'
59
+ */
60
+ language: import_zod2.z.union([import_zod2.z.enum(["auto", "en"]), import_zod2.z.string()]).nullish().default("auto"),
61
+ /**
62
+ * The audio format of the output.
63
+ * @default 'mp3'
64
+ */
65
+ format: import_zod2.z.enum(["aac", "mp3", "mulaw", "raw", "wav"]).nullish().default("mp3"),
66
+ /**
67
+ * The sample rate of the output audio in Hz.
68
+ * @default 24000
69
+ */
70
+ sampleRate: import_zod2.z.union([import_zod2.z.literal(8e3), import_zod2.z.literal(16e3), import_zod2.z.literal(24e3)]).nullish().default(24e3),
71
+ /**
72
+ * The speed of the speech. Range: 0.25 to 2.
73
+ * @default 1
74
+ */
75
+ speed: import_zod2.z.number().min(0.25).max(2).nullish().default(1),
76
+ /**
77
+ * A seed value for deterministic generation.
78
+ */
79
+ seed: import_zod2.z.number().int().nullish(),
80
+ /**
81
+ * Whether to use a conversational style.
82
+ * @default false
83
+ */
84
+ conversational: import_zod2.z.boolean().nullish().default(false),
85
+ /**
86
+ * Maximum length of the output in seconds (up to 300).
87
+ */
88
+ length: import_zod2.z.number().max(300).nullish(),
89
+ /**
90
+ * Top-p sampling parameter. Range: 0 to 1.
91
+ * @default 1
92
+ */
93
+ topP: import_zod2.z.number().min(0).max(1).nullish().default(1),
94
+ /**
95
+ * Temperature for sampling. Higher values increase randomness.
96
+ * @default 1
97
+ */
98
+ temperature: import_zod2.z.number().min(0).nullish().default(1)
99
+ });
100
+ var LMNTSpeechModel = class {
101
+ constructor(modelId, config) {
102
+ this.modelId = modelId;
103
+ this.config = config;
104
+ this.specificationVersion = "v1";
105
+ }
106
+ get provider() {
107
+ return this.config.provider;
108
+ }
109
+ getArgs({
110
+ text,
111
+ voice = "ava",
112
+ outputFormat = "mp3",
113
+ speed,
114
+ providerOptions
115
+ }) {
116
+ var _a, _b, _c, _d, _e, _f, _g;
117
+ const warnings = [];
118
+ const lmntOptions = (0, import_provider_utils2.parseProviderOptions)({
119
+ provider: "lmnt",
120
+ providerOptions,
121
+ schema: lmntSpeechCallOptionsSchema
122
+ });
123
+ const requestBody = {
124
+ model: this.modelId,
125
+ text,
126
+ voice,
127
+ response_format: "mp3",
128
+ speed
129
+ };
130
+ if (outputFormat) {
131
+ if (["mp3", "aac", "mulaw", "raw", "wav"].includes(outputFormat)) {
132
+ requestBody.response_format = outputFormat;
133
+ } else {
134
+ warnings.push({
135
+ type: "unsupported-setting",
136
+ setting: "outputFormat",
137
+ details: `Unsupported output format: ${outputFormat}. Using mp3 instead.`
138
+ });
139
+ }
140
+ }
141
+ if (lmntOptions) {
142
+ const speechModelOptions = {
143
+ conversational: (_a = lmntOptions.conversational) != null ? _a : void 0,
144
+ length: (_b = lmntOptions.length) != null ? _b : void 0,
145
+ seed: (_c = lmntOptions.seed) != null ? _c : void 0,
146
+ speed: (_d = lmntOptions.speed) != null ? _d : void 0,
147
+ temperature: (_e = lmntOptions.temperature) != null ? _e : void 0,
148
+ top_p: (_f = lmntOptions.topP) != null ? _f : void 0,
149
+ sample_rate: (_g = lmntOptions.sampleRate) != null ? _g : void 0
150
+ };
151
+ for (const key in speechModelOptions) {
152
+ const value = speechModelOptions[key];
153
+ if (value !== void 0) {
154
+ requestBody[key] = value;
155
+ }
156
+ }
157
+ }
158
+ return {
159
+ requestBody,
160
+ warnings
161
+ };
162
+ }
163
+ async doGenerate(options) {
164
+ var _a, _b, _c;
165
+ const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();
166
+ const { requestBody, warnings } = this.getArgs(options);
167
+ const {
168
+ value: audio,
169
+ responseHeaders,
170
+ rawValue: rawResponse
171
+ } = await (0, import_provider_utils2.postJsonToApi)({
172
+ url: this.config.url({
173
+ path: "/v1/ai/speech/bytes",
174
+ modelId: this.modelId
175
+ }),
176
+ headers: (0, import_provider_utils2.combineHeaders)(this.config.headers(), options.headers),
177
+ body: requestBody,
178
+ failedResponseHandler: lmntFailedResponseHandler,
179
+ successfulResponseHandler: (0, import_provider_utils2.createBinaryResponseHandler)(),
180
+ abortSignal: options.abortSignal,
181
+ fetch: this.config.fetch
182
+ });
183
+ return {
184
+ audio,
185
+ warnings,
186
+ request: {
187
+ body: JSON.stringify(requestBody)
188
+ },
189
+ response: {
190
+ timestamp: currentDate,
191
+ modelId: this.modelId,
192
+ headers: responseHeaders,
193
+ body: rawResponse
194
+ }
195
+ };
196
+ }
197
+ };
198
+
199
+ // src/lmnt-provider.ts
200
+ function createLMNT(options = {}) {
201
+ const getHeaders = () => ({
202
+ "x-api-key": (0, import_provider_utils3.loadApiKey)({
203
+ apiKey: options.apiKey,
204
+ environmentVariableName: "LMNT_API_KEY",
205
+ description: "LMNT"
206
+ }),
207
+ ...options.headers
208
+ });
209
+ const createSpeechModel = (modelId) => new LMNTSpeechModel(modelId, {
210
+ provider: `lmnt.speech`,
211
+ url: ({ path }) => `https://api.lmnt.com${path}`,
212
+ headers: getHeaders,
213
+ fetch: options.fetch
214
+ });
215
+ const provider = function(modelId) {
216
+ return {
217
+ speech: createSpeechModel(modelId)
218
+ };
219
+ };
220
+ provider.speech = createSpeechModel;
221
+ provider.speechModel = createSpeechModel;
222
+ return provider;
223
+ }
224
+ var lmnt = createLMNT();
225
+ // Annotate the CommonJS export names for ESM import in node:
226
+ 0 && (module.exports = {
227
+ createLMNT,
228
+ lmnt
229
+ });
230
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/lmnt-provider.ts","../src/lmnt-speech-model.ts","../src/lmnt-error.ts"],"sourcesContent":["export { createLMNT, lmnt } from './lmnt-provider';\nexport type { LMNTProvider, LMNTProviderSettings } from './lmnt-provider';\n","import { SpeechModelV1, ProviderV1 } from '@ai-sdk/provider';\nimport { FetchFunction, loadApiKey } from '@ai-sdk/provider-utils';\nimport { LMNTSpeechModel } from './lmnt-speech-model';\nimport { LMNTSpeechModelId } from './lmnt-speech-settings';\n\nexport interface LMNTProvider extends Pick<ProviderV1, 'speechModel'> {\n (\n modelId: 'aurora',\n settings?: {},\n ): {\n speech: LMNTSpeechModel;\n };\n\n /**\nCreates a model for speech synthesis.\n */\n speech(modelId: LMNTSpeechModelId): SpeechModelV1;\n}\n\nexport interface LMNTProviderSettings {\n /**\nAPI key for authenticating requests.\n */\n apiKey?: string;\n\n /**\nCustom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\n/**\nCreate an LMNT provider instance.\n */\nexport function createLMNT(options: LMNTProviderSettings = {}): LMNTProvider {\n const getHeaders = () => ({\n 'x-api-key': loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'LMNT_API_KEY',\n description: 'LMNT',\n }),\n ...options.headers,\n });\n\n const createSpeechModel = (modelId: LMNTSpeechModelId) =>\n new LMNTSpeechModel(modelId, {\n provider: `lmnt.speech`,\n url: ({ path }) => `https://api.lmnt.com${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const provider = function (modelId: LMNTSpeechModelId) {\n return {\n speech: createSpeechModel(modelId),\n };\n };\n\n provider.speech = createSpeechModel;\n provider.speechModel = createSpeechModel;\n\n return provider as LMNTProvider;\n}\n\n/**\nDefault LMNT provider instance.\n */\nexport const lmnt = createLMNT();\n","import { SpeechModelV1, SpeechModelV1CallWarning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createBinaryResponseHandler,\n parseProviderOptions,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\nimport { LMNTConfig } from './lmnt-config';\nimport { lmntFailedResponseHandler } from './lmnt-error';\nimport { LMNTSpeechModelId } from './lmnt-speech-settings';\nimport { LMNTSpeechAPITypes } from './lmnt-api-types';\n\n// https://docs.lmnt.com/api-reference/speech/synthesize-speech-bytes\nconst lmntSpeechCallOptionsSchema = z.object({\n /**\n * The model to use for speech synthesis e.g. 'aurora' or 'blizzard'.\n * @default 'aurora'\n */\n model: z\n .union([z.enum(['aurora', 'blizzard']), z.string()])\n .nullish()\n .default('aurora'),\n\n /**\n * The language of the input text.\n * @default 'auto'\n */\n language: z\n .union([z.enum(['auto', 'en']), z.string()])\n .nullish()\n .default('auto'),\n\n /**\n * The audio format of the output.\n * @default 'mp3'\n */\n format: z\n .enum(['aac', 'mp3', 'mulaw', 'raw', 'wav'])\n .nullish()\n .default('mp3'),\n\n /**\n * The sample rate of the output audio in Hz.\n * @default 24000\n */\n sampleRate: z\n .union([z.literal(8000), z.literal(16000), z.literal(24000)])\n .nullish()\n .default(24000),\n\n /**\n * The speed of the speech. Range: 0.25 to 2.\n * @default 1\n */\n speed: z.number().min(0.25).max(2).nullish().default(1),\n\n /**\n * A seed value for deterministic generation.\n */\n seed: z.number().int().nullish(),\n\n /**\n * Whether to use a conversational style.\n * @default false\n */\n conversational: z.boolean().nullish().default(false),\n\n /**\n * Maximum length of the output in seconds (up to 300).\n */\n length: z.number().max(300).nullish(),\n\n /**\n * Top-p sampling parameter. Range: 0 to 1.\n * @default 1\n */\n topP: z.number().min(0).max(1).nullish().default(1),\n\n /**\n * Temperature for sampling. Higher values increase randomness.\n * @default 1\n */\n temperature: z.number().min(0).nullish().default(1),\n});\n\nexport type LMNTSpeechCallOptions = z.infer<typeof lmntSpeechCallOptionsSchema>;\n\ninterface LMNTSpeechModelConfig extends LMNTConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class LMNTSpeechModel implements SpeechModelV1 {\n readonly specificationVersion = 'v1';\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: LMNTSpeechModelId,\n private readonly config: LMNTSpeechModelConfig,\n ) {}\n\n private getArgs({\n text,\n voice = 'ava',\n outputFormat = 'mp3',\n speed,\n providerOptions,\n }: Parameters<SpeechModelV1['doGenerate']>[0]) {\n const warnings: SpeechModelV1CallWarning[] = [];\n\n // Parse provider options\n const lmntOptions = parseProviderOptions({\n provider: 'lmnt',\n providerOptions,\n schema: lmntSpeechCallOptionsSchema,\n });\n\n // Create request body\n const requestBody: Record<string, unknown> = {\n model: this.modelId,\n text,\n voice,\n response_format: 'mp3',\n speed,\n };\n\n if (outputFormat) {\n if (['mp3', 'aac', 'mulaw', 'raw', 'wav'].includes(outputFormat)) {\n requestBody.response_format = outputFormat;\n } else {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'outputFormat',\n details: `Unsupported output format: ${outputFormat}. Using mp3 instead.`,\n });\n }\n }\n\n // Add provider-specific options\n if (lmntOptions) {\n const speechModelOptions: Omit<LMNTSpeechAPITypes, 'voice' | 'text'> = {\n conversational: lmntOptions.conversational ?? undefined,\n length: lmntOptions.length ?? undefined,\n seed: lmntOptions.seed ?? undefined,\n speed: lmntOptions.speed ?? undefined,\n temperature: lmntOptions.temperature ?? undefined,\n top_p: lmntOptions.topP ?? undefined,\n sample_rate: lmntOptions.sampleRate ?? undefined,\n };\n\n for (const key in speechModelOptions) {\n const value =\n speechModelOptions[\n key as keyof Omit<LMNTSpeechAPITypes, 'voice' | 'text'>\n ];\n if (value !== undefined) {\n requestBody[key] = value;\n }\n }\n }\n\n return {\n requestBody,\n warnings,\n };\n }\n\n async doGenerate(\n options: Parameters<SpeechModelV1['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<SpeechModelV1['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { requestBody, warnings } = this.getArgs(options);\n\n const {\n value: audio,\n responseHeaders,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: this.config.url({\n path: '/v1/ai/speech/bytes',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body: requestBody,\n failedResponseHandler: lmntFailedResponseHandler,\n successfulResponseHandler: createBinaryResponseHandler(),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n audio,\n warnings,\n request: {\n body: JSON.stringify(requestBody),\n },\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n body: rawResponse,\n },\n };\n }\n}\n","import { z } from 'zod';\nimport { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\n\nexport const lmntErrorDataSchema = z.object({\n error: z.object({\n message: z.string(),\n code: z.number(),\n }),\n});\n\nexport type LMNTErrorData = z.infer<typeof lmntErrorDataSchema>;\n\nexport const lmntFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: lmntErrorDataSchema,\n errorToMessage: data => data.error.message,\n});\n"],"mappings":"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","names":["import_provider_utils","import_provider_utils","import_zod"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,207 @@
1
+ // src/lmnt-provider.ts
2
+ import { loadApiKey } from "@ai-sdk/provider-utils";
3
+
4
+ // src/lmnt-speech-model.ts
5
+ import {
6
+ combineHeaders,
7
+ createBinaryResponseHandler,
8
+ parseProviderOptions,
9
+ postJsonToApi
10
+ } from "@ai-sdk/provider-utils";
11
+ import { z as z2 } from "zod";
12
+
13
+ // src/lmnt-error.ts
14
+ import { z } from "zod";
15
+ import { createJsonErrorResponseHandler } from "@ai-sdk/provider-utils";
16
+ var lmntErrorDataSchema = z.object({
17
+ error: z.object({
18
+ message: z.string(),
19
+ code: z.number()
20
+ })
21
+ });
22
+ var lmntFailedResponseHandler = createJsonErrorResponseHandler({
23
+ errorSchema: lmntErrorDataSchema,
24
+ errorToMessage: (data) => data.error.message
25
+ });
26
+
27
+ // src/lmnt-speech-model.ts
28
+ var lmntSpeechCallOptionsSchema = z2.object({
29
+ /**
30
+ * The model to use for speech synthesis e.g. 'aurora' or 'blizzard'.
31
+ * @default 'aurora'
32
+ */
33
+ model: z2.union([z2.enum(["aurora", "blizzard"]), z2.string()]).nullish().default("aurora"),
34
+ /**
35
+ * The language of the input text.
36
+ * @default 'auto'
37
+ */
38
+ language: z2.union([z2.enum(["auto", "en"]), z2.string()]).nullish().default("auto"),
39
+ /**
40
+ * The audio format of the output.
41
+ * @default 'mp3'
42
+ */
43
+ format: z2.enum(["aac", "mp3", "mulaw", "raw", "wav"]).nullish().default("mp3"),
44
+ /**
45
+ * The sample rate of the output audio in Hz.
46
+ * @default 24000
47
+ */
48
+ sampleRate: z2.union([z2.literal(8e3), z2.literal(16e3), z2.literal(24e3)]).nullish().default(24e3),
49
+ /**
50
+ * The speed of the speech. Range: 0.25 to 2.
51
+ * @default 1
52
+ */
53
+ speed: z2.number().min(0.25).max(2).nullish().default(1),
54
+ /**
55
+ * A seed value for deterministic generation.
56
+ */
57
+ seed: z2.number().int().nullish(),
58
+ /**
59
+ * Whether to use a conversational style.
60
+ * @default false
61
+ */
62
+ conversational: z2.boolean().nullish().default(false),
63
+ /**
64
+ * Maximum length of the output in seconds (up to 300).
65
+ */
66
+ length: z2.number().max(300).nullish(),
67
+ /**
68
+ * Top-p sampling parameter. Range: 0 to 1.
69
+ * @default 1
70
+ */
71
+ topP: z2.number().min(0).max(1).nullish().default(1),
72
+ /**
73
+ * Temperature for sampling. Higher values increase randomness.
74
+ * @default 1
75
+ */
76
+ temperature: z2.number().min(0).nullish().default(1)
77
+ });
78
+ var LMNTSpeechModel = class {
79
+ constructor(modelId, config) {
80
+ this.modelId = modelId;
81
+ this.config = config;
82
+ this.specificationVersion = "v1";
83
+ }
84
+ get provider() {
85
+ return this.config.provider;
86
+ }
87
+ getArgs({
88
+ text,
89
+ voice = "ava",
90
+ outputFormat = "mp3",
91
+ speed,
92
+ providerOptions
93
+ }) {
94
+ var _a, _b, _c, _d, _e, _f, _g;
95
+ const warnings = [];
96
+ const lmntOptions = parseProviderOptions({
97
+ provider: "lmnt",
98
+ providerOptions,
99
+ schema: lmntSpeechCallOptionsSchema
100
+ });
101
+ const requestBody = {
102
+ model: this.modelId,
103
+ text,
104
+ voice,
105
+ response_format: "mp3",
106
+ speed
107
+ };
108
+ if (outputFormat) {
109
+ if (["mp3", "aac", "mulaw", "raw", "wav"].includes(outputFormat)) {
110
+ requestBody.response_format = outputFormat;
111
+ } else {
112
+ warnings.push({
113
+ type: "unsupported-setting",
114
+ setting: "outputFormat",
115
+ details: `Unsupported output format: ${outputFormat}. Using mp3 instead.`
116
+ });
117
+ }
118
+ }
119
+ if (lmntOptions) {
120
+ const speechModelOptions = {
121
+ conversational: (_a = lmntOptions.conversational) != null ? _a : void 0,
122
+ length: (_b = lmntOptions.length) != null ? _b : void 0,
123
+ seed: (_c = lmntOptions.seed) != null ? _c : void 0,
124
+ speed: (_d = lmntOptions.speed) != null ? _d : void 0,
125
+ temperature: (_e = lmntOptions.temperature) != null ? _e : void 0,
126
+ top_p: (_f = lmntOptions.topP) != null ? _f : void 0,
127
+ sample_rate: (_g = lmntOptions.sampleRate) != null ? _g : void 0
128
+ };
129
+ for (const key in speechModelOptions) {
130
+ const value = speechModelOptions[key];
131
+ if (value !== void 0) {
132
+ requestBody[key] = value;
133
+ }
134
+ }
135
+ }
136
+ return {
137
+ requestBody,
138
+ warnings
139
+ };
140
+ }
141
+ async doGenerate(options) {
142
+ var _a, _b, _c;
143
+ const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();
144
+ const { requestBody, warnings } = this.getArgs(options);
145
+ const {
146
+ value: audio,
147
+ responseHeaders,
148
+ rawValue: rawResponse
149
+ } = await postJsonToApi({
150
+ url: this.config.url({
151
+ path: "/v1/ai/speech/bytes",
152
+ modelId: this.modelId
153
+ }),
154
+ headers: combineHeaders(this.config.headers(), options.headers),
155
+ body: requestBody,
156
+ failedResponseHandler: lmntFailedResponseHandler,
157
+ successfulResponseHandler: createBinaryResponseHandler(),
158
+ abortSignal: options.abortSignal,
159
+ fetch: this.config.fetch
160
+ });
161
+ return {
162
+ audio,
163
+ warnings,
164
+ request: {
165
+ body: JSON.stringify(requestBody)
166
+ },
167
+ response: {
168
+ timestamp: currentDate,
169
+ modelId: this.modelId,
170
+ headers: responseHeaders,
171
+ body: rawResponse
172
+ }
173
+ };
174
+ }
175
+ };
176
+
177
+ // src/lmnt-provider.ts
178
+ function createLMNT(options = {}) {
179
+ const getHeaders = () => ({
180
+ "x-api-key": loadApiKey({
181
+ apiKey: options.apiKey,
182
+ environmentVariableName: "LMNT_API_KEY",
183
+ description: "LMNT"
184
+ }),
185
+ ...options.headers
186
+ });
187
+ const createSpeechModel = (modelId) => new LMNTSpeechModel(modelId, {
188
+ provider: `lmnt.speech`,
189
+ url: ({ path }) => `https://api.lmnt.com${path}`,
190
+ headers: getHeaders,
191
+ fetch: options.fetch
192
+ });
193
+ const provider = function(modelId) {
194
+ return {
195
+ speech: createSpeechModel(modelId)
196
+ };
197
+ };
198
+ provider.speech = createSpeechModel;
199
+ provider.speechModel = createSpeechModel;
200
+ return provider;
201
+ }
202
+ var lmnt = createLMNT();
203
+ export {
204
+ createLMNT,
205
+ lmnt
206
+ };
207
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lmnt-provider.ts","../src/lmnt-speech-model.ts","../src/lmnt-error.ts"],"sourcesContent":["import { SpeechModelV1, ProviderV1 } from '@ai-sdk/provider';\nimport { FetchFunction, loadApiKey } from '@ai-sdk/provider-utils';\nimport { LMNTSpeechModel } from './lmnt-speech-model';\nimport { LMNTSpeechModelId } from './lmnt-speech-settings';\n\nexport interface LMNTProvider extends Pick<ProviderV1, 'speechModel'> {\n (\n modelId: 'aurora',\n settings?: {},\n ): {\n speech: LMNTSpeechModel;\n };\n\n /**\nCreates a model for speech synthesis.\n */\n speech(modelId: LMNTSpeechModelId): SpeechModelV1;\n}\n\nexport interface LMNTProviderSettings {\n /**\nAPI key for authenticating requests.\n */\n apiKey?: string;\n\n /**\nCustom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\n/**\nCreate an LMNT provider instance.\n */\nexport function createLMNT(options: LMNTProviderSettings = {}): LMNTProvider {\n const getHeaders = () => ({\n 'x-api-key': loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'LMNT_API_KEY',\n description: 'LMNT',\n }),\n ...options.headers,\n });\n\n const createSpeechModel = (modelId: LMNTSpeechModelId) =>\n new LMNTSpeechModel(modelId, {\n provider: `lmnt.speech`,\n url: ({ path }) => `https://api.lmnt.com${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const provider = function (modelId: LMNTSpeechModelId) {\n return {\n speech: createSpeechModel(modelId),\n };\n };\n\n provider.speech = createSpeechModel;\n provider.speechModel = createSpeechModel;\n\n return provider as LMNTProvider;\n}\n\n/**\nDefault LMNT provider instance.\n */\nexport const lmnt = createLMNT();\n","import { SpeechModelV1, SpeechModelV1CallWarning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createBinaryResponseHandler,\n parseProviderOptions,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\nimport { LMNTConfig } from './lmnt-config';\nimport { lmntFailedResponseHandler } from './lmnt-error';\nimport { LMNTSpeechModelId } from './lmnt-speech-settings';\nimport { LMNTSpeechAPITypes } from './lmnt-api-types';\n\n// https://docs.lmnt.com/api-reference/speech/synthesize-speech-bytes\nconst lmntSpeechCallOptionsSchema = z.object({\n /**\n * The model to use for speech synthesis e.g. 'aurora' or 'blizzard'.\n * @default 'aurora'\n */\n model: z\n .union([z.enum(['aurora', 'blizzard']), z.string()])\n .nullish()\n .default('aurora'),\n\n /**\n * The language of the input text.\n * @default 'auto'\n */\n language: z\n .union([z.enum(['auto', 'en']), z.string()])\n .nullish()\n .default('auto'),\n\n /**\n * The audio format of the output.\n * @default 'mp3'\n */\n format: z\n .enum(['aac', 'mp3', 'mulaw', 'raw', 'wav'])\n .nullish()\n .default('mp3'),\n\n /**\n * The sample rate of the output audio in Hz.\n * @default 24000\n */\n sampleRate: z\n .union([z.literal(8000), z.literal(16000), z.literal(24000)])\n .nullish()\n .default(24000),\n\n /**\n * The speed of the speech. Range: 0.25 to 2.\n * @default 1\n */\n speed: z.number().min(0.25).max(2).nullish().default(1),\n\n /**\n * A seed value for deterministic generation.\n */\n seed: z.number().int().nullish(),\n\n /**\n * Whether to use a conversational style.\n * @default false\n */\n conversational: z.boolean().nullish().default(false),\n\n /**\n * Maximum length of the output in seconds (up to 300).\n */\n length: z.number().max(300).nullish(),\n\n /**\n * Top-p sampling parameter. Range: 0 to 1.\n * @default 1\n */\n topP: z.number().min(0).max(1).nullish().default(1),\n\n /**\n * Temperature for sampling. Higher values increase randomness.\n * @default 1\n */\n temperature: z.number().min(0).nullish().default(1),\n});\n\nexport type LMNTSpeechCallOptions = z.infer<typeof lmntSpeechCallOptionsSchema>;\n\ninterface LMNTSpeechModelConfig extends LMNTConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class LMNTSpeechModel implements SpeechModelV1 {\n readonly specificationVersion = 'v1';\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: LMNTSpeechModelId,\n private readonly config: LMNTSpeechModelConfig,\n ) {}\n\n private getArgs({\n text,\n voice = 'ava',\n outputFormat = 'mp3',\n speed,\n providerOptions,\n }: Parameters<SpeechModelV1['doGenerate']>[0]) {\n const warnings: SpeechModelV1CallWarning[] = [];\n\n // Parse provider options\n const lmntOptions = parseProviderOptions({\n provider: 'lmnt',\n providerOptions,\n schema: lmntSpeechCallOptionsSchema,\n });\n\n // Create request body\n const requestBody: Record<string, unknown> = {\n model: this.modelId,\n text,\n voice,\n response_format: 'mp3',\n speed,\n };\n\n if (outputFormat) {\n if (['mp3', 'aac', 'mulaw', 'raw', 'wav'].includes(outputFormat)) {\n requestBody.response_format = outputFormat;\n } else {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'outputFormat',\n details: `Unsupported output format: ${outputFormat}. Using mp3 instead.`,\n });\n }\n }\n\n // Add provider-specific options\n if (lmntOptions) {\n const speechModelOptions: Omit<LMNTSpeechAPITypes, 'voice' | 'text'> = {\n conversational: lmntOptions.conversational ?? undefined,\n length: lmntOptions.length ?? undefined,\n seed: lmntOptions.seed ?? undefined,\n speed: lmntOptions.speed ?? undefined,\n temperature: lmntOptions.temperature ?? undefined,\n top_p: lmntOptions.topP ?? undefined,\n sample_rate: lmntOptions.sampleRate ?? undefined,\n };\n\n for (const key in speechModelOptions) {\n const value =\n speechModelOptions[\n key as keyof Omit<LMNTSpeechAPITypes, 'voice' | 'text'>\n ];\n if (value !== undefined) {\n requestBody[key] = value;\n }\n }\n }\n\n return {\n requestBody,\n warnings,\n };\n }\n\n async doGenerate(\n options: Parameters<SpeechModelV1['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<SpeechModelV1['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { requestBody, warnings } = this.getArgs(options);\n\n const {\n value: audio,\n responseHeaders,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: this.config.url({\n path: '/v1/ai/speech/bytes',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), options.headers),\n body: requestBody,\n failedResponseHandler: lmntFailedResponseHandler,\n successfulResponseHandler: createBinaryResponseHandler(),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n audio,\n warnings,\n request: {\n body: JSON.stringify(requestBody),\n },\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n body: rawResponse,\n },\n };\n }\n}\n","import { z } from 'zod';\nimport { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\n\nexport const lmntErrorDataSchema = z.object({\n error: z.object({\n message: z.string(),\n code: z.number(),\n }),\n});\n\nexport type LMNTErrorData = z.infer<typeof lmntErrorDataSchema>;\n\nexport const lmntFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: lmntErrorDataSchema,\n errorToMessage: data => data.error.message,\n});\n"],"mappings":"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","names":["z","z"]}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@ai-sdk/lmnt",
3
+ "version": "0.0.1",
4
+ "license": "Apache-2.0",
5
+ "sideEffects": false,
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.mjs",
8
+ "types": "./dist/index.d.ts",
9
+ "files": [
10
+ "dist/**/*",
11
+ "CHANGELOG.md"
12
+ ],
13
+ "exports": {
14
+ "./package.json": "./package.json",
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "import": "./dist/index.mjs",
18
+ "require": "./dist/index.js"
19
+ }
20
+ },
21
+ "dependencies": {
22
+ "@ai-sdk/provider": "1.1.3",
23
+ "@ai-sdk/provider-utils": "2.2.7"
24
+ },
25
+ "devDependencies": {
26
+ "@types/node": "20.17.24",
27
+ "tsup": "^8",
28
+ "typescript": "5.6.3",
29
+ "zod": "3.23.8",
30
+ "@vercel/ai-tsconfig": "0.0.0"
31
+ },
32
+ "peerDependencies": {
33
+ "zod": "^3.0.0"
34
+ },
35
+ "engines": {
36
+ "node": ">=18"
37
+ },
38
+ "publishConfig": {
39
+ "access": "public"
40
+ },
41
+ "homepage": "https://sdk.vercel.ai/docs",
42
+ "repository": {
43
+ "type": "git",
44
+ "url": "git+https://github.com/vercel/ai.git"
45
+ },
46
+ "bugs": {
47
+ "url": "https://github.com/vercel/ai/issues"
48
+ },
49
+ "keywords": [
50
+ "ai"
51
+ ],
52
+ "scripts": {
53
+ "build": "tsup",
54
+ "build:watch": "tsup --watch",
55
+ "clean": "rm -rf dist",
56
+ "lint": "eslint \"./**/*.ts*\"",
57
+ "type-check": "tsc --noEmit",
58
+ "prettier-check": "prettier --check \"./**/*.ts*\"",
59
+ "test": "pnpm test:node && pnpm test:edge",
60
+ "test:edge": "vitest --config vitest.edge.config.js --run",
61
+ "test:node": "vitest --config vitest.node.config.js --run",
62
+ "test:node:watch": "vitest --config vitest.node.config.js --watch"
63
+ }
64
+ }