@ai-sdk/deepinfra 3.0.0-beta.3 → 3.0.0-beta.30
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 +251 -8
- package/README.md +2 -0
- package/dist/index.js +81 -68
- package/dist/index.js.map +1 -1
- package/package.json +8 -10
- package/src/deepinfra-chat-language-model.ts +21 -2
- package/src/deepinfra-image-model.ts +20 -3
- package/dist/index.d.mts +0 -71
- package/dist/index.mjs +0 -344
- package/dist/index.mjs.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,248 @@
|
|
|
1
1
|
# @ai-sdk/deepinfra
|
|
2
2
|
|
|
3
|
+
## 3.0.0-beta.30
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [eea8d98]
|
|
8
|
+
- @ai-sdk/provider-utils@5.0.0-beta.25
|
|
9
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.30
|
|
10
|
+
|
|
11
|
+
## 3.0.0-beta.29
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- Updated dependencies [f807e45]
|
|
16
|
+
- @ai-sdk/provider-utils@5.0.0-beta.24
|
|
17
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.29
|
|
18
|
+
|
|
19
|
+
## 3.0.0-beta.28
|
|
20
|
+
|
|
21
|
+
### Patch Changes
|
|
22
|
+
|
|
23
|
+
- Updated dependencies [350ea38]
|
|
24
|
+
- @ai-sdk/provider-utils@5.0.0-beta.23
|
|
25
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.28
|
|
26
|
+
|
|
27
|
+
## 3.0.0-beta.27
|
|
28
|
+
|
|
29
|
+
### Patch Changes
|
|
30
|
+
|
|
31
|
+
- Updated dependencies [083947b]
|
|
32
|
+
- @ai-sdk/provider-utils@5.0.0-beta.22
|
|
33
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.27
|
|
34
|
+
|
|
35
|
+
## 3.0.0-beta.26
|
|
36
|
+
|
|
37
|
+
### Patch Changes
|
|
38
|
+
|
|
39
|
+
- Updated dependencies [add1126]
|
|
40
|
+
- @ai-sdk/provider-utils@5.0.0-beta.21
|
|
41
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.26
|
|
42
|
+
|
|
43
|
+
## 3.0.0-beta.25
|
|
44
|
+
|
|
45
|
+
### Patch Changes
|
|
46
|
+
|
|
47
|
+
- b3976a2: Add workflow serialization support to all provider models.
|
|
48
|
+
|
|
49
|
+
**`@ai-sdk/provider-utils`:** New `serializeModel()` helper that extracts only serializable properties from a model instance, filtering out functions and objects containing functions. Third-party provider authors can use this to add workflow support to their own models.
|
|
50
|
+
|
|
51
|
+
**All providers:** `headers` is now optional in provider config types. This is non-breaking — existing code that passes `headers` continues to work. Custom provider implementations that construct model configs manually can now omit `headers`, which is useful when models are deserialized from a workflow step boundary where auth is provided separately.
|
|
52
|
+
|
|
53
|
+
All provider model classes now include `WORKFLOW_SERIALIZE` and `WORKFLOW_DESERIALIZE` static methods, enabling them to cross workflow step boundaries without serialization errors.
|
|
54
|
+
|
|
55
|
+
- Updated dependencies [b3976a2]
|
|
56
|
+
- Updated dependencies [ff5eba1]
|
|
57
|
+
- @ai-sdk/provider-utils@5.0.0-beta.20
|
|
58
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.25
|
|
59
|
+
- @ai-sdk/provider@4.0.0-beta.12
|
|
60
|
+
|
|
61
|
+
## 3.0.0-beta.24
|
|
62
|
+
|
|
63
|
+
### Major Changes
|
|
64
|
+
|
|
65
|
+
- ef992f8: Remove CommonJS exports from all packages. All packages are now ESM-only (`"type": "module"`). Consumers using `require()` must switch to ESM `import` syntax.
|
|
66
|
+
|
|
67
|
+
### Patch Changes
|
|
68
|
+
|
|
69
|
+
- Updated dependencies [ef992f8]
|
|
70
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.24
|
|
71
|
+
- @ai-sdk/provider@4.0.0-beta.11
|
|
72
|
+
- @ai-sdk/provider-utils@5.0.0-beta.19
|
|
73
|
+
|
|
74
|
+
## 3.0.0-beta.23
|
|
75
|
+
|
|
76
|
+
### Patch Changes
|
|
77
|
+
|
|
78
|
+
- 90e2d8a: chore: fix unused vars not being flagged by our lint tooling
|
|
79
|
+
- Updated dependencies [90e2d8a]
|
|
80
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.23
|
|
81
|
+
- @ai-sdk/provider-utils@5.0.0-beta.18
|
|
82
|
+
|
|
83
|
+
## 3.0.0-beta.22
|
|
84
|
+
|
|
85
|
+
### Patch Changes
|
|
86
|
+
|
|
87
|
+
- Updated dependencies [3ae1786]
|
|
88
|
+
- @ai-sdk/provider-utils@5.0.0-beta.17
|
|
89
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.22
|
|
90
|
+
|
|
91
|
+
## 3.0.0-beta.21
|
|
92
|
+
|
|
93
|
+
### Patch Changes
|
|
94
|
+
|
|
95
|
+
- Updated dependencies [176466a]
|
|
96
|
+
- @ai-sdk/provider@4.0.0-beta.10
|
|
97
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.21
|
|
98
|
+
- @ai-sdk/provider-utils@5.0.0-beta.16
|
|
99
|
+
|
|
100
|
+
## 3.0.0-beta.20
|
|
101
|
+
|
|
102
|
+
### Patch Changes
|
|
103
|
+
|
|
104
|
+
- Updated dependencies [e311194]
|
|
105
|
+
- @ai-sdk/provider@4.0.0-beta.9
|
|
106
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.20
|
|
107
|
+
- @ai-sdk/provider-utils@5.0.0-beta.15
|
|
108
|
+
|
|
109
|
+
## 3.0.0-beta.19
|
|
110
|
+
|
|
111
|
+
### Patch Changes
|
|
112
|
+
|
|
113
|
+
- Updated dependencies [34bd95d]
|
|
114
|
+
- Updated dependencies [008271d]
|
|
115
|
+
- @ai-sdk/provider@4.0.0-beta.8
|
|
116
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.19
|
|
117
|
+
- @ai-sdk/provider-utils@5.0.0-beta.14
|
|
118
|
+
|
|
119
|
+
## 3.0.0-beta.18
|
|
120
|
+
|
|
121
|
+
### Patch Changes
|
|
122
|
+
|
|
123
|
+
- Updated dependencies [b0c2869]
|
|
124
|
+
- Updated dependencies [7e26e81]
|
|
125
|
+
- @ai-sdk/provider-utils@5.0.0-beta.13
|
|
126
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.18
|
|
127
|
+
|
|
128
|
+
## 3.0.0-beta.17
|
|
129
|
+
|
|
130
|
+
### Patch Changes
|
|
131
|
+
|
|
132
|
+
- Updated dependencies [816ff67]
|
|
133
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.17
|
|
134
|
+
|
|
135
|
+
## 3.0.0-beta.16
|
|
136
|
+
|
|
137
|
+
### Patch Changes
|
|
138
|
+
|
|
139
|
+
- Updated dependencies [46d1149]
|
|
140
|
+
- @ai-sdk/provider-utils@5.0.0-beta.12
|
|
141
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.16
|
|
142
|
+
|
|
143
|
+
## 3.0.0-beta.15
|
|
144
|
+
|
|
145
|
+
### Patch Changes
|
|
146
|
+
|
|
147
|
+
- Updated dependencies [6fd51c0]
|
|
148
|
+
- @ai-sdk/provider-utils@5.0.0-beta.11
|
|
149
|
+
- @ai-sdk/provider@4.0.0-beta.7
|
|
150
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.15
|
|
151
|
+
|
|
152
|
+
## 3.0.0-beta.14
|
|
153
|
+
|
|
154
|
+
### Patch Changes
|
|
155
|
+
|
|
156
|
+
- Updated dependencies [c29a26f]
|
|
157
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.14
|
|
158
|
+
- @ai-sdk/provider-utils@5.0.0-beta.10
|
|
159
|
+
- @ai-sdk/provider@4.0.0-beta.6
|
|
160
|
+
|
|
161
|
+
## 3.0.0-beta.13
|
|
162
|
+
|
|
163
|
+
### Patch Changes
|
|
164
|
+
|
|
165
|
+
- 38fc777: Add AI Gateway hint to provider READMEs
|
|
166
|
+
- Updated dependencies [38fc777]
|
|
167
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.13
|
|
168
|
+
|
|
169
|
+
## 3.0.0-beta.12
|
|
170
|
+
|
|
171
|
+
### Patch Changes
|
|
172
|
+
|
|
173
|
+
- Updated dependencies [2e17091]
|
|
174
|
+
- @ai-sdk/provider-utils@5.0.0-beta.9
|
|
175
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.12
|
|
176
|
+
|
|
177
|
+
## 3.0.0-beta.11
|
|
178
|
+
|
|
179
|
+
### Patch Changes
|
|
180
|
+
|
|
181
|
+
- Updated dependencies [986c6fd]
|
|
182
|
+
- Updated dependencies [493295c]
|
|
183
|
+
- @ai-sdk/provider-utils@5.0.0-beta.8
|
|
184
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.11
|
|
185
|
+
|
|
186
|
+
## 3.0.0-beta.10
|
|
187
|
+
|
|
188
|
+
### Patch Changes
|
|
189
|
+
|
|
190
|
+
- Updated dependencies [1f509d4]
|
|
191
|
+
- @ai-sdk/provider-utils@5.0.0-beta.7
|
|
192
|
+
- @ai-sdk/provider@4.0.0-beta.5
|
|
193
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.10
|
|
194
|
+
|
|
195
|
+
## 3.0.0-beta.9
|
|
196
|
+
|
|
197
|
+
### Patch Changes
|
|
198
|
+
|
|
199
|
+
- Updated dependencies [74d520f]
|
|
200
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.9
|
|
201
|
+
|
|
202
|
+
## 3.0.0-beta.8
|
|
203
|
+
|
|
204
|
+
### Patch Changes
|
|
205
|
+
|
|
206
|
+
- Updated dependencies [3887c70]
|
|
207
|
+
- @ai-sdk/provider-utils@5.0.0-beta.6
|
|
208
|
+
- @ai-sdk/provider@4.0.0-beta.4
|
|
209
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.8
|
|
210
|
+
|
|
211
|
+
## 3.0.0-beta.7
|
|
212
|
+
|
|
213
|
+
### Patch Changes
|
|
214
|
+
|
|
215
|
+
- Updated dependencies [776b617]
|
|
216
|
+
- @ai-sdk/provider-utils@5.0.0-beta.5
|
|
217
|
+
- @ai-sdk/provider@4.0.0-beta.3
|
|
218
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.7
|
|
219
|
+
|
|
220
|
+
## 3.0.0-beta.6
|
|
221
|
+
|
|
222
|
+
### Patch Changes
|
|
223
|
+
|
|
224
|
+
- Updated dependencies [61753c3]
|
|
225
|
+
- @ai-sdk/provider-utils@5.0.0-beta.4
|
|
226
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.6
|
|
227
|
+
|
|
228
|
+
## 3.0.0-beta.5
|
|
229
|
+
|
|
230
|
+
### Patch Changes
|
|
231
|
+
|
|
232
|
+
- Updated dependencies [f7d4f01]
|
|
233
|
+
- @ai-sdk/provider-utils@5.0.0-beta.3
|
|
234
|
+
- @ai-sdk/provider@4.0.0-beta.2
|
|
235
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.5
|
|
236
|
+
|
|
237
|
+
## 3.0.0-beta.4
|
|
238
|
+
|
|
239
|
+
### Patch Changes
|
|
240
|
+
|
|
241
|
+
- Updated dependencies [5c2a5a2]
|
|
242
|
+
- @ai-sdk/provider@4.0.0-beta.1
|
|
243
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.4
|
|
244
|
+
- @ai-sdk/provider-utils@5.0.0-beta.2
|
|
245
|
+
|
|
3
246
|
## 3.0.0-beta.3
|
|
4
247
|
|
|
5
248
|
### Patch Changes
|
|
@@ -355,13 +598,13 @@
|
|
|
355
598
|
Before
|
|
356
599
|
|
|
357
600
|
```ts
|
|
358
|
-
model.textEmbeddingModel(
|
|
601
|
+
model.textEmbeddingModel("my-model-id");
|
|
359
602
|
```
|
|
360
603
|
|
|
361
604
|
After
|
|
362
605
|
|
|
363
606
|
```ts
|
|
364
|
-
model.embeddingModel(
|
|
607
|
+
model.embeddingModel("my-model-id");
|
|
365
608
|
```
|
|
366
609
|
|
|
367
610
|
- 95f65c2: chore: use import \* from zod/v4
|
|
@@ -589,13 +832,13 @@
|
|
|
589
832
|
Before
|
|
590
833
|
|
|
591
834
|
```ts
|
|
592
|
-
model.textEmbeddingModel(
|
|
835
|
+
model.textEmbeddingModel("my-model-id");
|
|
593
836
|
```
|
|
594
837
|
|
|
595
838
|
After
|
|
596
839
|
|
|
597
840
|
```ts
|
|
598
|
-
model.embeddingModel(
|
|
841
|
+
model.embeddingModel("my-model-id");
|
|
599
842
|
```
|
|
600
843
|
|
|
601
844
|
- Updated dependencies [8d9e8ad]
|
|
@@ -1083,7 +1326,7 @@
|
|
|
1083
1326
|
|
|
1084
1327
|
```js
|
|
1085
1328
|
await generateImage({
|
|
1086
|
-
model: luma.image(
|
|
1329
|
+
model: luma.image("photon-flash-1", {
|
|
1087
1330
|
maxImagesPerCall: 5,
|
|
1088
1331
|
pollIntervalMillis: 500,
|
|
1089
1332
|
}),
|
|
@@ -1096,7 +1339,7 @@
|
|
|
1096
1339
|
|
|
1097
1340
|
```js
|
|
1098
1341
|
await generateImage({
|
|
1099
|
-
model: luma.image(
|
|
1342
|
+
model: luma.image("photon-flash-1"),
|
|
1100
1343
|
prompt,
|
|
1101
1344
|
n: 10,
|
|
1102
1345
|
maxImagesPerCall: 5,
|
|
@@ -1383,7 +1626,7 @@
|
|
|
1383
1626
|
|
|
1384
1627
|
```js
|
|
1385
1628
|
await generateImage({
|
|
1386
|
-
model: luma.image(
|
|
1629
|
+
model: luma.image("photon-flash-1", {
|
|
1387
1630
|
maxImagesPerCall: 5,
|
|
1388
1631
|
pollIntervalMillis: 500,
|
|
1389
1632
|
}),
|
|
@@ -1396,7 +1639,7 @@
|
|
|
1396
1639
|
|
|
1397
1640
|
```js
|
|
1398
1641
|
await generateImage({
|
|
1399
|
-
model: luma.image(
|
|
1642
|
+
model: luma.image("photon-flash-1"),
|
|
1400
1643
|
prompt,
|
|
1401
1644
|
n: 10,
|
|
1402
1645
|
maxImagesPerCall: 5,
|
package/README.md
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
The **[DeepInfra provider](https://ai-sdk.dev/providers/ai-sdk-providers/deepinfra)** for the [AI SDK](https://ai-sdk.dev/docs)
|
|
4
4
|
contains language model support for the DeepInfra API, giving you access to models like Llama 3, Mixtral, and other state-of-the-art LLMs.
|
|
5
5
|
|
|
6
|
+
> **Deploying to Vercel?** With Vercel's AI Gateway you can access DeepInfra (and hundreds of models from other providers) — no additional packages, API keys, or extra cost. [Get started with AI Gateway](https://vercel.com/ai-gateway).
|
|
7
|
+
|
|
6
8
|
## Setup
|
|
7
9
|
|
|
8
10
|
The DeepInfra provider is available in the `@ai-sdk/deepinfra` module. You can install it with
|
package/dist/index.js
CHANGED
|
@@ -1,39 +1,30 @@
|
|
|
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 index_exports = {};
|
|
22
|
-
__export(index_exports, {
|
|
23
|
-
VERSION: () => VERSION,
|
|
24
|
-
createDeepInfra: () => createDeepInfra,
|
|
25
|
-
deepinfra: () => deepinfra
|
|
26
|
-
});
|
|
27
|
-
module.exports = __toCommonJS(index_exports);
|
|
28
|
-
|
|
29
1
|
// src/deepinfra-provider.ts
|
|
30
|
-
|
|
31
|
-
|
|
2
|
+
import {
|
|
3
|
+
OpenAICompatibleCompletionLanguageModel,
|
|
4
|
+
OpenAICompatibleEmbeddingModel
|
|
5
|
+
} from "@ai-sdk/openai-compatible";
|
|
6
|
+
import {
|
|
7
|
+
loadApiKey,
|
|
8
|
+
withoutTrailingSlash,
|
|
9
|
+
withUserAgentSuffix
|
|
10
|
+
} from "@ai-sdk/provider-utils";
|
|
32
11
|
|
|
33
12
|
// src/deepinfra-image-model.ts
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
13
|
+
import {
|
|
14
|
+
combineHeaders,
|
|
15
|
+
convertBase64ToUint8Array,
|
|
16
|
+
convertToFormData,
|
|
17
|
+
createJsonErrorResponseHandler,
|
|
18
|
+
createJsonResponseHandler,
|
|
19
|
+
downloadBlob,
|
|
20
|
+
postFormDataToApi,
|
|
21
|
+
postJsonToApi,
|
|
22
|
+
serializeModelOptions,
|
|
23
|
+
WORKFLOW_SERIALIZE,
|
|
24
|
+
WORKFLOW_DESERIALIZE
|
|
25
|
+
} from "@ai-sdk/provider-utils";
|
|
26
|
+
import { z } from "zod/v4";
|
|
27
|
+
var DeepInfraImageModel = class _DeepInfraImageModel {
|
|
37
28
|
constructor(modelId, config) {
|
|
38
29
|
this.modelId = modelId;
|
|
39
30
|
this.config = config;
|
|
@@ -43,6 +34,15 @@ var DeepInfraImageModel = class {
|
|
|
43
34
|
get provider() {
|
|
44
35
|
return this.config.provider;
|
|
45
36
|
}
|
|
37
|
+
static [WORKFLOW_SERIALIZE](model) {
|
|
38
|
+
return serializeModelOptions({
|
|
39
|
+
modelId: model.modelId,
|
|
40
|
+
config: model.config
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
static [WORKFLOW_DESERIALIZE](options) {
|
|
44
|
+
return new _DeepInfraImageModel(options.modelId, options.config);
|
|
45
|
+
}
|
|
46
46
|
async doGenerate({
|
|
47
47
|
prompt,
|
|
48
48
|
n,
|
|
@@ -55,14 +55,14 @@ var DeepInfraImageModel = class {
|
|
|
55
55
|
files,
|
|
56
56
|
mask
|
|
57
57
|
}) {
|
|
58
|
-
var _a, _b, _c, _d, _e;
|
|
58
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i;
|
|
59
59
|
const warnings = [];
|
|
60
60
|
const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();
|
|
61
61
|
if (files != null && files.length > 0) {
|
|
62
|
-
const { value: response2, responseHeaders: responseHeaders2 } = await
|
|
62
|
+
const { value: response2, responseHeaders: responseHeaders2 } = await postFormDataToApi({
|
|
63
63
|
url: this.getEditUrl(),
|
|
64
|
-
headers: (
|
|
65
|
-
formData:
|
|
64
|
+
headers: combineHeaders((_e = (_d = this.config).headers) == null ? void 0 : _e.call(_d), headers),
|
|
65
|
+
formData: convertToFormData(
|
|
66
66
|
{
|
|
67
67
|
model: this.modelId,
|
|
68
68
|
prompt,
|
|
@@ -70,18 +70,18 @@ var DeepInfraImageModel = class {
|
|
|
70
70
|
mask: mask != null ? await fileToBlob(mask) : void 0,
|
|
71
71
|
n,
|
|
72
72
|
size,
|
|
73
|
-
...(
|
|
73
|
+
...(_f = providerOptions.deepinfra) != null ? _f : {}
|
|
74
74
|
},
|
|
75
75
|
{ useArrayBrackets: false }
|
|
76
76
|
),
|
|
77
|
-
failedResponseHandler:
|
|
77
|
+
failedResponseHandler: createJsonErrorResponseHandler({
|
|
78
78
|
errorSchema: deepInfraEditErrorSchema,
|
|
79
79
|
errorToMessage: (error) => {
|
|
80
80
|
var _a2, _b2;
|
|
81
81
|
return (_b2 = (_a2 = error.error) == null ? void 0 : _a2.message) != null ? _b2 : "Unknown error";
|
|
82
82
|
}
|
|
83
83
|
}),
|
|
84
|
-
successfulResponseHandler:
|
|
84
|
+
successfulResponseHandler: createJsonResponseHandler(
|
|
85
85
|
deepInfraEditResponseSchema
|
|
86
86
|
),
|
|
87
87
|
abortSignal,
|
|
@@ -98,22 +98,22 @@ var DeepInfraImageModel = class {
|
|
|
98
98
|
};
|
|
99
99
|
}
|
|
100
100
|
const splitSize = size == null ? void 0 : size.split("x");
|
|
101
|
-
const { value: response, responseHeaders } = await
|
|
101
|
+
const { value: response, responseHeaders } = await postJsonToApi({
|
|
102
102
|
url: `${this.config.baseURL}/${this.modelId}`,
|
|
103
|
-
headers: (
|
|
103
|
+
headers: combineHeaders((_h = (_g = this.config).headers) == null ? void 0 : _h.call(_g), headers),
|
|
104
104
|
body: {
|
|
105
105
|
prompt,
|
|
106
106
|
num_images: n,
|
|
107
107
|
...aspectRatio && { aspect_ratio: aspectRatio },
|
|
108
108
|
...splitSize && { width: splitSize[0], height: splitSize[1] },
|
|
109
109
|
...seed != null && { seed },
|
|
110
|
-
...(
|
|
110
|
+
...(_i = providerOptions.deepinfra) != null ? _i : {}
|
|
111
111
|
},
|
|
112
|
-
failedResponseHandler:
|
|
112
|
+
failedResponseHandler: createJsonErrorResponseHandler({
|
|
113
113
|
errorSchema: deepInfraErrorSchema,
|
|
114
114
|
errorToMessage: (error) => error.detail.error
|
|
115
115
|
}),
|
|
116
|
-
successfulResponseHandler:
|
|
116
|
+
successfulResponseHandler: createJsonResponseHandler(
|
|
117
117
|
deepInfraImageResponseSchema
|
|
118
118
|
),
|
|
119
119
|
abortSignal,
|
|
@@ -136,33 +136,47 @@ var DeepInfraImageModel = class {
|
|
|
136
136
|
return `${baseUrl}/images/edits`;
|
|
137
137
|
}
|
|
138
138
|
};
|
|
139
|
-
var deepInfraErrorSchema =
|
|
140
|
-
detail:
|
|
141
|
-
error:
|
|
139
|
+
var deepInfraErrorSchema = z.object({
|
|
140
|
+
detail: z.object({
|
|
141
|
+
error: z.string()
|
|
142
142
|
})
|
|
143
143
|
});
|
|
144
|
-
var deepInfraImageResponseSchema =
|
|
145
|
-
images:
|
|
144
|
+
var deepInfraImageResponseSchema = z.object({
|
|
145
|
+
images: z.array(z.string())
|
|
146
146
|
});
|
|
147
|
-
var deepInfraEditErrorSchema =
|
|
148
|
-
error:
|
|
149
|
-
message:
|
|
147
|
+
var deepInfraEditErrorSchema = z.object({
|
|
148
|
+
error: z.object({
|
|
149
|
+
message: z.string()
|
|
150
150
|
}).optional()
|
|
151
151
|
});
|
|
152
|
-
var deepInfraEditResponseSchema =
|
|
153
|
-
data:
|
|
152
|
+
var deepInfraEditResponseSchema = z.object({
|
|
153
|
+
data: z.array(z.object({ b64_json: z.string() }))
|
|
154
154
|
});
|
|
155
155
|
async function fileToBlob(file) {
|
|
156
156
|
if (file.type === "url") {
|
|
157
|
-
return
|
|
157
|
+
return downloadBlob(file.url);
|
|
158
158
|
}
|
|
159
|
-
const data = file.data instanceof Uint8Array ? file.data :
|
|
159
|
+
const data = file.data instanceof Uint8Array ? file.data : convertBase64ToUint8Array(file.data);
|
|
160
160
|
return new Blob([data], { type: file.mediaType });
|
|
161
161
|
}
|
|
162
162
|
|
|
163
163
|
// src/deepinfra-chat-language-model.ts
|
|
164
|
-
|
|
165
|
-
|
|
164
|
+
import { OpenAICompatibleChatLanguageModel } from "@ai-sdk/openai-compatible";
|
|
165
|
+
import {
|
|
166
|
+
serializeModelOptions as serializeModelOptions2,
|
|
167
|
+
WORKFLOW_SERIALIZE as WORKFLOW_SERIALIZE2,
|
|
168
|
+
WORKFLOW_DESERIALIZE as WORKFLOW_DESERIALIZE2
|
|
169
|
+
} from "@ai-sdk/provider-utils";
|
|
170
|
+
var DeepInfraChatLanguageModel = class _DeepInfraChatLanguageModel extends OpenAICompatibleChatLanguageModel {
|
|
171
|
+
static [WORKFLOW_SERIALIZE2](model) {
|
|
172
|
+
return serializeModelOptions2({
|
|
173
|
+
modelId: model.modelId,
|
|
174
|
+
config: model.config
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
static [WORKFLOW_DESERIALIZE2](options) {
|
|
178
|
+
return new _DeepInfraChatLanguageModel(options.modelId, options.config);
|
|
179
|
+
}
|
|
166
180
|
constructor(modelId, config) {
|
|
167
181
|
super(modelId, config);
|
|
168
182
|
}
|
|
@@ -293,17 +307,17 @@ var DeepInfraChatLanguageModel = class extends import_openai_compatible.OpenAICo
|
|
|
293
307
|
};
|
|
294
308
|
|
|
295
309
|
// src/version.ts
|
|
296
|
-
var VERSION = true ? "3.0.0-beta.
|
|
310
|
+
var VERSION = true ? "3.0.0-beta.30" : "0.0.0-test";
|
|
297
311
|
|
|
298
312
|
// src/deepinfra-provider.ts
|
|
299
313
|
function createDeepInfra(options = {}) {
|
|
300
314
|
var _a;
|
|
301
|
-
const baseURL =
|
|
315
|
+
const baseURL = withoutTrailingSlash(
|
|
302
316
|
(_a = options.baseURL) != null ? _a : "https://api.deepinfra.com/v1"
|
|
303
317
|
);
|
|
304
|
-
const getHeaders = () =>
|
|
318
|
+
const getHeaders = () => withUserAgentSuffix(
|
|
305
319
|
{
|
|
306
|
-
Authorization: `Bearer ${
|
|
320
|
+
Authorization: `Bearer ${loadApiKey({
|
|
307
321
|
apiKey: options.apiKey,
|
|
308
322
|
environmentVariableName: "DEEPINFRA_API_KEY",
|
|
309
323
|
description: "DeepInfra's API key"
|
|
@@ -324,11 +338,11 @@ function createDeepInfra(options = {}) {
|
|
|
324
338
|
getCommonModelConfig("chat")
|
|
325
339
|
);
|
|
326
340
|
};
|
|
327
|
-
const createCompletionModel = (modelId) => new
|
|
341
|
+
const createCompletionModel = (modelId) => new OpenAICompatibleCompletionLanguageModel(
|
|
328
342
|
modelId,
|
|
329
343
|
getCommonModelConfig("completion")
|
|
330
344
|
);
|
|
331
|
-
const createEmbeddingModel = (modelId) => new
|
|
345
|
+
const createEmbeddingModel = (modelId) => new OpenAICompatibleEmbeddingModel(
|
|
332
346
|
modelId,
|
|
333
347
|
getCommonModelConfig("embedding")
|
|
334
348
|
);
|
|
@@ -348,10 +362,9 @@ function createDeepInfra(options = {}) {
|
|
|
348
362
|
return provider;
|
|
349
363
|
}
|
|
350
364
|
var deepinfra = createDeepInfra();
|
|
351
|
-
|
|
352
|
-
0 && (module.exports = {
|
|
365
|
+
export {
|
|
353
366
|
VERSION,
|
|
354
367
|
createDeepInfra,
|
|
355
368
|
deepinfra
|
|
356
|
-
}
|
|
369
|
+
};
|
|
357
370
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/deepinfra-provider.ts","../src/deepinfra-image-model.ts","../src/deepinfra-chat-language-model.ts","../src/version.ts"],"sourcesContent":["export { createDeepInfra, deepinfra } from './deepinfra-provider';\nexport type {\n DeepInfraProvider,\n DeepInfraProviderSettings,\n} from './deepinfra-provider';\nexport type { OpenAICompatibleErrorData as DeepInfraErrorData } from '@ai-sdk/openai-compatible';\nexport { VERSION } from './version';\n","import {\n LanguageModelV4,\n EmbeddingModelV4,\n ProviderV4,\n ImageModelV4,\n} from '@ai-sdk/provider';\nimport {\n OpenAICompatibleCompletionLanguageModel,\n OpenAICompatibleEmbeddingModel,\n} from '@ai-sdk/openai-compatible';\nimport {\n FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n} from '@ai-sdk/provider-utils';\nimport { DeepInfraChatModelId } from './deepinfra-chat-options';\nimport { DeepInfraEmbeddingModelId } from './deepinfra-embedding-options';\nimport { DeepInfraCompletionModelId } from './deepinfra-completion-options';\nimport { DeepInfraImageModelId } from './deepinfra-image-settings';\nimport { DeepInfraImageModel } from './deepinfra-image-model';\nimport { DeepInfraChatLanguageModel } from './deepinfra-chat-language-model';\nimport { VERSION } from './version';\n\nexport interface DeepInfraProviderSettings {\n /**\n * DeepInfra API key.\n */\n apiKey?: string;\n /**\n * Base URL for the API calls.\n */\n baseURL?: string;\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface DeepInfraProvider extends ProviderV4 {\n /**\n * Creates a model for text generation.\n */\n (modelId: DeepInfraChatModelId): LanguageModelV4;\n\n /**\n * Creates a chat model for text generation.\n */\n chatModel(modelId: DeepInfraChatModelId): LanguageModelV4;\n\n /**\n * Creates a model for image generation.\n */\n image(modelId: DeepInfraImageModelId): ImageModelV4;\n\n /**\n * Creates a model for image generation.\n */\n imageModel(modelId: DeepInfraImageModelId): ImageModelV4;\n\n /**\n * Creates a chat model for text generation.\n */\n languageModel(modelId: DeepInfraChatModelId): LanguageModelV4;\n\n /**\n * Creates a completion model for text generation.\n */\n completionModel(modelId: DeepInfraCompletionModelId): LanguageModelV4;\n\n /**\n * Creates a embedding model for text generation.\n */\n embeddingModel(modelId: DeepInfraEmbeddingModelId): EmbeddingModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: DeepInfraEmbeddingModelId): EmbeddingModelV4;\n}\n\nexport function createDeepInfra(\n options: DeepInfraProviderSettings = {},\n): DeepInfraProvider {\n const baseURL = withoutTrailingSlash(\n options.baseURL ?? 'https://api.deepinfra.com/v1',\n );\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'DEEPINFRA_API_KEY',\n description: \"DeepInfra's API key\",\n })}`,\n ...options.headers,\n },\n `ai-sdk/deepinfra/${VERSION}`,\n );\n\n interface CommonModelConfig {\n provider: string;\n url: ({ path }: { path: string }) => string;\n headers: () => Record<string, string>;\n fetch?: FetchFunction;\n }\n\n const getCommonModelConfig = (modelType: string): CommonModelConfig => ({\n provider: `deepinfra.${modelType}`,\n url: ({ path }) => `${baseURL}/openai${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createChatModel = (modelId: DeepInfraChatModelId) => {\n return new DeepInfraChatLanguageModel(\n modelId,\n getCommonModelConfig('chat'),\n );\n };\n\n const createCompletionModel = (modelId: DeepInfraCompletionModelId) =>\n new OpenAICompatibleCompletionLanguageModel(\n modelId,\n getCommonModelConfig('completion'),\n );\n\n const createEmbeddingModel = (modelId: DeepInfraEmbeddingModelId) =>\n new OpenAICompatibleEmbeddingModel(\n modelId,\n getCommonModelConfig('embedding'),\n );\n\n const createImageModel = (modelId: DeepInfraImageModelId) =>\n new DeepInfraImageModel(modelId, {\n ...getCommonModelConfig('image'),\n baseURL: baseURL\n ? `${baseURL}/inference`\n : 'https://api.deepinfra.com/v1/inference',\n });\n\n const provider = (modelId: DeepInfraChatModelId) => createChatModel(modelId);\n\n provider.specificationVersion = 'v4' as const;\n provider.completionModel = createCompletionModel;\n provider.chatModel = createChatModel;\n provider.image = createImageModel;\n provider.imageModel = createImageModel;\n provider.languageModel = createChatModel;\n provider.embeddingModel = createEmbeddingModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n\n return provider;\n}\n\nexport const deepinfra = createDeepInfra();\n","import {\n ImageModelV4,\n ImageModelV4File,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertBase64ToUint8Array,\n convertToFormData,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n downloadBlob,\n FetchFunction,\n postFormDataToApi,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { DeepInfraImageModelId } from './deepinfra-image-settings';\nimport { z } from 'zod/v4';\n\ninterface DeepInfraImageModelConfig {\n provider: string;\n baseURL: string;\n headers: () => Record<string, string>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class DeepInfraImageModel implements ImageModelV4 {\n readonly specificationVersion = 'v4';\n readonly maxImagesPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: DeepInfraImageModelId,\n private config: DeepInfraImageModelConfig,\n ) {}\n\n async doGenerate({\n prompt,\n n,\n size,\n aspectRatio,\n seed,\n providerOptions,\n headers,\n abortSignal,\n files,\n mask,\n }: Parameters<ImageModelV4['doGenerate']>[0]): Promise<\n Awaited<ReturnType<ImageModelV4['doGenerate']>>\n > {\n const warnings: Array<SharedV4Warning> = [];\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n\n // Image editing mode - use OpenAI-compatible /images/edits endpoint\n if (files != null && files.length > 0) {\n const { value: response, responseHeaders } = await postFormDataToApi({\n url: this.getEditUrl(),\n headers: combineHeaders(this.config.headers(), headers),\n formData: convertToFormData<DeepInfraFormDataInput>(\n {\n model: this.modelId,\n prompt,\n image: await Promise.all(files.map(file => fileToBlob(file))),\n mask: mask != null ? await fileToBlob(mask) : undefined,\n n,\n size,\n ...(providerOptions.deepinfra ?? {}),\n },\n { useArrayBrackets: false },\n ),\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: deepInfraEditErrorSchema,\n errorToMessage: error => error.error?.message ?? 'Unknown error',\n }),\n successfulResponseHandler: createJsonResponseHandler(\n deepInfraEditResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n images: response.data.map(item => item.b64_json),\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n // Standard image generation mode\n // Some deepinfra models support size while others support aspect ratio.\n // Allow passing either and leave it up to the server to validate.\n const splitSize = size?.split('x');\n const { value: response, responseHeaders } = await postJsonToApi({\n url: `${this.config.baseURL}/${this.modelId}`,\n headers: combineHeaders(this.config.headers(), headers),\n body: {\n prompt,\n num_images: n,\n ...(aspectRatio && { aspect_ratio: aspectRatio }),\n ...(splitSize && { width: splitSize[0], height: splitSize[1] }),\n ...(seed != null && { seed }),\n ...(providerOptions.deepinfra ?? {}),\n },\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: deepInfraErrorSchema,\n errorToMessage: error => error.detail.error,\n }),\n successfulResponseHandler: createJsonResponseHandler(\n deepInfraImageResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n images: response.images.map(image =>\n image.replace(/^data:image\\/\\w+;base64,/, ''),\n ),\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n private getEditUrl(): string {\n // Use OpenAI-compatible endpoint for image editing\n // baseURL is typically https://api.deepinfra.com/v1/inference\n // We need to use https://api.deepinfra.com/v1/openai/images/edits\n const baseUrl = this.config.baseURL.replace('/inference', '/openai');\n return `${baseUrl}/images/edits`;\n }\n}\n\nexport const deepInfraErrorSchema = z.object({\n detail: z.object({\n error: z.string(),\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\nexport const deepInfraImageResponseSchema = z.object({\n images: z.array(z.string()),\n});\n\n// Schema for OpenAI-compatible image edit endpoint errors\nexport const deepInfraEditErrorSchema = z.object({\n error: z\n .object({\n message: z.string(),\n })\n .optional(),\n});\n\n// Schema for OpenAI-compatible image edit endpoint response\nexport const deepInfraEditResponseSchema = z.object({\n data: z.array(z.object({ b64_json: z.string() })),\n});\n\ntype DeepInfraFormDataInput = {\n model: string;\n prompt: string | undefined;\n image: Blob | Blob[];\n mask?: Blob;\n n: number;\n size: `${number}x${number}` | undefined;\n [key: string]: unknown;\n};\n\nasync function fileToBlob(file: ImageModelV4File): Promise<Blob> {\n if (file.type === 'url') {\n return downloadBlob(file.url);\n }\n\n const data =\n file.data instanceof Uint8Array\n ? file.data\n : convertBase64ToUint8Array(file.data);\n\n return new Blob([data as BlobPart], { type: file.mediaType });\n}\n","import {\n LanguageModelV4CallOptions,\n LanguageModelV4GenerateResult,\n LanguageModelV4StreamResult,\n} from '@ai-sdk/provider';\nimport { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';\nimport { FetchFunction } from '@ai-sdk/provider-utils';\n\ntype DeepInfraChatConfig = {\n provider: string;\n url: (options: { path: string; modelId?: string }) => string;\n headers: () => Record<string, string | undefined>;\n fetch?: FetchFunction;\n};\n\nexport class DeepInfraChatLanguageModel extends OpenAICompatibleChatLanguageModel {\n constructor(modelId: string, config: DeepInfraChatConfig) {\n super(modelId, config);\n }\n\n /**\n * Fixes incorrect token usage for Gemini/Gemma models from DeepInfra.\n *\n * DeepInfra's API returns completion_tokens that don't include reasoning_tokens\n * for Gemini/Gemma models, which violates the OpenAI-compatible spec.\n * According to the spec, completion_tokens should include reasoning_tokens.\n *\n * Example of incorrect data from DeepInfra:\n * {\n * \"completion_tokens\": 84, // text-only tokens\n * \"completion_tokens_details\": {\n * \"reasoning_tokens\": 1081 // reasoning tokens not included above\n * }\n * }\n *\n * This would result in negative text tokens: 84 - 1081 = -997\n *\n * The fix: If reasoning_tokens > completion_tokens, add reasoning_tokens\n * to completion_tokens: 84 + 1081 = 1165\n */\n private fixUsageForGeminiModels(usage: any): typeof usage {\n if (!usage || !usage.completion_tokens_details?.reasoning_tokens) {\n return usage;\n }\n\n const completionTokens = usage.completion_tokens ?? 0;\n const reasoningTokens = usage.completion_tokens_details.reasoning_tokens;\n\n // If reasoning tokens exceed completion tokens, the API data is incorrect\n // DeepInfra is returning only text tokens in completion_tokens, not including reasoning\n if (reasoningTokens > completionTokens) {\n const correctedCompletionTokens = completionTokens + reasoningTokens;\n\n return {\n ...usage,\n // Add reasoning_tokens to completion_tokens to get the correct total\n completion_tokens: correctedCompletionTokens,\n // Update total_tokens if present\n total_tokens:\n usage.total_tokens != null\n ? usage.total_tokens + reasoningTokens\n : undefined,\n };\n }\n\n return usage;\n }\n\n async doGenerate(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4GenerateResult> {\n const result = await super.doGenerate(options);\n\n // Fix usage if needed\n if (result.usage?.raw) {\n const fixedRawUsage = this.fixUsageForGeminiModels(result.usage.raw);\n if (fixedRawUsage !== result.usage.raw) {\n // Recalculate usage with fixed data\n const promptTokens = fixedRawUsage.prompt_tokens ?? 0;\n const completionTokens = fixedRawUsage.completion_tokens ?? 0;\n const cacheReadTokens =\n fixedRawUsage.prompt_tokens_details?.cached_tokens ?? 0;\n const reasoningTokens =\n fixedRawUsage.completion_tokens_details?.reasoning_tokens ?? 0;\n\n return {\n ...result,\n usage: {\n inputTokens: {\n total: promptTokens,\n noCache: promptTokens - cacheReadTokens,\n cacheRead: cacheReadTokens,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: completionTokens,\n text: completionTokens - reasoningTokens,\n reasoning: reasoningTokens,\n },\n raw: fixedRawUsage,\n },\n };\n }\n }\n\n return result;\n }\n\n async doStream(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4StreamResult> {\n const result = await super.doStream(options);\n\n // Wrap the stream to fix usage in the final chunk\n const originalStream = result.stream;\n const fixUsage = this.fixUsageForGeminiModels.bind(this);\n\n const transformedStream = new ReadableStream({\n async start(controller) {\n const reader = originalStream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n // Fix usage in finish chunks\n if (value.type === 'finish' && value.usage?.raw) {\n const fixedRawUsage = fixUsage(value.usage.raw);\n if (fixedRawUsage !== value.usage.raw) {\n const promptTokens = fixedRawUsage.prompt_tokens ?? 0;\n const completionTokens = fixedRawUsage.completion_tokens ?? 0;\n const cacheReadTokens =\n fixedRawUsage.prompt_tokens_details?.cached_tokens ?? 0;\n const reasoningTokens =\n fixedRawUsage.completion_tokens_details?.reasoning_tokens ??\n 0;\n\n controller.enqueue({\n ...value,\n usage: {\n inputTokens: {\n total: promptTokens,\n noCache: promptTokens - cacheReadTokens,\n cacheRead: cacheReadTokens,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: completionTokens,\n text: completionTokens - reasoningTokens,\n reasoning: reasoningTokens,\n },\n raw: fixedRawUsage,\n },\n });\n } else {\n controller.enqueue(value);\n }\n } else {\n controller.enqueue(value);\n }\n }\n controller.close();\n } catch (error) {\n controller.error(error);\n }\n },\n });\n\n return {\n ...result,\n stream: transformedStream,\n };\n }\n}\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["import_openai_compatible","import_provider_utils","response","responseHeaders","_a","_b"]}
|
|
1
|
+
{"version":3,"sources":["../src/deepinfra-provider.ts","../src/deepinfra-image-model.ts","../src/deepinfra-chat-language-model.ts","../src/version.ts"],"sourcesContent":["import {\n LanguageModelV4,\n EmbeddingModelV4,\n ProviderV4,\n ImageModelV4,\n} from '@ai-sdk/provider';\nimport {\n OpenAICompatibleCompletionLanguageModel,\n OpenAICompatibleEmbeddingModel,\n} from '@ai-sdk/openai-compatible';\nimport {\n FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n} from '@ai-sdk/provider-utils';\nimport { DeepInfraChatModelId } from './deepinfra-chat-options';\nimport { DeepInfraEmbeddingModelId } from './deepinfra-embedding-options';\nimport { DeepInfraCompletionModelId } from './deepinfra-completion-options';\nimport { DeepInfraImageModelId } from './deepinfra-image-settings';\nimport { DeepInfraImageModel } from './deepinfra-image-model';\nimport { DeepInfraChatLanguageModel } from './deepinfra-chat-language-model';\nimport { VERSION } from './version';\n\nexport interface DeepInfraProviderSettings {\n /**\n * DeepInfra API key.\n */\n apiKey?: string;\n /**\n * Base URL for the API calls.\n */\n baseURL?: string;\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface DeepInfraProvider extends ProviderV4 {\n /**\n * Creates a model for text generation.\n */\n (modelId: DeepInfraChatModelId): LanguageModelV4;\n\n /**\n * Creates a chat model for text generation.\n */\n chatModel(modelId: DeepInfraChatModelId): LanguageModelV4;\n\n /**\n * Creates a model for image generation.\n */\n image(modelId: DeepInfraImageModelId): ImageModelV4;\n\n /**\n * Creates a model for image generation.\n */\n imageModel(modelId: DeepInfraImageModelId): ImageModelV4;\n\n /**\n * Creates a chat model for text generation.\n */\n languageModel(modelId: DeepInfraChatModelId): LanguageModelV4;\n\n /**\n * Creates a completion model for text generation.\n */\n completionModel(modelId: DeepInfraCompletionModelId): LanguageModelV4;\n\n /**\n * Creates a embedding model for text generation.\n */\n embeddingModel(modelId: DeepInfraEmbeddingModelId): EmbeddingModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: DeepInfraEmbeddingModelId): EmbeddingModelV4;\n}\n\nexport function createDeepInfra(\n options: DeepInfraProviderSettings = {},\n): DeepInfraProvider {\n const baseURL = withoutTrailingSlash(\n options.baseURL ?? 'https://api.deepinfra.com/v1',\n );\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'DEEPINFRA_API_KEY',\n description: \"DeepInfra's API key\",\n })}`,\n ...options.headers,\n },\n `ai-sdk/deepinfra/${VERSION}`,\n );\n\n interface CommonModelConfig {\n provider: string;\n url: ({ path }: { path: string }) => string;\n headers: () => Record<string, string>;\n fetch?: FetchFunction;\n }\n\n const getCommonModelConfig = (modelType: string): CommonModelConfig => ({\n provider: `deepinfra.${modelType}`,\n url: ({ path }) => `${baseURL}/openai${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createChatModel = (modelId: DeepInfraChatModelId) => {\n return new DeepInfraChatLanguageModel(\n modelId,\n getCommonModelConfig('chat'),\n );\n };\n\n const createCompletionModel = (modelId: DeepInfraCompletionModelId) =>\n new OpenAICompatibleCompletionLanguageModel(\n modelId,\n getCommonModelConfig('completion'),\n );\n\n const createEmbeddingModel = (modelId: DeepInfraEmbeddingModelId) =>\n new OpenAICompatibleEmbeddingModel(\n modelId,\n getCommonModelConfig('embedding'),\n );\n\n const createImageModel = (modelId: DeepInfraImageModelId) =>\n new DeepInfraImageModel(modelId, {\n ...getCommonModelConfig('image'),\n baseURL: baseURL\n ? `${baseURL}/inference`\n : 'https://api.deepinfra.com/v1/inference',\n });\n\n const provider = (modelId: DeepInfraChatModelId) => createChatModel(modelId);\n\n provider.specificationVersion = 'v4' as const;\n provider.completionModel = createCompletionModel;\n provider.chatModel = createChatModel;\n provider.image = createImageModel;\n provider.imageModel = createImageModel;\n provider.languageModel = createChatModel;\n provider.embeddingModel = createEmbeddingModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n\n return provider;\n}\n\nexport const deepinfra = createDeepInfra();\n","import {\n ImageModelV4,\n ImageModelV4File,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertBase64ToUint8Array,\n convertToFormData,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n downloadBlob,\n FetchFunction,\n postFormDataToApi,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n} from '@ai-sdk/provider-utils';\nimport { DeepInfraImageModelId } from './deepinfra-image-settings';\nimport { z } from 'zod/v4';\n\ninterface DeepInfraImageModelConfig {\n provider: string;\n baseURL: string;\n headers?: () => Record<string, string>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class DeepInfraImageModel implements ImageModelV4 {\n readonly specificationVersion = 'v4';\n readonly maxImagesPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: DeepInfraImageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: DeepInfraImageModelId;\n config: DeepInfraImageModelConfig;\n }) {\n return new DeepInfraImageModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: DeepInfraImageModelId,\n private config: DeepInfraImageModelConfig,\n ) {}\n\n async doGenerate({\n prompt,\n n,\n size,\n aspectRatio,\n seed,\n providerOptions,\n headers,\n abortSignal,\n files,\n mask,\n }: Parameters<ImageModelV4['doGenerate']>[0]): Promise<\n Awaited<ReturnType<ImageModelV4['doGenerate']>>\n > {\n const warnings: Array<SharedV4Warning> = [];\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n\n // Image editing mode - use OpenAI-compatible /images/edits endpoint\n if (files != null && files.length > 0) {\n const { value: response, responseHeaders } = await postFormDataToApi({\n url: this.getEditUrl(),\n headers: combineHeaders(this.config.headers?.(), headers),\n formData: convertToFormData<DeepInfraFormDataInput>(\n {\n model: this.modelId,\n prompt,\n image: await Promise.all(files.map(file => fileToBlob(file))),\n mask: mask != null ? await fileToBlob(mask) : undefined,\n n,\n size,\n ...(providerOptions.deepinfra ?? {}),\n },\n { useArrayBrackets: false },\n ),\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: deepInfraEditErrorSchema,\n errorToMessage: error => error.error?.message ?? 'Unknown error',\n }),\n successfulResponseHandler: createJsonResponseHandler(\n deepInfraEditResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n images: response.data.map(item => item.b64_json),\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n // Standard image generation mode\n // Some deepinfra models support size while others support aspect ratio.\n // Allow passing either and leave it up to the server to validate.\n const splitSize = size?.split('x');\n const { value: response, responseHeaders } = await postJsonToApi({\n url: `${this.config.baseURL}/${this.modelId}`,\n headers: combineHeaders(this.config.headers?.(), headers),\n body: {\n prompt,\n num_images: n,\n ...(aspectRatio && { aspect_ratio: aspectRatio }),\n ...(splitSize && { width: splitSize[0], height: splitSize[1] }),\n ...(seed != null && { seed }),\n ...(providerOptions.deepinfra ?? {}),\n },\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: deepInfraErrorSchema,\n errorToMessage: error => error.detail.error,\n }),\n successfulResponseHandler: createJsonResponseHandler(\n deepInfraImageResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n images: response.images.map(image =>\n image.replace(/^data:image\\/\\w+;base64,/, ''),\n ),\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n private getEditUrl(): string {\n // Use OpenAI-compatible endpoint for image editing\n // baseURL is typically https://api.deepinfra.com/v1/inference\n // We need to use https://api.deepinfra.com/v1/openai/images/edits\n const baseUrl = this.config.baseURL.replace('/inference', '/openai');\n return `${baseUrl}/images/edits`;\n }\n}\n\nexport const deepInfraErrorSchema = z.object({\n detail: z.object({\n error: z.string(),\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\nexport const deepInfraImageResponseSchema = z.object({\n images: z.array(z.string()),\n});\n\n// Schema for OpenAI-compatible image edit endpoint errors\nexport const deepInfraEditErrorSchema = z.object({\n error: z\n .object({\n message: z.string(),\n })\n .optional(),\n});\n\n// Schema for OpenAI-compatible image edit endpoint response\nexport const deepInfraEditResponseSchema = z.object({\n data: z.array(z.object({ b64_json: z.string() })),\n});\n\ntype DeepInfraFormDataInput = {\n model: string;\n prompt: string | undefined;\n image: Blob | Blob[];\n mask?: Blob;\n n: number;\n size: `${number}x${number}` | undefined;\n [key: string]: unknown;\n};\n\nasync function fileToBlob(file: ImageModelV4File): Promise<Blob> {\n if (file.type === 'url') {\n return downloadBlob(file.url);\n }\n\n const data =\n file.data instanceof Uint8Array\n ? file.data\n : convertBase64ToUint8Array(file.data);\n\n return new Blob([data as BlobPart], { type: file.mediaType });\n}\n","import {\n LanguageModelV4CallOptions,\n LanguageModelV4GenerateResult,\n LanguageModelV4StreamResult,\n} from '@ai-sdk/provider';\nimport { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';\nimport {\n FetchFunction,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n} from '@ai-sdk/provider-utils';\n\ntype DeepInfraChatConfig = {\n provider: string;\n url: (options: { path: string; modelId?: string }) => string;\n headers?: () => Record<string, string | undefined>;\n fetch?: FetchFunction;\n};\n\nexport class DeepInfraChatLanguageModel extends OpenAICompatibleChatLanguageModel {\n static [WORKFLOW_SERIALIZE](model: DeepInfraChatLanguageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: string;\n config: DeepInfraChatConfig;\n }) {\n return new DeepInfraChatLanguageModel(options.modelId, options.config);\n }\n\n constructor(modelId: string, config: DeepInfraChatConfig) {\n super(modelId, config);\n }\n\n /**\n * Fixes incorrect token usage for Gemini/Gemma models from DeepInfra.\n *\n * DeepInfra's API returns completion_tokens that don't include reasoning_tokens\n * for Gemini/Gemma models, which violates the OpenAI-compatible spec.\n * According to the spec, completion_tokens should include reasoning_tokens.\n *\n * Example of incorrect data from DeepInfra:\n * {\n * \"completion_tokens\": 84, // text-only tokens\n * \"completion_tokens_details\": {\n * \"reasoning_tokens\": 1081 // reasoning tokens not included above\n * }\n * }\n *\n * This would result in negative text tokens: 84 - 1081 = -997\n *\n * The fix: If reasoning_tokens > completion_tokens, add reasoning_tokens\n * to completion_tokens: 84 + 1081 = 1165\n */\n private fixUsageForGeminiModels(usage: any): typeof usage {\n if (!usage || !usage.completion_tokens_details?.reasoning_tokens) {\n return usage;\n }\n\n const completionTokens = usage.completion_tokens ?? 0;\n const reasoningTokens = usage.completion_tokens_details.reasoning_tokens;\n\n // If reasoning tokens exceed completion tokens, the API data is incorrect\n // DeepInfra is returning only text tokens in completion_tokens, not including reasoning\n if (reasoningTokens > completionTokens) {\n const correctedCompletionTokens = completionTokens + reasoningTokens;\n\n return {\n ...usage,\n // Add reasoning_tokens to completion_tokens to get the correct total\n completion_tokens: correctedCompletionTokens,\n // Update total_tokens if present\n total_tokens:\n usage.total_tokens != null\n ? usage.total_tokens + reasoningTokens\n : undefined,\n };\n }\n\n return usage;\n }\n\n async doGenerate(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4GenerateResult> {\n const result = await super.doGenerate(options);\n\n // Fix usage if needed\n if (result.usage?.raw) {\n const fixedRawUsage = this.fixUsageForGeminiModels(result.usage.raw);\n if (fixedRawUsage !== result.usage.raw) {\n // Recalculate usage with fixed data\n const promptTokens = fixedRawUsage.prompt_tokens ?? 0;\n const completionTokens = fixedRawUsage.completion_tokens ?? 0;\n const cacheReadTokens =\n fixedRawUsage.prompt_tokens_details?.cached_tokens ?? 0;\n const reasoningTokens =\n fixedRawUsage.completion_tokens_details?.reasoning_tokens ?? 0;\n\n return {\n ...result,\n usage: {\n inputTokens: {\n total: promptTokens,\n noCache: promptTokens - cacheReadTokens,\n cacheRead: cacheReadTokens,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: completionTokens,\n text: completionTokens - reasoningTokens,\n reasoning: reasoningTokens,\n },\n raw: fixedRawUsage,\n },\n };\n }\n }\n\n return result;\n }\n\n async doStream(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4StreamResult> {\n const result = await super.doStream(options);\n\n // Wrap the stream to fix usage in the final chunk\n const originalStream = result.stream;\n const fixUsage = this.fixUsageForGeminiModels.bind(this);\n\n const transformedStream = new ReadableStream({\n async start(controller) {\n const reader = originalStream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n // Fix usage in finish chunks\n if (value.type === 'finish' && value.usage?.raw) {\n const fixedRawUsage = fixUsage(value.usage.raw);\n if (fixedRawUsage !== value.usage.raw) {\n const promptTokens = fixedRawUsage.prompt_tokens ?? 0;\n const completionTokens = fixedRawUsage.completion_tokens ?? 0;\n const cacheReadTokens =\n fixedRawUsage.prompt_tokens_details?.cached_tokens ?? 0;\n const reasoningTokens =\n fixedRawUsage.completion_tokens_details?.reasoning_tokens ??\n 0;\n\n controller.enqueue({\n ...value,\n usage: {\n inputTokens: {\n total: promptTokens,\n noCache: promptTokens - cacheReadTokens,\n cacheRead: cacheReadTokens,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: completionTokens,\n text: completionTokens - reasoningTokens,\n reasoning: reasoningTokens,\n },\n raw: fixedRawUsage,\n },\n });\n } else {\n controller.enqueue(value);\n }\n } else {\n controller.enqueue(value);\n }\n }\n controller.close();\n } catch (error) {\n controller.error(error);\n }\n },\n });\n\n return {\n ...result,\n stream: transformedStream,\n };\n }\n}\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["response","responseHeaders","_a","_b","serializeModelOptions","WORKFLOW_SERIALIZE","WORKFLOW_DESERIALIZE"]}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/deepinfra",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.30",
|
|
4
|
+
"type": "module",
|
|
4
5
|
"license": "Apache-2.0",
|
|
5
6
|
"sideEffects": false,
|
|
6
7
|
"main": "./dist/index.js",
|
|
7
|
-
"module": "./dist/index.mjs",
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
9
9
|
"files": [
|
|
10
10
|
"dist/**/*",
|
|
@@ -24,21 +24,21 @@
|
|
|
24
24
|
"./package.json": "./package.json",
|
|
25
25
|
".": {
|
|
26
26
|
"types": "./dist/index.d.ts",
|
|
27
|
-
"import": "./dist/index.
|
|
28
|
-
"
|
|
27
|
+
"import": "./dist/index.js",
|
|
28
|
+
"default": "./dist/index.js"
|
|
29
29
|
}
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@ai-sdk/openai-compatible": "3.0.0-beta.
|
|
33
|
-
"@ai-sdk/provider": "4.0.0-beta.
|
|
34
|
-
"@ai-sdk/provider-utils": "5.0.0-beta.
|
|
32
|
+
"@ai-sdk/openai-compatible": "3.0.0-beta.30",
|
|
33
|
+
"@ai-sdk/provider": "4.0.0-beta.12",
|
|
34
|
+
"@ai-sdk/provider-utils": "5.0.0-beta.25"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@types/node": "20.17.24",
|
|
38
38
|
"tsup": "^8",
|
|
39
39
|
"typescript": "5.8.3",
|
|
40
40
|
"zod": "3.25.76",
|
|
41
|
-
"@ai-sdk/test-server": "2.0.0-beta.
|
|
41
|
+
"@ai-sdk/test-server": "2.0.0-beta.1",
|
|
42
42
|
"@vercel/ai-tsconfig": "0.0.0"
|
|
43
43
|
},
|
|
44
44
|
"peerDependencies": {
|
|
@@ -65,9 +65,7 @@
|
|
|
65
65
|
"build": "pnpm clean && tsup --tsconfig tsconfig.build.json",
|
|
66
66
|
"build:watch": "pnpm clean && tsup --watch",
|
|
67
67
|
"clean": "del-cli dist docs *.tsbuildinfo",
|
|
68
|
-
"lint": "eslint \"./**/*.ts*\"",
|
|
69
68
|
"type-check": "tsc --build",
|
|
70
|
-
"prettier-check": "prettier --check \"./**/*.ts*\"",
|
|
71
69
|
"test": "pnpm test:node && pnpm test:edge",
|
|
72
70
|
"test:update": "pnpm test:node -u",
|
|
73
71
|
"test:watch": "vitest --config vitest.node.config.js",
|
|
@@ -4,16 +4,35 @@ import {
|
|
|
4
4
|
LanguageModelV4StreamResult,
|
|
5
5
|
} from '@ai-sdk/provider';
|
|
6
6
|
import { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
FetchFunction,
|
|
9
|
+
serializeModelOptions,
|
|
10
|
+
WORKFLOW_SERIALIZE,
|
|
11
|
+
WORKFLOW_DESERIALIZE,
|
|
12
|
+
} from '@ai-sdk/provider-utils';
|
|
8
13
|
|
|
9
14
|
type DeepInfraChatConfig = {
|
|
10
15
|
provider: string;
|
|
11
16
|
url: (options: { path: string; modelId?: string }) => string;
|
|
12
|
-
headers
|
|
17
|
+
headers?: () => Record<string, string | undefined>;
|
|
13
18
|
fetch?: FetchFunction;
|
|
14
19
|
};
|
|
15
20
|
|
|
16
21
|
export class DeepInfraChatLanguageModel extends OpenAICompatibleChatLanguageModel {
|
|
22
|
+
static [WORKFLOW_SERIALIZE](model: DeepInfraChatLanguageModel) {
|
|
23
|
+
return serializeModelOptions({
|
|
24
|
+
modelId: model.modelId,
|
|
25
|
+
config: model.config,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
static [WORKFLOW_DESERIALIZE](options: {
|
|
30
|
+
modelId: string;
|
|
31
|
+
config: DeepInfraChatConfig;
|
|
32
|
+
}) {
|
|
33
|
+
return new DeepInfraChatLanguageModel(options.modelId, options.config);
|
|
34
|
+
}
|
|
35
|
+
|
|
17
36
|
constructor(modelId: string, config: DeepInfraChatConfig) {
|
|
18
37
|
super(modelId, config);
|
|
19
38
|
}
|
|
@@ -13,6 +13,9 @@ import {
|
|
|
13
13
|
FetchFunction,
|
|
14
14
|
postFormDataToApi,
|
|
15
15
|
postJsonToApi,
|
|
16
|
+
serializeModelOptions,
|
|
17
|
+
WORKFLOW_SERIALIZE,
|
|
18
|
+
WORKFLOW_DESERIALIZE,
|
|
16
19
|
} from '@ai-sdk/provider-utils';
|
|
17
20
|
import { DeepInfraImageModelId } from './deepinfra-image-settings';
|
|
18
21
|
import { z } from 'zod/v4';
|
|
@@ -20,7 +23,7 @@ import { z } from 'zod/v4';
|
|
|
20
23
|
interface DeepInfraImageModelConfig {
|
|
21
24
|
provider: string;
|
|
22
25
|
baseURL: string;
|
|
23
|
-
headers
|
|
26
|
+
headers?: () => Record<string, string>;
|
|
24
27
|
fetch?: FetchFunction;
|
|
25
28
|
_internal?: {
|
|
26
29
|
currentDate?: () => Date;
|
|
@@ -35,6 +38,20 @@ export class DeepInfraImageModel implements ImageModelV4 {
|
|
|
35
38
|
return this.config.provider;
|
|
36
39
|
}
|
|
37
40
|
|
|
41
|
+
static [WORKFLOW_SERIALIZE](model: DeepInfraImageModel) {
|
|
42
|
+
return serializeModelOptions({
|
|
43
|
+
modelId: model.modelId,
|
|
44
|
+
config: model.config,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
static [WORKFLOW_DESERIALIZE](options: {
|
|
49
|
+
modelId: DeepInfraImageModelId;
|
|
50
|
+
config: DeepInfraImageModelConfig;
|
|
51
|
+
}) {
|
|
52
|
+
return new DeepInfraImageModel(options.modelId, options.config);
|
|
53
|
+
}
|
|
54
|
+
|
|
38
55
|
constructor(
|
|
39
56
|
readonly modelId: DeepInfraImageModelId,
|
|
40
57
|
private config: DeepInfraImageModelConfig,
|
|
@@ -61,7 +78,7 @@ export class DeepInfraImageModel implements ImageModelV4 {
|
|
|
61
78
|
if (files != null && files.length > 0) {
|
|
62
79
|
const { value: response, responseHeaders } = await postFormDataToApi({
|
|
63
80
|
url: this.getEditUrl(),
|
|
64
|
-
headers: combineHeaders(this.config.headers(), headers),
|
|
81
|
+
headers: combineHeaders(this.config.headers?.(), headers),
|
|
65
82
|
formData: convertToFormData<DeepInfraFormDataInput>(
|
|
66
83
|
{
|
|
67
84
|
model: this.modelId,
|
|
@@ -102,7 +119,7 @@ export class DeepInfraImageModel implements ImageModelV4 {
|
|
|
102
119
|
const splitSize = size?.split('x');
|
|
103
120
|
const { value: response, responseHeaders } = await postJsonToApi({
|
|
104
121
|
url: `${this.config.baseURL}/${this.modelId}`,
|
|
105
|
-
headers: combineHeaders(this.config.headers(), headers),
|
|
122
|
+
headers: combineHeaders(this.config.headers?.(), headers),
|
|
106
123
|
body: {
|
|
107
124
|
prompt,
|
|
108
125
|
num_images: n,
|
package/dist/index.d.mts
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { ProviderV4, LanguageModelV4, ImageModelV4, EmbeddingModelV4 } from '@ai-sdk/provider';
|
|
2
|
-
import { FetchFunction } from '@ai-sdk/provider-utils';
|
|
3
|
-
export { OpenAICompatibleErrorData as DeepInfraErrorData } from '@ai-sdk/openai-compatible';
|
|
4
|
-
|
|
5
|
-
type DeepInfraChatModelId = '01-ai/Yi-34B-Chat' | 'Austism/chronos-hermes-13b-v2' | 'bigcode/starcoder2-15b-instruct-v0.1' | 'bigcode/starcoder2-15b' | 'codellama/CodeLlama-34b-Instruct-hf' | 'codellama/CodeLlama-70b-Instruct-hf' | 'cognitivecomputations/dolphin-2.6-mixtral-8x7b' | 'cognitivecomputations/dolphin-2.9.1-llama-3-70b' | 'databricks/dbrx-instruct' | 'deepinfra/airoboros-70b' | 'deepseek-ai/DeepSeek-V3' | 'google/codegemma-7b-it' | 'google/gemma-1.1-7b-it' | 'google/gemma-2-27b-it' | 'google/gemma-2-9b-it' | 'Gryphe/MythoMax-L2-13b-turbo' | 'Gryphe/MythoMax-L2-13b' | 'HuggingFaceH4/zephyr-orpo-141b-A35b-v0.1' | 'KoboldAI/LLaMA2-13B-Tiefighter' | 'lizpreciatior/lzlv_70b_fp16_hf' | 'mattshumer/Reflection-Llama-3.1-70B' | 'meta-llama/Llama-2-13b-chat-hf' | 'meta-llama/Llama-2-70b-chat-hf' | 'meta-llama/Llama-2-7b-chat-hf' | 'meta-llama/Llama-3.2-11B-Vision-Instruct' | 'meta-llama/Llama-3.2-1B-Instruct' | 'meta-llama/Llama-3.2-3B-Instruct' | 'meta-llama/Llama-3.2-90B-Vision-Instruct' | 'meta-llama/Llama-3.3-70B-Instruct-Turbo' | 'meta-llama/Llama-3.3-70B-Instruct' | 'meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8' | 'meta-llama/Llama-4-Scout-17B-16E-Instruct' | 'meta-llama/Meta-Llama-3-70B-Instruct' | 'meta-llama/Meta-Llama-3-8B-Instruct' | 'meta-llama/Meta-Llama-3.1-405B-Instruct' | 'meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo' | 'meta-llama/Meta-Llama-3.1-70B-Instruct' | 'meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo' | 'meta-llama/Meta-Llama-3.1-8B-Instruct' | 'microsoft/Phi-3-medium-4k-instruct' | 'microsoft/WizardLM-2-7B' | 'microsoft/WizardLM-2-8x22B' | 'mistralai/Mistral-7B-Instruct-v0.1' | 'mistralai/Mistral-7B-Instruct-v0.2' | 'mistralai/Mistral-7B-Instruct-v0.3' | 'mistralai/Mistral-Nemo-Instruct-2407' | 'mistralai/Mixtral-8x22B-Instruct-v0.1' | 'mistralai/Mixtral-8x22B-v0.1' | 'mistralai/Mixtral-8x7B-Instruct-v0.1' | 'NousResearch/Hermes-3-Llama-3.1-405B' | 'nvidia/Llama-3.1-Nemotron-70B-Instruct' | 'nvidia/Nemotron-4-340B-Instruct' | 'openbmb/MiniCPM-Llama3-V-2_5' | 'openchat/openchat_3.5' | 'openchat/openchat-3.6-8b' | 'Phind/Phind-CodeLlama-34B-v2' | 'Qwen/Qwen2-72B-Instruct' | 'Qwen/Qwen2-7B-Instruct' | 'Qwen/Qwen2.5-72B-Instruct' | 'Qwen/Qwen2.5-7B-Instruct' | 'Qwen/Qwen2.5-Coder-32B-Instruct' | 'Qwen/Qwen2.5-Coder-7B' | 'Qwen/QwQ-32B-Preview' | 'Sao10K/L3-70B-Euryale-v2.1' | 'Sao10K/L3-8B-Lunaris-v1' | 'Sao10K/L3.1-70B-Euryale-v2.2' | (string & {});
|
|
6
|
-
|
|
7
|
-
type DeepInfraEmbeddingModelId = 'BAAI/bge-base-en-v1.5' | 'BAAI/bge-large-en-v1.5' | 'BAAI/bge-m3' | 'intfloat/e5-base-v2' | 'intfloat/e5-large-v2' | 'intfloat/multilingual-e5-large' | 'sentence-transformers/all-MiniLM-L12-v2' | 'sentence-transformers/all-MiniLM-L6-v2' | 'sentence-transformers/all-mpnet-base-v2' | 'sentence-transformers/clip-ViT-B-32' | 'sentence-transformers/clip-ViT-B-32-multilingual-v1' | 'sentence-transformers/multi-qa-mpnet-base-dot-v1' | 'sentence-transformers/paraphrase-MiniLM-L6-v2' | 'shibing624/text2vec-base-chinese' | 'thenlper/gte-base' | 'thenlper/gte-large' | (string & {});
|
|
8
|
-
|
|
9
|
-
type DeepInfraCompletionModelId = DeepInfraChatModelId;
|
|
10
|
-
|
|
11
|
-
type DeepInfraImageModelId = 'stabilityai/sd3.5' | 'black-forest-labs/FLUX-1.1-pro' | 'black-forest-labs/FLUX-1-schnell' | 'black-forest-labs/FLUX-1-dev' | 'black-forest-labs/FLUX-pro' | 'black-forest-labs/FLUX.1-Kontext-dev' | 'black-forest-labs/FLUX.1-Kontext-pro' | 'stabilityai/sd3.5-medium' | 'stabilityai/sdxl-turbo' | (string & {});
|
|
12
|
-
|
|
13
|
-
interface DeepInfraProviderSettings {
|
|
14
|
-
/**
|
|
15
|
-
* DeepInfra API key.
|
|
16
|
-
*/
|
|
17
|
-
apiKey?: string;
|
|
18
|
-
/**
|
|
19
|
-
* Base URL for the API calls.
|
|
20
|
-
*/
|
|
21
|
-
baseURL?: string;
|
|
22
|
-
/**
|
|
23
|
-
* Custom headers to include in the requests.
|
|
24
|
-
*/
|
|
25
|
-
headers?: Record<string, string>;
|
|
26
|
-
/**
|
|
27
|
-
* Custom fetch implementation. You can use it as a middleware to intercept requests,
|
|
28
|
-
* or to provide a custom fetch implementation for e.g. testing.
|
|
29
|
-
*/
|
|
30
|
-
fetch?: FetchFunction;
|
|
31
|
-
}
|
|
32
|
-
interface DeepInfraProvider extends ProviderV4 {
|
|
33
|
-
/**
|
|
34
|
-
* Creates a model for text generation.
|
|
35
|
-
*/
|
|
36
|
-
(modelId: DeepInfraChatModelId): LanguageModelV4;
|
|
37
|
-
/**
|
|
38
|
-
* Creates a chat model for text generation.
|
|
39
|
-
*/
|
|
40
|
-
chatModel(modelId: DeepInfraChatModelId): LanguageModelV4;
|
|
41
|
-
/**
|
|
42
|
-
* Creates a model for image generation.
|
|
43
|
-
*/
|
|
44
|
-
image(modelId: DeepInfraImageModelId): ImageModelV4;
|
|
45
|
-
/**
|
|
46
|
-
* Creates a model for image generation.
|
|
47
|
-
*/
|
|
48
|
-
imageModel(modelId: DeepInfraImageModelId): ImageModelV4;
|
|
49
|
-
/**
|
|
50
|
-
* Creates a chat model for text generation.
|
|
51
|
-
*/
|
|
52
|
-
languageModel(modelId: DeepInfraChatModelId): LanguageModelV4;
|
|
53
|
-
/**
|
|
54
|
-
* Creates a completion model for text generation.
|
|
55
|
-
*/
|
|
56
|
-
completionModel(modelId: DeepInfraCompletionModelId): LanguageModelV4;
|
|
57
|
-
/**
|
|
58
|
-
* Creates a embedding model for text generation.
|
|
59
|
-
*/
|
|
60
|
-
embeddingModel(modelId: DeepInfraEmbeddingModelId): EmbeddingModelV4;
|
|
61
|
-
/**
|
|
62
|
-
* @deprecated Use `embeddingModel` instead.
|
|
63
|
-
*/
|
|
64
|
-
textEmbeddingModel(modelId: DeepInfraEmbeddingModelId): EmbeddingModelV4;
|
|
65
|
-
}
|
|
66
|
-
declare function createDeepInfra(options?: DeepInfraProviderSettings): DeepInfraProvider;
|
|
67
|
-
declare const deepinfra: DeepInfraProvider;
|
|
68
|
-
|
|
69
|
-
declare const VERSION: string;
|
|
70
|
-
|
|
71
|
-
export { type DeepInfraProvider, type DeepInfraProviderSettings, VERSION, createDeepInfra, deepinfra };
|
package/dist/index.mjs
DELETED
|
@@ -1,344 +0,0 @@
|
|
|
1
|
-
// src/deepinfra-provider.ts
|
|
2
|
-
import {
|
|
3
|
-
OpenAICompatibleCompletionLanguageModel,
|
|
4
|
-
OpenAICompatibleEmbeddingModel
|
|
5
|
-
} from "@ai-sdk/openai-compatible";
|
|
6
|
-
import {
|
|
7
|
-
loadApiKey,
|
|
8
|
-
withoutTrailingSlash,
|
|
9
|
-
withUserAgentSuffix
|
|
10
|
-
} from "@ai-sdk/provider-utils";
|
|
11
|
-
|
|
12
|
-
// src/deepinfra-image-model.ts
|
|
13
|
-
import {
|
|
14
|
-
combineHeaders,
|
|
15
|
-
convertBase64ToUint8Array,
|
|
16
|
-
convertToFormData,
|
|
17
|
-
createJsonErrorResponseHandler,
|
|
18
|
-
createJsonResponseHandler,
|
|
19
|
-
downloadBlob,
|
|
20
|
-
postFormDataToApi,
|
|
21
|
-
postJsonToApi
|
|
22
|
-
} from "@ai-sdk/provider-utils";
|
|
23
|
-
import { z } from "zod/v4";
|
|
24
|
-
var DeepInfraImageModel = class {
|
|
25
|
-
constructor(modelId, config) {
|
|
26
|
-
this.modelId = modelId;
|
|
27
|
-
this.config = config;
|
|
28
|
-
this.specificationVersion = "v4";
|
|
29
|
-
this.maxImagesPerCall = 1;
|
|
30
|
-
}
|
|
31
|
-
get provider() {
|
|
32
|
-
return this.config.provider;
|
|
33
|
-
}
|
|
34
|
-
async doGenerate({
|
|
35
|
-
prompt,
|
|
36
|
-
n,
|
|
37
|
-
size,
|
|
38
|
-
aspectRatio,
|
|
39
|
-
seed,
|
|
40
|
-
providerOptions,
|
|
41
|
-
headers,
|
|
42
|
-
abortSignal,
|
|
43
|
-
files,
|
|
44
|
-
mask
|
|
45
|
-
}) {
|
|
46
|
-
var _a, _b, _c, _d, _e;
|
|
47
|
-
const warnings = [];
|
|
48
|
-
const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();
|
|
49
|
-
if (files != null && files.length > 0) {
|
|
50
|
-
const { value: response2, responseHeaders: responseHeaders2 } = await postFormDataToApi({
|
|
51
|
-
url: this.getEditUrl(),
|
|
52
|
-
headers: combineHeaders(this.config.headers(), headers),
|
|
53
|
-
formData: convertToFormData(
|
|
54
|
-
{
|
|
55
|
-
model: this.modelId,
|
|
56
|
-
prompt,
|
|
57
|
-
image: await Promise.all(files.map((file) => fileToBlob(file))),
|
|
58
|
-
mask: mask != null ? await fileToBlob(mask) : void 0,
|
|
59
|
-
n,
|
|
60
|
-
size,
|
|
61
|
-
...(_d = providerOptions.deepinfra) != null ? _d : {}
|
|
62
|
-
},
|
|
63
|
-
{ useArrayBrackets: false }
|
|
64
|
-
),
|
|
65
|
-
failedResponseHandler: createJsonErrorResponseHandler({
|
|
66
|
-
errorSchema: deepInfraEditErrorSchema,
|
|
67
|
-
errorToMessage: (error) => {
|
|
68
|
-
var _a2, _b2;
|
|
69
|
-
return (_b2 = (_a2 = error.error) == null ? void 0 : _a2.message) != null ? _b2 : "Unknown error";
|
|
70
|
-
}
|
|
71
|
-
}),
|
|
72
|
-
successfulResponseHandler: createJsonResponseHandler(
|
|
73
|
-
deepInfraEditResponseSchema
|
|
74
|
-
),
|
|
75
|
-
abortSignal,
|
|
76
|
-
fetch: this.config.fetch
|
|
77
|
-
});
|
|
78
|
-
return {
|
|
79
|
-
images: response2.data.map((item) => item.b64_json),
|
|
80
|
-
warnings,
|
|
81
|
-
response: {
|
|
82
|
-
timestamp: currentDate,
|
|
83
|
-
modelId: this.modelId,
|
|
84
|
-
headers: responseHeaders2
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
const splitSize = size == null ? void 0 : size.split("x");
|
|
89
|
-
const { value: response, responseHeaders } = await postJsonToApi({
|
|
90
|
-
url: `${this.config.baseURL}/${this.modelId}`,
|
|
91
|
-
headers: combineHeaders(this.config.headers(), headers),
|
|
92
|
-
body: {
|
|
93
|
-
prompt,
|
|
94
|
-
num_images: n,
|
|
95
|
-
...aspectRatio && { aspect_ratio: aspectRatio },
|
|
96
|
-
...splitSize && { width: splitSize[0], height: splitSize[1] },
|
|
97
|
-
...seed != null && { seed },
|
|
98
|
-
...(_e = providerOptions.deepinfra) != null ? _e : {}
|
|
99
|
-
},
|
|
100
|
-
failedResponseHandler: createJsonErrorResponseHandler({
|
|
101
|
-
errorSchema: deepInfraErrorSchema,
|
|
102
|
-
errorToMessage: (error) => error.detail.error
|
|
103
|
-
}),
|
|
104
|
-
successfulResponseHandler: createJsonResponseHandler(
|
|
105
|
-
deepInfraImageResponseSchema
|
|
106
|
-
),
|
|
107
|
-
abortSignal,
|
|
108
|
-
fetch: this.config.fetch
|
|
109
|
-
});
|
|
110
|
-
return {
|
|
111
|
-
images: response.images.map(
|
|
112
|
-
(image) => image.replace(/^data:image\/\w+;base64,/, "")
|
|
113
|
-
),
|
|
114
|
-
warnings,
|
|
115
|
-
response: {
|
|
116
|
-
timestamp: currentDate,
|
|
117
|
-
modelId: this.modelId,
|
|
118
|
-
headers: responseHeaders
|
|
119
|
-
}
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
getEditUrl() {
|
|
123
|
-
const baseUrl = this.config.baseURL.replace("/inference", "/openai");
|
|
124
|
-
return `${baseUrl}/images/edits`;
|
|
125
|
-
}
|
|
126
|
-
};
|
|
127
|
-
var deepInfraErrorSchema = z.object({
|
|
128
|
-
detail: z.object({
|
|
129
|
-
error: z.string()
|
|
130
|
-
})
|
|
131
|
-
});
|
|
132
|
-
var deepInfraImageResponseSchema = z.object({
|
|
133
|
-
images: z.array(z.string())
|
|
134
|
-
});
|
|
135
|
-
var deepInfraEditErrorSchema = z.object({
|
|
136
|
-
error: z.object({
|
|
137
|
-
message: z.string()
|
|
138
|
-
}).optional()
|
|
139
|
-
});
|
|
140
|
-
var deepInfraEditResponseSchema = z.object({
|
|
141
|
-
data: z.array(z.object({ b64_json: z.string() }))
|
|
142
|
-
});
|
|
143
|
-
async function fileToBlob(file) {
|
|
144
|
-
if (file.type === "url") {
|
|
145
|
-
return downloadBlob(file.url);
|
|
146
|
-
}
|
|
147
|
-
const data = file.data instanceof Uint8Array ? file.data : convertBase64ToUint8Array(file.data);
|
|
148
|
-
return new Blob([data], { type: file.mediaType });
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// src/deepinfra-chat-language-model.ts
|
|
152
|
-
import { OpenAICompatibleChatLanguageModel } from "@ai-sdk/openai-compatible";
|
|
153
|
-
var DeepInfraChatLanguageModel = class extends OpenAICompatibleChatLanguageModel {
|
|
154
|
-
constructor(modelId, config) {
|
|
155
|
-
super(modelId, config);
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Fixes incorrect token usage for Gemini/Gemma models from DeepInfra.
|
|
159
|
-
*
|
|
160
|
-
* DeepInfra's API returns completion_tokens that don't include reasoning_tokens
|
|
161
|
-
* for Gemini/Gemma models, which violates the OpenAI-compatible spec.
|
|
162
|
-
* According to the spec, completion_tokens should include reasoning_tokens.
|
|
163
|
-
*
|
|
164
|
-
* Example of incorrect data from DeepInfra:
|
|
165
|
-
* {
|
|
166
|
-
* "completion_tokens": 84, // text-only tokens
|
|
167
|
-
* "completion_tokens_details": {
|
|
168
|
-
* "reasoning_tokens": 1081 // reasoning tokens not included above
|
|
169
|
-
* }
|
|
170
|
-
* }
|
|
171
|
-
*
|
|
172
|
-
* This would result in negative text tokens: 84 - 1081 = -997
|
|
173
|
-
*
|
|
174
|
-
* The fix: If reasoning_tokens > completion_tokens, add reasoning_tokens
|
|
175
|
-
* to completion_tokens: 84 + 1081 = 1165
|
|
176
|
-
*/
|
|
177
|
-
fixUsageForGeminiModels(usage) {
|
|
178
|
-
var _a, _b;
|
|
179
|
-
if (!usage || !((_a = usage.completion_tokens_details) == null ? void 0 : _a.reasoning_tokens)) {
|
|
180
|
-
return usage;
|
|
181
|
-
}
|
|
182
|
-
const completionTokens = (_b = usage.completion_tokens) != null ? _b : 0;
|
|
183
|
-
const reasoningTokens = usage.completion_tokens_details.reasoning_tokens;
|
|
184
|
-
if (reasoningTokens > completionTokens) {
|
|
185
|
-
const correctedCompletionTokens = completionTokens + reasoningTokens;
|
|
186
|
-
return {
|
|
187
|
-
...usage,
|
|
188
|
-
// Add reasoning_tokens to completion_tokens to get the correct total
|
|
189
|
-
completion_tokens: correctedCompletionTokens,
|
|
190
|
-
// Update total_tokens if present
|
|
191
|
-
total_tokens: usage.total_tokens != null ? usage.total_tokens + reasoningTokens : void 0
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
return usage;
|
|
195
|
-
}
|
|
196
|
-
async doGenerate(options) {
|
|
197
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
198
|
-
const result = await super.doGenerate(options);
|
|
199
|
-
if ((_a = result.usage) == null ? void 0 : _a.raw) {
|
|
200
|
-
const fixedRawUsage = this.fixUsageForGeminiModels(result.usage.raw);
|
|
201
|
-
if (fixedRawUsage !== result.usage.raw) {
|
|
202
|
-
const promptTokens = (_b = fixedRawUsage.prompt_tokens) != null ? _b : 0;
|
|
203
|
-
const completionTokens = (_c = fixedRawUsage.completion_tokens) != null ? _c : 0;
|
|
204
|
-
const cacheReadTokens = (_e = (_d = fixedRawUsage.prompt_tokens_details) == null ? void 0 : _d.cached_tokens) != null ? _e : 0;
|
|
205
|
-
const reasoningTokens = (_g = (_f = fixedRawUsage.completion_tokens_details) == null ? void 0 : _f.reasoning_tokens) != null ? _g : 0;
|
|
206
|
-
return {
|
|
207
|
-
...result,
|
|
208
|
-
usage: {
|
|
209
|
-
inputTokens: {
|
|
210
|
-
total: promptTokens,
|
|
211
|
-
noCache: promptTokens - cacheReadTokens,
|
|
212
|
-
cacheRead: cacheReadTokens,
|
|
213
|
-
cacheWrite: void 0
|
|
214
|
-
},
|
|
215
|
-
outputTokens: {
|
|
216
|
-
total: completionTokens,
|
|
217
|
-
text: completionTokens - reasoningTokens,
|
|
218
|
-
reasoning: reasoningTokens
|
|
219
|
-
},
|
|
220
|
-
raw: fixedRawUsage
|
|
221
|
-
}
|
|
222
|
-
};
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
return result;
|
|
226
|
-
}
|
|
227
|
-
async doStream(options) {
|
|
228
|
-
const result = await super.doStream(options);
|
|
229
|
-
const originalStream = result.stream;
|
|
230
|
-
const fixUsage = this.fixUsageForGeminiModels.bind(this);
|
|
231
|
-
const transformedStream = new ReadableStream({
|
|
232
|
-
async start(controller) {
|
|
233
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
234
|
-
const reader = originalStream.getReader();
|
|
235
|
-
try {
|
|
236
|
-
while (true) {
|
|
237
|
-
const { done, value } = await reader.read();
|
|
238
|
-
if (done) break;
|
|
239
|
-
if (value.type === "finish" && ((_a = value.usage) == null ? void 0 : _a.raw)) {
|
|
240
|
-
const fixedRawUsage = fixUsage(value.usage.raw);
|
|
241
|
-
if (fixedRawUsage !== value.usage.raw) {
|
|
242
|
-
const promptTokens = (_b = fixedRawUsage.prompt_tokens) != null ? _b : 0;
|
|
243
|
-
const completionTokens = (_c = fixedRawUsage.completion_tokens) != null ? _c : 0;
|
|
244
|
-
const cacheReadTokens = (_e = (_d = fixedRawUsage.prompt_tokens_details) == null ? void 0 : _d.cached_tokens) != null ? _e : 0;
|
|
245
|
-
const reasoningTokens = (_g = (_f = fixedRawUsage.completion_tokens_details) == null ? void 0 : _f.reasoning_tokens) != null ? _g : 0;
|
|
246
|
-
controller.enqueue({
|
|
247
|
-
...value,
|
|
248
|
-
usage: {
|
|
249
|
-
inputTokens: {
|
|
250
|
-
total: promptTokens,
|
|
251
|
-
noCache: promptTokens - cacheReadTokens,
|
|
252
|
-
cacheRead: cacheReadTokens,
|
|
253
|
-
cacheWrite: void 0
|
|
254
|
-
},
|
|
255
|
-
outputTokens: {
|
|
256
|
-
total: completionTokens,
|
|
257
|
-
text: completionTokens - reasoningTokens,
|
|
258
|
-
reasoning: reasoningTokens
|
|
259
|
-
},
|
|
260
|
-
raw: fixedRawUsage
|
|
261
|
-
}
|
|
262
|
-
});
|
|
263
|
-
} else {
|
|
264
|
-
controller.enqueue(value);
|
|
265
|
-
}
|
|
266
|
-
} else {
|
|
267
|
-
controller.enqueue(value);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
controller.close();
|
|
271
|
-
} catch (error) {
|
|
272
|
-
controller.error(error);
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
});
|
|
276
|
-
return {
|
|
277
|
-
...result,
|
|
278
|
-
stream: transformedStream
|
|
279
|
-
};
|
|
280
|
-
}
|
|
281
|
-
};
|
|
282
|
-
|
|
283
|
-
// src/version.ts
|
|
284
|
-
var VERSION = true ? "3.0.0-beta.3" : "0.0.0-test";
|
|
285
|
-
|
|
286
|
-
// src/deepinfra-provider.ts
|
|
287
|
-
function createDeepInfra(options = {}) {
|
|
288
|
-
var _a;
|
|
289
|
-
const baseURL = withoutTrailingSlash(
|
|
290
|
-
(_a = options.baseURL) != null ? _a : "https://api.deepinfra.com/v1"
|
|
291
|
-
);
|
|
292
|
-
const getHeaders = () => withUserAgentSuffix(
|
|
293
|
-
{
|
|
294
|
-
Authorization: `Bearer ${loadApiKey({
|
|
295
|
-
apiKey: options.apiKey,
|
|
296
|
-
environmentVariableName: "DEEPINFRA_API_KEY",
|
|
297
|
-
description: "DeepInfra's API key"
|
|
298
|
-
})}`,
|
|
299
|
-
...options.headers
|
|
300
|
-
},
|
|
301
|
-
`ai-sdk/deepinfra/${VERSION}`
|
|
302
|
-
);
|
|
303
|
-
const getCommonModelConfig = (modelType) => ({
|
|
304
|
-
provider: `deepinfra.${modelType}`,
|
|
305
|
-
url: ({ path }) => `${baseURL}/openai${path}`,
|
|
306
|
-
headers: getHeaders,
|
|
307
|
-
fetch: options.fetch
|
|
308
|
-
});
|
|
309
|
-
const createChatModel = (modelId) => {
|
|
310
|
-
return new DeepInfraChatLanguageModel(
|
|
311
|
-
modelId,
|
|
312
|
-
getCommonModelConfig("chat")
|
|
313
|
-
);
|
|
314
|
-
};
|
|
315
|
-
const createCompletionModel = (modelId) => new OpenAICompatibleCompletionLanguageModel(
|
|
316
|
-
modelId,
|
|
317
|
-
getCommonModelConfig("completion")
|
|
318
|
-
);
|
|
319
|
-
const createEmbeddingModel = (modelId) => new OpenAICompatibleEmbeddingModel(
|
|
320
|
-
modelId,
|
|
321
|
-
getCommonModelConfig("embedding")
|
|
322
|
-
);
|
|
323
|
-
const createImageModel = (modelId) => new DeepInfraImageModel(modelId, {
|
|
324
|
-
...getCommonModelConfig("image"),
|
|
325
|
-
baseURL: baseURL ? `${baseURL}/inference` : "https://api.deepinfra.com/v1/inference"
|
|
326
|
-
});
|
|
327
|
-
const provider = (modelId) => createChatModel(modelId);
|
|
328
|
-
provider.specificationVersion = "v4";
|
|
329
|
-
provider.completionModel = createCompletionModel;
|
|
330
|
-
provider.chatModel = createChatModel;
|
|
331
|
-
provider.image = createImageModel;
|
|
332
|
-
provider.imageModel = createImageModel;
|
|
333
|
-
provider.languageModel = createChatModel;
|
|
334
|
-
provider.embeddingModel = createEmbeddingModel;
|
|
335
|
-
provider.textEmbeddingModel = createEmbeddingModel;
|
|
336
|
-
return provider;
|
|
337
|
-
}
|
|
338
|
-
var deepinfra = createDeepInfra();
|
|
339
|
-
export {
|
|
340
|
-
VERSION,
|
|
341
|
-
createDeepInfra,
|
|
342
|
-
deepinfra
|
|
343
|
-
};
|
|
344
|
-
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/deepinfra-provider.ts","../src/deepinfra-image-model.ts","../src/deepinfra-chat-language-model.ts","../src/version.ts"],"sourcesContent":["import {\n LanguageModelV4,\n EmbeddingModelV4,\n ProviderV4,\n ImageModelV4,\n} from '@ai-sdk/provider';\nimport {\n OpenAICompatibleCompletionLanguageModel,\n OpenAICompatibleEmbeddingModel,\n} from '@ai-sdk/openai-compatible';\nimport {\n FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n} from '@ai-sdk/provider-utils';\nimport { DeepInfraChatModelId } from './deepinfra-chat-options';\nimport { DeepInfraEmbeddingModelId } from './deepinfra-embedding-options';\nimport { DeepInfraCompletionModelId } from './deepinfra-completion-options';\nimport { DeepInfraImageModelId } from './deepinfra-image-settings';\nimport { DeepInfraImageModel } from './deepinfra-image-model';\nimport { DeepInfraChatLanguageModel } from './deepinfra-chat-language-model';\nimport { VERSION } from './version';\n\nexport interface DeepInfraProviderSettings {\n /**\n * DeepInfra API key.\n */\n apiKey?: string;\n /**\n * Base URL for the API calls.\n */\n baseURL?: string;\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface DeepInfraProvider extends ProviderV4 {\n /**\n * Creates a model for text generation.\n */\n (modelId: DeepInfraChatModelId): LanguageModelV4;\n\n /**\n * Creates a chat model for text generation.\n */\n chatModel(modelId: DeepInfraChatModelId): LanguageModelV4;\n\n /**\n * Creates a model for image generation.\n */\n image(modelId: DeepInfraImageModelId): ImageModelV4;\n\n /**\n * Creates a model for image generation.\n */\n imageModel(modelId: DeepInfraImageModelId): ImageModelV4;\n\n /**\n * Creates a chat model for text generation.\n */\n languageModel(modelId: DeepInfraChatModelId): LanguageModelV4;\n\n /**\n * Creates a completion model for text generation.\n */\n completionModel(modelId: DeepInfraCompletionModelId): LanguageModelV4;\n\n /**\n * Creates a embedding model for text generation.\n */\n embeddingModel(modelId: DeepInfraEmbeddingModelId): EmbeddingModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: DeepInfraEmbeddingModelId): EmbeddingModelV4;\n}\n\nexport function createDeepInfra(\n options: DeepInfraProviderSettings = {},\n): DeepInfraProvider {\n const baseURL = withoutTrailingSlash(\n options.baseURL ?? 'https://api.deepinfra.com/v1',\n );\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'DEEPINFRA_API_KEY',\n description: \"DeepInfra's API key\",\n })}`,\n ...options.headers,\n },\n `ai-sdk/deepinfra/${VERSION}`,\n );\n\n interface CommonModelConfig {\n provider: string;\n url: ({ path }: { path: string }) => string;\n headers: () => Record<string, string>;\n fetch?: FetchFunction;\n }\n\n const getCommonModelConfig = (modelType: string): CommonModelConfig => ({\n provider: `deepinfra.${modelType}`,\n url: ({ path }) => `${baseURL}/openai${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createChatModel = (modelId: DeepInfraChatModelId) => {\n return new DeepInfraChatLanguageModel(\n modelId,\n getCommonModelConfig('chat'),\n );\n };\n\n const createCompletionModel = (modelId: DeepInfraCompletionModelId) =>\n new OpenAICompatibleCompletionLanguageModel(\n modelId,\n getCommonModelConfig('completion'),\n );\n\n const createEmbeddingModel = (modelId: DeepInfraEmbeddingModelId) =>\n new OpenAICompatibleEmbeddingModel(\n modelId,\n getCommonModelConfig('embedding'),\n );\n\n const createImageModel = (modelId: DeepInfraImageModelId) =>\n new DeepInfraImageModel(modelId, {\n ...getCommonModelConfig('image'),\n baseURL: baseURL\n ? `${baseURL}/inference`\n : 'https://api.deepinfra.com/v1/inference',\n });\n\n const provider = (modelId: DeepInfraChatModelId) => createChatModel(modelId);\n\n provider.specificationVersion = 'v4' as const;\n provider.completionModel = createCompletionModel;\n provider.chatModel = createChatModel;\n provider.image = createImageModel;\n provider.imageModel = createImageModel;\n provider.languageModel = createChatModel;\n provider.embeddingModel = createEmbeddingModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n\n return provider;\n}\n\nexport const deepinfra = createDeepInfra();\n","import {\n ImageModelV4,\n ImageModelV4File,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertBase64ToUint8Array,\n convertToFormData,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n downloadBlob,\n FetchFunction,\n postFormDataToApi,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { DeepInfraImageModelId } from './deepinfra-image-settings';\nimport { z } from 'zod/v4';\n\ninterface DeepInfraImageModelConfig {\n provider: string;\n baseURL: string;\n headers: () => Record<string, string>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class DeepInfraImageModel implements ImageModelV4 {\n readonly specificationVersion = 'v4';\n readonly maxImagesPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: DeepInfraImageModelId,\n private config: DeepInfraImageModelConfig,\n ) {}\n\n async doGenerate({\n prompt,\n n,\n size,\n aspectRatio,\n seed,\n providerOptions,\n headers,\n abortSignal,\n files,\n mask,\n }: Parameters<ImageModelV4['doGenerate']>[0]): Promise<\n Awaited<ReturnType<ImageModelV4['doGenerate']>>\n > {\n const warnings: Array<SharedV4Warning> = [];\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n\n // Image editing mode - use OpenAI-compatible /images/edits endpoint\n if (files != null && files.length > 0) {\n const { value: response, responseHeaders } = await postFormDataToApi({\n url: this.getEditUrl(),\n headers: combineHeaders(this.config.headers(), headers),\n formData: convertToFormData<DeepInfraFormDataInput>(\n {\n model: this.modelId,\n prompt,\n image: await Promise.all(files.map(file => fileToBlob(file))),\n mask: mask != null ? await fileToBlob(mask) : undefined,\n n,\n size,\n ...(providerOptions.deepinfra ?? {}),\n },\n { useArrayBrackets: false },\n ),\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: deepInfraEditErrorSchema,\n errorToMessage: error => error.error?.message ?? 'Unknown error',\n }),\n successfulResponseHandler: createJsonResponseHandler(\n deepInfraEditResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n images: response.data.map(item => item.b64_json),\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n // Standard image generation mode\n // Some deepinfra models support size while others support aspect ratio.\n // Allow passing either and leave it up to the server to validate.\n const splitSize = size?.split('x');\n const { value: response, responseHeaders } = await postJsonToApi({\n url: `${this.config.baseURL}/${this.modelId}`,\n headers: combineHeaders(this.config.headers(), headers),\n body: {\n prompt,\n num_images: n,\n ...(aspectRatio && { aspect_ratio: aspectRatio }),\n ...(splitSize && { width: splitSize[0], height: splitSize[1] }),\n ...(seed != null && { seed }),\n ...(providerOptions.deepinfra ?? {}),\n },\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: deepInfraErrorSchema,\n errorToMessage: error => error.detail.error,\n }),\n successfulResponseHandler: createJsonResponseHandler(\n deepInfraImageResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n images: response.images.map(image =>\n image.replace(/^data:image\\/\\w+;base64,/, ''),\n ),\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n private getEditUrl(): string {\n // Use OpenAI-compatible endpoint for image editing\n // baseURL is typically https://api.deepinfra.com/v1/inference\n // We need to use https://api.deepinfra.com/v1/openai/images/edits\n const baseUrl = this.config.baseURL.replace('/inference', '/openai');\n return `${baseUrl}/images/edits`;\n }\n}\n\nexport const deepInfraErrorSchema = z.object({\n detail: z.object({\n error: z.string(),\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\nexport const deepInfraImageResponseSchema = z.object({\n images: z.array(z.string()),\n});\n\n// Schema for OpenAI-compatible image edit endpoint errors\nexport const deepInfraEditErrorSchema = z.object({\n error: z\n .object({\n message: z.string(),\n })\n .optional(),\n});\n\n// Schema for OpenAI-compatible image edit endpoint response\nexport const deepInfraEditResponseSchema = z.object({\n data: z.array(z.object({ b64_json: z.string() })),\n});\n\ntype DeepInfraFormDataInput = {\n model: string;\n prompt: string | undefined;\n image: Blob | Blob[];\n mask?: Blob;\n n: number;\n size: `${number}x${number}` | undefined;\n [key: string]: unknown;\n};\n\nasync function fileToBlob(file: ImageModelV4File): Promise<Blob> {\n if (file.type === 'url') {\n return downloadBlob(file.url);\n }\n\n const data =\n file.data instanceof Uint8Array\n ? file.data\n : convertBase64ToUint8Array(file.data);\n\n return new Blob([data as BlobPart], { type: file.mediaType });\n}\n","import {\n LanguageModelV4CallOptions,\n LanguageModelV4GenerateResult,\n LanguageModelV4StreamResult,\n} from '@ai-sdk/provider';\nimport { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';\nimport { FetchFunction } from '@ai-sdk/provider-utils';\n\ntype DeepInfraChatConfig = {\n provider: string;\n url: (options: { path: string; modelId?: string }) => string;\n headers: () => Record<string, string | undefined>;\n fetch?: FetchFunction;\n};\n\nexport class DeepInfraChatLanguageModel extends OpenAICompatibleChatLanguageModel {\n constructor(modelId: string, config: DeepInfraChatConfig) {\n super(modelId, config);\n }\n\n /**\n * Fixes incorrect token usage for Gemini/Gemma models from DeepInfra.\n *\n * DeepInfra's API returns completion_tokens that don't include reasoning_tokens\n * for Gemini/Gemma models, which violates the OpenAI-compatible spec.\n * According to the spec, completion_tokens should include reasoning_tokens.\n *\n * Example of incorrect data from DeepInfra:\n * {\n * \"completion_tokens\": 84, // text-only tokens\n * \"completion_tokens_details\": {\n * \"reasoning_tokens\": 1081 // reasoning tokens not included above\n * }\n * }\n *\n * This would result in negative text tokens: 84 - 1081 = -997\n *\n * The fix: If reasoning_tokens > completion_tokens, add reasoning_tokens\n * to completion_tokens: 84 + 1081 = 1165\n */\n private fixUsageForGeminiModels(usage: any): typeof usage {\n if (!usage || !usage.completion_tokens_details?.reasoning_tokens) {\n return usage;\n }\n\n const completionTokens = usage.completion_tokens ?? 0;\n const reasoningTokens = usage.completion_tokens_details.reasoning_tokens;\n\n // If reasoning tokens exceed completion tokens, the API data is incorrect\n // DeepInfra is returning only text tokens in completion_tokens, not including reasoning\n if (reasoningTokens > completionTokens) {\n const correctedCompletionTokens = completionTokens + reasoningTokens;\n\n return {\n ...usage,\n // Add reasoning_tokens to completion_tokens to get the correct total\n completion_tokens: correctedCompletionTokens,\n // Update total_tokens if present\n total_tokens:\n usage.total_tokens != null\n ? usage.total_tokens + reasoningTokens\n : undefined,\n };\n }\n\n return usage;\n }\n\n async doGenerate(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4GenerateResult> {\n const result = await super.doGenerate(options);\n\n // Fix usage if needed\n if (result.usage?.raw) {\n const fixedRawUsage = this.fixUsageForGeminiModels(result.usage.raw);\n if (fixedRawUsage !== result.usage.raw) {\n // Recalculate usage with fixed data\n const promptTokens = fixedRawUsage.prompt_tokens ?? 0;\n const completionTokens = fixedRawUsage.completion_tokens ?? 0;\n const cacheReadTokens =\n fixedRawUsage.prompt_tokens_details?.cached_tokens ?? 0;\n const reasoningTokens =\n fixedRawUsage.completion_tokens_details?.reasoning_tokens ?? 0;\n\n return {\n ...result,\n usage: {\n inputTokens: {\n total: promptTokens,\n noCache: promptTokens - cacheReadTokens,\n cacheRead: cacheReadTokens,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: completionTokens,\n text: completionTokens - reasoningTokens,\n reasoning: reasoningTokens,\n },\n raw: fixedRawUsage,\n },\n };\n }\n }\n\n return result;\n }\n\n async doStream(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4StreamResult> {\n const result = await super.doStream(options);\n\n // Wrap the stream to fix usage in the final chunk\n const originalStream = result.stream;\n const fixUsage = this.fixUsageForGeminiModels.bind(this);\n\n const transformedStream = new ReadableStream({\n async start(controller) {\n const reader = originalStream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n // Fix usage in finish chunks\n if (value.type === 'finish' && value.usage?.raw) {\n const fixedRawUsage = fixUsage(value.usage.raw);\n if (fixedRawUsage !== value.usage.raw) {\n const promptTokens = fixedRawUsage.prompt_tokens ?? 0;\n const completionTokens = fixedRawUsage.completion_tokens ?? 0;\n const cacheReadTokens =\n fixedRawUsage.prompt_tokens_details?.cached_tokens ?? 0;\n const reasoningTokens =\n fixedRawUsage.completion_tokens_details?.reasoning_tokens ??\n 0;\n\n controller.enqueue({\n ...value,\n usage: {\n inputTokens: {\n total: promptTokens,\n noCache: promptTokens - cacheReadTokens,\n cacheRead: cacheReadTokens,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: completionTokens,\n text: completionTokens - reasoningTokens,\n reasoning: reasoningTokens,\n },\n raw: fixedRawUsage,\n },\n });\n } else {\n controller.enqueue(value);\n }\n } else {\n controller.enqueue(value);\n }\n }\n controller.close();\n } catch (error) {\n controller.error(error);\n }\n },\n });\n\n return {\n ...result,\n stream: transformedStream,\n };\n }\n}\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["response","responseHeaders","_a","_b"]}
|