@ai-sdk/fireworks 3.0.0-canary.56 → 3.0.0
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 +70 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/docs/26-fireworks.mdx +94 -3
- package/package.json +5 -5
- package/src/fireworks-chat-options.ts +7 -1
- package/src/fireworks-provider.ts +7 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,75 @@
|
|
|
1
1
|
# @ai-sdk/fireworks
|
|
2
2
|
|
|
3
|
+
## 3.0.0
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- ef992f8: Remove CommonJS exports from all packages. All packages are now ESM-only (`"type": "module"`). Consumers using `require()` must switch to ESM `import` syntax.
|
|
8
|
+
- 8359612: Start v7 pre-release
|
|
9
|
+
|
|
10
|
+
### Patch Changes
|
|
11
|
+
|
|
12
|
+
- 38fc777: Add AI Gateway hint to provider READMEs
|
|
13
|
+
- 74d520f: feat: migrate providers to support new top-level `reasoning` parameter
|
|
14
|
+
- 38010a1: Enable `includeUsage` for Fireworks so streaming responses report token usage
|
|
15
|
+
- 7cf47d8: Add the `promptCacheKey` provider option for Fireworks prompt cache affinity
|
|
16
|
+
and Kimi K2.6 model autocomplete, and remove the deprecated Kimi K2.5
|
|
17
|
+
serverless model from autocomplete.
|
|
18
|
+
- 9f0e36c: trigger release for all packages after provenance setup
|
|
19
|
+
- 8f3e1da: chore(openai-compat): update v3 specs to v4
|
|
20
|
+
- aeda373: fix: only send provider credentials to same-origin response-supplied URLs
|
|
21
|
+
|
|
22
|
+
Several provider clients followed a URL taken from the provider's API response (a polling/status URL or a final media URL such as `polling_url`, `urls.get`, `result_url`, `result.sample`, or `video.uri`) and reused the authenticated headers — or appended `?key=<API_KEY>` — on that request. Because the host of the response-supplied URL was never validated, the long-lived API key was sent to whatever host the response named (a CDN in the benign case, or an attacker-chosen host if the provider response was tampered with), allowing credential exfiltration.
|
|
23
|
+
|
|
24
|
+
A new `isSameOrigin` helper is added to `@ai-sdk/provider-utils`, and the affected fetches in `@ai-sdk/black-forest-labs`, `@ai-sdk/fireworks`, `@ai-sdk/replicate`, `@ai-sdk/gladia`, `@ai-sdk/fal`, and `@ai-sdk/google` now attach credentials only when the followed URL is same-origin with the provider's configured API origin. Requests to a foreign origin are made without the credential.
|
|
25
|
+
|
|
26
|
+
- 7fc6bd6: Raise minimum supported Node.js version to 22. Supported versions: 22, 24, and 26.
|
|
27
|
+
- 0c4c275: trigger initial canary release
|
|
28
|
+
- 258c093: chore: ensure consistent import handling and avoid import duplicates or cycles
|
|
29
|
+
- b8396f0: trigger initial beta release
|
|
30
|
+
- 90e2d8a: chore: fix unused vars not being flagged by our lint tooling
|
|
31
|
+
- b3976a2: Add workflow serialization support to all provider models.
|
|
32
|
+
|
|
33
|
+
**`@ai-sdk/provider-utils`:** New `serializeModel()` helper that extracts only serializable properties from a model instance, filtering out functions and objects containing functions. Third-party provider authors can use this to add workflow support to their own models.
|
|
34
|
+
|
|
35
|
+
**All providers:** `headers` is now optional in provider config types. This is non-breaking — existing code that passes `headers` continues to work. Custom provider implementations that construct model configs manually can now omit `headers`, which is useful when models are deserialized from a workflow step boundary where auth is provided separately.
|
|
36
|
+
|
|
37
|
+
All provider model classes now include `WORKFLOW_SERIALIZE` and `WORKFLOW_DESERIALIZE` static methods, enabling them to cross workflow step boundaries without serialization errors.
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
## 3.0.0-beta.60
|
|
41
|
+
|
|
42
|
+
### Patch Changes
|
|
43
|
+
|
|
44
|
+
- 7cf47d8: Add the `promptCacheKey` provider option for Fireworks prompt cache affinity
|
|
45
|
+
and Kimi K2.6 model autocomplete, and remove the deprecated Kimi K2.5
|
|
46
|
+
serverless model from autocomplete.
|
|
47
|
+
|
|
48
|
+
## 3.0.0-beta.59
|
|
49
|
+
|
|
50
|
+
### Patch Changes
|
|
51
|
+
|
|
52
|
+
- Updated dependencies [0416e3e]
|
|
53
|
+
- @ai-sdk/provider@4.0.0-beta.20
|
|
54
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.58
|
|
55
|
+
- @ai-sdk/provider-utils@5.0.0-beta.50
|
|
56
|
+
|
|
57
|
+
## 3.0.0-beta.58
|
|
58
|
+
|
|
59
|
+
### Patch Changes
|
|
60
|
+
|
|
61
|
+
- b8396f0: trigger initial beta release
|
|
62
|
+
- Updated dependencies [b8396f0]
|
|
63
|
+
- @ai-sdk/openai-compatible@3.0.0-beta.57
|
|
64
|
+
- @ai-sdk/provider-utils@5.0.0-beta.49
|
|
65
|
+
- @ai-sdk/provider@4.0.0-beta.19
|
|
66
|
+
|
|
67
|
+
## 3.0.0-canary.57
|
|
68
|
+
|
|
69
|
+
### Patch Changes
|
|
70
|
+
|
|
71
|
+
- 38010a1: Enable `includeUsage` for Fireworks so streaming responses report token usage
|
|
72
|
+
|
|
3
73
|
## 3.0.0-canary.56
|
|
4
74
|
|
|
5
75
|
### Patch Changes
|
package/dist/index.d.ts
CHANGED
|
@@ -3,8 +3,9 @@ import * as _ai_sdk_provider from '@ai-sdk/provider';
|
|
|
3
3
|
import { ImageModelV4, ProviderV4, LanguageModelV4, EmbeddingModelV4 } from '@ai-sdk/provider';
|
|
4
4
|
import { WORKFLOW_SERIALIZE, WORKFLOW_DESERIALIZE, FetchFunction } from '@ai-sdk/provider-utils';
|
|
5
5
|
|
|
6
|
-
type FireworksChatModelId = 'accounts/fireworks/models/deepseek-v3' | 'accounts/fireworks/models/llama-v3p3-70b-instruct' | 'accounts/fireworks/models/llama-v3p2-3b-instruct' | 'accounts/fireworks/models/llama-v3p1-405b-instruct' | 'accounts/fireworks/models/llama-v3p1-8b-instruct' | 'accounts/fireworks/models/mixtral-8x7b-instruct' | 'accounts/fireworks/models/mixtral-8x22b-instruct' | 'accounts/fireworks/models/mixtral-8x7b-instruct-hf' | 'accounts/fireworks/models/qwen2p5-coder-32b-instruct' | 'accounts/fireworks/models/qwen2p5-72b-instruct' | 'accounts/fireworks/models/qwen-qwq-32b-preview' | 'accounts/fireworks/models/qwen2-vl-72b-instruct' | 'accounts/fireworks/models/llama-v3p2-11b-vision-instruct' | 'accounts/fireworks/models/qwq-32b' | 'accounts/fireworks/models/yi-large' | 'accounts/fireworks/models/kimi-k2-instruct' | 'accounts/fireworks/models/kimi-k2-thinking' | 'accounts/fireworks/models/kimi-
|
|
6
|
+
type FireworksChatModelId = 'accounts/fireworks/models/deepseek-v3' | 'accounts/fireworks/models/llama-v3p3-70b-instruct' | 'accounts/fireworks/models/llama-v3p2-3b-instruct' | 'accounts/fireworks/models/llama-v3p1-405b-instruct' | 'accounts/fireworks/models/llama-v3p1-8b-instruct' | 'accounts/fireworks/models/mixtral-8x7b-instruct' | 'accounts/fireworks/models/mixtral-8x22b-instruct' | 'accounts/fireworks/models/mixtral-8x7b-instruct-hf' | 'accounts/fireworks/models/qwen2p5-coder-32b-instruct' | 'accounts/fireworks/models/qwen2p5-72b-instruct' | 'accounts/fireworks/models/qwen-qwq-32b-preview' | 'accounts/fireworks/models/qwen2-vl-72b-instruct' | 'accounts/fireworks/models/llama-v3p2-11b-vision-instruct' | 'accounts/fireworks/models/qwq-32b' | 'accounts/fireworks/models/yi-large' | 'accounts/fireworks/models/kimi-k2-instruct' | 'accounts/fireworks/models/kimi-k2-thinking' | 'accounts/fireworks/models/kimi-k2p6' | 'accounts/fireworks/models/minimax-m2' | (string & {});
|
|
7
7
|
declare const fireworksLanguageModelOptions: z.ZodObject<{
|
|
8
|
+
promptCacheKey: z.ZodOptional<z.ZodString>;
|
|
8
9
|
thinking: z.ZodOptional<z.ZodObject<{
|
|
9
10
|
type: z.ZodOptional<z.ZodEnum<{
|
|
10
11
|
enabled: "enabled";
|
package/dist/index.js
CHANGED
|
@@ -306,7 +306,7 @@ import {
|
|
|
306
306
|
import { z as z2 } from "zod/v4";
|
|
307
307
|
|
|
308
308
|
// src/version.ts
|
|
309
|
-
var VERSION = true ? "3.0.0
|
|
309
|
+
var VERSION = true ? "3.0.0" : "0.0.0-test";
|
|
310
310
|
|
|
311
311
|
// src/fireworks-provider.ts
|
|
312
312
|
var fireworksErrorSchema = z2.object({
|
|
@@ -340,13 +340,16 @@ function createFireworks(options = {}) {
|
|
|
340
340
|
const createChatModel = (modelId) => {
|
|
341
341
|
return new OpenAICompatibleChatLanguageModel(modelId, {
|
|
342
342
|
...getCommonModelConfig("chat"),
|
|
343
|
+
includeUsage: true,
|
|
343
344
|
errorStructure: fireworksErrorStructure,
|
|
344
345
|
transformRequestBody: (args) => {
|
|
345
346
|
const thinking = args.thinking;
|
|
346
347
|
const reasoningHistory = args.reasoningHistory;
|
|
348
|
+
const promptCacheKey = args.promptCacheKey;
|
|
347
349
|
const {
|
|
348
350
|
thinking: _,
|
|
349
351
|
reasoningHistory: __,
|
|
352
|
+
promptCacheKey: ___,
|
|
350
353
|
reasoning_effort,
|
|
351
354
|
...rest
|
|
352
355
|
} = args;
|
|
@@ -356,6 +359,9 @@ function createFireworks(options = {}) {
|
|
|
356
359
|
// Workaround since OpenAI spec allows for 5 reasoning levels, but Fireworks only supports 3 of them.
|
|
357
360
|
reasoning_effort: reasoning_effort === "minimal" ? "low" : reasoning_effort === "xhigh" ? "high" : reasoning_effort
|
|
358
361
|
},
|
|
362
|
+
...promptCacheKey !== void 0 && {
|
|
363
|
+
prompt_cache_key: promptCacheKey
|
|
364
|
+
},
|
|
359
365
|
...thinking && {
|
|
360
366
|
thinking: {
|
|
361
367
|
type: thinking.type,
|
|
@@ -373,6 +379,7 @@ function createFireworks(options = {}) {
|
|
|
373
379
|
};
|
|
374
380
|
const createCompletionModel = (modelId) => new OpenAICompatibleCompletionLanguageModel(modelId, {
|
|
375
381
|
...getCommonModelConfig("completion"),
|
|
382
|
+
includeUsage: true,
|
|
376
383
|
errorStructure: fireworksErrorStructure
|
|
377
384
|
});
|
|
378
385
|
const createEmbeddingModel = (modelId) => new OpenAICompatibleEmbeddingModel(modelId, {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/fireworks-image-model.ts","../src/fireworks-image-api.ts","../src/fireworks-provider.ts","../src/version.ts"],"sourcesContent":["import type { ImageModelV4, SharedV4Warning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertImageModelFileToDataUri,\n createBinaryResponseHandler,\n createJsonResponseHandler,\n createStatusCodeErrorResponseHandler,\n delay,\n getFromApi,\n isSameOrigin,\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 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 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\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 ...(providerOptions.fireworks ?? {}),\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 headers: isSameOrigin(imageUrl, this.config.baseURL)\n ? headers\n : undefined,\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 const maxPollAttempts = Math.ceil(\n pollTimeoutMillis / Math.max(1, pollIntervalMillis),\n );\n\n const pollUrl = getPollUrlForModel(this.config.baseURL, this.modelId);\n\n for (let i = 0; i < maxPollAttempts; i++) {\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,\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 }\n\n throw new Error(\n `Fireworks image generation timed out after ${pollTimeoutMillis}ms`,\n );\n }\n}\n","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 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.string(),\n});\n\nconst fireworksErrorStructure: ProviderErrorStructure<FireworksErrorData> = {\n errorSchema: fireworksErrorSchema,\n errorToMessage: data => data.error,\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 errorStructure: fireworksErrorStructure,\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\n const {\n thinking: _,\n reasoningHistory: __,\n reasoning_effort,\n ...rest\n } = args;\n\n return {\n ...rest,\n ...(reasoning_effort != null && {\n // Workaround since OpenAI spec allows for 5 reasoning levels, but Fireworks only supports 3 of them.\n reasoning_effort:\n reasoning_effort === 'minimal'\n ? 'low'\n : reasoning_effort === 'xhigh'\n ? 'high'\n : reasoning_effort,\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 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","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["z","z"]}
|
|
1
|
+
{"version":3,"sources":["../src/fireworks-image-model.ts","../src/fireworks-image-api.ts","../src/fireworks-provider.ts","../src/version.ts"],"sourcesContent":["import type { ImageModelV4, SharedV4Warning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertImageModelFileToDataUri,\n createBinaryResponseHandler,\n createJsonResponseHandler,\n createStatusCodeErrorResponseHandler,\n delay,\n getFromApi,\n isSameOrigin,\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 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 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\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 ...(providerOptions.fireworks ?? {}),\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 headers: isSameOrigin(imageUrl, this.config.baseURL)\n ? headers\n : undefined,\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 const maxPollAttempts = Math.ceil(\n pollTimeoutMillis / Math.max(1, pollIntervalMillis),\n );\n\n const pollUrl = getPollUrlForModel(this.config.baseURL, this.modelId);\n\n for (let i = 0; i < maxPollAttempts; i++) {\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,\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 }\n\n throw new Error(\n `Fireworks image generation timed out after ${pollTimeoutMillis}ms`,\n );\n }\n}\n","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 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.string(),\n});\n\nconst fireworksErrorStructure: ProviderErrorStructure<FireworksErrorData> = {\n errorSchema: fireworksErrorSchema,\n errorToMessage: data => data.error,\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 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\n const {\n thinking: _,\n reasoningHistory: __,\n promptCacheKey: ___,\n reasoning_effort,\n ...rest\n } = args;\n\n return {\n ...rest,\n ...(reasoning_effort != null && {\n // Workaround since OpenAI spec allows for 5 reasoning levels, but Fireworks only supports 3 of them.\n reasoning_effort:\n reasoning_effort === 'minimal'\n ? 'low'\n : reasoning_effort === 'xhigh'\n ? 'high'\n : reasoning_effort,\n }),\n ...(promptCacheKey !== undefined && {\n prompt_cache_key: promptCacheKey,\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","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["z","z"]}
|
package/docs/26-fireworks.mdx
CHANGED
|
@@ -122,7 +122,7 @@ import {
|
|
|
122
122
|
import { generateText } from 'ai';
|
|
123
123
|
|
|
124
124
|
const { text, reasoningText } = await generateText({
|
|
125
|
-
model: fireworks('accounts/fireworks/models/kimi-
|
|
125
|
+
model: fireworks('accounts/fireworks/models/kimi-k2p6'),
|
|
126
126
|
providerOptions: {
|
|
127
127
|
fireworks: {
|
|
128
128
|
thinking: { type: 'enabled', budgetTokens: 4096 },
|
|
@@ -135,9 +135,16 @@ const { text, reasoningText } = await generateText({
|
|
|
135
135
|
|
|
136
136
|
The following optional provider options are available for Fireworks chat models:
|
|
137
137
|
|
|
138
|
+
- **promptCacheKey** _string_
|
|
139
|
+
|
|
140
|
+
A stable, opaque key that improves prompt cache hit rates by routing requests
|
|
141
|
+
with shared prompt prefixes to the same Fireworks replica. Reuse the same key
|
|
142
|
+
for all steps and calls in one conversation, and use different keys for
|
|
143
|
+
unrelated conversations.
|
|
144
|
+
|
|
138
145
|
- **thinking** _object_
|
|
139
146
|
|
|
140
|
-
Configuration for thinking/reasoning models like Kimi K2.
|
|
147
|
+
Configuration for thinking/reasoning models like Kimi K2.6.
|
|
141
148
|
- **type** _'enabled' | 'disabled'_
|
|
142
149
|
|
|
143
150
|
Whether to enable thinking mode.
|
|
@@ -153,6 +160,90 @@ The following optional provider options are available for Fireworks chat models:
|
|
|
153
160
|
- `'interleaved'`: Include reasoning between tool calls within a single turn
|
|
154
161
|
- `'preserved'`: Keep all reasoning in history
|
|
155
162
|
|
|
163
|
+
### Prompt Cache Affinity
|
|
164
|
+
|
|
165
|
+
[Fireworks prompt caching](https://docs.fireworks.ai/guides/prompt-caching)
|
|
166
|
+
is automatic, but cached prefixes are local to a replica. Set
|
|
167
|
+
`promptCacheKey` to an opaque session or conversation identifier to improve
|
|
168
|
+
cache affinity. The provider sends it as Fireworks'
|
|
169
|
+
[`prompt_cache_key`](https://docs.fireworks.ai/api-reference/post-chatcompletions)
|
|
170
|
+
request field.
|
|
171
|
+
|
|
172
|
+
The AI SDK reuses the same provider options for every model step in a
|
|
173
|
+
multi-step `generateText` or `streamText` call, so one key covers the complete
|
|
174
|
+
tool loop:
|
|
175
|
+
|
|
176
|
+
```ts
|
|
177
|
+
import {
|
|
178
|
+
fireworks,
|
|
179
|
+
type FireworksLanguageModelOptions,
|
|
180
|
+
} from '@ai-sdk/fireworks';
|
|
181
|
+
import { generateText, isStepCount, tool } from 'ai';
|
|
182
|
+
import { z } from 'zod';
|
|
183
|
+
|
|
184
|
+
const sessionId = 'conversation-123';
|
|
185
|
+
|
|
186
|
+
const result = await generateText({
|
|
187
|
+
model: fireworks('accounts/fireworks/models/kimi-k2p6'),
|
|
188
|
+
providerOptions: {
|
|
189
|
+
fireworks: {
|
|
190
|
+
promptCacheKey: sessionId,
|
|
191
|
+
} satisfies FireworksLanguageModelOptions,
|
|
192
|
+
},
|
|
193
|
+
tools: {
|
|
194
|
+
weather: tool({
|
|
195
|
+
description: 'Get the weather for a city.',
|
|
196
|
+
inputSchema: z.object({ city: z.string() }),
|
|
197
|
+
execute: async ({ city }) => `It is sunny in ${city}.`,
|
|
198
|
+
}),
|
|
199
|
+
},
|
|
200
|
+
stopWhen: isStepCount(5),
|
|
201
|
+
prompt: 'What is the weather in San Francisco?',
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
console.log(result.usage.inputTokenDetails.cacheReadTokens);
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
For a reusable `ToolLoopAgent`, use call options to supply a key for each
|
|
208
|
+
conversation. Pass the same key again for later agent calls that continue that
|
|
209
|
+
conversation:
|
|
210
|
+
|
|
211
|
+
```ts
|
|
212
|
+
import {
|
|
213
|
+
fireworks,
|
|
214
|
+
type FireworksLanguageModelOptions,
|
|
215
|
+
} from '@ai-sdk/fireworks';
|
|
216
|
+
import { ToolLoopAgent } from 'ai';
|
|
217
|
+
import { z } from 'zod';
|
|
218
|
+
import { weatherTool } from './weather-tool';
|
|
219
|
+
|
|
220
|
+
const agent = new ToolLoopAgent({
|
|
221
|
+
model: fireworks('accounts/fireworks/models/kimi-k2p6'),
|
|
222
|
+
callOptionsSchema: z.object({
|
|
223
|
+
sessionId: z.string(),
|
|
224
|
+
}),
|
|
225
|
+
prepareCall: ({ options, ...settings }) => ({
|
|
226
|
+
...settings,
|
|
227
|
+
providerOptions: {
|
|
228
|
+
fireworks: {
|
|
229
|
+
promptCacheKey: options.sessionId,
|
|
230
|
+
} satisfies FireworksLanguageModelOptions,
|
|
231
|
+
},
|
|
232
|
+
}),
|
|
233
|
+
tools: { weather: weatherTool },
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
const result = await agent.generate({
|
|
237
|
+
prompt: 'What is the weather in San Francisco?',
|
|
238
|
+
options: {
|
|
239
|
+
sessionId: 'conversation-123',
|
|
240
|
+
},
|
|
241
|
+
});
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
Use non-identifying values for cache keys rather than email addresses or other
|
|
245
|
+
personal information.
|
|
246
|
+
|
|
156
247
|
### Completion Models
|
|
157
248
|
|
|
158
249
|
You can create models that call the Fireworks completions API using the `.completionModel()` factory method:
|
|
@@ -186,7 +277,7 @@ const model = fireworks.completionModel(
|
|
|
186
277
|
| `accounts/fireworks/models/yi-large` | <Cross size={18} /> | <Check size={18} /> | <Check size={18} /> | <Cross size={18} /> |
|
|
187
278
|
| `accounts/fireworks/models/kimi-k2-instruct` | <Cross size={18} /> | <Check size={18} /> | <Check size={18} /> | <Cross size={18} /> |
|
|
188
279
|
| `accounts/fireworks/models/kimi-k2-thinking` | <Cross size={18} /> | <Check size={18} /> | <Check size={18} /> | <Cross size={18} /> |
|
|
189
|
-
| `accounts/fireworks/models/kimi-
|
|
280
|
+
| `accounts/fireworks/models/kimi-k2p6` | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> | <Cross size={18} /> |
|
|
190
281
|
| `accounts/fireworks/models/minimax-m2` | <Cross size={18} /> | <Check size={18} /> | <Check size={18} /> | <Cross size={18} /> |
|
|
191
282
|
|
|
192
283
|
<Note>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/fireworks",
|
|
3
|
-
"version": "3.0.0
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -29,16 +29,16 @@
|
|
|
29
29
|
}
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@ai-sdk/openai-compatible": "3.0.0
|
|
33
|
-
"@ai-sdk/provider": "4.0.0
|
|
34
|
-
"@ai-sdk/provider-utils": "5.0.0
|
|
32
|
+
"@ai-sdk/openai-compatible": "3.0.0",
|
|
33
|
+
"@ai-sdk/provider": "4.0.0",
|
|
34
|
+
"@ai-sdk/provider-utils": "5.0.0"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@types/node": "22.19.19",
|
|
38
38
|
"tsup": "^8.5.1",
|
|
39
39
|
"typescript": "5.8.3",
|
|
40
40
|
"zod": "3.25.76",
|
|
41
|
-
"@ai-sdk/test-server": "2.0.0
|
|
41
|
+
"@ai-sdk/test-server": "2.0.0",
|
|
42
42
|
"@vercel/ai-tsconfig": "0.0.0"
|
|
43
43
|
},
|
|
44
44
|
"peerDependencies": {
|
|
@@ -20,11 +20,17 @@ export type FireworksChatModelId =
|
|
|
20
20
|
| 'accounts/fireworks/models/yi-large'
|
|
21
21
|
| 'accounts/fireworks/models/kimi-k2-instruct'
|
|
22
22
|
| 'accounts/fireworks/models/kimi-k2-thinking'
|
|
23
|
-
| 'accounts/fireworks/models/kimi-
|
|
23
|
+
| 'accounts/fireworks/models/kimi-k2p6'
|
|
24
24
|
| 'accounts/fireworks/models/minimax-m2'
|
|
25
25
|
| (string & {});
|
|
26
26
|
|
|
27
27
|
export const fireworksLanguageModelOptions = z.object({
|
|
28
|
+
/**
|
|
29
|
+
* A stable key for routing requests with shared prompt prefixes to the same
|
|
30
|
+
* prompt cache.
|
|
31
|
+
*/
|
|
32
|
+
promptCacheKey: z.string().optional(),
|
|
33
|
+
|
|
28
34
|
thinking: z
|
|
29
35
|
.object({
|
|
30
36
|
type: z.enum(['enabled', 'disabled']).optional(),
|
|
@@ -134,16 +134,19 @@ export function createFireworks(
|
|
|
134
134
|
const createChatModel = (modelId: FireworksChatModelId) => {
|
|
135
135
|
return new OpenAICompatibleChatLanguageModel(modelId, {
|
|
136
136
|
...getCommonModelConfig('chat'),
|
|
137
|
+
includeUsage: true,
|
|
137
138
|
errorStructure: fireworksErrorStructure,
|
|
138
139
|
transformRequestBody: args => {
|
|
139
140
|
const thinking = args.thinking as
|
|
140
141
|
| { type?: string; budgetTokens?: number }
|
|
141
142
|
| undefined;
|
|
142
143
|
const reasoningHistory = args.reasoningHistory as string | undefined;
|
|
144
|
+
const promptCacheKey = args.promptCacheKey as string | undefined;
|
|
143
145
|
|
|
144
146
|
const {
|
|
145
147
|
thinking: _,
|
|
146
148
|
reasoningHistory: __,
|
|
149
|
+
promptCacheKey: ___,
|
|
147
150
|
reasoning_effort,
|
|
148
151
|
...rest
|
|
149
152
|
} = args;
|
|
@@ -159,6 +162,9 @@ export function createFireworks(
|
|
|
159
162
|
? 'high'
|
|
160
163
|
: reasoning_effort,
|
|
161
164
|
}),
|
|
165
|
+
...(promptCacheKey !== undefined && {
|
|
166
|
+
prompt_cache_key: promptCacheKey,
|
|
167
|
+
}),
|
|
162
168
|
...(thinking && {
|
|
163
169
|
thinking: {
|
|
164
170
|
type: thinking.type,
|
|
@@ -178,6 +184,7 @@ export function createFireworks(
|
|
|
178
184
|
const createCompletionModel = (modelId: FireworksCompletionModelId) =>
|
|
179
185
|
new OpenAICompatibleCompletionLanguageModel(modelId, {
|
|
180
186
|
...getCommonModelConfig('completion'),
|
|
187
|
+
includeUsage: true,
|
|
181
188
|
errorStructure: fireworksErrorStructure,
|
|
182
189
|
});
|
|
183
190
|
|