@ai-sdk/deepinfra 3.0.0-beta.4 → 3.0.0-beta.57
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 +490 -8
- package/README.md +2 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +84 -70
- package/dist/index.js.map +1 -1
- package/docs/11-deepinfra.mdx +14 -14
- package/package.json +15 -15
- package/src/deepinfra-chat-language-model.ts +22 -4
- package/src/deepinfra-completion-options.ts +1 -1
- package/src/deepinfra-image-model.ts +23 -6
- package/src/deepinfra-provider.ts +7 -7
- package/src/index.ts +6 -1
- package/dist/index.d.mts +0 -71
- package/dist/index.mjs +0 -344
- package/dist/index.mjs.map +0 -1
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.57" : "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
|
);
|
|
@@ -347,11 +361,11 @@ function createDeepInfra(options = {}) {
|
|
|
347
361
|
provider.textEmbeddingModel = createEmbeddingModel;
|
|
348
362
|
return provider;
|
|
349
363
|
}
|
|
350
|
-
var
|
|
351
|
-
|
|
352
|
-
0 && (module.exports = {
|
|
364
|
+
var deepInfra = createDeepInfra();
|
|
365
|
+
export {
|
|
353
366
|
VERSION,
|
|
354
367
|
createDeepInfra,
|
|
355
|
-
|
|
356
|
-
|
|
368
|
+
deepInfra,
|
|
369
|
+
deepInfra as deepinfra
|
|
370
|
+
};
|
|
357
371
|
//# 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 type {\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 loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport type { DeepInfraChatModelId } from './deepinfra-chat-options';\nimport type { DeepInfraEmbeddingModelId } from './deepinfra-embedding-options';\nimport type { DeepInfraCompletionModelId } from './deepinfra-completion-options';\nimport type { 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 type {\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 postFormDataToApi,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport type { 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 type {\n LanguageModelV4CallOptions,\n LanguageModelV4GenerateResult,\n LanguageModelV4StreamResult,\n} from '@ai-sdk/provider';\nimport { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';\nimport {\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\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/docs/11-deepinfra.mdx
CHANGED
|
@@ -29,10 +29,10 @@ The DeepInfra provider is available via the `@ai-sdk/deepinfra` module. You can
|
|
|
29
29
|
|
|
30
30
|
## Provider Instance
|
|
31
31
|
|
|
32
|
-
You can import the default provider instance `
|
|
32
|
+
You can import the default provider instance `deepInfra` from `@ai-sdk/deepinfra`:
|
|
33
33
|
|
|
34
34
|
```ts
|
|
35
|
-
import {
|
|
35
|
+
import { deepInfra } from '@ai-sdk/deepinfra';
|
|
36
36
|
```
|
|
37
37
|
|
|
38
38
|
If you need a customized setup, you can import `createDeepInfra` from `@ai-sdk/deepinfra` and create a provider instance with your settings:
|
|
@@ -40,7 +40,7 @@ If you need a customized setup, you can import `createDeepInfra` from `@ai-sdk/d
|
|
|
40
40
|
```ts
|
|
41
41
|
import { createDeepInfra } from '@ai-sdk/deepinfra';
|
|
42
42
|
|
|
43
|
-
const
|
|
43
|
+
const deepInfra = createDeepInfra({
|
|
44
44
|
apiKey: process.env.DEEPINFRA_API_KEY ?? '',
|
|
45
45
|
});
|
|
46
46
|
```
|
|
@@ -76,11 +76,11 @@ You can use the following optional settings to customize the DeepInfra provider
|
|
|
76
76
|
You can create language models using a provider instance. The first argument is the model ID, for example:
|
|
77
77
|
|
|
78
78
|
```ts
|
|
79
|
-
import {
|
|
79
|
+
import { deepInfra } from '@ai-sdk/deepinfra';
|
|
80
80
|
import { generateText } from 'ai';
|
|
81
81
|
|
|
82
82
|
const { text } = await generateText({
|
|
83
|
-
model:
|
|
83
|
+
model: deepInfra('meta-llama/Meta-Llama-3.1-70B-Instruct'),
|
|
84
84
|
prompt: 'Write a vegetarian lasagna recipe for 4 people.',
|
|
85
85
|
});
|
|
86
86
|
```
|
|
@@ -128,11 +128,11 @@ You can create DeepInfra image models using the `.image()` factory method.
|
|
|
128
128
|
For more on image generation with the AI SDK see [generateImage()](/docs/reference/ai-sdk-core/generate-image).
|
|
129
129
|
|
|
130
130
|
```ts
|
|
131
|
-
import {
|
|
131
|
+
import { deepInfra } from '@ai-sdk/deepinfra';
|
|
132
132
|
import { generateImage } from 'ai';
|
|
133
133
|
|
|
134
134
|
const { image } = await generateImage({
|
|
135
|
-
model:
|
|
135
|
+
model: deepInfra.image('stabilityai/sd3.5'),
|
|
136
136
|
prompt: 'A futuristic cityscape at sunset',
|
|
137
137
|
aspectRatio: '16:9',
|
|
138
138
|
});
|
|
@@ -150,11 +150,11 @@ const { image } = await generateImage({
|
|
|
150
150
|
You can pass model-specific parameters using the `providerOptions.deepinfra` field:
|
|
151
151
|
|
|
152
152
|
```ts
|
|
153
|
-
import {
|
|
153
|
+
import { deepInfra } from '@ai-sdk/deepinfra';
|
|
154
154
|
import { generateImage } from 'ai';
|
|
155
155
|
|
|
156
156
|
const { image } = await generateImage({
|
|
157
|
-
model:
|
|
157
|
+
model: deepInfra.image('stabilityai/sd3.5'),
|
|
158
158
|
prompt: 'A futuristic cityscape at sunset',
|
|
159
159
|
aspectRatio: '16:9',
|
|
160
160
|
providerOptions: {
|
|
@@ -177,7 +177,7 @@ Transform an existing image using text prompts:
|
|
|
177
177
|
const imageBuffer = readFileSync('./input-image.png');
|
|
178
178
|
|
|
179
179
|
const { images } = await generateImage({
|
|
180
|
-
model:
|
|
180
|
+
model: deepInfra.image('Qwen/Qwen-Image-Edit'),
|
|
181
181
|
prompt: {
|
|
182
182
|
text: 'Turn the cat into a golden retriever dog',
|
|
183
183
|
images: [imageBuffer],
|
|
@@ -195,7 +195,7 @@ const image = readFileSync('./input-image.png');
|
|
|
195
195
|
const mask = readFileSync('./mask.png');
|
|
196
196
|
|
|
197
197
|
const { images } = await generateImage({
|
|
198
|
-
model:
|
|
198
|
+
model: deepInfra.image('Qwen/Qwen-Image-Edit'),
|
|
199
199
|
prompt: {
|
|
200
200
|
text: 'A sunlit indoor lounge area with a pool containing a flamingo',
|
|
201
201
|
images: [image],
|
|
@@ -213,7 +213,7 @@ const cat = readFileSync('./cat.png');
|
|
|
213
213
|
const dog = readFileSync('./dog.png');
|
|
214
214
|
|
|
215
215
|
const { images } = await generateImage({
|
|
216
|
-
model:
|
|
216
|
+
model: deepInfra.image('Qwen/Qwen-Image-Edit'),
|
|
217
217
|
prompt: {
|
|
218
218
|
text: 'Create a scene with both animals together, playing as friends',
|
|
219
219
|
images: [cat, dog],
|
|
@@ -258,11 +258,11 @@ You can create DeepInfra embedding models using the `.embeddingModel()` factory
|
|
|
258
258
|
For more on embedding models with the AI SDK see [embed()](/docs/reference/ai-sdk-core/embed).
|
|
259
259
|
|
|
260
260
|
```ts
|
|
261
|
-
import {
|
|
261
|
+
import { deepInfra } from '@ai-sdk/deepinfra';
|
|
262
262
|
import { embed } from 'ai';
|
|
263
263
|
|
|
264
264
|
const { embedding } = await embed({
|
|
265
|
-
model:
|
|
265
|
+
model: deepInfra.embeddingModel('BAAI/bge-large-en-v1.5'),
|
|
266
266
|
value: 'sunny day at the beach',
|
|
267
267
|
});
|
|
268
268
|
```
|
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.57",
|
|
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,36 +24,38 @@
|
|
|
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.57",
|
|
33
|
+
"@ai-sdk/provider": "4.0.0-beta.19",
|
|
34
|
+
"@ai-sdk/provider-utils": "5.0.0-beta.49"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
-
"@types/node": "
|
|
38
|
-
"tsup": "^8",
|
|
37
|
+
"@types/node": "22.19.19",
|
|
38
|
+
"tsup": "^8.5.1",
|
|
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.7",
|
|
42
42
|
"@vercel/ai-tsconfig": "0.0.0"
|
|
43
43
|
},
|
|
44
44
|
"peerDependencies": {
|
|
45
45
|
"zod": "^3.25.76 || ^4.1.8"
|
|
46
46
|
},
|
|
47
47
|
"engines": {
|
|
48
|
-
"node": ">=
|
|
48
|
+
"node": ">=22"
|
|
49
49
|
},
|
|
50
50
|
"publishConfig": {
|
|
51
|
-
"access": "public"
|
|
51
|
+
"access": "public",
|
|
52
|
+
"provenance": true
|
|
52
53
|
},
|
|
53
54
|
"homepage": "https://ai-sdk.dev/docs",
|
|
54
55
|
"repository": {
|
|
55
56
|
"type": "git",
|
|
56
|
-
"url": "
|
|
57
|
+
"url": "https://github.com/vercel/ai",
|
|
58
|
+
"directory": "packages/deepinfra"
|
|
57
59
|
},
|
|
58
60
|
"bugs": {
|
|
59
61
|
"url": "https://github.com/vercel/ai/issues"
|
|
@@ -65,9 +67,7 @@
|
|
|
65
67
|
"build": "pnpm clean && tsup --tsconfig tsconfig.build.json",
|
|
66
68
|
"build:watch": "pnpm clean && tsup --watch",
|
|
67
69
|
"clean": "del-cli dist docs *.tsbuildinfo",
|
|
68
|
-
"lint": "eslint \"./**/*.ts*\"",
|
|
69
70
|
"type-check": "tsc --build",
|
|
70
|
-
"prettier-check": "prettier --check \"./**/*.ts*\"",
|
|
71
71
|
"test": "pnpm test:node && pnpm test:edge",
|
|
72
72
|
"test:update": "pnpm test:node -u",
|
|
73
73
|
"test:watch": "vitest --config vitest.node.config.js",
|
|
@@ -1,19 +1,37 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type {
|
|
2
2
|
LanguageModelV4CallOptions,
|
|
3
3
|
LanguageModelV4GenerateResult,
|
|
4
4
|
LanguageModelV4StreamResult,
|
|
5
5
|
} from '@ai-sdk/provider';
|
|
6
6
|
import { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';
|
|
7
|
-
import {
|
|
8
|
-
|
|
7
|
+
import {
|
|
8
|
+
serializeModelOptions,
|
|
9
|
+
WORKFLOW_SERIALIZE,
|
|
10
|
+
WORKFLOW_DESERIALIZE,
|
|
11
|
+
type FetchFunction,
|
|
12
|
+
} from '@ai-sdk/provider-utils';
|
|
9
13
|
type DeepInfraChatConfig = {
|
|
10
14
|
provider: string;
|
|
11
15
|
url: (options: { path: string; modelId?: string }) => string;
|
|
12
|
-
headers
|
|
16
|
+
headers?: () => Record<string, string | undefined>;
|
|
13
17
|
fetch?: FetchFunction;
|
|
14
18
|
};
|
|
15
19
|
|
|
16
20
|
export class DeepInfraChatLanguageModel extends OpenAICompatibleChatLanguageModel {
|
|
21
|
+
static [WORKFLOW_SERIALIZE](model: DeepInfraChatLanguageModel) {
|
|
22
|
+
return serializeModelOptions({
|
|
23
|
+
modelId: model.modelId,
|
|
24
|
+
config: model.config,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
static [WORKFLOW_DESERIALIZE](options: {
|
|
29
|
+
modelId: string;
|
|
30
|
+
config: DeepInfraChatConfig;
|
|
31
|
+
}) {
|
|
32
|
+
return new DeepInfraChatLanguageModel(options.modelId, options.config);
|
|
33
|
+
}
|
|
34
|
+
|
|
17
35
|
constructor(modelId: string, config: DeepInfraChatConfig) {
|
|
18
36
|
super(modelId, config);
|
|
19
37
|
}
|