@ai-sdk/deepinfra 3.0.0-beta.22 → 3.0.0-beta.24
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 +22 -0
- package/dist/index.js +51 -64
- package/dist/index.js.map +1 -1
- package/package.json +8 -8
- 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,27 @@
|
|
|
1
1
|
# @ai-sdk/deepinfra
|
|
2
2
|
|
|
3
|
+
## 3.0.0-beta.24
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- ef992f8: Remove CommonJS exports from all packages. All packages are now ESM-only (`"type": "module"`). Consumers using `require()` must switch to ESM `import` syntax.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [ef992f8]
|
|
12
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.24
|
|
13
|
+
- @ai-sdk/provider@4.0.0-beta.11
|
|
14
|
+
- @ai-sdk/provider-utils@5.0.0-beta.19
|
|
15
|
+
|
|
16
|
+
## 3.0.0-beta.23
|
|
17
|
+
|
|
18
|
+
### Patch Changes
|
|
19
|
+
|
|
20
|
+
- 90e2d8a: chore: fix unused vars not being flagged by our lint tooling
|
|
21
|
+
- Updated dependencies [90e2d8a]
|
|
22
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.23
|
|
23
|
+
- @ai-sdk/provider-utils@5.0.0-beta.18
|
|
24
|
+
|
|
3
25
|
## 3.0.0-beta.22
|
|
4
26
|
|
|
5
27
|
### Patch Changes
|
package/dist/index.js
CHANGED
|
@@ -1,38 +1,26 @@
|
|
|
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
|
-
|
|
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";
|
|
36
24
|
var DeepInfraImageModel = class {
|
|
37
25
|
constructor(modelId, config) {
|
|
38
26
|
this.modelId = modelId;
|
|
@@ -59,10 +47,10 @@ var DeepInfraImageModel = class {
|
|
|
59
47
|
const warnings = [];
|
|
60
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();
|
|
61
49
|
if (files != null && files.length > 0) {
|
|
62
|
-
const { value: response2, responseHeaders: responseHeaders2 } = await
|
|
50
|
+
const { value: response2, responseHeaders: responseHeaders2 } = await postFormDataToApi({
|
|
63
51
|
url: this.getEditUrl(),
|
|
64
|
-
headers:
|
|
65
|
-
formData:
|
|
52
|
+
headers: combineHeaders(this.config.headers(), headers),
|
|
53
|
+
formData: convertToFormData(
|
|
66
54
|
{
|
|
67
55
|
model: this.modelId,
|
|
68
56
|
prompt,
|
|
@@ -74,14 +62,14 @@ var DeepInfraImageModel = class {
|
|
|
74
62
|
},
|
|
75
63
|
{ useArrayBrackets: false }
|
|
76
64
|
),
|
|
77
|
-
failedResponseHandler:
|
|
65
|
+
failedResponseHandler: createJsonErrorResponseHandler({
|
|
78
66
|
errorSchema: deepInfraEditErrorSchema,
|
|
79
67
|
errorToMessage: (error) => {
|
|
80
68
|
var _a2, _b2;
|
|
81
69
|
return (_b2 = (_a2 = error.error) == null ? void 0 : _a2.message) != null ? _b2 : "Unknown error";
|
|
82
70
|
}
|
|
83
71
|
}),
|
|
84
|
-
successfulResponseHandler:
|
|
72
|
+
successfulResponseHandler: createJsonResponseHandler(
|
|
85
73
|
deepInfraEditResponseSchema
|
|
86
74
|
),
|
|
87
75
|
abortSignal,
|
|
@@ -98,9 +86,9 @@ var DeepInfraImageModel = class {
|
|
|
98
86
|
};
|
|
99
87
|
}
|
|
100
88
|
const splitSize = size == null ? void 0 : size.split("x");
|
|
101
|
-
const { value: response, responseHeaders } = await
|
|
89
|
+
const { value: response, responseHeaders } = await postJsonToApi({
|
|
102
90
|
url: `${this.config.baseURL}/${this.modelId}`,
|
|
103
|
-
headers:
|
|
91
|
+
headers: combineHeaders(this.config.headers(), headers),
|
|
104
92
|
body: {
|
|
105
93
|
prompt,
|
|
106
94
|
num_images: n,
|
|
@@ -109,11 +97,11 @@ var DeepInfraImageModel = class {
|
|
|
109
97
|
...seed != null && { seed },
|
|
110
98
|
...(_e = providerOptions.deepinfra) != null ? _e : {}
|
|
111
99
|
},
|
|
112
|
-
failedResponseHandler:
|
|
100
|
+
failedResponseHandler: createJsonErrorResponseHandler({
|
|
113
101
|
errorSchema: deepInfraErrorSchema,
|
|
114
102
|
errorToMessage: (error) => error.detail.error
|
|
115
103
|
}),
|
|
116
|
-
successfulResponseHandler:
|
|
104
|
+
successfulResponseHandler: createJsonResponseHandler(
|
|
117
105
|
deepInfraImageResponseSchema
|
|
118
106
|
),
|
|
119
107
|
abortSignal,
|
|
@@ -136,33 +124,33 @@ var DeepInfraImageModel = class {
|
|
|
136
124
|
return `${baseUrl}/images/edits`;
|
|
137
125
|
}
|
|
138
126
|
};
|
|
139
|
-
var deepInfraErrorSchema =
|
|
140
|
-
detail:
|
|
141
|
-
error:
|
|
127
|
+
var deepInfraErrorSchema = z.object({
|
|
128
|
+
detail: z.object({
|
|
129
|
+
error: z.string()
|
|
142
130
|
})
|
|
143
131
|
});
|
|
144
|
-
var deepInfraImageResponseSchema =
|
|
145
|
-
images:
|
|
132
|
+
var deepInfraImageResponseSchema = z.object({
|
|
133
|
+
images: z.array(z.string())
|
|
146
134
|
});
|
|
147
|
-
var deepInfraEditErrorSchema =
|
|
148
|
-
error:
|
|
149
|
-
message:
|
|
135
|
+
var deepInfraEditErrorSchema = z.object({
|
|
136
|
+
error: z.object({
|
|
137
|
+
message: z.string()
|
|
150
138
|
}).optional()
|
|
151
139
|
});
|
|
152
|
-
var deepInfraEditResponseSchema =
|
|
153
|
-
data:
|
|
140
|
+
var deepInfraEditResponseSchema = z.object({
|
|
141
|
+
data: z.array(z.object({ b64_json: z.string() }))
|
|
154
142
|
});
|
|
155
143
|
async function fileToBlob(file) {
|
|
156
144
|
if (file.type === "url") {
|
|
157
|
-
return
|
|
145
|
+
return downloadBlob(file.url);
|
|
158
146
|
}
|
|
159
|
-
const data = file.data instanceof Uint8Array ? file.data :
|
|
147
|
+
const data = file.data instanceof Uint8Array ? file.data : convertBase64ToUint8Array(file.data);
|
|
160
148
|
return new Blob([data], { type: file.mediaType });
|
|
161
149
|
}
|
|
162
150
|
|
|
163
151
|
// src/deepinfra-chat-language-model.ts
|
|
164
|
-
|
|
165
|
-
var DeepInfraChatLanguageModel = class extends
|
|
152
|
+
import { OpenAICompatibleChatLanguageModel } from "@ai-sdk/openai-compatible";
|
|
153
|
+
var DeepInfraChatLanguageModel = class extends OpenAICompatibleChatLanguageModel {
|
|
166
154
|
constructor(modelId, config) {
|
|
167
155
|
super(modelId, config);
|
|
168
156
|
}
|
|
@@ -293,17 +281,17 @@ var DeepInfraChatLanguageModel = class extends import_openai_compatible.OpenAICo
|
|
|
293
281
|
};
|
|
294
282
|
|
|
295
283
|
// src/version.ts
|
|
296
|
-
var VERSION = true ? "3.0.0-beta.
|
|
284
|
+
var VERSION = true ? "3.0.0-beta.24" : "0.0.0-test";
|
|
297
285
|
|
|
298
286
|
// src/deepinfra-provider.ts
|
|
299
287
|
function createDeepInfra(options = {}) {
|
|
300
288
|
var _a;
|
|
301
|
-
const baseURL =
|
|
289
|
+
const baseURL = withoutTrailingSlash(
|
|
302
290
|
(_a = options.baseURL) != null ? _a : "https://api.deepinfra.com/v1"
|
|
303
291
|
);
|
|
304
|
-
const getHeaders = () =>
|
|
292
|
+
const getHeaders = () => withUserAgentSuffix(
|
|
305
293
|
{
|
|
306
|
-
Authorization: `Bearer ${
|
|
294
|
+
Authorization: `Bearer ${loadApiKey({
|
|
307
295
|
apiKey: options.apiKey,
|
|
308
296
|
environmentVariableName: "DEEPINFRA_API_KEY",
|
|
309
297
|
description: "DeepInfra's API key"
|
|
@@ -324,11 +312,11 @@ function createDeepInfra(options = {}) {
|
|
|
324
312
|
getCommonModelConfig("chat")
|
|
325
313
|
);
|
|
326
314
|
};
|
|
327
|
-
const createCompletionModel = (modelId) => new
|
|
315
|
+
const createCompletionModel = (modelId) => new OpenAICompatibleCompletionLanguageModel(
|
|
328
316
|
modelId,
|
|
329
317
|
getCommonModelConfig("completion")
|
|
330
318
|
);
|
|
331
|
-
const createEmbeddingModel = (modelId) => new
|
|
319
|
+
const createEmbeddingModel = (modelId) => new OpenAICompatibleEmbeddingModel(
|
|
332
320
|
modelId,
|
|
333
321
|
getCommonModelConfig("embedding")
|
|
334
322
|
);
|
|
@@ -348,10 +336,9 @@ function createDeepInfra(options = {}) {
|
|
|
348
336
|
return provider;
|
|
349
337
|
}
|
|
350
338
|
var deepinfra = createDeepInfra();
|
|
351
|
-
|
|
352
|
-
0 && (module.exports = {
|
|
339
|
+
export {
|
|
353
340
|
VERSION,
|
|
354
341
|
createDeepInfra,
|
|
355
342
|
deepinfra
|
|
356
|
-
}
|
|
343
|
+
};
|
|
357
344
|
//# 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} 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"]}
|
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.24",
|
|
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.24",
|
|
33
|
+
"@ai-sdk/provider": "4.0.0-beta.11",
|
|
34
|
+
"@ai-sdk/provider-utils": "5.0.0-beta.19"
|
|
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": {
|
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.22" : "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"]}
|