@ai-sdk/luma 0.1.8 → 1.0.0-alpha.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 +219 -18
- package/dist/index.d.mts +5 -29
- package/dist/index.d.ts +5 -29
- package/dist/index.js +18 -20
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +18 -20
- package/dist/index.mjs.map +1 -1
- package/package.json +12 -10
package/CHANGELOG.md
CHANGED
|
@@ -1,42 +1,243 @@
|
|
|
1
1
|
# @ai-sdk/luma
|
|
2
2
|
|
|
3
|
-
## 0.1
|
|
3
|
+
## 1.0.0-alpha.1
|
|
4
4
|
|
|
5
5
|
### Patch Changes
|
|
6
6
|
|
|
7
|
-
- Updated dependencies [
|
|
8
|
-
- @ai-sdk/provider
|
|
7
|
+
- Updated dependencies [3f2f00c]
|
|
8
|
+
- @ai-sdk/provider@2.0.0-alpha.1
|
|
9
|
+
- @ai-sdk/provider-utils@3.0.0-alpha.1
|
|
9
10
|
|
|
10
|
-
## 0.
|
|
11
|
+
## 1.0.0-canary.19
|
|
11
12
|
|
|
12
13
|
### Patch Changes
|
|
13
14
|
|
|
14
|
-
- Updated dependencies [
|
|
15
|
-
- @ai-sdk/provider@
|
|
16
|
-
- @ai-sdk/provider-utils@2.2.7
|
|
15
|
+
- Updated dependencies [faf8446]
|
|
16
|
+
- @ai-sdk/provider-utils@3.0.0-canary.19
|
|
17
17
|
|
|
18
|
-
## 0.
|
|
18
|
+
## 1.0.0-canary.18
|
|
19
19
|
|
|
20
20
|
### Patch Changes
|
|
21
21
|
|
|
22
|
-
- Updated dependencies [
|
|
23
|
-
- @ai-sdk/provider@
|
|
24
|
-
- @ai-sdk/provider-utils@2.2.6
|
|
22
|
+
- Updated dependencies [40acf9b]
|
|
23
|
+
- @ai-sdk/provider-utils@3.0.0-canary.18
|
|
25
24
|
|
|
26
|
-
## 0.
|
|
25
|
+
## 1.0.0-canary.17
|
|
26
|
+
|
|
27
|
+
### Major Changes
|
|
28
|
+
|
|
29
|
+
- 516be5b: ### Move Image Model Settings into generate options
|
|
30
|
+
|
|
31
|
+
Image Models no longer have settings. Instead, `maxImagesPerCall` can be passed directly to `generateImage()`. All other image settings can be passed to `providerOptions[provider]`.
|
|
32
|
+
|
|
33
|
+
Before
|
|
34
|
+
|
|
35
|
+
```js
|
|
36
|
+
await generateImage({
|
|
37
|
+
model: luma.image('photon-flash-1', {
|
|
38
|
+
maxImagesPerCall: 5,
|
|
39
|
+
pollIntervalMillis: 500,
|
|
40
|
+
}),
|
|
41
|
+
prompt,
|
|
42
|
+
n: 10,
|
|
43
|
+
});
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
After
|
|
47
|
+
|
|
48
|
+
```js
|
|
49
|
+
await generateImage({
|
|
50
|
+
model: luma.image('photon-flash-1'),
|
|
51
|
+
prompt,
|
|
52
|
+
n: 10,
|
|
53
|
+
maxImagesPerCall: 5,
|
|
54
|
+
providerOptions: {
|
|
55
|
+
luma: { pollIntervalMillis: 5 },
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Pull Request: https://github.com/vercel/ai/pull/6180
|
|
27
61
|
|
|
28
62
|
### Patch Changes
|
|
29
63
|
|
|
30
|
-
- Updated dependencies [
|
|
31
|
-
- @ai-sdk/provider-utils@
|
|
32
|
-
|
|
64
|
+
- Updated dependencies [ea7a7c9]
|
|
65
|
+
- @ai-sdk/provider-utils@3.0.0-canary.17
|
|
66
|
+
|
|
67
|
+
## 1.0.0-canary.16
|
|
68
|
+
|
|
69
|
+
### Patch Changes
|
|
70
|
+
|
|
71
|
+
- Updated dependencies [87b828f]
|
|
72
|
+
- @ai-sdk/provider-utils@3.0.0-canary.16
|
|
73
|
+
|
|
74
|
+
## 1.0.0-canary.15
|
|
75
|
+
|
|
76
|
+
### Patch Changes
|
|
77
|
+
|
|
78
|
+
- Updated dependencies [a571d6e]
|
|
79
|
+
- Updated dependencies [a8c8bd5]
|
|
80
|
+
- Updated dependencies [7979f7f]
|
|
81
|
+
- Updated dependencies [41fa418]
|
|
82
|
+
- @ai-sdk/provider-utils@3.0.0-canary.15
|
|
83
|
+
- @ai-sdk/provider@2.0.0-canary.14
|
|
84
|
+
|
|
85
|
+
## 1.0.0-canary.14
|
|
86
|
+
|
|
87
|
+
### Patch Changes
|
|
88
|
+
|
|
89
|
+
- Updated dependencies [957b739]
|
|
90
|
+
- Updated dependencies [9bd5ab5]
|
|
91
|
+
- @ai-sdk/provider-utils@3.0.0-canary.14
|
|
92
|
+
- @ai-sdk/provider@2.0.0-canary.13
|
|
93
|
+
|
|
94
|
+
## 1.0.0-canary.13
|
|
95
|
+
|
|
96
|
+
### Patch Changes
|
|
97
|
+
|
|
98
|
+
- d9209ca: fix (image-model): `specificationVersion: v1` -> `v2`
|
|
99
|
+
- Updated dependencies [7b3ae3f]
|
|
100
|
+
- Updated dependencies [0ff02bb]
|
|
101
|
+
- @ai-sdk/provider@2.0.0-canary.12
|
|
102
|
+
- @ai-sdk/provider-utils@3.0.0-canary.13
|
|
103
|
+
|
|
104
|
+
## 1.0.0-canary.12
|
|
105
|
+
|
|
106
|
+
### Patch Changes
|
|
107
|
+
|
|
108
|
+
- Updated dependencies [9bf7291]
|
|
109
|
+
- Updated dependencies [4617fab]
|
|
110
|
+
- Updated dependencies [e030615]
|
|
111
|
+
- @ai-sdk/provider@2.0.0-canary.11
|
|
112
|
+
- @ai-sdk/provider-utils@3.0.0-canary.12
|
|
113
|
+
|
|
114
|
+
## 1.0.0-canary.11
|
|
115
|
+
|
|
116
|
+
### Patch Changes
|
|
117
|
+
|
|
118
|
+
- 9301f86: refactor (image-model): rename `ImageModelV1` to `ImageModelV2`
|
|
119
|
+
- Updated dependencies [66962ed]
|
|
120
|
+
- Updated dependencies [9301f86]
|
|
121
|
+
- Updated dependencies [a3f768e]
|
|
122
|
+
- @ai-sdk/provider-utils@3.0.0-canary.11
|
|
123
|
+
- @ai-sdk/provider@2.0.0-canary.10
|
|
124
|
+
|
|
125
|
+
## 1.0.0-canary.10
|
|
126
|
+
|
|
127
|
+
### Patch Changes
|
|
128
|
+
|
|
129
|
+
- Updated dependencies [e86be6f]
|
|
130
|
+
- @ai-sdk/provider@2.0.0-canary.9
|
|
131
|
+
- @ai-sdk/provider-utils@3.0.0-canary.10
|
|
132
|
+
|
|
133
|
+
## 1.0.0-canary.9
|
|
134
|
+
|
|
135
|
+
### Patch Changes
|
|
136
|
+
|
|
137
|
+
- Updated dependencies [95857aa]
|
|
138
|
+
- Updated dependencies [7ea4132]
|
|
139
|
+
- @ai-sdk/provider@2.0.0-canary.8
|
|
140
|
+
- @ai-sdk/provider-utils@3.0.0-canary.9
|
|
141
|
+
|
|
142
|
+
## 1.0.0-canary.8
|
|
143
|
+
|
|
144
|
+
### Patch Changes
|
|
145
|
+
|
|
146
|
+
- Updated dependencies [5d142ab]
|
|
147
|
+
- Updated dependencies [b6b43c7]
|
|
148
|
+
- Updated dependencies [8aa9e20]
|
|
149
|
+
- Updated dependencies [3795467]
|
|
150
|
+
- @ai-sdk/provider-utils@3.0.0-canary.8
|
|
151
|
+
- @ai-sdk/provider@2.0.0-canary.7
|
|
152
|
+
|
|
153
|
+
## 1.0.0-canary.7
|
|
154
|
+
|
|
155
|
+
### Patch Changes
|
|
156
|
+
|
|
157
|
+
- Updated dependencies [26735b5]
|
|
158
|
+
- Updated dependencies [443d8ec]
|
|
159
|
+
- Updated dependencies [14c9410]
|
|
160
|
+
- Updated dependencies [d9c98f4]
|
|
161
|
+
- Updated dependencies [c4a2fec]
|
|
162
|
+
- Updated dependencies [0054544]
|
|
163
|
+
- Updated dependencies [9e9c809]
|
|
164
|
+
- Updated dependencies [32831c6]
|
|
165
|
+
- Updated dependencies [d0f9495]
|
|
166
|
+
- Updated dependencies [fd65bc6]
|
|
167
|
+
- Updated dependencies [393138b]
|
|
168
|
+
- Updated dependencies [7182d14]
|
|
169
|
+
- @ai-sdk/provider@2.0.0-canary.6
|
|
170
|
+
- @ai-sdk/provider-utils@3.0.0-canary.7
|
|
171
|
+
|
|
172
|
+
## 1.0.0-canary.6
|
|
173
|
+
|
|
174
|
+
### Patch Changes
|
|
175
|
+
|
|
176
|
+
- Updated dependencies [411e483]
|
|
177
|
+
- Updated dependencies [79457bd]
|
|
178
|
+
- Updated dependencies [ad80501]
|
|
179
|
+
- Updated dependencies [1766ede]
|
|
180
|
+
- Updated dependencies [f10304b]
|
|
181
|
+
- @ai-sdk/provider@2.0.0-canary.5
|
|
182
|
+
- @ai-sdk/provider-utils@3.0.0-canary.6
|
|
183
|
+
|
|
184
|
+
## 1.0.0-canary.5
|
|
185
|
+
|
|
186
|
+
### Patch Changes
|
|
187
|
+
|
|
188
|
+
- Updated dependencies [6f6bb89]
|
|
189
|
+
- @ai-sdk/provider@2.0.0-canary.4
|
|
190
|
+
- @ai-sdk/provider-utils@3.0.0-canary.5
|
|
191
|
+
|
|
192
|
+
## 1.0.0-canary.4
|
|
193
|
+
|
|
194
|
+
### Patch Changes
|
|
195
|
+
|
|
196
|
+
- Updated dependencies [d1a1aa1]
|
|
197
|
+
- @ai-sdk/provider@2.0.0-canary.3
|
|
198
|
+
- @ai-sdk/provider-utils@3.0.0-canary.4
|
|
199
|
+
|
|
200
|
+
## 1.0.0-canary.3
|
|
201
|
+
|
|
202
|
+
### Patch Changes
|
|
203
|
+
|
|
204
|
+
- Updated dependencies [a166433]
|
|
205
|
+
- Updated dependencies [abf9a79]
|
|
206
|
+
- Updated dependencies [9f95b35]
|
|
207
|
+
- Updated dependencies [0a87932]
|
|
208
|
+
- Updated dependencies [6dc848c]
|
|
209
|
+
- @ai-sdk/provider-utils@3.0.0-canary.3
|
|
210
|
+
- @ai-sdk/provider@2.0.0-canary.2
|
|
211
|
+
|
|
212
|
+
## 1.0.0-canary.2
|
|
213
|
+
|
|
214
|
+
### Patch Changes
|
|
215
|
+
|
|
216
|
+
- Updated dependencies [c57e248]
|
|
217
|
+
- Updated dependencies [33f4a6a]
|
|
218
|
+
- @ai-sdk/provider@2.0.0-canary.1
|
|
219
|
+
- @ai-sdk/provider-utils@3.0.0-canary.2
|
|
220
|
+
|
|
221
|
+
## 1.0.0-canary.1
|
|
222
|
+
|
|
223
|
+
### Patch Changes
|
|
224
|
+
|
|
225
|
+
- Updated dependencies [060370c]
|
|
226
|
+
- Updated dependencies [0c0c0b3]
|
|
227
|
+
- Updated dependencies [63d791d]
|
|
228
|
+
- @ai-sdk/provider-utils@3.0.0-canary.1
|
|
229
|
+
|
|
230
|
+
## 1.0.0-canary.0
|
|
231
|
+
|
|
232
|
+
### Major Changes
|
|
33
233
|
|
|
34
|
-
|
|
234
|
+
- d5f588f: AI SDK 5
|
|
35
235
|
|
|
36
236
|
### Patch Changes
|
|
37
237
|
|
|
38
|
-
- Updated dependencies [
|
|
39
|
-
- @ai-sdk/provider-utils@
|
|
238
|
+
- Updated dependencies [d5f588f]
|
|
239
|
+
- @ai-sdk/provider-utils@3.0.0-canary.0
|
|
240
|
+
- @ai-sdk/provider@2.0.0-canary.0
|
|
40
241
|
|
|
41
242
|
## 0.1.3
|
|
42
243
|
|
package/dist/index.d.mts
CHANGED
|
@@ -1,33 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ProviderV2, ImageModelV2 } from '@ai-sdk/provider';
|
|
2
2
|
import { FetchFunction } from '@ai-sdk/provider-utils';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
|
|
5
5
|
type LumaImageModelId = 'photon-1' | 'photon-flash-1' | (string & {});
|
|
6
|
-
/**
|
|
7
|
-
Configuration settings for Luma image generation.
|
|
8
|
-
|
|
9
|
-
Since the Luma API processes images through an asynchronous queue system, these
|
|
10
|
-
settings allow you to tune the polling behavior when waiting for image
|
|
11
|
-
generation to complete.
|
|
12
|
-
*/
|
|
13
|
-
interface LumaImageSettings {
|
|
14
|
-
/**
|
|
15
|
-
Override the maximum number of images per call (default 1)
|
|
16
|
-
*/
|
|
17
|
-
maxImagesPerCall?: number;
|
|
18
|
-
/**
|
|
19
|
-
Override the polling interval in milliseconds (default 500). This controls how
|
|
20
|
-
frequently the API is checked for completed images while they are being
|
|
21
|
-
processed in Luma's queue.
|
|
22
|
-
*/
|
|
23
|
-
pollIntervalMillis?: number;
|
|
24
|
-
/**
|
|
25
|
-
Override the maximum number of polling attempts (default 120). Since image
|
|
26
|
-
generation is queued and processed asynchronously, this limits how long to wait
|
|
27
|
-
for results before timing out.
|
|
28
|
-
*/
|
|
29
|
-
maxPollAttempts?: number;
|
|
30
|
-
}
|
|
31
6
|
|
|
32
7
|
interface LumaProviderSettings {
|
|
33
8
|
/**
|
|
@@ -49,15 +24,16 @@ interface LumaProviderSettings {
|
|
|
49
24
|
*/
|
|
50
25
|
fetch?: FetchFunction;
|
|
51
26
|
}
|
|
52
|
-
interface LumaProvider extends
|
|
27
|
+
interface LumaProvider extends ProviderV2 {
|
|
53
28
|
/**
|
|
54
29
|
Creates a model for image generation.
|
|
30
|
+
@deprecated Use `imageModel` instead.
|
|
55
31
|
*/
|
|
56
|
-
image(modelId: LumaImageModelId
|
|
32
|
+
image(modelId: LumaImageModelId): ImageModelV2;
|
|
57
33
|
/**
|
|
58
34
|
Creates a model for image generation.
|
|
59
35
|
*/
|
|
60
|
-
imageModel(modelId: LumaImageModelId
|
|
36
|
+
imageModel(modelId: LumaImageModelId): ImageModelV2;
|
|
61
37
|
}
|
|
62
38
|
declare function createLuma(options?: LumaProviderSettings): LumaProvider;
|
|
63
39
|
declare const luma: LumaProvider;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,33 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ProviderV2, ImageModelV2 } from '@ai-sdk/provider';
|
|
2
2
|
import { FetchFunction } from '@ai-sdk/provider-utils';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
|
|
5
5
|
type LumaImageModelId = 'photon-1' | 'photon-flash-1' | (string & {});
|
|
6
|
-
/**
|
|
7
|
-
Configuration settings for Luma image generation.
|
|
8
|
-
|
|
9
|
-
Since the Luma API processes images through an asynchronous queue system, these
|
|
10
|
-
settings allow you to tune the polling behavior when waiting for image
|
|
11
|
-
generation to complete.
|
|
12
|
-
*/
|
|
13
|
-
interface LumaImageSettings {
|
|
14
|
-
/**
|
|
15
|
-
Override the maximum number of images per call (default 1)
|
|
16
|
-
*/
|
|
17
|
-
maxImagesPerCall?: number;
|
|
18
|
-
/**
|
|
19
|
-
Override the polling interval in milliseconds (default 500). This controls how
|
|
20
|
-
frequently the API is checked for completed images while they are being
|
|
21
|
-
processed in Luma's queue.
|
|
22
|
-
*/
|
|
23
|
-
pollIntervalMillis?: number;
|
|
24
|
-
/**
|
|
25
|
-
Override the maximum number of polling attempts (default 120). Since image
|
|
26
|
-
generation is queued and processed asynchronously, this limits how long to wait
|
|
27
|
-
for results before timing out.
|
|
28
|
-
*/
|
|
29
|
-
maxPollAttempts?: number;
|
|
30
|
-
}
|
|
31
6
|
|
|
32
7
|
interface LumaProviderSettings {
|
|
33
8
|
/**
|
|
@@ -49,15 +24,16 @@ interface LumaProviderSettings {
|
|
|
49
24
|
*/
|
|
50
25
|
fetch?: FetchFunction;
|
|
51
26
|
}
|
|
52
|
-
interface LumaProvider extends
|
|
27
|
+
interface LumaProvider extends ProviderV2 {
|
|
53
28
|
/**
|
|
54
29
|
Creates a model for image generation.
|
|
30
|
+
@deprecated Use `imageModel` instead.
|
|
55
31
|
*/
|
|
56
|
-
image(modelId: LumaImageModelId
|
|
32
|
+
image(modelId: LumaImageModelId): ImageModelV2;
|
|
57
33
|
/**
|
|
58
34
|
Creates a model for image generation.
|
|
59
35
|
*/
|
|
60
|
-
imageModel(modelId: LumaImageModelId
|
|
36
|
+
imageModel(modelId: LumaImageModelId): ImageModelV2;
|
|
61
37
|
}
|
|
62
38
|
declare function createLuma(options?: LumaProviderSettings): LumaProvider;
|
|
63
39
|
declare const luma: LumaProvider;
|
package/dist/index.js
CHANGED
|
@@ -36,22 +36,17 @@ var import_zod = require("zod");
|
|
|
36
36
|
var DEFAULT_POLL_INTERVAL_MILLIS = 500;
|
|
37
37
|
var DEFAULT_MAX_POLL_ATTEMPTS = 6e4 / DEFAULT_POLL_INTERVAL_MILLIS;
|
|
38
38
|
var LumaImageModel = class {
|
|
39
|
-
constructor(modelId,
|
|
39
|
+
constructor(modelId, config) {
|
|
40
40
|
this.modelId = modelId;
|
|
41
|
-
this.settings = settings;
|
|
42
41
|
this.config = config;
|
|
43
|
-
this.specificationVersion = "
|
|
44
|
-
|
|
45
|
-
this.pollIntervalMillis =
|
|
46
|
-
this.maxPollAttempts =
|
|
42
|
+
this.specificationVersion = "v2";
|
|
43
|
+
this.maxImagesPerCall = 1;
|
|
44
|
+
this.pollIntervalMillis = DEFAULT_POLL_INTERVAL_MILLIS;
|
|
45
|
+
this.maxPollAttempts = DEFAULT_MAX_POLL_ATTEMPTS;
|
|
47
46
|
}
|
|
48
47
|
get provider() {
|
|
49
48
|
return this.config.provider;
|
|
50
49
|
}
|
|
51
|
-
get maxImagesPerCall() {
|
|
52
|
-
var _a;
|
|
53
|
-
return (_a = this.settings.maxImagesPerCall) != null ? _a : 1;
|
|
54
|
-
}
|
|
55
50
|
async doGenerate({
|
|
56
51
|
prompt,
|
|
57
52
|
n,
|
|
@@ -78,7 +73,8 @@ var LumaImageModel = class {
|
|
|
78
73
|
details: "This model does not support the `size` option. Use `aspectRatio` instead."
|
|
79
74
|
});
|
|
80
75
|
}
|
|
81
|
-
const
|
|
76
|
+
const { pollIntervalMillis, maxPollAttempts, ...providerRequestOptions } = (_a = providerOptions.luma) != null ? _a : {};
|
|
77
|
+
const currentDate = (_d = (_c = (_b = this.config._internal) == null ? void 0 : _b.currentDate) == null ? void 0 : _c.call(_b)) != null ? _d : /* @__PURE__ */ new Date();
|
|
82
78
|
const fullHeaders = (0, import_provider_utils.combineHeaders)(this.config.headers(), headers);
|
|
83
79
|
const { value: generationResponse, responseHeaders } = await (0, import_provider_utils.postJsonToApi)({
|
|
84
80
|
url: this.getLumaGenerationsUrl(),
|
|
@@ -87,7 +83,7 @@ var LumaImageModel = class {
|
|
|
87
83
|
prompt,
|
|
88
84
|
...aspectRatio ? { aspect_ratio: aspectRatio } : {},
|
|
89
85
|
model: this.modelId,
|
|
90
|
-
...
|
|
86
|
+
...providerRequestOptions
|
|
91
87
|
},
|
|
92
88
|
abortSignal,
|
|
93
89
|
fetch: this.config.fetch,
|
|
@@ -99,7 +95,8 @@ var LumaImageModel = class {
|
|
|
99
95
|
const imageUrl = await this.pollForImageUrl(
|
|
100
96
|
generationResponse.id,
|
|
101
97
|
fullHeaders,
|
|
102
|
-
abortSignal
|
|
98
|
+
abortSignal,
|
|
99
|
+
providerOptions.luma
|
|
103
100
|
);
|
|
104
101
|
const downloadedImage = await this.downloadImage(imageUrl, abortSignal);
|
|
105
102
|
return {
|
|
@@ -112,11 +109,12 @@ var LumaImageModel = class {
|
|
|
112
109
|
}
|
|
113
110
|
};
|
|
114
111
|
}
|
|
115
|
-
async pollForImageUrl(generationId, headers, abortSignal) {
|
|
116
|
-
var _a;
|
|
117
|
-
let attemptCount = 0;
|
|
112
|
+
async pollForImageUrl(generationId, headers, abortSignal, imageSettings) {
|
|
113
|
+
var _a, _b, _c;
|
|
118
114
|
const url = this.getLumaGenerationsUrl(generationId);
|
|
119
|
-
|
|
115
|
+
const maxPollAttempts = (_a = imageSettings == null ? void 0 : imageSettings.maxPollAttempts) != null ? _a : this.maxPollAttempts;
|
|
116
|
+
const pollIntervalMillis = (_b = imageSettings == null ? void 0 : imageSettings.pollIntervalMillis) != null ? _b : this.pollIntervalMillis;
|
|
117
|
+
for (let i = 0; i < maxPollAttempts; i++) {
|
|
120
118
|
const { value: statusResponse } = await (0, import_provider_utils.getFromApi)({
|
|
121
119
|
url,
|
|
122
120
|
headers,
|
|
@@ -129,7 +127,7 @@ var LumaImageModel = class {
|
|
|
129
127
|
});
|
|
130
128
|
switch (statusResponse.state) {
|
|
131
129
|
case "completed":
|
|
132
|
-
if (!((
|
|
130
|
+
if (!((_c = statusResponse.assets) == null ? void 0 : _c.image)) {
|
|
133
131
|
throw new import_provider.InvalidResponseDataError({
|
|
134
132
|
data: statusResponse,
|
|
135
133
|
message: `Image generation completed but no image was found.`
|
|
@@ -142,7 +140,7 @@ var LumaImageModel = class {
|
|
|
142
140
|
message: `Image generation failed.`
|
|
143
141
|
});
|
|
144
142
|
}
|
|
145
|
-
await (0, import_provider_utils.delay)(
|
|
143
|
+
await (0, import_provider_utils.delay)(pollIntervalMillis);
|
|
146
144
|
}
|
|
147
145
|
throw new Error(
|
|
148
146
|
`Image generation timed out after ${this.maxPollAttempts} attempts.`
|
|
@@ -209,7 +207,7 @@ function createLuma(options = {}) {
|
|
|
209
207
|
})}`,
|
|
210
208
|
...options.headers
|
|
211
209
|
});
|
|
212
|
-
const createImageModel = (modelId
|
|
210
|
+
const createImageModel = (modelId) => new LumaImageModel(modelId, {
|
|
213
211
|
provider: "luma.image",
|
|
214
212
|
baseURL: baseURL != null ? baseURL : defaultBaseURL,
|
|
215
213
|
headers: getHeaders,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/luma-provider.ts","../src/luma-image-model.ts"],"sourcesContent":["export { createLuma, luma } from './luma-provider';\nexport type { LumaProvider, LumaProviderSettings } from './luma-provider';\nexport type { LumaErrorData } from './luma-image-model';\n","import { ImageModelV1, NoSuchModelError, ProviderV1 } from '@ai-sdk/provider';\nimport {\n FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport { LumaImageModel } from './luma-image-model';\nimport { LumaImageModelId, LumaImageSettings } from './luma-image-settings';\n\nexport interface LumaProviderSettings {\n /**\nLuma API key. Default value is taken from the `LUMA_API_KEY` environment\nvariable.\n */\n apiKey?: string;\n /**\nBase URL for the API calls.\n */\n baseURL?: string;\n /**\nCustom headers to include in the requests.\n */\n headers?: Record<string, string>;\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\nexport interface LumaProvider extends ProviderV1 {\n /**\nCreates a model for image generation.\n */\n image(modelId: LumaImageModelId, settings?: LumaImageSettings): ImageModelV1;\n\n /**\nCreates a model for image generation.\n */\n imageModel(\n modelId: LumaImageModelId,\n settings?: LumaImageSettings,\n ): ImageModelV1;\n}\n\nconst defaultBaseURL = 'https://api.lumalabs.ai';\n\nexport function createLuma(options: LumaProviderSettings = {}): LumaProvider {\n const baseURL = withoutTrailingSlash(options.baseURL ?? defaultBaseURL);\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'LUMA_API_KEY',\n description: 'Luma',\n })}`,\n ...options.headers,\n });\n\n const createImageModel = (\n modelId: LumaImageModelId,\n settings: LumaImageSettings = {},\n ) =>\n new LumaImageModel(modelId, settings, {\n provider: 'luma.image',\n baseURL: baseURL ?? defaultBaseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n return {\n image: createImageModel,\n imageModel: createImageModel,\n languageModel: () => {\n throw new NoSuchModelError({\n modelId: 'languageModel',\n modelType: 'languageModel',\n });\n },\n textEmbeddingModel: () => {\n throw new NoSuchModelError({\n modelId: 'textEmbeddingModel',\n modelType: 'textEmbeddingModel',\n });\n },\n };\n}\n\nexport const luma = createLuma();\n","import {\n ImageModelV1,\n ImageModelV1CallWarning,\n InvalidResponseDataError,\n} from '@ai-sdk/provider';\nimport {\n FetchFunction,\n combineHeaders,\n createBinaryResponseHandler,\n createJsonResponseHandler,\n createJsonErrorResponseHandler,\n createStatusCodeErrorResponseHandler,\n delay,\n getFromApi,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { LumaImageSettings } from './luma-image-settings';\nimport { z } from 'zod';\n\nconst DEFAULT_POLL_INTERVAL_MILLIS = 500;\nconst DEFAULT_MAX_POLL_ATTEMPTS = 60000 / DEFAULT_POLL_INTERVAL_MILLIS;\n\ninterface LumaImageModelConfig {\n provider: string;\n baseURL: string;\n headers: () => Record<string, string>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class LumaImageModel implements ImageModelV1 {\n readonly specificationVersion = 'v1';\n\n private readonly pollIntervalMillis: number;\n private readonly maxPollAttempts: number;\n\n get provider(): string {\n return this.config.provider;\n }\n\n get maxImagesPerCall(): number {\n return this.settings.maxImagesPerCall ?? 1;\n }\n\n constructor(\n readonly modelId: string,\n private readonly settings: LumaImageSettings,\n private readonly config: LumaImageModelConfig,\n ) {\n this.pollIntervalMillis =\n settings.pollIntervalMillis ?? DEFAULT_POLL_INTERVAL_MILLIS;\n this.maxPollAttempts =\n settings.maxPollAttempts ?? DEFAULT_MAX_POLL_ATTEMPTS;\n }\n\n async doGenerate({\n prompt,\n n,\n size,\n aspectRatio,\n seed,\n providerOptions,\n headers,\n abortSignal,\n }: Parameters<ImageModelV1['doGenerate']>[0]): Promise<\n Awaited<ReturnType<ImageModelV1['doGenerate']>>\n > {\n const warnings: Array<ImageModelV1CallWarning> = [];\n\n if (seed != null) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'seed',\n details: 'This model does not support the `seed` option.',\n });\n }\n\n if (size != null) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'size',\n details:\n 'This model does not support the `size` option. Use `aspectRatio` instead.',\n });\n }\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const fullHeaders = combineHeaders(this.config.headers(), headers);\n const { value: generationResponse, responseHeaders } = await postJsonToApi({\n url: this.getLumaGenerationsUrl(),\n headers: fullHeaders,\n body: {\n prompt,\n ...(aspectRatio ? { aspect_ratio: aspectRatio } : {}),\n model: this.modelId,\n ...(providerOptions.luma ?? {}),\n },\n abortSignal,\n fetch: this.config.fetch,\n failedResponseHandler: this.createLumaErrorHandler(),\n successfulResponseHandler: createJsonResponseHandler(\n lumaGenerationResponseSchema,\n ),\n });\n\n const imageUrl = await this.pollForImageUrl(\n generationResponse.id,\n fullHeaders,\n abortSignal,\n );\n\n const downloadedImage = await this.downloadImage(imageUrl, abortSignal);\n\n return {\n images: [downloadedImage],\n warnings,\n response: {\n modelId: this.modelId,\n timestamp: currentDate,\n headers: responseHeaders,\n },\n };\n }\n\n private async pollForImageUrl(\n generationId: string,\n headers: Record<string, string | undefined>,\n abortSignal: AbortSignal | undefined,\n ): Promise<string> {\n let attemptCount = 0;\n const url = this.getLumaGenerationsUrl(generationId);\n for (let i = 0; i < this.maxPollAttempts; i++) {\n const { value: statusResponse } = await getFromApi({\n url,\n headers,\n abortSignal,\n fetch: this.config.fetch,\n failedResponseHandler: this.createLumaErrorHandler(),\n successfulResponseHandler: createJsonResponseHandler(\n lumaGenerationResponseSchema,\n ),\n });\n\n switch (statusResponse.state) {\n case 'completed':\n if (!statusResponse.assets?.image) {\n throw new InvalidResponseDataError({\n data: statusResponse,\n message: `Image generation completed but no image was found.`,\n });\n }\n return statusResponse.assets.image;\n case 'failed':\n throw new InvalidResponseDataError({\n data: statusResponse,\n message: `Image generation failed.`,\n });\n }\n await delay(this.pollIntervalMillis);\n }\n\n throw new Error(\n `Image generation timed out after ${this.maxPollAttempts} attempts.`,\n );\n }\n\n private createLumaErrorHandler() {\n return createJsonErrorResponseHandler({\n errorSchema: lumaErrorSchema,\n errorToMessage: (error: LumaErrorData) =>\n error.detail[0].msg ?? 'Unknown error',\n });\n }\n\n private getLumaGenerationsUrl(generationId?: string) {\n return `${this.config.baseURL}/dream-machine/v1/generations/${\n generationId ?? 'image'\n }`;\n }\n\n private async downloadImage(\n url: string,\n abortSignal: AbortSignal | undefined,\n ): Promise<Uint8Array> {\n const { value: response } = await getFromApi({\n url,\n // No specific headers should be needed for this request as it's a\n // generated image provided by Luma.\n abortSignal,\n failedResponseHandler: createStatusCodeErrorResponseHandler(),\n successfulResponseHandler: createBinaryResponseHandler(),\n fetch: this.config.fetch,\n });\n return response;\n }\n}\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst lumaGenerationResponseSchema = z.object({\n id: z.string(),\n state: z.enum(['queued', 'dreaming', 'completed', 'failed']),\n failure_reason: z.string().nullish(),\n assets: z\n .object({\n image: z.string(), // URL of the generated image\n })\n .nullish(),\n});\n\nconst lumaErrorSchema = z.object({\n detail: z.array(\n z.object({\n type: z.string(),\n loc: z.array(z.string()),\n msg: z.string(),\n input: z.string(),\n ctx: z\n .object({\n expected: z.string(),\n })\n .nullish(),\n }),\n ),\n});\n\nexport type LumaErrorData = z.infer<typeof lumaErrorSchema>;\n"],"mappings":"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","names":["import_provider","import_provider_utils"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/luma-provider.ts","../src/luma-image-model.ts"],"sourcesContent":["export { createLuma, luma } from './luma-provider';\nexport type { LumaProvider, LumaProviderSettings } from './luma-provider';\nexport type { LumaErrorData } from './luma-image-model';\n","import { ImageModelV2, NoSuchModelError, ProviderV2 } from '@ai-sdk/provider';\nimport {\n FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport { LumaImageModel } from './luma-image-model';\nimport { LumaImageModelId } from './luma-image-settings';\n\nexport interface LumaProviderSettings {\n /**\nLuma API key. Default value is taken from the `LUMA_API_KEY` environment\nvariable.\n */\n apiKey?: string;\n /**\nBase URL for the API calls.\n */\n baseURL?: string;\n /**\nCustom headers to include in the requests.\n */\n headers?: Record<string, string>;\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\nexport interface LumaProvider extends ProviderV2 {\n /**\nCreates a model for image generation.\n@deprecated Use `imageModel` instead.\n */\n image(modelId: LumaImageModelId): ImageModelV2;\n\n /**\nCreates a model for image generation.\n */\n imageModel(modelId: LumaImageModelId): ImageModelV2;\n}\n\nconst defaultBaseURL = 'https://api.lumalabs.ai';\n\nexport function createLuma(options: LumaProviderSettings = {}): LumaProvider {\n const baseURL = withoutTrailingSlash(options.baseURL ?? defaultBaseURL);\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'LUMA_API_KEY',\n description: 'Luma',\n })}`,\n ...options.headers,\n });\n\n const createImageModel = (modelId: LumaImageModelId) =>\n new LumaImageModel(modelId, {\n provider: 'luma.image',\n baseURL: baseURL ?? defaultBaseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n return {\n image: createImageModel,\n imageModel: createImageModel,\n languageModel: () => {\n throw new NoSuchModelError({\n modelId: 'languageModel',\n modelType: 'languageModel',\n });\n },\n textEmbeddingModel: () => {\n throw new NoSuchModelError({\n modelId: 'textEmbeddingModel',\n modelType: 'textEmbeddingModel',\n });\n },\n };\n}\n\nexport const luma = createLuma();\n","import {\n ImageModelV2,\n ImageModelV2CallWarning,\n InvalidResponseDataError,\n} from '@ai-sdk/provider';\nimport {\n FetchFunction,\n combineHeaders,\n createBinaryResponseHandler,\n createJsonResponseHandler,\n createJsonErrorResponseHandler,\n createStatusCodeErrorResponseHandler,\n delay,\n getFromApi,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { LumaImageSettings } from './luma-image-settings';\nimport { z } from 'zod';\n\nconst DEFAULT_POLL_INTERVAL_MILLIS = 500;\nconst DEFAULT_MAX_POLL_ATTEMPTS = 60000 / DEFAULT_POLL_INTERVAL_MILLIS;\n\ninterface LumaImageModelConfig {\n provider: string;\n baseURL: string;\n headers: () => Record<string, string>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class LumaImageModel implements ImageModelV2 {\n readonly specificationVersion = 'v2';\n readonly maxImagesPerCall = 1;\n readonly pollIntervalMillis = DEFAULT_POLL_INTERVAL_MILLIS;\n readonly maxPollAttempts = DEFAULT_MAX_POLL_ATTEMPTS;\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: string,\n private readonly config: LumaImageModelConfig,\n ) {}\n\n async doGenerate({\n prompt,\n n,\n size,\n aspectRatio,\n seed,\n providerOptions,\n headers,\n abortSignal,\n }: Parameters<ImageModelV2['doGenerate']>[0]): Promise<\n Awaited<ReturnType<ImageModelV2['doGenerate']>>\n > {\n const warnings: Array<ImageModelV2CallWarning> = [];\n\n if (seed != null) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'seed',\n details: 'This model does not support the `seed` option.',\n });\n }\n\n if (size != null) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'size',\n details:\n 'This model does not support the `size` option. Use `aspectRatio` instead.',\n });\n }\n\n // remove non-request options from providerOptions\n const { pollIntervalMillis, maxPollAttempts, ...providerRequestOptions } =\n providerOptions.luma ?? {};\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const fullHeaders = combineHeaders(this.config.headers(), headers);\n const { value: generationResponse, responseHeaders } = await postJsonToApi({\n url: this.getLumaGenerationsUrl(),\n headers: fullHeaders,\n body: {\n prompt,\n ...(aspectRatio ? { aspect_ratio: aspectRatio } : {}),\n model: this.modelId,\n ...providerRequestOptions,\n },\n abortSignal,\n fetch: this.config.fetch,\n failedResponseHandler: this.createLumaErrorHandler(),\n successfulResponseHandler: createJsonResponseHandler(\n lumaGenerationResponseSchema,\n ),\n });\n\n const imageUrl = await this.pollForImageUrl(\n generationResponse.id,\n fullHeaders,\n abortSignal,\n providerOptions.luma,\n );\n\n const downloadedImage = await this.downloadImage(imageUrl, abortSignal);\n\n return {\n images: [downloadedImage],\n warnings,\n response: {\n modelId: this.modelId,\n timestamp: currentDate,\n headers: responseHeaders,\n },\n };\n }\n\n private async pollForImageUrl(\n generationId: string,\n headers: Record<string, string | undefined>,\n abortSignal: AbortSignal | undefined,\n imageSettings?: LumaImageSettings,\n ): Promise<string> {\n const url = this.getLumaGenerationsUrl(generationId);\n const maxPollAttempts =\n imageSettings?.maxPollAttempts ?? this.maxPollAttempts;\n const pollIntervalMillis =\n imageSettings?.pollIntervalMillis ?? this.pollIntervalMillis;\n\n for (let i = 0; i < maxPollAttempts; i++) {\n const { value: statusResponse } = await getFromApi({\n url,\n headers,\n abortSignal,\n fetch: this.config.fetch,\n failedResponseHandler: this.createLumaErrorHandler(),\n successfulResponseHandler: createJsonResponseHandler(\n lumaGenerationResponseSchema,\n ),\n });\n\n switch (statusResponse.state) {\n case 'completed':\n if (!statusResponse.assets?.image) {\n throw new InvalidResponseDataError({\n data: statusResponse,\n message: `Image generation completed but no image was found.`,\n });\n }\n return statusResponse.assets.image;\n case 'failed':\n throw new InvalidResponseDataError({\n data: statusResponse,\n message: `Image generation failed.`,\n });\n }\n await delay(pollIntervalMillis);\n }\n\n throw new Error(\n `Image generation timed out after ${this.maxPollAttempts} attempts.`,\n );\n }\n\n private createLumaErrorHandler() {\n return createJsonErrorResponseHandler({\n errorSchema: lumaErrorSchema,\n errorToMessage: (error: LumaErrorData) =>\n error.detail[0].msg ?? 'Unknown error',\n });\n }\n\n private getLumaGenerationsUrl(generationId?: string) {\n return `${this.config.baseURL}/dream-machine/v1/generations/${\n generationId ?? 'image'\n }`;\n }\n\n private async downloadImage(\n url: string,\n abortSignal: AbortSignal | undefined,\n ): Promise<Uint8Array> {\n const { value: response } = await getFromApi({\n url,\n // No specific headers should be needed for this request as it's a\n // generated image provided by Luma.\n abortSignal,\n failedResponseHandler: createStatusCodeErrorResponseHandler(),\n successfulResponseHandler: createBinaryResponseHandler(),\n fetch: this.config.fetch,\n });\n return response;\n }\n}\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst lumaGenerationResponseSchema = z.object({\n id: z.string(),\n state: z.enum(['queued', 'dreaming', 'completed', 'failed']),\n failure_reason: z.string().nullish(),\n assets: z\n .object({\n image: z.string(), // URL of the generated image\n })\n .nullish(),\n});\n\nconst lumaErrorSchema = z.object({\n detail: z.array(\n z.object({\n type: z.string(),\n loc: z.array(z.string()),\n msg: z.string(),\n input: z.string(),\n ctx: z\n .object({\n expected: z.string(),\n })\n .nullish(),\n }),\n ),\n});\n\nexport type LumaErrorData = z.infer<typeof lumaErrorSchema>;\n"],"mappings":"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","names":["import_provider","import_provider_utils"]}
|
package/dist/index.mjs
CHANGED
|
@@ -23,22 +23,17 @@ import { z } from "zod";
|
|
|
23
23
|
var DEFAULT_POLL_INTERVAL_MILLIS = 500;
|
|
24
24
|
var DEFAULT_MAX_POLL_ATTEMPTS = 6e4 / DEFAULT_POLL_INTERVAL_MILLIS;
|
|
25
25
|
var LumaImageModel = class {
|
|
26
|
-
constructor(modelId,
|
|
26
|
+
constructor(modelId, config) {
|
|
27
27
|
this.modelId = modelId;
|
|
28
|
-
this.settings = settings;
|
|
29
28
|
this.config = config;
|
|
30
|
-
this.specificationVersion = "
|
|
31
|
-
|
|
32
|
-
this.pollIntervalMillis =
|
|
33
|
-
this.maxPollAttempts =
|
|
29
|
+
this.specificationVersion = "v2";
|
|
30
|
+
this.maxImagesPerCall = 1;
|
|
31
|
+
this.pollIntervalMillis = DEFAULT_POLL_INTERVAL_MILLIS;
|
|
32
|
+
this.maxPollAttempts = DEFAULT_MAX_POLL_ATTEMPTS;
|
|
34
33
|
}
|
|
35
34
|
get provider() {
|
|
36
35
|
return this.config.provider;
|
|
37
36
|
}
|
|
38
|
-
get maxImagesPerCall() {
|
|
39
|
-
var _a;
|
|
40
|
-
return (_a = this.settings.maxImagesPerCall) != null ? _a : 1;
|
|
41
|
-
}
|
|
42
37
|
async doGenerate({
|
|
43
38
|
prompt,
|
|
44
39
|
n,
|
|
@@ -65,7 +60,8 @@ var LumaImageModel = class {
|
|
|
65
60
|
details: "This model does not support the `size` option. Use `aspectRatio` instead."
|
|
66
61
|
});
|
|
67
62
|
}
|
|
68
|
-
const
|
|
63
|
+
const { pollIntervalMillis, maxPollAttempts, ...providerRequestOptions } = (_a = providerOptions.luma) != null ? _a : {};
|
|
64
|
+
const currentDate = (_d = (_c = (_b = this.config._internal) == null ? void 0 : _b.currentDate) == null ? void 0 : _c.call(_b)) != null ? _d : /* @__PURE__ */ new Date();
|
|
69
65
|
const fullHeaders = combineHeaders(this.config.headers(), headers);
|
|
70
66
|
const { value: generationResponse, responseHeaders } = await postJsonToApi({
|
|
71
67
|
url: this.getLumaGenerationsUrl(),
|
|
@@ -74,7 +70,7 @@ var LumaImageModel = class {
|
|
|
74
70
|
prompt,
|
|
75
71
|
...aspectRatio ? { aspect_ratio: aspectRatio } : {},
|
|
76
72
|
model: this.modelId,
|
|
77
|
-
...
|
|
73
|
+
...providerRequestOptions
|
|
78
74
|
},
|
|
79
75
|
abortSignal,
|
|
80
76
|
fetch: this.config.fetch,
|
|
@@ -86,7 +82,8 @@ var LumaImageModel = class {
|
|
|
86
82
|
const imageUrl = await this.pollForImageUrl(
|
|
87
83
|
generationResponse.id,
|
|
88
84
|
fullHeaders,
|
|
89
|
-
abortSignal
|
|
85
|
+
abortSignal,
|
|
86
|
+
providerOptions.luma
|
|
90
87
|
);
|
|
91
88
|
const downloadedImage = await this.downloadImage(imageUrl, abortSignal);
|
|
92
89
|
return {
|
|
@@ -99,11 +96,12 @@ var LumaImageModel = class {
|
|
|
99
96
|
}
|
|
100
97
|
};
|
|
101
98
|
}
|
|
102
|
-
async pollForImageUrl(generationId, headers, abortSignal) {
|
|
103
|
-
var _a;
|
|
104
|
-
let attemptCount = 0;
|
|
99
|
+
async pollForImageUrl(generationId, headers, abortSignal, imageSettings) {
|
|
100
|
+
var _a, _b, _c;
|
|
105
101
|
const url = this.getLumaGenerationsUrl(generationId);
|
|
106
|
-
|
|
102
|
+
const maxPollAttempts = (_a = imageSettings == null ? void 0 : imageSettings.maxPollAttempts) != null ? _a : this.maxPollAttempts;
|
|
103
|
+
const pollIntervalMillis = (_b = imageSettings == null ? void 0 : imageSettings.pollIntervalMillis) != null ? _b : this.pollIntervalMillis;
|
|
104
|
+
for (let i = 0; i < maxPollAttempts; i++) {
|
|
107
105
|
const { value: statusResponse } = await getFromApi({
|
|
108
106
|
url,
|
|
109
107
|
headers,
|
|
@@ -116,7 +114,7 @@ var LumaImageModel = class {
|
|
|
116
114
|
});
|
|
117
115
|
switch (statusResponse.state) {
|
|
118
116
|
case "completed":
|
|
119
|
-
if (!((
|
|
117
|
+
if (!((_c = statusResponse.assets) == null ? void 0 : _c.image)) {
|
|
120
118
|
throw new InvalidResponseDataError({
|
|
121
119
|
data: statusResponse,
|
|
122
120
|
message: `Image generation completed but no image was found.`
|
|
@@ -129,7 +127,7 @@ var LumaImageModel = class {
|
|
|
129
127
|
message: `Image generation failed.`
|
|
130
128
|
});
|
|
131
129
|
}
|
|
132
|
-
await delay(
|
|
130
|
+
await delay(pollIntervalMillis);
|
|
133
131
|
}
|
|
134
132
|
throw new Error(
|
|
135
133
|
`Image generation timed out after ${this.maxPollAttempts} attempts.`
|
|
@@ -196,7 +194,7 @@ function createLuma(options = {}) {
|
|
|
196
194
|
})}`,
|
|
197
195
|
...options.headers
|
|
198
196
|
});
|
|
199
|
-
const createImageModel = (modelId
|
|
197
|
+
const createImageModel = (modelId) => new LumaImageModel(modelId, {
|
|
200
198
|
provider: "luma.image",
|
|
201
199
|
baseURL: baseURL != null ? baseURL : defaultBaseURL,
|
|
202
200
|
headers: getHeaders,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/luma-provider.ts","../src/luma-image-model.ts"],"sourcesContent":["import { ImageModelV1, NoSuchModelError, ProviderV1 } from '@ai-sdk/provider';\nimport {\n FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport { LumaImageModel } from './luma-image-model';\nimport { LumaImageModelId, LumaImageSettings } from './luma-image-settings';\n\nexport interface LumaProviderSettings {\n /**\nLuma API key. Default value is taken from the `LUMA_API_KEY` environment\nvariable.\n */\n apiKey?: string;\n /**\nBase URL for the API calls.\n */\n baseURL?: string;\n /**\nCustom headers to include in the requests.\n */\n headers?: Record<string, string>;\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\nexport interface LumaProvider extends ProviderV1 {\n /**\nCreates a model for image generation.\n */\n image(modelId: LumaImageModelId, settings?: LumaImageSettings): ImageModelV1;\n\n /**\nCreates a model for image generation.\n */\n imageModel(\n modelId: LumaImageModelId,\n settings?: LumaImageSettings,\n ): ImageModelV1;\n}\n\nconst defaultBaseURL = 'https://api.lumalabs.ai';\n\nexport function createLuma(options: LumaProviderSettings = {}): LumaProvider {\n const baseURL = withoutTrailingSlash(options.baseURL ?? defaultBaseURL);\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'LUMA_API_KEY',\n description: 'Luma',\n })}`,\n ...options.headers,\n });\n\n const createImageModel = (\n modelId: LumaImageModelId,\n settings: LumaImageSettings = {},\n ) =>\n new LumaImageModel(modelId, settings, {\n provider: 'luma.image',\n baseURL: baseURL ?? defaultBaseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n return {\n image: createImageModel,\n imageModel: createImageModel,\n languageModel: () => {\n throw new NoSuchModelError({\n modelId: 'languageModel',\n modelType: 'languageModel',\n });\n },\n textEmbeddingModel: () => {\n throw new NoSuchModelError({\n modelId: 'textEmbeddingModel',\n modelType: 'textEmbeddingModel',\n });\n },\n };\n}\n\nexport const luma = createLuma();\n","import {\n ImageModelV1,\n ImageModelV1CallWarning,\n InvalidResponseDataError,\n} from '@ai-sdk/provider';\nimport {\n FetchFunction,\n combineHeaders,\n createBinaryResponseHandler,\n createJsonResponseHandler,\n createJsonErrorResponseHandler,\n createStatusCodeErrorResponseHandler,\n delay,\n getFromApi,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { LumaImageSettings } from './luma-image-settings';\nimport { z } from 'zod';\n\nconst DEFAULT_POLL_INTERVAL_MILLIS = 500;\nconst DEFAULT_MAX_POLL_ATTEMPTS = 60000 / DEFAULT_POLL_INTERVAL_MILLIS;\n\ninterface LumaImageModelConfig {\n provider: string;\n baseURL: string;\n headers: () => Record<string, string>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class LumaImageModel implements ImageModelV1 {\n readonly specificationVersion = 'v1';\n\n private readonly pollIntervalMillis: number;\n private readonly maxPollAttempts: number;\n\n get provider(): string {\n return this.config.provider;\n }\n\n get maxImagesPerCall(): number {\n return this.settings.maxImagesPerCall ?? 1;\n }\n\n constructor(\n readonly modelId: string,\n private readonly settings: LumaImageSettings,\n private readonly config: LumaImageModelConfig,\n ) {\n this.pollIntervalMillis =\n settings.pollIntervalMillis ?? DEFAULT_POLL_INTERVAL_MILLIS;\n this.maxPollAttempts =\n settings.maxPollAttempts ?? DEFAULT_MAX_POLL_ATTEMPTS;\n }\n\n async doGenerate({\n prompt,\n n,\n size,\n aspectRatio,\n seed,\n providerOptions,\n headers,\n abortSignal,\n }: Parameters<ImageModelV1['doGenerate']>[0]): Promise<\n Awaited<ReturnType<ImageModelV1['doGenerate']>>\n > {\n const warnings: Array<ImageModelV1CallWarning> = [];\n\n if (seed != null) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'seed',\n details: 'This model does not support the `seed` option.',\n });\n }\n\n if (size != null) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'size',\n details:\n 'This model does not support the `size` option. Use `aspectRatio` instead.',\n });\n }\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const fullHeaders = combineHeaders(this.config.headers(), headers);\n const { value: generationResponse, responseHeaders } = await postJsonToApi({\n url: this.getLumaGenerationsUrl(),\n headers: fullHeaders,\n body: {\n prompt,\n ...(aspectRatio ? { aspect_ratio: aspectRatio } : {}),\n model: this.modelId,\n ...(providerOptions.luma ?? {}),\n },\n abortSignal,\n fetch: this.config.fetch,\n failedResponseHandler: this.createLumaErrorHandler(),\n successfulResponseHandler: createJsonResponseHandler(\n lumaGenerationResponseSchema,\n ),\n });\n\n const imageUrl = await this.pollForImageUrl(\n generationResponse.id,\n fullHeaders,\n abortSignal,\n );\n\n const downloadedImage = await this.downloadImage(imageUrl, abortSignal);\n\n return {\n images: [downloadedImage],\n warnings,\n response: {\n modelId: this.modelId,\n timestamp: currentDate,\n headers: responseHeaders,\n },\n };\n }\n\n private async pollForImageUrl(\n generationId: string,\n headers: Record<string, string | undefined>,\n abortSignal: AbortSignal | undefined,\n ): Promise<string> {\n let attemptCount = 0;\n const url = this.getLumaGenerationsUrl(generationId);\n for (let i = 0; i < this.maxPollAttempts; i++) {\n const { value: statusResponse } = await getFromApi({\n url,\n headers,\n abortSignal,\n fetch: this.config.fetch,\n failedResponseHandler: this.createLumaErrorHandler(),\n successfulResponseHandler: createJsonResponseHandler(\n lumaGenerationResponseSchema,\n ),\n });\n\n switch (statusResponse.state) {\n case 'completed':\n if (!statusResponse.assets?.image) {\n throw new InvalidResponseDataError({\n data: statusResponse,\n message: `Image generation completed but no image was found.`,\n });\n }\n return statusResponse.assets.image;\n case 'failed':\n throw new InvalidResponseDataError({\n data: statusResponse,\n message: `Image generation failed.`,\n });\n }\n await delay(this.pollIntervalMillis);\n }\n\n throw new Error(\n `Image generation timed out after ${this.maxPollAttempts} attempts.`,\n );\n }\n\n private createLumaErrorHandler() {\n return createJsonErrorResponseHandler({\n errorSchema: lumaErrorSchema,\n errorToMessage: (error: LumaErrorData) =>\n error.detail[0].msg ?? 'Unknown error',\n });\n }\n\n private getLumaGenerationsUrl(generationId?: string) {\n return `${this.config.baseURL}/dream-machine/v1/generations/${\n generationId ?? 'image'\n }`;\n }\n\n private async downloadImage(\n url: string,\n abortSignal: AbortSignal | undefined,\n ): Promise<Uint8Array> {\n const { value: response } = await getFromApi({\n url,\n // No specific headers should be needed for this request as it's a\n // generated image provided by Luma.\n abortSignal,\n failedResponseHandler: createStatusCodeErrorResponseHandler(),\n successfulResponseHandler: createBinaryResponseHandler(),\n fetch: this.config.fetch,\n });\n return response;\n }\n}\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst lumaGenerationResponseSchema = z.object({\n id: z.string(),\n state: z.enum(['queued', 'dreaming', 'completed', 'failed']),\n failure_reason: z.string().nullish(),\n assets: z\n .object({\n image: z.string(), // URL of the generated image\n })\n .nullish(),\n});\n\nconst lumaErrorSchema = z.object({\n detail: z.array(\n z.object({\n type: z.string(),\n loc: z.array(z.string()),\n msg: z.string(),\n input: z.string(),\n ctx: z\n .object({\n expected: z.string(),\n })\n .nullish(),\n }),\n ),\n});\n\nexport type LumaErrorData = z.infer<typeof lumaErrorSchema>;\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/luma-provider.ts","../src/luma-image-model.ts"],"sourcesContent":["import { ImageModelV2, NoSuchModelError, ProviderV2 } from '@ai-sdk/provider';\nimport {\n FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport { LumaImageModel } from './luma-image-model';\nimport { LumaImageModelId } from './luma-image-settings';\n\nexport interface LumaProviderSettings {\n /**\nLuma API key. Default value is taken from the `LUMA_API_KEY` environment\nvariable.\n */\n apiKey?: string;\n /**\nBase URL for the API calls.\n */\n baseURL?: string;\n /**\nCustom headers to include in the requests.\n */\n headers?: Record<string, string>;\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\nexport interface LumaProvider extends ProviderV2 {\n /**\nCreates a model for image generation.\n@deprecated Use `imageModel` instead.\n */\n image(modelId: LumaImageModelId): ImageModelV2;\n\n /**\nCreates a model for image generation.\n */\n imageModel(modelId: LumaImageModelId): ImageModelV2;\n}\n\nconst defaultBaseURL = 'https://api.lumalabs.ai';\n\nexport function createLuma(options: LumaProviderSettings = {}): LumaProvider {\n const baseURL = withoutTrailingSlash(options.baseURL ?? defaultBaseURL);\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'LUMA_API_KEY',\n description: 'Luma',\n })}`,\n ...options.headers,\n });\n\n const createImageModel = (modelId: LumaImageModelId) =>\n new LumaImageModel(modelId, {\n provider: 'luma.image',\n baseURL: baseURL ?? defaultBaseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n return {\n image: createImageModel,\n imageModel: createImageModel,\n languageModel: () => {\n throw new NoSuchModelError({\n modelId: 'languageModel',\n modelType: 'languageModel',\n });\n },\n textEmbeddingModel: () => {\n throw new NoSuchModelError({\n modelId: 'textEmbeddingModel',\n modelType: 'textEmbeddingModel',\n });\n },\n };\n}\n\nexport const luma = createLuma();\n","import {\n ImageModelV2,\n ImageModelV2CallWarning,\n InvalidResponseDataError,\n} from '@ai-sdk/provider';\nimport {\n FetchFunction,\n combineHeaders,\n createBinaryResponseHandler,\n createJsonResponseHandler,\n createJsonErrorResponseHandler,\n createStatusCodeErrorResponseHandler,\n delay,\n getFromApi,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { LumaImageSettings } from './luma-image-settings';\nimport { z } from 'zod';\n\nconst DEFAULT_POLL_INTERVAL_MILLIS = 500;\nconst DEFAULT_MAX_POLL_ATTEMPTS = 60000 / DEFAULT_POLL_INTERVAL_MILLIS;\n\ninterface LumaImageModelConfig {\n provider: string;\n baseURL: string;\n headers: () => Record<string, string>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class LumaImageModel implements ImageModelV2 {\n readonly specificationVersion = 'v2';\n readonly maxImagesPerCall = 1;\n readonly pollIntervalMillis = DEFAULT_POLL_INTERVAL_MILLIS;\n readonly maxPollAttempts = DEFAULT_MAX_POLL_ATTEMPTS;\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: string,\n private readonly config: LumaImageModelConfig,\n ) {}\n\n async doGenerate({\n prompt,\n n,\n size,\n aspectRatio,\n seed,\n providerOptions,\n headers,\n abortSignal,\n }: Parameters<ImageModelV2['doGenerate']>[0]): Promise<\n Awaited<ReturnType<ImageModelV2['doGenerate']>>\n > {\n const warnings: Array<ImageModelV2CallWarning> = [];\n\n if (seed != null) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'seed',\n details: 'This model does not support the `seed` option.',\n });\n }\n\n if (size != null) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'size',\n details:\n 'This model does not support the `size` option. Use `aspectRatio` instead.',\n });\n }\n\n // remove non-request options from providerOptions\n const { pollIntervalMillis, maxPollAttempts, ...providerRequestOptions } =\n providerOptions.luma ?? {};\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const fullHeaders = combineHeaders(this.config.headers(), headers);\n const { value: generationResponse, responseHeaders } = await postJsonToApi({\n url: this.getLumaGenerationsUrl(),\n headers: fullHeaders,\n body: {\n prompt,\n ...(aspectRatio ? { aspect_ratio: aspectRatio } : {}),\n model: this.modelId,\n ...providerRequestOptions,\n },\n abortSignal,\n fetch: this.config.fetch,\n failedResponseHandler: this.createLumaErrorHandler(),\n successfulResponseHandler: createJsonResponseHandler(\n lumaGenerationResponseSchema,\n ),\n });\n\n const imageUrl = await this.pollForImageUrl(\n generationResponse.id,\n fullHeaders,\n abortSignal,\n providerOptions.luma,\n );\n\n const downloadedImage = await this.downloadImage(imageUrl, abortSignal);\n\n return {\n images: [downloadedImage],\n warnings,\n response: {\n modelId: this.modelId,\n timestamp: currentDate,\n headers: responseHeaders,\n },\n };\n }\n\n private async pollForImageUrl(\n generationId: string,\n headers: Record<string, string | undefined>,\n abortSignal: AbortSignal | undefined,\n imageSettings?: LumaImageSettings,\n ): Promise<string> {\n const url = this.getLumaGenerationsUrl(generationId);\n const maxPollAttempts =\n imageSettings?.maxPollAttempts ?? this.maxPollAttempts;\n const pollIntervalMillis =\n imageSettings?.pollIntervalMillis ?? this.pollIntervalMillis;\n\n for (let i = 0; i < maxPollAttempts; i++) {\n const { value: statusResponse } = await getFromApi({\n url,\n headers,\n abortSignal,\n fetch: this.config.fetch,\n failedResponseHandler: this.createLumaErrorHandler(),\n successfulResponseHandler: createJsonResponseHandler(\n lumaGenerationResponseSchema,\n ),\n });\n\n switch (statusResponse.state) {\n case 'completed':\n if (!statusResponse.assets?.image) {\n throw new InvalidResponseDataError({\n data: statusResponse,\n message: `Image generation completed but no image was found.`,\n });\n }\n return statusResponse.assets.image;\n case 'failed':\n throw new InvalidResponseDataError({\n data: statusResponse,\n message: `Image generation failed.`,\n });\n }\n await delay(pollIntervalMillis);\n }\n\n throw new Error(\n `Image generation timed out after ${this.maxPollAttempts} attempts.`,\n );\n }\n\n private createLumaErrorHandler() {\n return createJsonErrorResponseHandler({\n errorSchema: lumaErrorSchema,\n errorToMessage: (error: LumaErrorData) =>\n error.detail[0].msg ?? 'Unknown error',\n });\n }\n\n private getLumaGenerationsUrl(generationId?: string) {\n return `${this.config.baseURL}/dream-machine/v1/generations/${\n generationId ?? 'image'\n }`;\n }\n\n private async downloadImage(\n url: string,\n abortSignal: AbortSignal | undefined,\n ): Promise<Uint8Array> {\n const { value: response } = await getFromApi({\n url,\n // No specific headers should be needed for this request as it's a\n // generated image provided by Luma.\n abortSignal,\n failedResponseHandler: createStatusCodeErrorResponseHandler(),\n successfulResponseHandler: createBinaryResponseHandler(),\n fetch: this.config.fetch,\n });\n return response;\n }\n}\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst lumaGenerationResponseSchema = z.object({\n id: z.string(),\n state: z.enum(['queued', 'dreaming', 'completed', 'failed']),\n failure_reason: z.string().nullish(),\n assets: z\n .object({\n image: z.string(), // URL of the generated image\n })\n .nullish(),\n});\n\nconst lumaErrorSchema = z.object({\n detail: z.array(\n z.object({\n type: z.string(),\n loc: z.array(z.string()),\n msg: z.string(),\n input: z.string(),\n ctx: z\n .object({\n expected: z.string(),\n })\n .nullish(),\n }),\n ),\n});\n\nexport type LumaErrorData = z.infer<typeof lumaErrorSchema>;\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/luma",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "1.0.0-alpha.1",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -19,18 +19,18 @@
|
|
|
19
19
|
}
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@ai-sdk/provider": "
|
|
23
|
-
"@ai-sdk/provider
|
|
22
|
+
"@ai-sdk/provider-utils": "3.0.0-alpha.1",
|
|
23
|
+
"@ai-sdk/provider": "2.0.0-alpha.1"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@types/node": "20.17.24",
|
|
27
27
|
"tsup": "^8",
|
|
28
|
-
"typescript": "5.
|
|
29
|
-
"zod": "3.
|
|
28
|
+
"typescript": "5.8.3",
|
|
29
|
+
"zod": "3.24.4",
|
|
30
30
|
"@vercel/ai-tsconfig": "0.0.0"
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
33
|
-
"zod": "^3.
|
|
33
|
+
"zod": "^3.24.0"
|
|
34
34
|
},
|
|
35
35
|
"engines": {
|
|
36
36
|
"node": ">=18"
|
|
@@ -50,13 +50,15 @@
|
|
|
50
50
|
"ai"
|
|
51
51
|
],
|
|
52
52
|
"scripts": {
|
|
53
|
-
"build": "tsup",
|
|
54
|
-
"build:watch": "tsup --watch",
|
|
55
|
-
"clean": "rm -rf dist",
|
|
53
|
+
"build": "pnpm clean && tsup --tsconfig tsconfig.build.json",
|
|
54
|
+
"build:watch": "pnpm clean && tsup --watch",
|
|
55
|
+
"clean": "rm -rf dist *.tsbuildinfo",
|
|
56
56
|
"lint": "eslint \"./**/*.ts*\"",
|
|
57
|
-
"type-check": "tsc --
|
|
57
|
+
"type-check": "tsc --build",
|
|
58
58
|
"prettier-check": "prettier --check \"./**/*.ts*\"",
|
|
59
59
|
"test": "pnpm test:node && pnpm test:edge",
|
|
60
|
+
"test:update": "pnpm test:node -u",
|
|
61
|
+
"test:watch": "vitest --config vitest.node.config.js",
|
|
60
62
|
"test:edge": "vitest --config vitest.edge.config.js --run",
|
|
61
63
|
"test:node": "vitest --config vitest.node.config.js --run"
|
|
62
64
|
}
|