@ai-sdk/fireworks 3.0.84 → 3.0.85

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,20 @@
1
1
  # @ai-sdk/fireworks
2
2
 
3
+ ## 3.0.85
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
+
3
18
  ## 3.0.84
4
19
 
5
20
  ### Patch Changes
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { FetchFunction, InferSchema, WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from "@ai-sdk/provider-utils";
1
+ import { FetchFunction, InferSchema, Resolvable, WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from "@ai-sdk/provider-utils";
2
2
  import { z } from "zod/v4";
3
3
  import { EmbeddingModelV4, ImageModelV4, LanguageModelV4, ProviderV4 } from "@ai-sdk/provider";
4
4
  //#region src/fireworks-chat-options.d.ts
@@ -35,7 +35,7 @@ type FireworksImageModelId = 'accounts/fireworks/models/flux-1-dev-fp8' | 'accou
35
35
  interface FireworksImageModelConfig {
36
36
  provider: string;
37
37
  baseURL: string;
38
- headers?: () => Record<string, string>;
38
+ headers?: Resolvable<Record<string, string>>;
39
39
  fetch?: FetchFunction;
40
40
  /**
41
41
  * Poll interval in milliseconds between status checks for async models.
@@ -113,8 +113,9 @@ interface FireworksProviderSettings {
113
113
  /**
114
114
  * Fireworks API key. Default value is taken from the `FIREWORKS_API_KEY`
115
115
  * environment variable.
116
+ * A function is called before each request and may return a promise.
116
117
  */
117
- apiKey?: string;
118
+ apiKey?: Resolvable<string>;
118
119
  /**
119
120
  * Base URL for the API calls.
120
121
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/fireworks-chat-options.ts","../src/fireworks-embedding-options.ts","../src/fireworks-image-options.ts","../src/fireworks-image-model.ts","../src/fireworks-image-model-options.ts","../src/fireworks-completion-options.ts","../src/fireworks-provider.ts","../src/version.ts"],"mappings":";;;;KAIY;cAsBC,+BAA6B,EAAA;;;;;;;;;;;;;;;;;GAoBxC,EAAA,KAAA;KAEU,gCAAgC,EAAE,aACrC;;;KC9CG;cAIC,gCAA8B,EAAA,cAAA,EAAA,KAAA;KAE/B,iCAAiC,EAAE,aACtC;;;KCTG;;;UC8FF;EACR;EACA;EACA,gBAAgB;EAChB,QAAQ;;;;;EAKR;;;;;EAKA;EACA;IACE,oBAAoB;;;qBAIX,+BAA+B;WAgD/B,SAAS;UACV;WAhDD;WACA;MAEL;MAqBA;MAIA;UAII,oBAAoB,OAAO;;;;UAO3B,sBAAsB;IAC5B,SAAS;IACT,QAAQ;MACT;EAKU,YAAA,SAAS,uBACV,QAAQ;EAGZ,aACJ,QACA,GACA,MACA,aACA,MACA,iBACA,SACA,aACA,OACA,QACC,WAAW,iCAAiC,QAC7C,QAAQ,WAAW;;;;;UA2GP;;;;UAkEA;;;;cCzVH,mEAAgC;;;;;;;;;;;;KAmDjC,6BAA6B,mBAChC;;;KC1DG;;;KC0BA,qBAAqB,EAAE,aAAa;cAE1C,sBAAoB,EAAA;;;;;;;;GAWxB,EAAA,KAAA;UAQe;;;;;EAKf;;;;EAIA;;;;EAIA,UAAU;;;;;EAKV,QAAQ;;UAGO,0BAA0B;;;;GAIxC,SAAS,uBAAuB;;;;EAKjC,UAAU,SAAS,uBAAuB;;;;EAK1C,gBAAgB,SAAS,6BAA6B;;;;EAKtD,cAAc,SAAS,uBAAuB;;;;EAK9C,eAAe,SAAS,4BAA4B;;;;EAKpD,mBAAmB,SAAS,4BAA4B;;;;EAKxD,MAAM,SAAS,wBAAwB;;;;EAKvC,WAAW,SAAS,wBAAwB;;wBAK9B,gBACd,UAAS,4BACR;qBAiHU,WAAS;;;qBClOT"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/fireworks-chat-options.ts","../src/fireworks-embedding-options.ts","../src/fireworks-image-options.ts","../src/fireworks-image-model.ts","../src/fireworks-image-model-options.ts","../src/fireworks-completion-options.ts","../src/fireworks-provider.ts","../src/version.ts"],"mappings":";;;;KAIY;cAsBC,+BAA6B,EAAA;;;;;;;;;;;;;;;;;GAoBxC,EAAA,KAAA;KAEU,gCAAgC,EAAE,aACrC;;;KC9CG;cAIC,gCAA8B,EAAA,cAAA,EAAA,KAAA;KAE/B,iCAAiC,EAAE,aACtC;;;KCTG;;;UCgGF;EACR;EACA;EACA,UAAU,WAAW;EACrB,QAAQ;;;;;EAKR;;;;;EAKA;EACA;IACE,oBAAoB;;;qBAIX,+BAA+B;WAgD/B,SAAS;UACV;WAhDD;WACA;MAEL;MAqBA;MAIA;UAII,oBAAoB,OAAO;;;;UAO3B,sBAAsB;IAC5B,SAAS;IACT,QAAQ;MACT;EAKU,YAAA,SAAS,uBACV,QAAQ;EAGZ,aACJ,QACA,GACA,MACA,aACA,MACA,iBACA,SACA,aACA,OACA,QACC,WAAW,iCAAiC,QAC7C,QAAQ,WAAW;;;;;UA0GP;;;;UAkEA;;;;cC1VH,mEAAgC;;;;;;;;;;;;KAmDjC,6BAA6B,mBAChC;;;KC1DG;;;KC4BA,qBAAqB,EAAE,aAAa;cAE1C,sBAAoB,EAAA;;;;;;;;GAWxB,EAAA,KAAA;UAQe;;;;;;EAMf,SAAS;;;;EAIT;;;;EAIA,UAAU;;;;;EAKV,QAAQ;;UAGO,0BAA0B;;;;GAIxC,SAAS,uBAAuB;;;;EAKjC,UAAU,SAAS,uBAAuB;;;;EAK1C,gBAAgB,SAAS,6BAA6B;;;;EAKtD,cAAc,SAAS,uBAAuB;;;;EAK9C,eAAe,SAAS,4BAA4B;;;;EAKpD,mBAAmB,SAAS,4BAA4B;;;;EAKxD,MAAM,SAAS,wBAAwB;;;;EAKvC,WAAW,SAAS,wBAAwB;;wBAK9B,gBACd,UAAS,4BACR;qBAmHU,WAAS;;;qBCvOT"}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE, combineHeaders, convertImageModelFileToDataUri, createBinaryResponseHandler, createJsonResponseHandler, createStatusCodeErrorResponseHandler, delay, getFromApi, lazySchema, loadApiKey, mapReasoningToProviderEffort, parseProviderOptions, postJsonToApi, serializeModelOptions, withUserAgentSuffix, withoutTrailingSlash, zodSchema } from "@ai-sdk/provider-utils";
1
+ import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE, combineHeaders, convertImageModelFileToDataUri, createBinaryResponseHandler, createJsonResponseHandler, createStatusCodeErrorResponseHandler, delay, getFromApi, lazySchema, loadApiKey, mapReasoningToProviderEffort, parseProviderOptions, postJsonToApi, resolve, resolveWith, serializeModelOptions, withUserAgentSuffix, withoutTrailingSlash, zodSchema } from "@ai-sdk/provider-utils";
2
2
  import { z } from "zod/v4";
3
3
  import { OpenAICompatibleChatLanguageModel, OpenAICompatibleCompletionLanguageModel, OpenAICompatibleEmbeddingModel } from "@ai-sdk/openai-compatible";
4
4
  //#region src/fireworks-image-api.ts
@@ -157,7 +157,6 @@ var FireworksImageModel = class FireworksImageModel {
157
157
  });
158
158
  const splitSize = size?.split("x");
159
159
  const currentDate = this.config._internal?.currentDate?.() ?? /* @__PURE__ */ new Date();
160
- const combinedHeaders = combineHeaders(this.config.headers?.(), headers);
161
160
  const fireworksOptions = await parseProviderOptions({
162
161
  provider: "fireworks",
163
162
  providerOptions,
@@ -177,14 +176,14 @@ var FireworksImageModel = class FireworksImageModel {
177
176
  };
178
177
  if (backendConfig?.urlFormat === "workflows_async") return this.doGenerateAsync({
179
178
  body,
180
- headers: combinedHeaders,
179
+ headers,
181
180
  abortSignal,
182
181
  warnings,
183
182
  currentDate
184
183
  });
185
184
  const { value: response, responseHeaders } = await postJsonToApi({
186
185
  url: getUrlForModel(this.config.baseURL, this.modelId),
187
- headers: combinedHeaders,
186
+ headers: combineHeaders(await resolve(this.config.headers), headers),
188
187
  body,
189
188
  failedResponseHandler: createStatusCodeErrorResponseHandler(),
190
189
  successfulResponseHandler: createBinaryResponseHandler(),
@@ -208,7 +207,7 @@ var FireworksImageModel = class FireworksImageModel {
208
207
  async doGenerateAsync({ body, headers, abortSignal, warnings, currentDate }) {
209
208
  const { value: submitResponse } = await postJsonToApi({
210
209
  url: getUrlForModel(this.config.baseURL, this.modelId),
211
- headers,
210
+ headers: combineHeaders(await resolve(this.config.headers), headers),
212
211
  body,
213
212
  failedResponseHandler: createStatusCodeErrorResponseHandler(),
214
213
  successfulResponseHandler: createJsonResponseHandler(asyncSubmitResponseSchema),
@@ -226,7 +225,7 @@ var FireworksImageModel = class FireworksImageModel {
226
225
  validateUrl: true,
227
226
  credentialedOrigin: this.config.baseURL,
228
227
  trustedOrigin: this.config.baseURL,
229
- headers,
228
+ headers: combineHeaders(await resolve(this.config.headers), headers),
230
229
  abortSignal,
231
230
  failedResponseHandler: createStatusCodeErrorResponseHandler(),
232
231
  successfulResponseHandler: createBinaryResponseHandler(),
@@ -260,7 +259,7 @@ var FireworksImageModel = class FireworksImageModel {
260
259
  while (true) {
261
260
  const { value: pollResponse } = await postJsonToApi({
262
261
  url: pollUrl,
263
- headers,
262
+ headers: combineHeaders(await resolve(this.config.headers), headers),
264
263
  body: { id: requestId },
265
264
  failedResponseHandler: createStatusCodeErrorResponseHandler(),
266
265
  successfulResponseHandler: createJsonResponseHandler(asyncPollResponseSchema),
@@ -286,7 +285,7 @@ var FireworksImageModel = class FireworksImageModel {
286
285
  };
287
286
  //#endregion
288
287
  //#region src/version.ts
289
- const VERSION = "3.0.84";
288
+ const VERSION = "3.0.85";
290
289
  //#endregion
291
290
  //#region src/fireworks-provider.ts
292
291
  const fireworksErrorStructure = {
@@ -302,14 +301,14 @@ const fireworksErrorStructure = {
302
301
  const defaultBaseURL = "https://api.fireworks.ai/inference/v1";
303
302
  function createFireworks(options = {}) {
304
303
  const baseURL = withoutTrailingSlash(options.baseURL ?? defaultBaseURL);
305
- const getHeaders = () => withUserAgentSuffix({
304
+ const getHeaders = () => resolveWith(options.apiKey, (apiKey) => withUserAgentSuffix({
306
305
  Authorization: `Bearer ${loadApiKey({
307
- apiKey: options.apiKey,
306
+ apiKey,
308
307
  environmentVariableName: "FIREWORKS_API_KEY",
309
308
  description: "Fireworks API key"
310
309
  })}`,
311
310
  ...options.headers
312
- }, `ai-sdk-fireworks/${VERSION}`);
311
+ }, `ai-sdk-fireworks/${VERSION}`));
313
312
  const getCommonModelConfig = (modelType) => ({
314
313
  provider: `fireworks.${modelType}`,
315
314
  url: ({ path }) => `${baseURL}${path}`,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/fireworks-image-api.ts","../src/fireworks-image-model-options.ts","../src/fireworks-image-model.ts","../src/version.ts","../src/fireworks-provider.ts"],"sourcesContent":["import { lazySchema, zodSchema } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n// Schema for async submit response\nexport const asyncSubmitResponseSchema = lazySchema(() =>\n zodSchema(\n z.object({\n request_id: z.string(),\n }),\n ),\n);\n\n// Schema for async poll response\nexport const asyncPollResponseSchema = lazySchema(() =>\n zodSchema(\n z.object({\n id: z.string(),\n status: z.string(),\n result: z\n .object({\n sample: z.string().optional(),\n })\n .nullable(),\n }),\n ),\n);\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const fireworksImageModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z.looseObject({\n /**\n * Classifier-free guidance scale for the image diffusion process.\n */\n guidance_scale: z.number().optional(),\n\n /**\n * Number of denoising steps for the image generation process.\n */\n num_inference_steps: z.number().int().optional(),\n\n /**\n * Desired output image format.\n */\n output_format: z.enum(['jpeg', 'png']).optional(),\n\n /**\n * URL to receive webhook notifications for async Kontext requests.\n */\n webhook_url: z.string().optional(),\n\n /**\n * Secret for webhook signature verification.\n */\n webhook_secret: z.string().optional(),\n\n /**\n * Whether Fireworks should automatically modify the prompt for more creative generation.\n */\n prompt_upsampling: z.boolean().optional(),\n\n /**\n * Moderation tolerance level for inputs and outputs.\n */\n safety_tolerance: z.number().int().min(0).max(6).optional(),\n\n /**\n * Guidance scale for legacy image_generation models.\n */\n cfg_scale: z.number().optional(),\n\n /**\n * Number of generation steps for legacy image_generation models.\n */\n steps: z.number().int().optional(),\n }),\n ),\n);\n\nexport type FireworksImageModelOptions = InferSchema<\n typeof fireworksImageModelOptionsSchema\n>;\n","import type { ImageModelV4, SharedV4Warning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertImageModelFileToDataUri,\n createBinaryResponseHandler,\n createJsonResponseHandler,\n createStatusCodeErrorResponseHandler,\n delay,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport {\n asyncPollResponseSchema,\n asyncSubmitResponseSchema,\n} from './fireworks-image-api';\nimport { fireworksImageModelOptionsSchema } from './fireworks-image-model-options';\nimport type { FireworksImageModelId } from './fireworks-image-options';\n\nconst DEFAULT_POLL_INTERVAL_MILLIS = 500;\nconst DEFAULT_POLL_TIMEOUT_MILLIS = 120000; // 2 minutes for image generation\n\ninterface FireworksImageModelBackendConfig {\n urlFormat: 'workflows' | 'workflows_async' | 'image_generation';\n supportsSize?: boolean;\n supportsEditing?: boolean;\n}\n\nconst modelToBackendConfig: Partial<\n Record<FireworksImageModelId, FireworksImageModelBackendConfig>\n> = {\n 'accounts/fireworks/models/flux-1-dev-fp8': {\n urlFormat: 'workflows',\n },\n 'accounts/fireworks/models/flux-1-schnell-fp8': {\n urlFormat: 'workflows',\n },\n 'accounts/fireworks/models/flux-kontext-pro': {\n urlFormat: 'workflows_async',\n supportsEditing: true,\n },\n 'accounts/fireworks/models/flux-kontext-max': {\n urlFormat: 'workflows_async',\n supportsEditing: true,\n },\n 'accounts/fireworks/models/playground-v2-5-1024px-aesthetic': {\n urlFormat: 'image_generation',\n supportsSize: true,\n },\n 'accounts/fireworks/models/japanese-stable-diffusion-xl': {\n urlFormat: 'image_generation',\n supportsSize: true,\n },\n 'accounts/fireworks/models/playground-v2-1024px-aesthetic': {\n urlFormat: 'image_generation',\n supportsSize: true,\n },\n 'accounts/fireworks/models/stable-diffusion-xl-1024-v1-0': {\n urlFormat: 'image_generation',\n supportsSize: true,\n },\n 'accounts/fireworks/models/SSD-1B': {\n urlFormat: 'image_generation',\n supportsSize: true,\n },\n};\n\nfunction getUrlForModel(\n baseUrl: string,\n modelId: FireworksImageModelId,\n): string {\n const config = modelToBackendConfig[modelId];\n\n switch (config?.urlFormat) {\n case 'image_generation':\n return `${baseUrl}/image_generation/${modelId}`;\n case 'workflows_async':\n return `${baseUrl}/workflows/${modelId}`;\n case 'workflows':\n default:\n return `${baseUrl}/workflows/${modelId}/text_to_image`;\n }\n}\n\nfunction getPollUrlForModel(\n baseUrl: string,\n modelId: FireworksImageModelId,\n): string {\n return `${baseUrl}/workflows/${modelId}/get_result`;\n}\n\ninterface FireworksImageModelConfig {\n provider: string;\n baseURL: string;\n headers?: () => Record<string, string>;\n fetch?: FetchFunction;\n /**\n * Poll interval in milliseconds between status checks for async models.\n * Defaults to 500ms.\n */\n pollIntervalMillis?: number;\n /**\n * Overall timeout in milliseconds for polling before giving up.\n * Defaults to 120000ms (2 minutes).\n */\n pollTimeoutMillis?: number;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class FireworksImageModel implements ImageModelV4 {\n readonly specificationVersion = 'v4';\n readonly maxImagesPerCall = 1;\n\n get supportsFileInputs(): boolean | undefined {\n if (\n this.modelId === 'accounts/fireworks/models/flux-kontext-pro' ||\n this.modelId === 'accounts/fireworks/models/flux-kontext-max'\n ) {\n return true;\n }\n\n return [\n 'accounts/fireworks/models/flux-1-dev-fp8',\n 'accounts/fireworks/models/flux-1-schnell-fp8',\n 'accounts/fireworks/models/playground-v2-5-1024px-aesthetic',\n 'accounts/fireworks/models/japanese-stable-diffusion-xl',\n 'accounts/fireworks/models/playground-v2-1024px-aesthetic',\n 'accounts/fireworks/models/SSD-1B',\n 'accounts/fireworks/models/stable-diffusion-xl-1024-v1-0',\n ].includes(this.modelId)\n ? false\n : undefined;\n }\n\n get supportsMaskInputs(): boolean | undefined {\n return this.supportsFileInputs == null ? undefined : false;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: FireworksImageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: FireworksImageModelId;\n config: FireworksImageModelConfig;\n }) {\n return new FireworksImageModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: FireworksImageModelId,\n private config: FireworksImageModelConfig,\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\n const backendConfig = modelToBackendConfig[this.modelId];\n if (!backendConfig?.supportsSize && size != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'size',\n details:\n 'This model does not support the `size` option. Use `aspectRatio` instead.',\n });\n }\n\n // Use supportsSize as a proxy for whether the model does not support\n // aspectRatio. This invariant holds for the current set of models.\n if (backendConfig?.supportsSize && aspectRatio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details: 'This model does not support the `aspectRatio` option.',\n });\n }\n\n // Handle files for image editing\n const hasInputImage = files != null && files.length > 0;\n let inputImage: string | undefined;\n\n if (hasInputImage) {\n inputImage = convertImageModelFileToDataUri(files[0]);\n\n if (files.length > 1) {\n warnings.push({\n type: 'other',\n message:\n 'Fireworks only supports a single input image. Additional images are ignored.',\n });\n }\n }\n\n // Warn about mask - Fireworks Kontext models don't support explicit masks\n if (mask != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'mask',\n details:\n 'Fireworks Kontext models do not support explicit masks. Use the prompt to describe the areas to edit.',\n });\n }\n\n const splitSize = size?.split('x');\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const combinedHeaders = combineHeaders(this.config.headers?.(), headers);\n const fireworksOptions =\n (await parseProviderOptions({\n provider: 'fireworks',\n providerOptions,\n schema: fireworksImageModelOptionsSchema,\n })) ?? {};\n\n const body = {\n prompt,\n aspect_ratio: aspectRatio,\n seed,\n samples: n,\n ...(inputImage && { input_image: inputImage }),\n ...(splitSize && { width: splitSize[0], height: splitSize[1] }),\n ...fireworksOptions,\n };\n\n // Handle async models that require polling (e.g., flux-kontext-*)\n if (backendConfig?.urlFormat === 'workflows_async') {\n return this.doGenerateAsync({\n body,\n headers: combinedHeaders,\n abortSignal,\n warnings,\n currentDate,\n });\n }\n\n // Handle sync models that return binary directly\n const { value: response, responseHeaders } = await postJsonToApi({\n url: getUrlForModel(this.config.baseURL, this.modelId),\n headers: combinedHeaders,\n body,\n failedResponseHandler: createStatusCodeErrorResponseHandler(),\n successfulResponseHandler: createBinaryResponseHandler(),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n images: [response],\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n /**\n * Handles async image generation for models like flux-kontext-* that return\n * a request_id and require polling for results.\n */\n private async doGenerateAsync({\n body,\n headers,\n abortSignal,\n warnings,\n currentDate,\n }: {\n body: Record<string, unknown>;\n headers: Record<string, string | undefined>;\n abortSignal: AbortSignal | undefined;\n warnings: Array<SharedV4Warning>;\n currentDate: Date;\n }): Promise<Awaited<ReturnType<ImageModelV4['doGenerate']>>> {\n // Submit the generation request\n const { value: submitResponse } = await postJsonToApi({\n url: getUrlForModel(this.config.baseURL, this.modelId),\n headers,\n body,\n failedResponseHandler: createStatusCodeErrorResponseHandler(),\n successfulResponseHandler: createJsonResponseHandler(\n asyncSubmitResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n const requestId = submitResponse.request_id;\n\n // Poll for the result\n const imageUrl = await this.pollForImageUrl({\n requestId,\n headers,\n abortSignal,\n });\n\n // Download the image from the URL. The URL comes from the provider\n // response and typically points at a CDN, so only send credentials when it\n // stays on the provider's own origin (never leak the API key to a CDN or an\n // attacker-named host).\n const { value: imageBytes, responseHeaders } = await getFromApi({\n url: imageUrl,\n // imageUrl comes from the provider response body.\n validateUrl: true,\n credentialedOrigin: this.config.baseURL,\n trustedOrigin: this.config.baseURL,\n headers,\n abortSignal,\n failedResponseHandler: createStatusCodeErrorResponseHandler(),\n successfulResponseHandler: createBinaryResponseHandler(),\n fetch: this.config.fetch,\n });\n\n return {\n images: [imageBytes],\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n /**\n * Polls the get_result endpoint until the image is ready.\n */\n private async pollForImageUrl({\n requestId,\n headers,\n abortSignal,\n }: {\n requestId: string;\n headers: Record<string, string | undefined>;\n abortSignal: AbortSignal | undefined;\n }): Promise<string> {\n const pollIntervalMillis =\n this.config.pollIntervalMillis ?? DEFAULT_POLL_INTERVAL_MILLIS;\n const pollTimeoutMillis =\n this.config.pollTimeoutMillis ?? DEFAULT_POLL_TIMEOUT_MILLIS;\n\n const pollUrl = getPollUrlForModel(this.config.baseURL, this.modelId);\n\n const timeoutController = new AbortController();\n let didTimeout = false;\n const timeoutId = setTimeout(() => {\n didTimeout = true;\n timeoutController.abort();\n }, pollTimeoutMillis);\n const pollingAbortSignal =\n abortSignal == null\n ? timeoutController.signal\n : AbortSignal.any([abortSignal, timeoutController.signal]);\n\n try {\n while (true) {\n const { value: pollResponse } = await postJsonToApi({\n url: pollUrl,\n headers,\n body: { id: requestId },\n failedResponseHandler: createStatusCodeErrorResponseHandler(),\n successfulResponseHandler: createJsonResponseHandler(\n asyncPollResponseSchema,\n ),\n abortSignal: pollingAbortSignal,\n fetch: this.config.fetch,\n });\n\n const status = pollResponse.status;\n\n if (status === 'Ready') {\n const imageUrl = pollResponse.result?.sample;\n if (typeof imageUrl === 'string') {\n return imageUrl;\n }\n throw new Error(\n 'Fireworks poll response is Ready but missing result.sample',\n );\n }\n\n if (status === 'Error' || status === 'Failed') {\n throw new Error(\n `Fireworks image generation failed with status: ${status}`,\n );\n }\n\n // Wait before next poll attempt\n await delay(pollIntervalMillis, {\n abortSignal: pollingAbortSignal,\n });\n }\n } catch (error) {\n if (didTimeout) {\n throw new Error(\n `Fireworks image generation timed out after ${pollTimeoutMillis}ms`,\n );\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\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 {\n OpenAICompatibleChatLanguageModel,\n OpenAICompatibleCompletionLanguageModel,\n OpenAICompatibleEmbeddingModel,\n type ProviderErrorStructure,\n} from '@ai-sdk/openai-compatible';\nimport type {\n EmbeddingModelV4,\n ImageModelV4,\n LanguageModelV4,\n ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n mapReasoningToProviderEffort,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { FireworksChatModelId } from './fireworks-chat-options';\nimport type { FireworksCompletionModelId } from './fireworks-completion-options';\nimport type { FireworksEmbeddingModelId } from './fireworks-embedding-options';\nimport { FireworksImageModel } from './fireworks-image-model';\nimport type { FireworksImageModelId } from './fireworks-image-options';\nimport { VERSION } from './version';\n\nexport type FireworksErrorData = z.infer<typeof fireworksErrorSchema>;\n\nconst fireworksErrorSchema = z.object({\n error: z.union([\n z.string(),\n z.object({\n message: z.string(),\n object: z.string().nullish(),\n type: z.string().nullish(),\n param: z.any().nullish(),\n code: z.union([z.string(), z.number()]).nullish(),\n }),\n ]),\n});\n\nconst fireworksErrorStructure: ProviderErrorStructure<FireworksErrorData> = {\n errorSchema: fireworksErrorSchema,\n errorToMessage: data =>\n typeof data.error === 'string' ? data.error : data.error.message,\n};\n\nexport interface FireworksProviderSettings {\n /**\n * Fireworks API key. Default value is taken from the `FIREWORKS_API_KEY`\n * environment variable.\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 FireworksProvider extends ProviderV4 {\n /**\n * Creates a model for text generation.\n */\n (modelId: FireworksChatModelId): LanguageModelV4;\n\n /**\n * Creates a chat model for text generation.\n */\n chatModel(modelId: FireworksChatModelId): LanguageModelV4;\n\n /**\n * Creates a completion model for text generation.\n */\n completionModel(modelId: FireworksCompletionModelId): LanguageModelV4;\n\n /**\n * Creates a chat model for text generation.\n */\n languageModel(modelId: FireworksChatModelId): LanguageModelV4;\n\n /**\n * Creates a text embedding model for text generation.\n */\n embeddingModel(modelId: FireworksEmbeddingModelId): EmbeddingModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: FireworksEmbeddingModelId): EmbeddingModelV4;\n\n /**\n * Creates a model for image generation.\n */\n image(modelId: FireworksImageModelId): ImageModelV4;\n\n /**\n * Creates a model for image generation.\n */\n imageModel(modelId: FireworksImageModelId): ImageModelV4;\n}\n\nconst defaultBaseURL = 'https://api.fireworks.ai/inference/v1';\n\nexport function createFireworks(\n options: FireworksProviderSettings = {},\n): FireworksProvider {\n const baseURL = withoutTrailingSlash(options.baseURL ?? defaultBaseURL);\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'FIREWORKS_API_KEY',\n description: 'Fireworks API key',\n })}`,\n ...options.headers,\n },\n `ai-sdk-fireworks/${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: `fireworks.${modelType}`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createChatModel = (modelId: FireworksChatModelId) => {\n return new OpenAICompatibleChatLanguageModel(modelId, {\n ...getCommonModelConfig('chat'),\n includeUsage: true,\n errorStructure: fireworksErrorStructure,\n supportsStructuredOutputs: true,\n mapReasoning: ({ reasoning, warnings }) =>\n mapReasoningToProviderEffort({\n reasoning,\n effortMap: getFireworksReasoningEffortMap(modelId),\n warnings,\n }),\n transformRequestBody: args => {\n const thinking = args.thinking as\n | { type?: string; budgetTokens?: number }\n | undefined;\n const reasoningHistory = args.reasoningHistory as string | undefined;\n const promptCacheKey = args.promptCacheKey as string | undefined;\n const serviceTier = args.serviceTier as string | undefined;\n\n const {\n thinking: _,\n reasoningHistory: __,\n promptCacheKey: ___,\n serviceTier: ____,\n ...rest\n } = args;\n\n return {\n ...rest,\n ...(promptCacheKey !== undefined && {\n prompt_cache_key: promptCacheKey,\n }),\n ...(serviceTier !== undefined && {\n service_tier: serviceTier,\n }),\n ...(thinking && {\n thinking: {\n type: thinking.type,\n ...(thinking.budgetTokens !== undefined && {\n budget_tokens: thinking.budgetTokens,\n }),\n },\n }),\n ...(reasoningHistory && {\n reasoning_history: reasoningHistory,\n }),\n };\n },\n });\n };\n\n const createCompletionModel = (modelId: FireworksCompletionModelId) =>\n new OpenAICompatibleCompletionLanguageModel(modelId, {\n ...getCommonModelConfig('completion'),\n includeUsage: true,\n errorStructure: fireworksErrorStructure,\n });\n\n const createEmbeddingModel = (modelId: FireworksEmbeddingModelId) =>\n new OpenAICompatibleEmbeddingModel(modelId, {\n ...getCommonModelConfig('embedding'),\n errorStructure: fireworksErrorStructure,\n });\n\n const createImageModel = (modelId: FireworksImageModelId) =>\n new FireworksImageModel(modelId, {\n ...getCommonModelConfig('image'),\n baseURL: baseURL ?? defaultBaseURL,\n });\n\n const provider = (modelId: FireworksChatModelId) => createChatModel(modelId);\n\n provider.specificationVersion = 'v4' as const;\n provider.completionModel = createCompletionModel;\n provider.chatModel = createChatModel;\n provider.languageModel = createChatModel;\n provider.embeddingModel = createEmbeddingModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n provider.image = createImageModel;\n provider.imageModel = createImageModel;\n return provider;\n}\n\nexport const fireworks = createFireworks();\n\n// Model families that always reason and reject reasoning effort 'none'.\nconst modelsWithoutNoneReasoningEffort = /^(?:gpt-oss|glm-5p3|muse-spark)/;\n\n// Model families that reject reasoning effort 'minimal'.\nconst modelsWithoutMinimalReasoningEffort = /^(?:nemotron|inkling)/;\n\n/**\n * Fireworks accepts every reasoning effort for most models, so reasoning\n * values are sent directly, except to model families known to reject them.\n */\nfunction getFireworksReasoningEffortMap(modelId: string) {\n const modelName = modelId.slice(modelId.lastIndexOf('/') + 1);\n\n return {\n ...(!modelsWithoutNoneReasoningEffort.test(modelName) && {\n none: 'none' as const,\n }),\n ...(!modelsWithoutMinimalReasoningEffort.test(modelName) && {\n minimal: 'minimal' as const,\n }),\n low: 'low' as const,\n medium: 'medium' as const,\n high: 'high' as const,\n xhigh: 'xhigh' as const,\n max: 'max' as const,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/fireworks-image-api.ts","../src/fireworks-image-model-options.ts","../src/fireworks-image-model.ts","../src/version.ts","../src/fireworks-provider.ts"],"sourcesContent":["import { lazySchema, zodSchema } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n// Schema for async submit response\nexport const asyncSubmitResponseSchema = lazySchema(() =>\n zodSchema(\n z.object({\n request_id: z.string(),\n }),\n ),\n);\n\n// Schema for async poll response\nexport const asyncPollResponseSchema = lazySchema(() =>\n zodSchema(\n z.object({\n id: z.string(),\n status: z.string(),\n result: z\n .object({\n sample: z.string().optional(),\n })\n .nullable(),\n }),\n ),\n);\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const fireworksImageModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z.looseObject({\n /**\n * Classifier-free guidance scale for the image diffusion process.\n */\n guidance_scale: z.number().optional(),\n\n /**\n * Number of denoising steps for the image generation process.\n */\n num_inference_steps: z.number().int().optional(),\n\n /**\n * Desired output image format.\n */\n output_format: z.enum(['jpeg', 'png']).optional(),\n\n /**\n * URL to receive webhook notifications for async Kontext requests.\n */\n webhook_url: z.string().optional(),\n\n /**\n * Secret for webhook signature verification.\n */\n webhook_secret: z.string().optional(),\n\n /**\n * Whether Fireworks should automatically modify the prompt for more creative generation.\n */\n prompt_upsampling: z.boolean().optional(),\n\n /**\n * Moderation tolerance level for inputs and outputs.\n */\n safety_tolerance: z.number().int().min(0).max(6).optional(),\n\n /**\n * Guidance scale for legacy image_generation models.\n */\n cfg_scale: z.number().optional(),\n\n /**\n * Number of generation steps for legacy image_generation models.\n */\n steps: z.number().int().optional(),\n }),\n ),\n);\n\nexport type FireworksImageModelOptions = InferSchema<\n typeof fireworksImageModelOptionsSchema\n>;\n","import type { ImageModelV4, SharedV4Warning } from '@ai-sdk/provider';\nimport {\n type Resolvable,\n resolve,\n combineHeaders,\n convertImageModelFileToDataUri,\n createBinaryResponseHandler,\n createJsonResponseHandler,\n createStatusCodeErrorResponseHandler,\n delay,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport {\n asyncPollResponseSchema,\n asyncSubmitResponseSchema,\n} from './fireworks-image-api';\nimport { fireworksImageModelOptionsSchema } from './fireworks-image-model-options';\nimport type { FireworksImageModelId } from './fireworks-image-options';\n\nconst DEFAULT_POLL_INTERVAL_MILLIS = 500;\nconst DEFAULT_POLL_TIMEOUT_MILLIS = 120000; // 2 minutes for image generation\n\ninterface FireworksImageModelBackendConfig {\n urlFormat: 'workflows' | 'workflows_async' | 'image_generation';\n supportsSize?: boolean;\n supportsEditing?: boolean;\n}\n\nconst modelToBackendConfig: Partial<\n Record<FireworksImageModelId, FireworksImageModelBackendConfig>\n> = {\n 'accounts/fireworks/models/flux-1-dev-fp8': {\n urlFormat: 'workflows',\n },\n 'accounts/fireworks/models/flux-1-schnell-fp8': {\n urlFormat: 'workflows',\n },\n 'accounts/fireworks/models/flux-kontext-pro': {\n urlFormat: 'workflows_async',\n supportsEditing: true,\n },\n 'accounts/fireworks/models/flux-kontext-max': {\n urlFormat: 'workflows_async',\n supportsEditing: true,\n },\n 'accounts/fireworks/models/playground-v2-5-1024px-aesthetic': {\n urlFormat: 'image_generation',\n supportsSize: true,\n },\n 'accounts/fireworks/models/japanese-stable-diffusion-xl': {\n urlFormat: 'image_generation',\n supportsSize: true,\n },\n 'accounts/fireworks/models/playground-v2-1024px-aesthetic': {\n urlFormat: 'image_generation',\n supportsSize: true,\n },\n 'accounts/fireworks/models/stable-diffusion-xl-1024-v1-0': {\n urlFormat: 'image_generation',\n supportsSize: true,\n },\n 'accounts/fireworks/models/SSD-1B': {\n urlFormat: 'image_generation',\n supportsSize: true,\n },\n};\n\nfunction getUrlForModel(\n baseUrl: string,\n modelId: FireworksImageModelId,\n): string {\n const config = modelToBackendConfig[modelId];\n\n switch (config?.urlFormat) {\n case 'image_generation':\n return `${baseUrl}/image_generation/${modelId}`;\n case 'workflows_async':\n return `${baseUrl}/workflows/${modelId}`;\n case 'workflows':\n default:\n return `${baseUrl}/workflows/${modelId}/text_to_image`;\n }\n}\n\nfunction getPollUrlForModel(\n baseUrl: string,\n modelId: FireworksImageModelId,\n): string {\n return `${baseUrl}/workflows/${modelId}/get_result`;\n}\n\ninterface FireworksImageModelConfig {\n provider: string;\n baseURL: string;\n headers?: Resolvable<Record<string, string>>;\n fetch?: FetchFunction;\n /**\n * Poll interval in milliseconds between status checks for async models.\n * Defaults to 500ms.\n */\n pollIntervalMillis?: number;\n /**\n * Overall timeout in milliseconds for polling before giving up.\n * Defaults to 120000ms (2 minutes).\n */\n pollTimeoutMillis?: number;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class FireworksImageModel implements ImageModelV4 {\n readonly specificationVersion = 'v4';\n readonly maxImagesPerCall = 1;\n\n get supportsFileInputs(): boolean | undefined {\n if (\n this.modelId === 'accounts/fireworks/models/flux-kontext-pro' ||\n this.modelId === 'accounts/fireworks/models/flux-kontext-max'\n ) {\n return true;\n }\n\n return [\n 'accounts/fireworks/models/flux-1-dev-fp8',\n 'accounts/fireworks/models/flux-1-schnell-fp8',\n 'accounts/fireworks/models/playground-v2-5-1024px-aesthetic',\n 'accounts/fireworks/models/japanese-stable-diffusion-xl',\n 'accounts/fireworks/models/playground-v2-1024px-aesthetic',\n 'accounts/fireworks/models/SSD-1B',\n 'accounts/fireworks/models/stable-diffusion-xl-1024-v1-0',\n ].includes(this.modelId)\n ? false\n : undefined;\n }\n\n get supportsMaskInputs(): boolean | undefined {\n return this.supportsFileInputs == null ? undefined : false;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: FireworksImageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: FireworksImageModelId;\n config: FireworksImageModelConfig;\n }) {\n return new FireworksImageModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: FireworksImageModelId,\n private config: FireworksImageModelConfig,\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\n const backendConfig = modelToBackendConfig[this.modelId];\n if (!backendConfig?.supportsSize && size != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'size',\n details:\n 'This model does not support the `size` option. Use `aspectRatio` instead.',\n });\n }\n\n // Use supportsSize as a proxy for whether the model does not support\n // aspectRatio. This invariant holds for the current set of models.\n if (backendConfig?.supportsSize && aspectRatio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details: 'This model does not support the `aspectRatio` option.',\n });\n }\n\n // Handle files for image editing\n const hasInputImage = files != null && files.length > 0;\n let inputImage: string | undefined;\n\n if (hasInputImage) {\n inputImage = convertImageModelFileToDataUri(files[0]);\n\n if (files.length > 1) {\n warnings.push({\n type: 'other',\n message:\n 'Fireworks only supports a single input image. Additional images are ignored.',\n });\n }\n }\n\n // Warn about mask - Fireworks Kontext models don't support explicit masks\n if (mask != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'mask',\n details:\n 'Fireworks Kontext models do not support explicit masks. Use the prompt to describe the areas to edit.',\n });\n }\n\n const splitSize = size?.split('x');\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const fireworksOptions =\n (await parseProviderOptions({\n provider: 'fireworks',\n providerOptions,\n schema: fireworksImageModelOptionsSchema,\n })) ?? {};\n\n const body = {\n prompt,\n aspect_ratio: aspectRatio,\n seed,\n samples: n,\n ...(inputImage && { input_image: inputImage }),\n ...(splitSize && { width: splitSize[0], height: splitSize[1] }),\n ...fireworksOptions,\n };\n\n // Handle async models that require polling (e.g., flux-kontext-*)\n if (backendConfig?.urlFormat === 'workflows_async') {\n return this.doGenerateAsync({\n body,\n headers,\n abortSignal,\n warnings,\n currentDate,\n });\n }\n\n // Handle sync models that return binary directly\n const { value: response, responseHeaders } = await postJsonToApi({\n url: getUrlForModel(this.config.baseURL, this.modelId),\n headers: combineHeaders(await resolve(this.config.headers), headers),\n body,\n failedResponseHandler: createStatusCodeErrorResponseHandler(),\n successfulResponseHandler: createBinaryResponseHandler(),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n images: [response],\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n /**\n * Handles async image generation for models like flux-kontext-* that return\n * a request_id and require polling for results.\n */\n private async doGenerateAsync({\n body,\n headers,\n abortSignal,\n warnings,\n currentDate,\n }: {\n body: Record<string, unknown>;\n headers: Record<string, string | undefined> | undefined;\n abortSignal: AbortSignal | undefined;\n warnings: Array<SharedV4Warning>;\n currentDate: Date;\n }): Promise<Awaited<ReturnType<ImageModelV4['doGenerate']>>> {\n // Submit the generation request\n const { value: submitResponse } = await postJsonToApi({\n url: getUrlForModel(this.config.baseURL, this.modelId),\n headers: combineHeaders(await resolve(this.config.headers), headers),\n body,\n failedResponseHandler: createStatusCodeErrorResponseHandler(),\n successfulResponseHandler: createJsonResponseHandler(\n asyncSubmitResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n const requestId = submitResponse.request_id;\n\n // Poll for the result\n const imageUrl = await this.pollForImageUrl({\n requestId,\n headers,\n abortSignal,\n });\n\n // Download the image from the URL. The URL comes from the provider\n // response and typically points at a CDN, so only send credentials when it\n // stays on the provider's own origin (never leak the API key to a CDN or an\n // attacker-named host).\n const { value: imageBytes, responseHeaders } = await getFromApi({\n url: imageUrl,\n // imageUrl comes from the provider response body.\n validateUrl: true,\n credentialedOrigin: this.config.baseURL,\n trustedOrigin: this.config.baseURL,\n headers: combineHeaders(await resolve(this.config.headers), headers),\n abortSignal,\n failedResponseHandler: createStatusCodeErrorResponseHandler(),\n successfulResponseHandler: createBinaryResponseHandler(),\n fetch: this.config.fetch,\n });\n\n return {\n images: [imageBytes],\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n /**\n * Polls the get_result endpoint until the image is ready.\n */\n private async pollForImageUrl({\n requestId,\n headers,\n abortSignal,\n }: {\n requestId: string;\n headers: Record<string, string | undefined> | undefined;\n abortSignal: AbortSignal | undefined;\n }): Promise<string> {\n const pollIntervalMillis =\n this.config.pollIntervalMillis ?? DEFAULT_POLL_INTERVAL_MILLIS;\n const pollTimeoutMillis =\n this.config.pollTimeoutMillis ?? DEFAULT_POLL_TIMEOUT_MILLIS;\n\n const pollUrl = getPollUrlForModel(this.config.baseURL, this.modelId);\n\n const timeoutController = new AbortController();\n let didTimeout = false;\n const timeoutId = setTimeout(() => {\n didTimeout = true;\n timeoutController.abort();\n }, pollTimeoutMillis);\n const pollingAbortSignal =\n abortSignal == null\n ? timeoutController.signal\n : AbortSignal.any([abortSignal, timeoutController.signal]);\n\n try {\n while (true) {\n const { value: pollResponse } = await postJsonToApi({\n url: pollUrl,\n headers: combineHeaders(await resolve(this.config.headers), headers),\n body: { id: requestId },\n failedResponseHandler: createStatusCodeErrorResponseHandler(),\n successfulResponseHandler: createJsonResponseHandler(\n asyncPollResponseSchema,\n ),\n abortSignal: pollingAbortSignal,\n fetch: this.config.fetch,\n });\n\n const status = pollResponse.status;\n\n if (status === 'Ready') {\n const imageUrl = pollResponse.result?.sample;\n if (typeof imageUrl === 'string') {\n return imageUrl;\n }\n throw new Error(\n 'Fireworks poll response is Ready but missing result.sample',\n );\n }\n\n if (status === 'Error' || status === 'Failed') {\n throw new Error(\n `Fireworks image generation failed with status: ${status}`,\n );\n }\n\n // Wait before next poll attempt\n await delay(pollIntervalMillis, {\n abortSignal: pollingAbortSignal,\n });\n }\n } catch (error) {\n if (didTimeout) {\n throw new Error(\n `Fireworks image generation timed out after ${pollTimeoutMillis}ms`,\n );\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\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 {\n OpenAICompatibleChatLanguageModel,\n OpenAICompatibleCompletionLanguageModel,\n OpenAICompatibleEmbeddingModel,\n type ProviderErrorStructure,\n} from '@ai-sdk/openai-compatible';\nimport type {\n EmbeddingModelV4,\n ImageModelV4,\n LanguageModelV4,\n ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n type Resolvable,\n resolveWith,\n loadApiKey,\n mapReasoningToProviderEffort,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { FireworksChatModelId } from './fireworks-chat-options';\nimport type { FireworksCompletionModelId } from './fireworks-completion-options';\nimport type { FireworksEmbeddingModelId } from './fireworks-embedding-options';\nimport { FireworksImageModel } from './fireworks-image-model';\nimport type { FireworksImageModelId } from './fireworks-image-options';\nimport { VERSION } from './version';\n\nexport type FireworksErrorData = z.infer<typeof fireworksErrorSchema>;\n\nconst fireworksErrorSchema = z.object({\n error: z.union([\n z.string(),\n z.object({\n message: z.string(),\n object: z.string().nullish(),\n type: z.string().nullish(),\n param: z.any().nullish(),\n code: z.union([z.string(), z.number()]).nullish(),\n }),\n ]),\n});\n\nconst fireworksErrorStructure: ProviderErrorStructure<FireworksErrorData> = {\n errorSchema: fireworksErrorSchema,\n errorToMessage: data =>\n typeof data.error === 'string' ? data.error : data.error.message,\n};\n\nexport interface FireworksProviderSettings {\n /**\n * Fireworks API key. Default value is taken from the `FIREWORKS_API_KEY`\n * environment variable.\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 FireworksProvider extends ProviderV4 {\n /**\n * Creates a model for text generation.\n */\n (modelId: FireworksChatModelId): LanguageModelV4;\n\n /**\n * Creates a chat model for text generation.\n */\n chatModel(modelId: FireworksChatModelId): LanguageModelV4;\n\n /**\n * Creates a completion model for text generation.\n */\n completionModel(modelId: FireworksCompletionModelId): LanguageModelV4;\n\n /**\n * Creates a chat model for text generation.\n */\n languageModel(modelId: FireworksChatModelId): LanguageModelV4;\n\n /**\n * Creates a text embedding model for text generation.\n */\n embeddingModel(modelId: FireworksEmbeddingModelId): EmbeddingModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: FireworksEmbeddingModelId): EmbeddingModelV4;\n\n /**\n * Creates a model for image generation.\n */\n image(modelId: FireworksImageModelId): ImageModelV4;\n\n /**\n * Creates a model for image generation.\n */\n imageModel(modelId: FireworksImageModelId): ImageModelV4;\n}\n\nconst defaultBaseURL = 'https://api.fireworks.ai/inference/v1';\n\nexport function createFireworks(\n options: FireworksProviderSettings = {},\n): FireworksProvider {\n const baseURL = withoutTrailingSlash(options.baseURL ?? defaultBaseURL);\n const getHeaders = () =>\n resolveWith(options.apiKey, apiKey =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey,\n environmentVariableName: 'FIREWORKS_API_KEY',\n description: 'Fireworks API key',\n })}`,\n ...options.headers,\n },\n `ai-sdk-fireworks/${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: `fireworks.${modelType}`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createChatModel = (modelId: FireworksChatModelId) => {\n return new OpenAICompatibleChatLanguageModel(modelId, {\n ...getCommonModelConfig('chat'),\n includeUsage: true,\n errorStructure: fireworksErrorStructure,\n supportsStructuredOutputs: true,\n mapReasoning: ({ reasoning, warnings }) =>\n mapReasoningToProviderEffort({\n reasoning,\n effortMap: getFireworksReasoningEffortMap(modelId),\n warnings,\n }),\n transformRequestBody: args => {\n const thinking = args.thinking as\n | { type?: string; budgetTokens?: number }\n | undefined;\n const reasoningHistory = args.reasoningHistory as string | undefined;\n const promptCacheKey = args.promptCacheKey as string | undefined;\n const serviceTier = args.serviceTier as string | undefined;\n\n const {\n thinking: _,\n reasoningHistory: __,\n promptCacheKey: ___,\n serviceTier: ____,\n ...rest\n } = args;\n\n return {\n ...rest,\n ...(promptCacheKey !== undefined && {\n prompt_cache_key: promptCacheKey,\n }),\n ...(serviceTier !== undefined && {\n service_tier: serviceTier,\n }),\n ...(thinking && {\n thinking: {\n type: thinking.type,\n ...(thinking.budgetTokens !== undefined && {\n budget_tokens: thinking.budgetTokens,\n }),\n },\n }),\n ...(reasoningHistory && {\n reasoning_history: reasoningHistory,\n }),\n };\n },\n });\n };\n\n const createCompletionModel = (modelId: FireworksCompletionModelId) =>\n new OpenAICompatibleCompletionLanguageModel(modelId, {\n ...getCommonModelConfig('completion'),\n includeUsage: true,\n errorStructure: fireworksErrorStructure,\n });\n\n const createEmbeddingModel = (modelId: FireworksEmbeddingModelId) =>\n new OpenAICompatibleEmbeddingModel(modelId, {\n ...getCommonModelConfig('embedding'),\n errorStructure: fireworksErrorStructure,\n });\n\n const createImageModel = (modelId: FireworksImageModelId) =>\n new FireworksImageModel(modelId, {\n ...getCommonModelConfig('image'),\n baseURL: baseURL ?? defaultBaseURL,\n });\n\n const provider = (modelId: FireworksChatModelId) => createChatModel(modelId);\n\n provider.specificationVersion = 'v4' as const;\n provider.completionModel = createCompletionModel;\n provider.chatModel = createChatModel;\n provider.languageModel = createChatModel;\n provider.embeddingModel = createEmbeddingModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n provider.image = createImageModel;\n provider.imageModel = createImageModel;\n return provider;\n}\n\nexport const fireworks = createFireworks();\n\n// Model families that always reason and reject reasoning effort 'none'.\nconst modelsWithoutNoneReasoningEffort = /^(?:gpt-oss|glm-5p3|muse-spark)/;\n\n// Model families that reject reasoning effort 'minimal'.\nconst modelsWithoutMinimalReasoningEffort = /^(?:nemotron|inkling)/;\n\n/**\n * Fireworks accepts every reasoning effort for most models, so reasoning\n * values are sent directly, except to model families known to reject them.\n */\nfunction getFireworksReasoningEffortMap(modelId: string) {\n const modelName = modelId.slice(modelId.lastIndexOf('/') + 1);\n\n return {\n ...(!modelsWithoutNoneReasoningEffort.test(modelName) && {\n none: 'none' as const,\n }),\n ...(!modelsWithoutMinimalReasoningEffort.test(modelName) && {\n minimal: 'minimal' as const,\n }),\n low: 'low' as const,\n medium: 'medium' as const,\n high: 'high' as const,\n xhigh: 'xhigh' as const,\n max: 'max' as const,\n };\n}\n"],"mappings":"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"}
@@ -86,11 +86,14 @@ You can use the following optional settings to customize the Fireworks provider
86
86
  Use a different URL prefix for API calls, e.g. to use proxy servers.
87
87
  The default prefix is `https://api.fireworks.ai/inference/v1`.
88
88
 
89
- - **apiKey** _string_
89
+ - **apiKey** _string | PromiseLike&lt;string&gt; | (() =&gt; string | PromiseLike&lt;string&gt;)_
90
90
 
91
91
  API key that is being sent using the `Authorization` header. It defaults to
92
92
  the `FIREWORKS_API_KEY` environment variable.
93
93
 
94
+ A function is called before each request and may return a promise. Use it to
95
+ supply refreshed credentials; a promise value resolves to the same key each time.
96
+
94
97
  - **headers** _Record&lt;string,string&gt;_
95
98
 
96
99
  Custom headers to include in the requests.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/fireworks",
3
- "version": "3.0.84",
3
+ "version": "3.0.85",
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.81",
33
- "@ai-sdk/provider": "4.0.34",
34
- "@ai-sdk/provider-utils": "5.0.71"
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",
@@ -1,5 +1,7 @@
1
1
  import type { ImageModelV4, SharedV4Warning } from '@ai-sdk/provider';
2
2
  import {
3
+ type Resolvable,
4
+ resolve,
3
5
  combineHeaders,
4
6
  convertImageModelFileToDataUri,
5
7
  createBinaryResponseHandler,
@@ -96,7 +98,7 @@ function getPollUrlForModel(
96
98
  interface FireworksImageModelConfig {
97
99
  provider: string;
98
100
  baseURL: string;
99
- headers?: () => Record<string, string>;
101
+ headers?: Resolvable<Record<string, string>>;
100
102
  fetch?: FetchFunction;
101
103
  /**
102
104
  * Poll interval in milliseconds between status checks for async models.
@@ -229,7 +231,6 @@ export class FireworksImageModel implements ImageModelV4 {
229
231
 
230
232
  const splitSize = size?.split('x');
231
233
  const currentDate = this.config._internal?.currentDate?.() ?? new Date();
232
- const combinedHeaders = combineHeaders(this.config.headers?.(), headers);
233
234
  const fireworksOptions =
234
235
  (await parseProviderOptions({
235
236
  provider: 'fireworks',
@@ -251,7 +252,7 @@ export class FireworksImageModel implements ImageModelV4 {
251
252
  if (backendConfig?.urlFormat === 'workflows_async') {
252
253
  return this.doGenerateAsync({
253
254
  body,
254
- headers: combinedHeaders,
255
+ headers,
255
256
  abortSignal,
256
257
  warnings,
257
258
  currentDate,
@@ -261,7 +262,7 @@ export class FireworksImageModel implements ImageModelV4 {
261
262
  // Handle sync models that return binary directly
262
263
  const { value: response, responseHeaders } = await postJsonToApi({
263
264
  url: getUrlForModel(this.config.baseURL, this.modelId),
264
- headers: combinedHeaders,
265
+ headers: combineHeaders(await resolve(this.config.headers), headers),
265
266
  body,
266
267
  failedResponseHandler: createStatusCodeErrorResponseHandler(),
267
268
  successfulResponseHandler: createBinaryResponseHandler(),
@@ -292,7 +293,7 @@ export class FireworksImageModel implements ImageModelV4 {
292
293
  currentDate,
293
294
  }: {
294
295
  body: Record<string, unknown>;
295
- headers: Record<string, string | undefined>;
296
+ headers: Record<string, string | undefined> | undefined;
296
297
  abortSignal: AbortSignal | undefined;
297
298
  warnings: Array<SharedV4Warning>;
298
299
  currentDate: Date;
@@ -300,7 +301,7 @@ export class FireworksImageModel implements ImageModelV4 {
300
301
  // Submit the generation request
301
302
  const { value: submitResponse } = await postJsonToApi({
302
303
  url: getUrlForModel(this.config.baseURL, this.modelId),
303
- headers,
304
+ headers: combineHeaders(await resolve(this.config.headers), headers),
304
305
  body,
305
306
  failedResponseHandler: createStatusCodeErrorResponseHandler(),
306
307
  successfulResponseHandler: createJsonResponseHandler(
@@ -329,7 +330,7 @@ export class FireworksImageModel implements ImageModelV4 {
329
330
  validateUrl: true,
330
331
  credentialedOrigin: this.config.baseURL,
331
332
  trustedOrigin: this.config.baseURL,
332
- headers,
333
+ headers: combineHeaders(await resolve(this.config.headers), headers),
333
334
  abortSignal,
334
335
  failedResponseHandler: createStatusCodeErrorResponseHandler(),
335
336
  successfulResponseHandler: createBinaryResponseHandler(),
@@ -356,7 +357,7 @@ export class FireworksImageModel implements ImageModelV4 {
356
357
  abortSignal,
357
358
  }: {
358
359
  requestId: string;
359
- headers: Record<string, string | undefined>;
360
+ headers: Record<string, string | undefined> | undefined;
360
361
  abortSignal: AbortSignal | undefined;
361
362
  }): Promise<string> {
362
363
  const pollIntervalMillis =
@@ -381,7 +382,7 @@ export class FireworksImageModel implements ImageModelV4 {
381
382
  while (true) {
382
383
  const { value: pollResponse } = await postJsonToApi({
383
384
  url: pollUrl,
384
- headers,
385
+ headers: combineHeaders(await resolve(this.config.headers), headers),
385
386
  body: { id: requestId },
386
387
  failedResponseHandler: createStatusCodeErrorResponseHandler(),
387
388
  successfulResponseHandler: createJsonResponseHandler(
@@ -11,6 +11,8 @@ import type {
11
11
  ProviderV4,
12
12
  } from '@ai-sdk/provider';
13
13
  import {
14
+ type Resolvable,
15
+ resolveWith,
14
16
  loadApiKey,
15
17
  mapReasoningToProviderEffort,
16
18
  withoutTrailingSlash,
@@ -50,8 +52,9 @@ export interface FireworksProviderSettings {
50
52
  /**
51
53
  * Fireworks API key. Default value is taken from the `FIREWORKS_API_KEY`
52
54
  * environment variable.
55
+ * A function is called before each request and may return a promise.
53
56
  */
54
- apiKey?: string;
57
+ apiKey?: Resolvable<string>;
55
58
  /**
56
59
  * Base URL for the API calls.
57
60
  */
@@ -116,22 +119,24 @@ export function createFireworks(
116
119
  ): FireworksProvider {
117
120
  const baseURL = withoutTrailingSlash(options.baseURL ?? defaultBaseURL);
118
121
  const getHeaders = () =>
119
- withUserAgentSuffix(
120
- {
121
- Authorization: `Bearer ${loadApiKey({
122
- apiKey: options.apiKey,
123
- environmentVariableName: 'FIREWORKS_API_KEY',
124
- description: 'Fireworks API key',
125
- })}`,
126
- ...options.headers,
127
- },
128
- `ai-sdk-fireworks/${VERSION}`,
122
+ resolveWith(options.apiKey, apiKey =>
123
+ withUserAgentSuffix(
124
+ {
125
+ Authorization: `Bearer ${loadApiKey({
126
+ apiKey,
127
+ environmentVariableName: 'FIREWORKS_API_KEY',
128
+ description: 'Fireworks API key',
129
+ })}`,
130
+ ...options.headers,
131
+ },
132
+ `ai-sdk-fireworks/${VERSION}`,
133
+ ),
129
134
  );
130
135
 
131
136
  interface CommonModelConfig {
132
137
  provider: string;
133
138
  url: ({ path }: { path: string }) => string;
134
- headers: () => Record<string, string>;
139
+ headers: Resolvable<Record<string, string>>;
135
140
  fetch?: FetchFunction;
136
141
  }
137
142