@ai-sdk/fireworks 3.0.83 → 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 +33 -0
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35 -20
- package/dist/index.js.map +1 -1
- package/docs/26-fireworks.mdx +7 -6
- package/package.json +4 -4
- package/src/fireworks-image-model.ts +10 -9
- package/src/fireworks-provider.ts +53 -33
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,38 @@
|
|
|
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
|
+
|
|
18
|
+
## 3.0.84
|
|
19
|
+
|
|
20
|
+
### Patch Changes
|
|
21
|
+
|
|
22
|
+
- 61a315e: fix: map the top-level `reasoning` option consistently across providers
|
|
23
|
+
|
|
24
|
+
Providers now resolve reasoning the same way:
|
|
25
|
+
|
|
26
|
+
1. A provider-specific reasoning setting in `providerOptions` is sent unchanged. OpenAI no longer drops `providerOptions.openai.reasoningEffort` values that are not in its list for the model, and Fireworks no longer rewrites `providerOptions.fireworks.reasoningEffort`. Fireworks also sends top-level `reasoning` values directly instead of rounding them to `'high'` at most, except for model families known to reject `'none'` (GPT-OSS, GLM-5.3, Muse Spark) or `'minimal'` (Nemotron, Inkling).
|
|
27
|
+
2. Otherwise, `reasoning` maps to the closest level the model supports, rounding down, and rounds up only when there is no lower level. For example, `'xhigh'` now maps to `'high'` instead of `'max'` on Anthropic and Bedrock models without `xhigh` effort, and `'medium'` maps to `'low'` instead of `'high'` on DeepSeek, Kimi K3, and Mistral GLM-5.3 models.
|
|
28
|
+
3. `'none'` on a model that cannot disable reasoning maps to the model's lowest level with a compatibility warning, instead of being dropped or sending a request the API rejects. This affects GPT-6 models without `'none'`, xAI grok-4.5 and later, Groq GPT-OSS, Kimi K3, Perplexity, QuiverAI, Bedrock OpenAI `gpt-oss` models, and Gemini 2.5 Pro (minimum thinking budget). Gemini 3 and Anthropic and Bedrock `between_tools` mappings now emit the compatibility warning too.
|
|
29
|
+
|
|
30
|
+
`mapReasoningToProviderEffort` now accepts any `reasoning` value, returns an optional `providerOptionsEffort` unchanged, and rounds levels that are missing from the effort map to the closest supported level. `mapReasoningToProviderBudget` maps `'none'` to the minimum reasoning budget, always returns a budget, and uses the default percentage for levels missing from `budgetPercentages`. `OpenAICompatibleChatConfig` adds an optional `mapReasoning` function for mapping the top-level `reasoning` option.
|
|
31
|
+
|
|
32
|
+
- Updated dependencies [61a315e]
|
|
33
|
+
- @ai-sdk/provider-utils@5.0.71
|
|
34
|
+
- @ai-sdk/openai-compatible@3.0.81
|
|
35
|
+
|
|
3
36
|
## 3.0.83
|
|
4
37
|
|
|
5
38
|
### 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?:
|
|
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
|
*/
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;;;
|
|
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, 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
|
|
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:
|
|
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.
|
|
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
|
|
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}`,
|
|
@@ -322,21 +321,19 @@ function createFireworks(options = {}) {
|
|
|
322
321
|
includeUsage: true,
|
|
323
322
|
errorStructure: fireworksErrorStructure,
|
|
324
323
|
supportsStructuredOutputs: true,
|
|
325
|
-
|
|
324
|
+
mapReasoning: ({ reasoning, warnings }) => mapReasoningToProviderEffort({
|
|
325
|
+
reasoning,
|
|
326
|
+
effortMap: getFireworksReasoningEffortMap(modelId),
|
|
327
|
+
warnings
|
|
328
|
+
}),
|
|
329
|
+
transformRequestBody: (args) => {
|
|
326
330
|
const thinking = args.thinking;
|
|
327
331
|
const reasoningHistory = args.reasoningHistory;
|
|
328
332
|
const promptCacheKey = args.promptCacheKey;
|
|
329
333
|
const serviceTier = args.serviceTier;
|
|
330
|
-
const { thinking: _, reasoningHistory: __, promptCacheKey: ___, serviceTier: ____,
|
|
331
|
-
const mappedReasoningEffort = reasoning_effort === "minimal" ? "low" : reasoning_effort === "xhigh" || reasoning_effort === "max" ? "high" : reasoning_effort;
|
|
332
|
-
if (mappedReasoningEffort !== reasoning_effort) warnings?.push({
|
|
333
|
-
type: "compatibility",
|
|
334
|
-
feature: "reasoning",
|
|
335
|
-
details: `reasoning "${reasoning_effort}" is not directly supported by this model. mapped to effort "${mappedReasoningEffort}".`
|
|
336
|
-
});
|
|
334
|
+
const { thinking: _, reasoningHistory: __, promptCacheKey: ___, serviceTier: ____, ...rest } = args;
|
|
337
335
|
return {
|
|
338
336
|
...rest,
|
|
339
|
-
...reasoning_effort != null && { reasoning_effort: mappedReasoningEffort },
|
|
340
337
|
...promptCacheKey !== void 0 && { prompt_cache_key: promptCacheKey },
|
|
341
338
|
...serviceTier !== void 0 && { service_tier: serviceTier },
|
|
342
339
|
...thinking && { thinking: {
|
|
@@ -373,6 +370,24 @@ function createFireworks(options = {}) {
|
|
|
373
370
|
return provider;
|
|
374
371
|
}
|
|
375
372
|
const fireworks = createFireworks();
|
|
373
|
+
const modelsWithoutNoneReasoningEffort = /^(?:gpt-oss|glm-5p3|muse-spark)/;
|
|
374
|
+
const modelsWithoutMinimalReasoningEffort = /^(?:nemotron|inkling)/;
|
|
375
|
+
/**
|
|
376
|
+
* Fireworks accepts every reasoning effort for most models, so reasoning
|
|
377
|
+
* values are sent directly, except to model families known to reject them.
|
|
378
|
+
*/
|
|
379
|
+
function getFireworksReasoningEffortMap(modelId) {
|
|
380
|
+
const modelName = modelId.slice(modelId.lastIndexOf("/") + 1);
|
|
381
|
+
return {
|
|
382
|
+
...!modelsWithoutNoneReasoningEffort.test(modelName) && { none: "none" },
|
|
383
|
+
...!modelsWithoutMinimalReasoningEffort.test(modelName) && { minimal: "minimal" },
|
|
384
|
+
low: "low",
|
|
385
|
+
medium: "medium",
|
|
386
|
+
high: "high",
|
|
387
|
+
xhigh: "xhigh",
|
|
388
|
+
max: "max"
|
|
389
|
+
};
|
|
390
|
+
}
|
|
376
391
|
//#endregion
|
|
377
392
|
export { FireworksImageModel, VERSION, createFireworks, fireworks };
|
|
378
393
|
|
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 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 transformRequestBody: (args, warnings) => {\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 reasoning_effort,\n ...rest\n } = args;\n\n // Fireworks supports low, medium, and high reasoning levels.\n const mappedReasoningEffort =\n reasoning_effort === 'minimal'\n ? 'low'\n : reasoning_effort === 'xhigh' || reasoning_effort === 'max'\n ? 'high'\n : reasoning_effort;\n\n if (mappedReasoningEffort !== reasoning_effort) {\n warnings?.push({\n type: 'compatibility',\n feature: 'reasoning',\n details: `reasoning \"${reasoning_effort}\" is not directly supported by this model. mapped to effort \"${mappedReasoningEffort}\".`,\n });\n }\n\n return {\n ...rest,\n ...(reasoning_effort != null && {\n reasoning_effort: mappedReasoningEffort,\n }),\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"],"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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"}
|
package/docs/26-fireworks.mdx
CHANGED
|
@@ -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**
|
|
89
|
+
- **apiKey** _string | PromiseLike<string> | (() => string | PromiseLike<string>)_
|
|
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<string,string>_
|
|
95
98
|
|
|
96
99
|
Custom headers to include in the requests.
|
|
@@ -111,11 +114,9 @@ const model = fireworks('accounts/fireworks/models/firefunction-v1');
|
|
|
111
114
|
### Reasoning Models
|
|
112
115
|
|
|
113
116
|
For models that support reasoning effort, use the top-level `reasoning` parameter.
|
|
114
|
-
Fireworks
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
`providerOptions.fireworks.reasoningEffort` takes precedence over the top-level
|
|
118
|
-
setting.
|
|
117
|
+
Most Fireworks models accept every reasoning effort from `'none'` to `'max'`.
|
|
118
|
+
GPT-OSS, GLM-5.3 and Muse Spark models cannot disable reasoning, and Nemotron
|
|
119
|
+
and Inkling models do not support `'minimal'`.
|
|
119
120
|
|
|
120
121
|
Fireworks exposes the thinking of `deepseek-r1` in the generated text using the `<think>` tag.
|
|
121
122
|
You can use the `extractReasoningMiddleware` to extract this reasoning and expose it as a `reasoning` property on the result:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/fireworks",
|
|
3
|
-
"version": "3.0.
|
|
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.
|
|
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",
|
|
@@ -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?:
|
|
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
|
|
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:
|
|
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,7 +11,10 @@ import type {
|
|
|
11
11
|
ProviderV4,
|
|
12
12
|
} from '@ai-sdk/provider';
|
|
13
13
|
import {
|
|
14
|
+
type Resolvable,
|
|
15
|
+
resolveWith,
|
|
14
16
|
loadApiKey,
|
|
17
|
+
mapReasoningToProviderEffort,
|
|
15
18
|
withoutTrailingSlash,
|
|
16
19
|
withUserAgentSuffix,
|
|
17
20
|
type FetchFunction,
|
|
@@ -49,8 +52,9 @@ export interface FireworksProviderSettings {
|
|
|
49
52
|
/**
|
|
50
53
|
* Fireworks API key. Default value is taken from the `FIREWORKS_API_KEY`
|
|
51
54
|
* environment variable.
|
|
55
|
+
* A function is called before each request and may return a promise.
|
|
52
56
|
*/
|
|
53
|
-
apiKey?: string
|
|
57
|
+
apiKey?: Resolvable<string>;
|
|
54
58
|
/**
|
|
55
59
|
* Base URL for the API calls.
|
|
56
60
|
*/
|
|
@@ -115,22 +119,24 @@ export function createFireworks(
|
|
|
115
119
|
): FireworksProvider {
|
|
116
120
|
const baseURL = withoutTrailingSlash(options.baseURL ?? defaultBaseURL);
|
|
117
121
|
const getHeaders = () =>
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
+
),
|
|
128
134
|
);
|
|
129
135
|
|
|
130
136
|
interface CommonModelConfig {
|
|
131
137
|
provider: string;
|
|
132
138
|
url: ({ path }: { path: string }) => string;
|
|
133
|
-
headers:
|
|
139
|
+
headers: Resolvable<Record<string, string>>;
|
|
134
140
|
fetch?: FetchFunction;
|
|
135
141
|
}
|
|
136
142
|
|
|
@@ -147,7 +153,13 @@ export function createFireworks(
|
|
|
147
153
|
includeUsage: true,
|
|
148
154
|
errorStructure: fireworksErrorStructure,
|
|
149
155
|
supportsStructuredOutputs: true,
|
|
150
|
-
|
|
156
|
+
mapReasoning: ({ reasoning, warnings }) =>
|
|
157
|
+
mapReasoningToProviderEffort({
|
|
158
|
+
reasoning,
|
|
159
|
+
effortMap: getFireworksReasoningEffortMap(modelId),
|
|
160
|
+
warnings,
|
|
161
|
+
}),
|
|
162
|
+
transformRequestBody: args => {
|
|
151
163
|
const thinking = args.thinking as
|
|
152
164
|
| { type?: string; budgetTokens?: number }
|
|
153
165
|
| undefined;
|
|
@@ -160,31 +172,11 @@ export function createFireworks(
|
|
|
160
172
|
reasoningHistory: __,
|
|
161
173
|
promptCacheKey: ___,
|
|
162
174
|
serviceTier: ____,
|
|
163
|
-
reasoning_effort,
|
|
164
175
|
...rest
|
|
165
176
|
} = args;
|
|
166
177
|
|
|
167
|
-
// Fireworks supports low, medium, and high reasoning levels.
|
|
168
|
-
const mappedReasoningEffort =
|
|
169
|
-
reasoning_effort === 'minimal'
|
|
170
|
-
? 'low'
|
|
171
|
-
: reasoning_effort === 'xhigh' || reasoning_effort === 'max'
|
|
172
|
-
? 'high'
|
|
173
|
-
: reasoning_effort;
|
|
174
|
-
|
|
175
|
-
if (mappedReasoningEffort !== reasoning_effort) {
|
|
176
|
-
warnings?.push({
|
|
177
|
-
type: 'compatibility',
|
|
178
|
-
feature: 'reasoning',
|
|
179
|
-
details: `reasoning "${reasoning_effort}" is not directly supported by this model. mapped to effort "${mappedReasoningEffort}".`,
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
|
|
183
178
|
return {
|
|
184
179
|
...rest,
|
|
185
|
-
...(reasoning_effort != null && {
|
|
186
|
-
reasoning_effort: mappedReasoningEffort,
|
|
187
|
-
}),
|
|
188
180
|
...(promptCacheKey !== undefined && {
|
|
189
181
|
prompt_cache_key: promptCacheKey,
|
|
190
182
|
}),
|
|
@@ -240,3 +232,31 @@ export function createFireworks(
|
|
|
240
232
|
}
|
|
241
233
|
|
|
242
234
|
export const fireworks = createFireworks();
|
|
235
|
+
|
|
236
|
+
// Model families that always reason and reject reasoning effort 'none'.
|
|
237
|
+
const modelsWithoutNoneReasoningEffort = /^(?:gpt-oss|glm-5p3|muse-spark)/;
|
|
238
|
+
|
|
239
|
+
// Model families that reject reasoning effort 'minimal'.
|
|
240
|
+
const modelsWithoutMinimalReasoningEffort = /^(?:nemotron|inkling)/;
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Fireworks accepts every reasoning effort for most models, so reasoning
|
|
244
|
+
* values are sent directly, except to model families known to reject them.
|
|
245
|
+
*/
|
|
246
|
+
function getFireworksReasoningEffortMap(modelId: string) {
|
|
247
|
+
const modelName = modelId.slice(modelId.lastIndexOf('/') + 1);
|
|
248
|
+
|
|
249
|
+
return {
|
|
250
|
+
...(!modelsWithoutNoneReasoningEffort.test(modelName) && {
|
|
251
|
+
none: 'none' as const,
|
|
252
|
+
}),
|
|
253
|
+
...(!modelsWithoutMinimalReasoningEffort.test(modelName) && {
|
|
254
|
+
minimal: 'minimal' as const,
|
|
255
|
+
}),
|
|
256
|
+
low: 'low' as const,
|
|
257
|
+
medium: 'medium' as const,
|
|
258
|
+
high: 'high' as const,
|
|
259
|
+
xhigh: 'xhigh' as const,
|
|
260
|
+
max: 'max' as const,
|
|
261
|
+
};
|
|
262
|
+
}
|