@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 +23 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -7
- package/dist/index.js.map +1 -1
- package/docs/11-deepinfra.mdx +4 -1
- package/package.json +4 -4
- package/src/deepinfra-chat-language-model.ts +2 -1
- package/src/deepinfra-image-model.ts +5 -3
- package/src/deepinfra-provider.ts +17 -12
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
|
*/
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;;;
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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":";;;;AAOA,MAAa,mCAAmC,iBAC9C,UACE,EAAE,YAAY;CACZ,iBAAiB,EAAE,OAAO,CAAC,CAAC,QAAQ;CACpC,qBAAqB,EAAE,OAAO,CAAC,CAAC,QAAQ;CACxC,gBAAgB,EAAE,OAAO,CAAC,CAAC,QAAQ;CACnC,UAAU,EAAE,OAAO,CAAC,CAAC,QAAQ;CAC7B,iBAAiB,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ;CAC9C,SAAS,EAAE,OAAO,CAAC,CAAC,QAAQ;CAC5B,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ;CAC1B,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ;AAC3B,CAAC,CACH,CACF;;;ACmBA,IAAa,sBAAb,MAAa,oBAA4C;CAIvD,IAAI,qBAA0C;EAC5C,OAAO;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF,CAAC,CAAC,SAAS,KAAK,OAAO,IACnB,OACA,KAAA;CACN;CAEA,IAAI,qBAA0C;EAC5C,OAAO,KAAK;CACd;CAEA,IAAI,WAAmB;EACrB,OAAO,KAAK,OAAO;CACrB;CAEA,QAAQ,oBAAoB,OAA4B;EACtD,OAAO,sBAAsB;GAC3B,SAAS,MAAM;GACf,QAAQ,MAAM;EAChB,CAAC;CACH;CAEA,QAAQ,sBAAsB,SAG3B;EACD,OAAO,IAAI,oBAAoB,QAAQ,SAAS,QAAQ,MAAM;CAChE;CAEA,YACE,SACA,QACA;EAFS,KAAA,UAAA;EACD,KAAA,SAAA;EA5CsB,KAAA,uBAAA;EACJ,KAAA,mBAAA;CA4CzB;CAEH,MAAM,WAAW,EACf,QACA,GACA,MACA,aACA,MACA,iBACA,SACA,aACA,OACA,QAGA;EACA,MAAM,WAAmC,CAAC;EAC1C,MAAM,cAAc,KAAK,OAAO,WAAW,cAAc,qBAAK,IAAI,KAAK;EACvE,MAAM,mBAAoB,MAAM,qBAAqB;GACnD,UAAU;GACV;GACA,QAAQ;EACV,CAAC;EAGD,IAAI,SAAS,QAAQ,MAAM,SAAS,GAAG;GACrC,MAAM,EAAE,OAAO,UAAU,oBAAoB,MAAM,kBAAkB;IACnE,KAAK,KAAK,WAAW;IACrB,SAAS,eAAe,MAAM,QAAQ,KAAK,OAAO,OAAO,GAAG,OAAO;IACnE,UAAU,kBACR;KACE,OAAO,KAAK;KACZ;KACA,OAAO,MAAM,QAAQ,IAAI,MAAM,KAAI,SAAQ,WAAW,IAAI,CAAC,CAAC;KAC5D,MAAM,QAAQ,OAAO,MAAM,WAAW,IAAI,IAAI,KAAA;KAC9C;KACA;KACA,GAAG;IACL,GACA,EAAE,kBAAkB,MAAM,CAC5B;IACA,uBAAuB,+BAA+B;KACpD,aAAa;KACb,iBAAgB,UAAS,MAAM,OAAO,WAAW;IACnD,CAAC;IACD,2BAA2B,0BACzB,2BACF;IACA;IACA,OAAO,KAAK,OAAO;GACrB,CAAC;GAED,OAAO;IACL,QAAQ,SAAS,KAAK,KAAI,SAAQ,KAAK,QAAQ;IAC/C;IACA,UAAU;KACR,WAAW;KACX,SAAS,KAAK;KACd,SAAS;IACX;GACF;EACF;EAKA,MAAM,YAAY,MAAM,MAAM,GAAG;EACjC,MAAM,EAAE,OAAO,UAAU,oBAAoB,MAAM,cAAc;GAC/D,KAAK,GAAG,KAAK,OAAO,QAAQ,GAAG,KAAK;GACpC,SAAS,eAAe,MAAM,QAAQ,KAAK,OAAO,OAAO,GAAG,OAAO;GACnE,MAAM;IACJ;IACA,YAAY;IACZ,GAAI,eAAe,EAAE,cAAc,YAAY;IAC/C,GAAI,aAAa;KAAE,OAAO,UAAU;KAAI,QAAQ,UAAU;IAAG;IAC7D,GAAI,QAAQ,QAAQ,EAAE,KAAK;IAC3B,GAAG;GACL;GACA,uBAAuB,+BAA+B;IACpD,aAAa;IACb,iBAAgB,UAAS,MAAM,OAAO;GACxC,CAAC;GACD,2BAA2B,0BACzB,4BACF;GACA;GACA,OAAO,KAAK,OAAO;EACrB,CAAC;EAED,OAAO;GACL,QAAQ,SAAS,OAAO,KAAI,UAC1B,MAAM,QAAQ,4BAA4B,EAAE,CAC9C;GACA;GACA,UAAU;IACR,WAAW;IACX,SAAS,KAAK;IACd,SAAS;GACX;EACF;CACF;CAEA,aAA6B;EAK3B,OAAO,GADS,KAAK,OAAO,QAAQ,QAAQ,cAAc,SAC1C,EAAE;CACpB;AACF;AAEA,MAAa,uBAAuB,EAAE,OAAO,EAC3C,QAAQ,EAAE,OAAO,EACf,OAAO,EAAE,OAAO,EAClB,CAAC,EACH,CAAC;AAID,MAAa,+BAA+B,EAAE,OAAO,EACnD,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAC5B,CAAC;AAGD,MAAa,2BAA2B,EAAE,OAAO,EAC/C,OAAO,EACJ,OAAO,EACN,SAAS,EAAE,OAAO,EACpB,CAAC,CAAC,CACD,SAAS,EACd,CAAC;AAGD,MAAa,8BAA8B,EAAE,OAAO,EAClD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,EAClD,CAAC;AAYD,eAAe,WAAW,MAAuC;CAC/D,IAAI,KAAK,SAAS,OAChB,OAAO,aAAa,KAAK,GAAG;CAG9B,MAAM,OACJ,KAAK,gBAAgB,aACjB,KAAK,OACL,0BAA0B,KAAK,IAAI;CAEzC,OAAO,IAAI,KAAK,CAAC,IAAgB,GAAG,EAAE,MAAM,KAAK,UAAU,CAAC;AAC9D;;;AC9NA,IAAa,6BAAb,MAAa,mCAAmC,kCAAkC;CAChF,QAAQ,oBAAoB,OAAmC;EAC7D,OAAO,sBAAsB;GAC3B,SAAS,MAAM;GACf,QAAQ,MAAM;EAChB,CAAC;CACH;CAEA,QAAQ,sBAAsB,SAG3B;EACD,OAAO,IAAI,2BAA2B,QAAQ,SAAS,QAAQ,MAAM;CACvE;;;;;;;;;;;;;;;;;;;;;CAsBA,wBAAgC,OAA0B;EACxD,IAAI,CAAC,SAAS,CAAC,MAAM,2BAA2B,kBAC9C,OAAO;EAGT,MAAM,mBAAmB,MAAM,qBAAqB;EACpD,MAAM,kBAAkB,MAAM,0BAA0B;EAIxD,IAAI,kBAAkB,kBAAkB;GACtC,MAAM,4BAA4B,mBAAmB;GAErD,OAAO;IACL,GAAG;IAEH,mBAAmB;IAEnB,cACE,MAAM,gBAAgB,OAClB,MAAM,eAAe,kBACrB,KAAA;GACR;EACF;EAEA,OAAO;CACT;CAEA,MAAM,WACJ,SACwC;EACxC,MAAM,SAAS,MAAM,MAAM,WAAW,OAAO;EAG7C,IAAI,OAAO,OAAO,KAAK;GACrB,MAAM,gBAAgB,KAAK,wBAAwB,OAAO,MAAM,GAAG;GACnE,IAAI,kBAAkB,OAAO,MAAM,KAAK;IAEtC,MAAM,eAAe,cAAc,iBAAiB;IACpD,MAAM,mBAAmB,cAAc,qBAAqB;IAC5D,MAAM,kBACJ,cAAc,uBAAuB,iBAAiB;IACxD,MAAM,kBACJ,cAAc,2BAA2B,oBAAoB;IAE/D,OAAO;KACL,GAAG;KACH,OAAO;MACL,aAAa;OACX,OAAO;OACP,SAAS,eAAe;OACxB,WAAW;OACX,YAAY,KAAA;MACd;MACA,cAAc;OACZ,OAAO;OACP,MAAM,mBAAmB;OACzB,WAAW;MACb;MACA,KAAK;KACP;IACF;GACF;EACF;EAEA,OAAO;CACT;CAEA,MAAM,SACJ,SACsC;EACtC,MAAM,SAAS,MAAM,MAAM,SAAS,OAAO;EAG3C,MAAM,iBAAiB,OAAO;EAC9B,MAAM,WAAW,KAAK,wBAAwB,KAAK,IAAI;EAEvD,MAAM,oBAAoB,IAAI,eAAe,EAC3C,MAAM,MAAM,YAAY;GACtB,MAAM,SAAS,eAAe,UAAU;GACxC,IAAI;IACF,OAAO,MAAM;KACX,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK;KAC1C,IAAI,MAAM;KAGV,IAAI,MAAM,SAAS,YAAY,MAAM,OAAO,KAAK;MAC/C,MAAM,gBAAgB,SAAS,MAAM,MAAM,GAAG;MAC9C,IAAI,kBAAkB,MAAM,MAAM,KAAK;OACrC,MAAM,eAAe,cAAc,iBAAiB;OACpD,MAAM,mBAAmB,cAAc,qBAAqB;OAC5D,MAAM,kBACJ,cAAc,uBAAuB,iBAAiB;OACxD,MAAM,kBACJ,cAAc,2BAA2B,oBACzC;OAEF,WAAW,QAAQ;QACjB,GAAG;QACH,OAAO;SACL,aAAa;UACX,OAAO;UACP,SAAS,eAAe;UACxB,WAAW;UACX,YAAY,KAAA;SACd;SACA,cAAc;UACZ,OAAO;UACP,MAAM,mBAAmB;UACzB,WAAW;SACb;SACA,KAAK;QACP;OACF,CAAC;MACH,OACE,WAAW,QAAQ,KAAK;KAE5B,OACE,WAAW,QAAQ,KAAK;IAE5B;IACA,WAAW,MAAM;GACnB,SAAS,OAAO;IACd,WAAW,MAAM,KAAK;GACxB;EACF,EACF,CAAC;EAED,OAAO;GACL,GAAG;GACH,QAAQ;EACV;CACF;AACF;;;AC3LA,MAAa,UAAA;;;ACuFb,SAAgB,gBACd,UAAqC,CAAC,GACnB;CACnB,MAAM,UAAU,qBACd,QAAQ,WAAW,8BACrB;CACA,MAAM,mBACJ,YAAY,QAAQ,SAAQ,WAC1B,oBACE;EACE,eAAe,UAAU,WAAW;GAClC;GACA,yBAAyB;GACzB,aAAa;EACf,CAAC;EACD,GAAG,QAAQ;CACb,GACA,oBAAoB,SACtB,CACF;CASF,MAAM,wBAAwB,eAA0C;EACtE,UAAU,aAAa;EACvB,MAAM,EAAE,WAAW,GAAG,QAAQ,SAAS;EACvC,SAAS;EACT,OAAO,QAAQ;CACjB;CAEA,MAAM,mBAAmB,YAAkC;EACzD,OAAO,IAAI,2BAA2B,SAAS;GAC7C,GAAG,qBAAqB,MAAM;GAC9B,2BAA2B;EAC7B,CAAC;CACH;CAEA,MAAM,yBAAyB,YAC7B,IAAI,wCACF,SACA,qBAAqB,YAAY,CACnC;CAEF,MAAM,wBAAwB,YAC5B,IAAI,+BACF,SACA,qBAAqB,WAAW,CAClC;CAEF,MAAM,oBAAoB,YACxB,IAAI,oBAAoB,SAAS;EAC/B,GAAG,qBAAqB,OAAO;EAC/B,SAAS,UACL,GAAG,QAAQ,cACX;CACN,CAAC;CAEH,MAAM,YAAY,YAAkC,gBAAgB,OAAO;CAE3E,SAAS,uBAAuB;CAChC,SAAS,kBAAkB;CAC3B,SAAS,YAAY;CACrB,SAAS,QAAQ;CACjB,SAAS,aAAa;CACtB,SAAS,gBAAgB;CACzB,SAAS,iBAAiB;CAC1B,SAAS,qBAAqB;CAE9B,OAAO;AACT;AAEA,MAAa,YAAY,gBAAgB"}
|
package/docs/11-deepinfra.mdx
CHANGED
|
@@ -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**
|
|
91
|
+
- **apiKey** _string | PromiseLike<string> | (() => string | PromiseLike<string>)_
|
|
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<string,string>_
|
|
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.
|
|
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.
|
|
33
|
-
"@ai-sdk/provider": "4.0.
|
|
34
|
-
"@ai-sdk/provider-utils": "5.0.
|
|
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?:
|
|
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?:
|
|
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
|
|
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
|
|
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
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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:
|
|
114
|
+
headers: Resolvable<Record<string, string>>;
|
|
110
115
|
fetch?: FetchFunction;
|
|
111
116
|
}
|
|
112
117
|
|