@ai-sdk/deepinfra 3.0.80 → 3.0.82

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 CHANGED
@@ -1,5 +1,28 @@
1
1
  # @ai-sdk/deepinfra
2
2
 
3
+ ## 3.0.82
4
+
5
+ ### Patch Changes
6
+
7
+ - 7716e18: Support promises and synchronous or asynchronous callbacks in provider API key and token settings. Resolve credentials per authenticated request while preserving existing authentication behavior and synchronous credential serialization.
8
+
9
+ The experimental OpenAI Live `getServerWebSocketConfig()` method can now resolve asynchronously. Await its result before using the connection settings.
10
+
11
+ - Updated dependencies [7716e18]
12
+ - Updated dependencies [5c247e9]
13
+ - Updated dependencies [dcd2f8d]
14
+ - @ai-sdk/openai-compatible@3.0.82
15
+ - @ai-sdk/provider-utils@5.0.72
16
+ - @ai-sdk/provider@4.0.35
17
+
18
+ ## 3.0.81
19
+
20
+ ### Patch Changes
21
+
22
+ - Updated dependencies [61a315e]
23
+ - @ai-sdk/provider-utils@5.0.71
24
+ - @ai-sdk/openai-compatible@3.0.81
25
+
3
26
  ## 3.0.80
4
27
 
5
28
  ### Patch Changes
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { OpenAICompatibleErrorData as DeepInfraErrorData } from "@ai-sdk/openai-compatible";
2
- import { FetchFunction, InferSchema } from "@ai-sdk/provider-utils";
2
+ import { FetchFunction, InferSchema, Resolvable } from "@ai-sdk/provider-utils";
3
3
  import { EmbeddingModelV4, ImageModelV4, LanguageModelV4, ProviderV4 } from "@ai-sdk/provider";
4
4
  //#region src/deepinfra-chat-options.d.ts
5
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 & {});
@@ -17,8 +17,9 @@ type DeepInfraImageModelId = 'stabilityai/sd3.5' | 'black-forest-labs/FLUX-1.1-p
17
17
  interface DeepInfraProviderSettings {
18
18
  /**
19
19
  * DeepInfra API key.
20
+ * A function is called before each request and may return a promise.
20
21
  */
21
- apiKey?: string;
22
+ apiKey?: Resolvable<string>;
22
23
  /**
23
24
  * Base URL for the API calls.
24
25
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/deepinfra-chat-options.ts","../src/deepinfra-embedding-options.ts","../src/deepinfra-completion-options.ts","../src/deepinfra-image-settings.ts","../src/deepinfra-provider.ts","../src/deepinfra-image-model-options.ts","../src/version.ts"],"mappings":";;;;KACY;;;KCAA;;;KCEA,6BAA6B;;;KCF7B;;;UCuBK;;;;EAIf;;;;EAIA;;;;EAIA,UAAU;;;;;EAKV,QAAQ;;UAGO,0BAA0B;;;;GAIxC,SAAS,uBAAuB;;;;EAKjC,UAAU,SAAS,uBAAuB;;;;EAK1C,MAAM,SAAS,wBAAwB;;;;EAKvC,WAAW,SAAS,wBAAwB;;;;EAK5C,cAAc,SAAS,uBAAuB;;;;EAK9C,gBAAgB,SAAS,6BAA6B;;;;EAKtD,eAAe,SAAS,4BAA4B;;;;EAKpD,mBAAmB,SAAS,4BAA4B;;wBAG1C,gBACd,UAAS,4BACR;qBAwEU,WAAS;;;cCzJT,mEAAgC;;;;;;;;;;;KAejC,6BAA6B,mBAChC;;;qBCrBI"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/deepinfra-chat-options.ts","../src/deepinfra-embedding-options.ts","../src/deepinfra-completion-options.ts","../src/deepinfra-image-settings.ts","../src/deepinfra-provider.ts","../src/deepinfra-image-model-options.ts","../src/version.ts"],"mappings":";;;;KACY;;;KCAA;;;KCEA,6BAA6B;;;KCF7B;;;UCyBK;;;;;EAKf,SAAS;;;;EAIT;;;;EAIA,UAAU;;;;;EAKV,QAAQ;;UAGO,0BAA0B;;;;GAIxC,SAAS,uBAAuB;;;;EAKjC,UAAU,SAAS,uBAAuB;;;;EAK1C,MAAM,SAAS,wBAAwB;;;;EAKvC,WAAW,SAAS,wBAAwB;;;;EAK5C,cAAc,SAAS,uBAAuB;;;;EAK9C,gBAAgB,SAAS,6BAA6B;;;;EAKtD,eAAe,SAAS,4BAA4B;;;;EAKpD,mBAAmB,SAAS,4BAA4B;;wBAG1C,gBACd,UAAS,4BACR;qBA0EU,WAAS;;;cC9JT,mEAAgC;;;;;;;;;;;KAejC,6BAA6B,mBAChC;;;qBCrBI"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { OpenAICompatibleChatLanguageModel, OpenAICompatibleCompletionLanguageModel, OpenAICompatibleEmbeddingModel } from "@ai-sdk/openai-compatible";
2
- import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE, combineHeaders, convertBase64ToUint8Array, convertToFormData, createJsonErrorResponseHandler, createJsonResponseHandler, downloadBlob, lazySchema, loadApiKey, parseProviderOptions, postFormDataToApi, postJsonToApi, serializeModelOptions, withUserAgentSuffix, withoutTrailingSlash, zodSchema } from "@ai-sdk/provider-utils";
2
+ import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE, combineHeaders, convertBase64ToUint8Array, convertToFormData, createJsonErrorResponseHandler, createJsonResponseHandler, downloadBlob, lazySchema, loadApiKey, parseProviderOptions, postFormDataToApi, postJsonToApi, resolve, resolveWith, serializeModelOptions, withUserAgentSuffix, withoutTrailingSlash, zodSchema } from "@ai-sdk/provider-utils";
3
3
  import { z } from "zod/v4";
4
4
  //#region src/deepinfra-image-model-options.ts
5
5
  const deepInfraImageModelOptionsSchema = lazySchema(() => zodSchema(z.looseObject({
@@ -61,7 +61,7 @@ var DeepInfraImageModel = class DeepInfraImageModel {
61
61
  if (files != null && files.length > 0) {
62
62
  const { value: response, responseHeaders } = await postFormDataToApi({
63
63
  url: this.getEditUrl(),
64
- headers: combineHeaders(this.config.headers?.(), headers),
64
+ headers: combineHeaders(await resolve(this.config.headers), headers),
65
65
  formData: convertToFormData({
66
66
  model: this.modelId,
67
67
  prompt,
@@ -92,7 +92,7 @@ var DeepInfraImageModel = class DeepInfraImageModel {
92
92
  const splitSize = size?.split("x");
93
93
  const { value: response, responseHeaders } = await postJsonToApi({
94
94
  url: `${this.config.baseURL}/${this.modelId}`,
95
- headers: combineHeaders(this.config.headers?.(), headers),
95
+ headers: combineHeaders(await resolve(this.config.headers), headers),
96
96
  body: {
97
97
  prompt,
98
98
  num_images: n,
@@ -261,19 +261,19 @@ var DeepInfraChatLanguageModel = class DeepInfraChatLanguageModel extends OpenAI
261
261
  };
262
262
  //#endregion
263
263
  //#region src/version.ts
264
- const VERSION = "3.0.80";
264
+ const VERSION = "3.0.82";
265
265
  //#endregion
266
266
  //#region src/deepinfra-provider.ts
267
267
  function createDeepInfra(options = {}) {
268
268
  const baseURL = withoutTrailingSlash(options.baseURL ?? "https://api.deepinfra.com/v1");
269
- const getHeaders = () => withUserAgentSuffix({
269
+ const getHeaders = () => resolveWith(options.apiKey, (apiKey) => withUserAgentSuffix({
270
270
  Authorization: `Bearer ${loadApiKey({
271
- apiKey: options.apiKey,
271
+ apiKey,
272
272
  environmentVariableName: "DEEPINFRA_API_KEY",
273
273
  description: "DeepInfra's API key"
274
274
  })}`,
275
275
  ...options.headers
276
- }, `ai-sdk-deepinfra/${VERSION}`);
276
+ }, `ai-sdk-deepinfra/${VERSION}`));
277
277
  const getCommonModelConfig = (modelType) => ({
278
278
  provider: `deepinfra.${modelType}`,
279
279
  url: ({ path }) => `${baseURL}/openai${path}`,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/deepinfra-image-model-options.ts","../src/deepinfra-image-model.ts","../src/deepinfra-chat-language-model.ts","../src/version.ts","../src/deepinfra-provider.ts"],"sourcesContent":["import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const deepInfraImageModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z.looseObject({\n negative_prompt: z.string().nullish(),\n num_inference_steps: z.number().nullish(),\n guidance_scale: z.number().nullish(),\n guidance: z.number().nullish(),\n response_format: z.enum(['b64_json']).nullish(),\n quality: z.string().nullish(),\n style: z.string().nullish(),\n user: z.string().nullish(),\n }),\n ),\n);\n\nexport type DeepInfraImageModelOptions = InferSchema<\n typeof deepInfraImageModelOptionsSchema\n>;\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 parseProviderOptions,\n postFormDataToApi,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n deepInfraImageModelOptionsSchema,\n type DeepInfraImageModelOptions,\n} from './deepinfra-image-model-options';\nimport type { DeepInfraImageModelId } from './deepinfra-image-settings';\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 supportsFileInputs(): boolean | undefined {\n return [\n 'stabilityai/sd3.5',\n 'black-forest-labs/FLUX-1.1-pro',\n 'black-forest-labs/FLUX-1-schnell',\n 'black-forest-labs/FLUX-1-dev',\n 'black-forest-labs/FLUX-pro',\n 'black-forest-labs/FLUX.1-Kontext-dev',\n 'black-forest-labs/FLUX.1-Kontext-pro',\n 'Qwen/Qwen-Image-Edit',\n 'stabilityai/sd3.5-medium',\n 'stabilityai/sdxl-turbo',\n ].includes(this.modelId)\n ? true\n : undefined;\n }\n\n get supportsMaskInputs(): boolean | undefined {\n return this.supportsFileInputs;\n }\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 const deepInfraOptions = (await parseProviderOptions({\n provider: 'deepinfra',\n providerOptions,\n schema: deepInfraImageModelOptionsSchema,\n })) as DeepInfraImageModelOptions | undefined;\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 ...deepInfraOptions,\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 ...deepInfraOptions,\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 supportsStructuredOutputs?: boolean;\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 /**\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","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(modelId, {\n ...getCommonModelConfig('chat'),\n supportsStructuredOutputs: true,\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"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/deepinfra-image-model-options.ts","../src/deepinfra-image-model.ts","../src/deepinfra-chat-language-model.ts","../src/version.ts","../src/deepinfra-provider.ts"],"sourcesContent":["import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const deepInfraImageModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z.looseObject({\n negative_prompt: z.string().nullish(),\n num_inference_steps: z.number().nullish(),\n guidance_scale: z.number().nullish(),\n guidance: z.number().nullish(),\n response_format: z.enum(['b64_json']).nullish(),\n quality: z.string().nullish(),\n style: z.string().nullish(),\n user: z.string().nullish(),\n }),\n ),\n);\n\nexport type DeepInfraImageModelOptions = InferSchema<\n typeof deepInfraImageModelOptionsSchema\n>;\n","import type {\n ImageModelV4,\n ImageModelV4File,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n type Resolvable,\n resolve,\n combineHeaders,\n convertBase64ToUint8Array,\n convertToFormData,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n downloadBlob,\n parseProviderOptions,\n postFormDataToApi,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n deepInfraImageModelOptionsSchema,\n type DeepInfraImageModelOptions,\n} from './deepinfra-image-model-options';\nimport type { DeepInfraImageModelId } from './deepinfra-image-settings';\n\ninterface DeepInfraImageModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<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 supportsFileInputs(): boolean | undefined {\n return [\n 'stabilityai/sd3.5',\n 'black-forest-labs/FLUX-1.1-pro',\n 'black-forest-labs/FLUX-1-schnell',\n 'black-forest-labs/FLUX-1-dev',\n 'black-forest-labs/FLUX-pro',\n 'black-forest-labs/FLUX.1-Kontext-dev',\n 'black-forest-labs/FLUX.1-Kontext-pro',\n 'Qwen/Qwen-Image-Edit',\n 'stabilityai/sd3.5-medium',\n 'stabilityai/sdxl-turbo',\n ].includes(this.modelId)\n ? true\n : undefined;\n }\n\n get supportsMaskInputs(): boolean | undefined {\n return this.supportsFileInputs;\n }\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 const deepInfraOptions = (await parseProviderOptions({\n provider: 'deepinfra',\n providerOptions,\n schema: deepInfraImageModelOptionsSchema,\n })) as DeepInfraImageModelOptions | undefined;\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(await resolve(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 ...deepInfraOptions,\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(await resolve(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 ...deepInfraOptions,\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 type Resolvable,\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?: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n supportsStructuredOutputs?: boolean;\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 /**\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","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 type Resolvable,\n resolveWith,\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 * A function is called before each request and may return a promise.\n */\n apiKey?: Resolvable<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 resolveWith(options.apiKey, apiKey =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n 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\n interface CommonModelConfig {\n provider: string;\n url: ({ path }: { path: string }) => string;\n headers: Resolvable<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(modelId, {\n ...getCommonModelConfig('chat'),\n supportsStructuredOutputs: true,\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"],"mappings":"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"}
@@ -88,11 +88,14 @@ You can use the following optional settings to customize the DeepInfra provider
88
88
  Note: Language models and embeddings use OpenAI-compatible endpoints at `{baseURL}/openai`,
89
89
  while image models use `{baseURL}/inference`.
90
90
 
91
- - **apiKey** _string_
91
+ - **apiKey** _string | PromiseLike&lt;string&gt; | (() =&gt; string | PromiseLike&lt;string&gt;)_
92
92
 
93
93
  API key that is being sent using the `Authorization` header. It defaults to
94
94
  the `DEEPINFRA_API_KEY` environment variable.
95
95
 
96
+ A function is called before each request and may return a promise. Use it to
97
+ supply refreshed credentials; a promise value resolves to the same key each time.
98
+
96
99
  - **headers** _Record&lt;string,string&gt;_
97
100
 
98
101
  Custom headers to include in the requests.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/deepinfra",
3
- "version": "3.0.80",
3
+ "version": "3.0.82",
4
4
  "type": "module",
5
5
  "license": "Apache-2.0",
6
6
  "sideEffects": false,
@@ -29,9 +29,9 @@
29
29
  }
30
30
  },
31
31
  "dependencies": {
32
- "@ai-sdk/openai-compatible": "3.0.80",
33
- "@ai-sdk/provider": "4.0.34",
34
- "@ai-sdk/provider-utils": "5.0.70"
32
+ "@ai-sdk/openai-compatible": "3.0.82",
33
+ "@ai-sdk/provider": "4.0.35",
34
+ "@ai-sdk/provider-utils": "5.0.72"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@ai-sdk/test-server": "2.0.4",
@@ -5,6 +5,7 @@ import type {
5
5
  } from '@ai-sdk/provider';
6
6
  import { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';
7
7
  import {
8
+ type Resolvable,
8
9
  serializeModelOptions,
9
10
  WORKFLOW_SERIALIZE,
10
11
  WORKFLOW_DESERIALIZE,
@@ -13,7 +14,7 @@ import {
13
14
  type DeepInfraChatConfig = {
14
15
  provider: string;
15
16
  url: (options: { path: string; modelId?: string }) => string;
16
- headers?: () => Record<string, string | undefined>;
17
+ headers?: Resolvable<Record<string, string | undefined>>;
17
18
  fetch?: FetchFunction;
18
19
  supportsStructuredOutputs?: boolean;
19
20
  };
@@ -4,6 +4,8 @@ import type {
4
4
  SharedV4Warning,
5
5
  } from '@ai-sdk/provider';
6
6
  import {
7
+ type Resolvable,
8
+ resolve,
7
9
  combineHeaders,
8
10
  convertBase64ToUint8Array,
9
11
  convertToFormData,
@@ -28,7 +30,7 @@ import type { DeepInfraImageModelId } from './deepinfra-image-settings';
28
30
  interface DeepInfraImageModelConfig {
29
31
  provider: string;
30
32
  baseURL: string;
31
- headers?: () => Record<string, string>;
33
+ headers?: Resolvable<Record<string, string>>;
32
34
  fetch?: FetchFunction;
33
35
  _internal?: {
34
36
  currentDate?: () => Date;
@@ -109,7 +111,7 @@ export class DeepInfraImageModel implements ImageModelV4 {
109
111
  if (files != null && files.length > 0) {
110
112
  const { value: response, responseHeaders } = await postFormDataToApi({
111
113
  url: this.getEditUrl(),
112
- headers: combineHeaders(this.config.headers?.(), headers),
114
+ headers: combineHeaders(await resolve(this.config.headers), headers),
113
115
  formData: convertToFormData<DeepInfraFormDataInput>(
114
116
  {
115
117
  model: this.modelId,
@@ -150,7 +152,7 @@ export class DeepInfraImageModel implements ImageModelV4 {
150
152
  const splitSize = size?.split('x');
151
153
  const { value: response, responseHeaders } = await postJsonToApi({
152
154
  url: `${this.config.baseURL}/${this.modelId}`,
153
- headers: combineHeaders(this.config.headers?.(), headers),
155
+ headers: combineHeaders(await resolve(this.config.headers), headers),
154
156
  body: {
155
157
  prompt,
156
158
  num_images: n,
@@ -9,6 +9,8 @@ import {
9
9
  OpenAICompatibleEmbeddingModel,
10
10
  } from '@ai-sdk/openai-compatible';
11
11
  import {
12
+ type Resolvable,
13
+ resolveWith,
12
14
  loadApiKey,
13
15
  withoutTrailingSlash,
14
16
  withUserAgentSuffix,
@@ -25,8 +27,9 @@ import { VERSION } from './version';
25
27
  export interface DeepInfraProviderSettings {
26
28
  /**
27
29
  * DeepInfra API key.
30
+ * A function is called before each request and may return a promise.
28
31
  */
29
- apiKey?: string;
32
+ apiKey?: Resolvable<string>;
30
33
  /**
31
34
  * Base URL for the API calls.
32
35
  */
@@ -91,22 +94,24 @@ export function createDeepInfra(
91
94
  options.baseURL ?? 'https://api.deepinfra.com/v1',
92
95
  );
93
96
  const getHeaders = () =>
94
- withUserAgentSuffix(
95
- {
96
- Authorization: `Bearer ${loadApiKey({
97
- apiKey: options.apiKey,
98
- environmentVariableName: 'DEEPINFRA_API_KEY',
99
- description: "DeepInfra's API key",
100
- })}`,
101
- ...options.headers,
102
- },
103
- `ai-sdk-deepinfra/${VERSION}`,
97
+ resolveWith(options.apiKey, apiKey =>
98
+ withUserAgentSuffix(
99
+ {
100
+ Authorization: `Bearer ${loadApiKey({
101
+ apiKey,
102
+ environmentVariableName: 'DEEPINFRA_API_KEY',
103
+ description: "DeepInfra's API key",
104
+ })}`,
105
+ ...options.headers,
106
+ },
107
+ `ai-sdk-deepinfra/${VERSION}`,
108
+ ),
104
109
  );
105
110
 
106
111
  interface CommonModelConfig {
107
112
  provider: string;
108
113
  url: ({ path }: { path: string }) => string;
109
- headers: () => Record<string, string>;
114
+ headers: Resolvable<Record<string, string>>;
110
115
  fetch?: FetchFunction;
111
116
  }
112
117