@shop-os/modelkit 0.1.6 → 0.1.7
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/README.md +1 -0
- package/dist/index.cjs +618 -78
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +29 -1
- package/dist/index.d.ts +29 -1
- package/dist/index.js +618 -78
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/catalog/registry.ts","../src/catalog/image.ts","../src/catalog/other.ts","../src/catalog/text.ts","../src/catalog/video.ts","../src/catalog/models.ts","../src/resolve-options.ts","../src/keys.ts","../src/retry.ts","../src/json.ts","../src/text.ts","../src/text-steps.ts","../src/client.ts","../src/adapters/media-ref.ts","../src/generated-image.ts","../src/adapters/ai-sdk-text.ts","../src/adapters/ark.ts","../src/adapters/fal.ts","../src/adapters/google-genai.ts","../src/adapters/google-files.ts","../src/adapters/google-image.ts","../src/adapters/higgsfield.ts","../src/adapters/higgsfield-motions.ts","../src/adapters/openai-image.ts","../src/adapters/prodia.ts","../src/adapters/replicate.ts","../src/adapters/xai-video.ts","../src/adapters/index.ts","../src/default.ts"],"sourcesContent":["/**\n * Everything `ai` exports is available here, so `import { ... } from \"ai\"` can become\n * `import { ... } from \"@shop-os/modelkit\"` unchanged. The generation functions below\n * replace their `ai` namesakes: they accept a catalog id or alias as `model` next to\n * the provider instances `ai` accepts, and they emit canonical usage.\n */\nexport * from \"ai\";\n\nexport * from \"./types.js\";\nexport * from \"./errors.js\";\nexport { Catalog } from \"./catalog/registry.js\";\nexport { MODELS } from \"./catalog/models.js\";\nexport {\n resolveAudioOptions,\n resolveImageOptions,\n resolveVideoOptions,\n nearestAspectRatio,\n} from \"./resolve-options.js\";\nexport type { OnUnsupported, ResolveResult } from \"./resolve-options.js\";\nexport { resolveKeys, keysFromEnv, ADAPTER_KEYS } from \"./keys.js\";\nexport { classifyHttpError, shouldRetry, withRetry, pollUntil, sleep } from \"./retry.js\";\nexport type { Adapter, AdapterContext } from \"./adapters/adapter.js\";\nexport { createModelKit } from \"./client.js\";\nexport type { ModelKit, AdapterRegistry, LanguageModelHandle } from \"./client.js\";\nexport * from \"./adapters/index.js\";\nexport {\n createDefaultModelKit,\n describe,\n generateAudio,\n generateImage,\n generateImage as experimental_generateImage,\n generateObject,\n generateText,\n generateVideo,\n languageModel,\n prepareMediaPart,\n streamObject,\n streamText,\n} from \"./default.js\";\nexport { JsonValueSchema, JsonObjectSchema, readErrorBody, describeThrown } from \"./json.js\";\nexport { toGeneratedImage } from \"./generated-image.js\";\nexport * from \"./text.js\";\n\n// The kit's coercion warning keeps the `Warning` name; the SDK's is `AiWarning`.\nexport type { Warning } from \"./types.js\";\nexport type { Warning as AiWarning } from \"ai\";\n","import type { JsonValue } from \"./types.js\";\n\n/** Provider body or the lifted detail (Gemini blockReason, fal body.detail). */\nexport type ProviderErrorBody = string | JsonValue;\n\nexport type ModelKitErrorCode =\n | \"unknown_model\"\n | \"unsupported_option\"\n | \"missing_input\"\n | \"content_blocked\"\n | \"provider_rejected\"\n | \"timeout\"\n | \"auth\"\n | \"network\"\n | \"rate_limited\";\n\nexport interface ModelKitErrorInit {\n code: ModelKitErrorCode;\n message: string;\n provider?: string;\n model?: string;\n status?: number;\n body?: ProviderErrorBody;\n cause?: unknown;\n retryable?: boolean;\n}\n\nexport class ModelKitError extends Error {\n readonly code: ModelKitErrorCode;\n readonly provider: string | undefined;\n readonly model: string | undefined;\n readonly status: number | undefined;\n readonly body: ProviderErrorBody | undefined;\n readonly retryable: boolean;\n\n constructor(init: ModelKitErrorInit) {\n super(init.message, { cause: init.cause });\n this.name = \"ModelKitError\";\n this.code = init.code;\n this.provider = init.provider;\n this.model = init.model;\n this.status = init.status;\n this.body = init.body;\n this.retryable = init.retryable ?? defaultRetryable(init.code);\n }\n}\n\nfunction defaultRetryable(code: ModelKitErrorCode): boolean {\n return code === \"timeout\" || code === \"network\" || code === \"rate_limited\";\n}\n\nexport function isModelKitError(err: unknown): err is ModelKitError {\n return err instanceof ModelKitError;\n}\n","import { ModelKitError } from \"../errors.js\";\nimport type { CatalogModel, Lifecycle, ModelType } from \"../types.js\";\n\nexport class Catalog {\n private readonly byId = new Map<string, CatalogModel>();\n private readonly byAlias = new Map<string, string>();\n\n constructor(models: CatalogModel[]) {\n for (const model of models) this.add(model);\n }\n\n add(model: CatalogModel): void {\n this.byId.set(model.id, model);\n this.byAlias.set(model.id, model.id);\n for (const alias of model.aliases) this.byAlias.set(alias, model.id);\n }\n\n /** Resolves a canonical id or any historical alias. */\n resolveId(idOrAlias: string): string | undefined {\n return this.byAlias.get(idOrAlias);\n }\n\n get(idOrAlias: string): CatalogModel | undefined {\n const id = this.resolveId(idOrAlias);\n return id ? this.byId.get(id) : undefined;\n }\n\n require(idOrAlias: string): CatalogModel {\n const model = this.get(idOrAlias);\n if (!model) {\n throw new ModelKitError({\n code: \"unknown_model\",\n message: `Unknown model \"${idOrAlias}\"`,\n model: idOrAlias,\n });\n }\n if (model.lifecycle === \"retired\") {\n const hint = model.replacedBy ? ` Use \"${model.replacedBy}\".` : \"\";\n throw new ModelKitError({\n code: \"unknown_model\",\n message: `Model \"${model.id}\" is retired.${hint}`,\n model: model.id,\n });\n }\n return model;\n }\n\n list(filter: { type?: ModelType; lifecycle?: Lifecycle[] } = {}): CatalogModel[] {\n const lifecycles = filter.lifecycle ?? [\"active\"];\n return [...this.byId.values()].filter(\n (m) =>\n (filter.type ? m.type === filter.type : true) && lifecycles.includes(m.lifecycle),\n );\n }\n\n /** Merge rows by id. Used for catalogOverride. */\n withOverrides(rows: CatalogModel[]): Catalog {\n return new Catalog([\n ...[...this.byId.values()].filter((m) => !rows.some((r) => r.id === m.id)),\n ...rows,\n ]);\n }\n}\n","import type { AspectRatio, CatalogModel, ImageSize } from \"../types.js\";\n\nconst IMAGE_USAGE = { unit: \"images\", modality: \"IMAGE\" } as const;\n\n// https://ai.google.dev/gemini-api/docs/image-generation#aspect_ratios\nconst GEMINI_RATIOS: AspectRatio[] = [\n \"1:1\",\n \"2:3\",\n \"3:2\",\n \"16:9\",\n \"9:16\",\n \"4:3\",\n \"3:4\",\n \"21:9\",\n \"4:5\",\n \"5:4\",\n \"adaptive\",\n];\n\nfunction geminiImage(\n id: string,\n label: string,\n aliases: string[],\n sizes: ImageSize[],\n): CatalogModel {\n const model: CatalogModel = {\n id,\n aliases,\n label,\n type: \"image\",\n adapter: \"google-image\",\n providerModelId: id,\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...GEMINI_RATIOS],\n sizes,\n supports: [\"safetySettings\", \"temperature\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n };\n return model;\n}\n\nexport const IMAGE_MODELS: CatalogModel[] = [\n geminiImage(\"gemini-3-pro-image-preview\", \"Nano Banana Pro\", [\"nb-pro\"], [\"1K\", \"2K\", \"4K\"]),\n geminiImage(\n \"gemini-3.1-flash-image-preview\",\n \"Nano Banana Flash\",\n [\"nb-2\"],\n // Flash 3.1 is the only Gemini image model with the 512 tier.\n [\"512\", \"1K\", \"2K\", \"4K\"],\n ),\n geminiImage(\"gemini-3.1-flash-lite-image\", \"Nano Banana Lite\", [\"nb-lite\"], [\"1K\"]),\n // trigger-workflows validates 1K only; pricing seeds 2K/4K rows so allow all three.\n geminiImage(\"gemini-2.5-flash-image\", \"Gemini 2.5 Flash Image\", [], [\"1K\", \"2K\", \"4K\"]),\n {\n // Cowork \"auto\" lets OpenAI pick the size; the canonical equivalent is adaptive.\n id: \"gpt-image-2\",\n aliases: [],\n label: \"GPT Image 2\",\n type: \"image\",\n adapter: \"openai-image\",\n providerModelId: \"gpt-image-2\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [\"1:1\", \"3:2\", \"2:3\", \"16:9\", \"9:16\", \"4:5\", \"5:4\", \"adaptive\"],\n sizes: [\"1K\", \"2K\", \"4K\"],\n references: { images: 16 },\n supports: [\"quality\", \"count\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"adaptive\", quality: \"auto\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n },\n {\n // Same Images API surface as gpt-image-2 plus the \"xhigh\" and \"max\" quality tiers.\n id: \"gpt-image-2.5-sunburst\",\n aliases: [],\n label: \"GPT Image 2.5 Sunburst\",\n type: \"image\",\n adapter: \"openai-image\",\n providerModelId: \"gpt-image-2.5-sunburst\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [\"1:1\", \"3:2\", \"2:3\", \"16:9\", \"9:16\", \"4:5\", \"5:4\", \"adaptive\"],\n sizes: [\"1K\", \"2K\", \"4K\"],\n references: { images: 16 },\n supports: [\"quality\", \"count\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"adaptive\", quality: \"auto\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n },\n {\n // Same Images API surface as gpt-image-2 plus the \"xhigh\" and \"max\" quality tiers.\n id: \"gpt-image-2.5-flare\",\n aliases: [],\n label: \"GPT Image 2.5 Flare\",\n type: \"image\",\n adapter: \"openai-image\",\n providerModelId: \"gpt-image-2.5-flare\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [\"1:1\", \"3:2\", \"2:3\", \"16:9\", \"9:16\", \"4:5\", \"5:4\", \"adaptive\"],\n sizes: [\"1K\", \"2K\", \"4K\"],\n references: { images: 16 },\n supports: [\"quality\", \"count\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"adaptive\", quality: \"auto\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n },\n {\n // Cowork allows 7 ratios; trigger-workflows allows 9 (adds 3:2, 9:21, drops 4:5/5:4).\n id: \"muse-image-1.0\",\n aliases: [],\n label: \"Meta Muse\",\n type: \"image\",\n adapter: \"fal\",\n providerModelId: \"muse-image-1.0\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [\n \"21:9\",\n \"16:9\",\n \"4:3\",\n \"3:2\",\n \"1:1\",\n \"2:3\",\n \"3:4\",\n \"9:16\",\n \"4:5\",\n \"5:4\",\n \"9:21\",\n \"adaptive\",\n ],\n sizes: [\"1K\"],\n references: { images: 10 },\n supports: [\"count\", \"outputFormat\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\", outputFormat: \"png\", count: 1 },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n },\n {\n id: \"seedream-5-0-pro\",\n aliases: [\"seedream-4-5\"],\n label: \"Seedream 5 Pro\",\n type: \"image\",\n adapter: \"ark\",\n providerModelId: \"dola-seedream-5-0-pro-260628\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [\"1:1\", \"4:3\", \"3:4\", \"16:9\", \"9:16\", \"3:2\", \"2:3\", \"21:9\", \"4:5\", \"5:4\"],\n sizes: [\"1K\", \"2K\"],\n references: { images: 10 },\n // Ark's Images API has no output-format, quality or count field; only\n // the seed is forwarded, so anything else must warn, not vanish.\n supports: [\"seed\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n },\n {\n id: \"seedream-4.5\",\n aliases: [],\n label: \"Seedream 4.5\",\n type: \"image\",\n adapter: \"ark\",\n providerModelId: \"seedream-4-5-251128\",\n lifecycle: \"active\",\n constraints: {\n // 97:30 has no Ark size spelling; the A+ flow pads inputs to 97:30 and\n // omits the ratio instead. Advertise only sizes the adapter can send.\n aspectRatios: [\n \"1:1\",\n \"2:3\",\n \"3:2\",\n \"4:3\",\n \"3:4\",\n \"4:5\",\n \"5:4\",\n \"9:16\",\n \"16:9\",\n \"21:9\",\n \"9:21\",\n ],\n sizes: [\"1K\", \"2K\", \"4K\"],\n references: { images: 10 },\n supports: [\"seed\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n },\n {\n id: \"flux-2-pro\",\n aliases: [],\n label: \"Flux 2 Pro\",\n type: \"image\",\n adapter: \"prodia\",\n providerModelId: \"flux-2-pro\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [\"1:1\", \"2:3\", \"3:2\", \"16:9\", \"9:16\", \"4:3\", \"3:4\", \"4:5\", \"5:4\", \"21:9\"],\n sizes: [\"1K\"],\n // flux-2-pro's job type always returns image/png; only the seed is forwarded.\n supports: [\"seed\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n },\n {\n // Prodia's gemini-3-pro jobs take aspect_ratio + resolution (1K/2K/4K), not\n // width/height; 97:30 is outside its aspect_ratio enum.\n // https://docs.prodia.com/models/gemini-3/\n id: \"prodia-nano-banana-pro\",\n aliases: [],\n label: \"Nano Banana Pro via Prodia\",\n type: \"image\",\n adapter: \"prodia\",\n providerModelId: \"inference.gemini-3-pro.img2img.v1\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [\"1:1\", \"2:3\", \"3:2\", \"4:3\", \"3:4\", \"4:5\", \"5:4\", \"9:16\", \"16:9\", \"21:9\"],\n sizes: [\"1K\", \"2K\", \"4K\"],\n requires: [\"references\"],\n supports: [\"seed\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n },\n {\n // Nano Banana (img2img.v2) is flat-rate with aspect_ratio only; 3:2, 4:5,\n // 5:4 and 97:30 are not in its enum. https://docs.prodia.com/models/nano-banana/\n id: \"prodia-nano-banana\",\n aliases: [],\n label: \"Nano Banana via Prodia\",\n type: \"image\",\n adapter: \"prodia\",\n providerModelId: \"inference.nano-banana.img2img.v2\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [\"1:1\", \"2:3\", \"3:4\", \"4:3\", \"9:16\", \"16:9\", \"21:9\"],\n sizes: [\"1K\"],\n requires: [\"references\"],\n supports: [\"seed\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n },\n {\n // WAN 2.7 takes `images` (up to 9) and a `size` enum whose exact values\n // cover 1:1/16:9/9:16/4:3/3:4 only; other ratios have no spelling.\n // https://replicate.com/wan-video/wan-2.7-image-pro (input schema)\n id: \"wan-2.7-image-pro\",\n aliases: [],\n label: \"WAN 2.7 Image Pro\",\n type: \"image\",\n adapter: \"replicate\",\n providerModelId: \"wan-video/wan-2.7-image-pro\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [\"1:1\", \"16:9\", \"9:16\", \"4:3\", \"3:4\"],\n sizes: [\"1K\", \"2K\", \"4K\"],\n references: { images: 9 },\n supports: [],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { unit: \"compute_seconds\", modality: \"IMAGE\" },\n pricingKind: \"image_size\",\n },\n {\n // Qwen Image 2 Pro has aspect_ratio but no size input; resolution follows\n // the reference image (match_input_image) or the provider default.\n // https://replicate.com/qwen/qwen-image-2-pro (input schema)\n id: \"qwen-image-2-pro\",\n aliases: [],\n label: \"Qwen Image 2 Pro\",\n type: \"image\",\n adapter: \"replicate\",\n providerModelId: \"qwen/qwen-image-2-pro\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [\"1:1\", \"16:9\", \"9:16\", \"4:3\", \"3:4\", \"3:2\", \"2:3\"],\n sizes: [],\n references: { images: 1 },\n requires: [\"references\"],\n supports: [],\n },\n defaults: { aspectRatio: \"1:1\" },\n usage: { unit: \"compute_seconds\", modality: \"IMAGE\" },\n pricingKind: \"image_size\",\n },\n {\n // Qwen Image Edit Plus takes aspect_ratio (or match_input_image) and\n // output_format, but no size; no default ratio so edits keep following\n // the input image. https://replicate.com/qwen-edit-apps/qwen-image-edit-plus-lora-skin\n id: \"qwen-image-edit-plus-lora-skin\",\n aliases: [],\n label: \"Qwen Image Edit Plus\",\n type: \"image\",\n adapter: \"replicate\",\n providerModelId: \"qwen-edit-apps/qwen-image-edit-plus-lora-skin\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [\"1:1\", \"16:9\", \"9:16\", \"4:3\", \"3:4\"],\n sizes: [],\n references: { images: 1 },\n requires: [\"references\"],\n supports: [\"outputFormat\"],\n },\n defaults: { outputFormat: \"png\" },\n usage: { unit: \"compute_seconds\", modality: \"IMAGE\" },\n pricingKind: \"image_size\",\n },\n];\n","import type { CatalogModel } from \"../types.js\";\n\nexport const OTHER_MODELS: CatalogModel[] = [\n {\n id: \"lyria-3-clip-preview\",\n aliases: [],\n label: \"Lyria 3 Clip\",\n type: \"audio\",\n adapter: \"google-genai\",\n providerModelId: \"lyria-3-clip-preview\",\n lifecycle: \"active\",\n constraints: {\n durations: [30],\n references: { images: 10 },\n supports: [],\n },\n defaults: {},\n usage: { unit: \"images\", modality: \"AUDIO\" },\n pricingKind: \"flat\",\n },\n {\n id: \"lyria-3-pro-preview\",\n aliases: [],\n label: \"Lyria 3 Pro\",\n type: \"audio\",\n adapter: \"google-genai\",\n providerModelId: \"lyria-3-pro-preview\",\n lifecycle: \"active\",\n constraints: {\n references: { images: 10 },\n supports: [],\n },\n defaults: {},\n usage: { unit: \"images\", modality: \"AUDIO\" },\n pricingKind: \"flat\",\n },\n {\n id: \"google/lyria-2\",\n aliases: [],\n label: \"Lyria 2 via Replicate\",\n type: \"audio\",\n adapter: \"replicate\",\n providerModelId: \"google/lyria-2\",\n lifecycle: \"active\",\n constraints: {\n durations: [30],\n supports: [\"seed\", \"negativePrompt\"],\n },\n defaults: {},\n usage: { unit: \"compute_seconds\", modality: \"AUDIO\" },\n pricingKind: \"flat\",\n },\n {\n id: \"mmaudio\",\n aliases: [\"zsxkib/mmaudio\", \"video-to-audio\"],\n label: \"MMAudio video-to-audio\",\n type: \"audio\",\n adapter: \"replicate\",\n providerModelId:\n \"zsxkib/mmaudio:62871fb59889b2d7c13777f08deb3b36bdff88f7e1d53a50ad7694548a41b484\",\n lifecycle: \"active\",\n constraints: {\n durations: { min: 1, max: 30 },\n requires: [\"sourceVideo\"],\n supports: [\"seed\", \"negativePrompt\"],\n },\n defaults: { durationSeconds: 8 },\n usage: { unit: \"compute_seconds\", modality: \"AUDIO\" },\n pricingKind: \"flat\",\n },\n {\n id: \"elevenlabs-music\",\n aliases: [\"elevenlabs/music\"],\n label: \"ElevenLabs Music via Replicate\",\n type: \"audio\",\n adapter: \"replicate\",\n providerModelId: \"elevenlabs/music\",\n lifecycle: \"active\",\n constraints: {\n durations: { min: 5, max: 300 },\n supports: [\"instrumental\"],\n },\n defaults: { durationSeconds: 15, instrumental: true },\n // Replicate's run() does not report predict_time; billed by generated length.\n usage: { unit: \"seconds\", modality: \"AUDIO\" },\n pricingKind: \"flat\",\n },\n {\n id: \"topaz\",\n aliases: [\"replicate-upscaler\", \"upscale\", \"topazlabs/image-upscale\"],\n label: \"Topaz Upscale\",\n type: \"upscale\",\n adapter: \"replicate\",\n providerModelId: \"topazlabs/image-upscale\",\n lifecycle: \"active\",\n constraints: {\n references: { images: 1 },\n requires: [\"references\"],\n supports: [\"scaleFactor\", \"outputFormat\", \"upscale\"],\n },\n defaults: { scaleFactor: 2, outputFormat: \"png\" },\n usage: { unit: \"compute_seconds\", modality: \"IMAGE\" },\n pricingKind: \"flat\",\n },\n {\n id: \"bg-remove\",\n aliases: [],\n label: \"Background Remover\",\n type: \"bg-remove\",\n adapter: \"prodia\",\n providerModelId: \"inference.remove-background.v1\",\n lifecycle: \"active\",\n constraints: {\n references: { images: 1 },\n requires: [\"references\"],\n supports: [],\n },\n defaults: {},\n usage: { unit: \"images\", modality: \"IMAGE\" },\n pricingKind: \"flat\",\n },\n];\n","import type { CatalogModel } from \"../types.js\";\n\nconst TEXT_USAGE = { unit: \"tokens\", modality: \"TEXT\" } as const;\n\nfunction text(\n id: string,\n label: string,\n providerModelId: string,\n extra?: Partial<CatalogModel>,\n): CatalogModel {\n return {\n id,\n aliases: [],\n label,\n type: \"text\",\n adapter: \"ai-sdk-text\",\n providerModelId,\n lifecycle: \"active\",\n constraints: { supports: [] },\n defaults: {},\n usage: { ...TEXT_USAGE },\n pricingKind: \"token\",\n ...extra,\n };\n}\n\nexport const TEXT_MODELS: CatalogModel[] = [\n text(\"gpt-4o\", \"GPT-4o\", \"gpt-4o\"),\n text(\"gpt-4o-mini\", \"GPT-4o mini\", \"gpt-4o-mini\"),\n text(\"gpt-5.1\", \"GPT-5.1\", \"gpt-5.1\"),\n text(\"gpt-5.2\", \"GPT-5.2\", \"gpt-5.2\"),\n text(\"gpt-5.4\", \"GPT-5.4\", \"gpt-5.4\"),\n // OpenAI never shipped gpt-5.1-mini or gpt-5.2-mini; callers that still send them get 5.4 mini.\n text(\"gpt-5.4-mini\", \"GPT-5.4 mini\", \"gpt-5.4-mini\", {\n aliases: [\"gpt-5.1-mini\", \"gpt-5.2-mini\"],\n }),\n text(\"gpt-5.5\", \"GPT-5.5\", \"gpt-5.5\"),\n text(\"gpt-5.6-luna\", \"GPT-5.6 Luna\", \"gpt-5.6-luna\"),\n text(\"gpt-5.6-terra\", \"GPT-5.6 Terra\", \"gpt-5.6-terra\"),\n text(\"gpt-5.6-sol\", \"GPT-5.6 Sol\", \"gpt-5.6-sol\"),\n // Library key \"claude-sonnet-4.5\" maps to the SDK id \"claude-sonnet-4-5\".\n text(\"claude-sonnet-4-5\", \"Claude Sonnet 4.5\", \"claude-sonnet-4-5\", {\n aliases: [\"claude-sonnet-4.5\", \"claude-sonnet-4-5-20250929\"],\n }),\n // Anthropic retired the dated 4.0 ids; callers that still send them get 4.6.\n text(\"claude-sonnet-4-6\", \"Claude Sonnet 4.6\", \"claude-sonnet-4-6\", {\n aliases: [\n \"claude-sonnet-4.6\",\n \"claude-sonnet-4\",\n \"claude-sonnet-4.0\",\n \"claude-sonnet-4-20250514\",\n ],\n }),\n text(\"claude-sonnet-5\", \"Claude Sonnet 5\", \"claude-sonnet-5\"),\n text(\"claude-opus-4-8\", \"Claude Opus 4.8\", \"claude-opus-4-8\", {\n aliases: [\"claude-opus-4.8\", \"claude-opus-4\", \"claude-opus-4.0\", \"claude-opus-4-20250514\"],\n }),\n text(\"claude-haiku-4-5\", \"Claude Haiku 4.5\", \"claude-haiku-4-5\", {\n aliases: [\"claude-haiku-4.5\", \"claude-haiku-4-5-20251001\", \"claude-haiku-4\"],\n }),\n text(\"claude-opus-5\", \"Claude Opus 5\", \"claude-opus-5\", {\n aliases: [\"claude-opus-5.0\"],\n }),\n text(\"claude-fable-5\", \"Claude Fable 5\", \"claude-fable-5\"),\n text(\"gemini-2.5-flash\", \"Gemini 2.5 Flash\", \"gemini-2.5-flash\"),\n text(\"gemini-2.5-pro\", \"Gemini 2.5 Pro\", \"gemini-2.5-pro\"),\n text(\"gemini-3.1-pro-preview\", \"Gemini 3.1 Pro (preview)\", \"gemini-3.1-pro-preview\"),\n text(\"gemini-3.5-flash\", \"Gemini 3.5 Flash\", \"gemini-3.5-flash\"),\n text(\"gemini-3.6-flash\", \"Gemini 3.6 Flash\", \"gemini-3.6-flash\"),\n text(\"gemini-3.7-flash\", \"Gemini 3.7 Flash\", \"gemini-3.7-flash\"),\n text(\"gemini-3.8-flash\", \"Gemini 3.8 Flash\", \"gemini-3.8-flash\"),\n // Renamed to gemini-3.6-flash in vibe-shared model-migration.ts.\n text(\"gemini-3-flash-preview\", \"Gemini 3 Flash (preview)\", \"gemini-3-flash-preview\", {\n lifecycle: \"deprecated\",\n replacedBy: \"gemini-3.6-flash\",\n }),\n text(\"gemini-3.1-flash-lite\", \"Gemini 3.1 Flash Lite\", \"gemini-3.1-flash-lite\"),\n text(\"sonar\", \"Sonar\", \"sonar\"),\n text(\"sonar-pro\", \"Sonar Pro\", \"sonar-pro\"),\n text(\"sonar-reasoning-pro\", \"Sonar Reasoning Pro\", \"sonar-reasoning-pro\"),\n text(\"deepseek-v4-flash\", \"DeepSeek V4 Flash\", \"deepseek-v4-flash\"),\n text(\"deepseek-v4-pro\", \"DeepSeek V4 Pro\", \"deepseek-v4-pro\"),\n text(\"grok-4.3\", \"Grok 4.3\", \"grok-4.3\"),\n text(\"kimi-k2.5\", \"Kimi K2.5\", \"kimi-k2.5\"),\n text(\"kimi-k3\", \"Kimi K3\", \"kimi-k3\"),\n // Cowork calls the provider \"MiniMax-M3\"; the pricing key is lowercase.\n text(\"minimax-m3\", \"MiniMax M3\", \"MiniMax-M3\", { aliases: [\"MiniMax-M3\"] }),\n];\n","import type { AspectRatio, CatalogModel } from \"../types.js\";\n\nconst VIDEO_USAGE = { unit: \"seconds\", modality: \"VIDEO\" } as const;\n\nconst SEEDANCE_RATIOS: AspectRatio[] = [\"21:9\", \"16:9\", \"4:3\", \"1:1\", \"3:4\", \"9:16\", \"adaptive\"];\nconst KLING_RATIOS: AspectRatio[] = [\"16:9\", \"9:16\", \"1:1\", \"adaptive\"];\nconst OMNI_RATIOS: AspectRatio[] = [\"16:9\", \"9:16\"];\nconst GROK_RATIOS: AspectRatio[] = [\"1:1\", \"16:9\", \"9:16\", \"4:3\", \"3:4\", \"3:2\", \"2:3\"];\nconst H3_RATIOS: AspectRatio[] = [\"21:9\", \"16:9\", \"4:3\", \"1:1\", \"3:4\", \"9:16\"];\nconst H3_REFERENCE_RATIOS: AspectRatio[] = [\"adaptive\", ...H3_RATIOS];\n\nconst NEGATIVE_PROMPT = \"blur, distort, and low quality\";\n\nexport const VIDEO_MODELS: CatalogModel[] = [\n {\n id: \"veo-3.1\",\n aliases: [\n \"veo-3.1-generate-001\",\n \"veo-3.1-generate-preview\",\n \"veo3\",\n \"veo-3.1-frame-specific\",\n ],\n label: \"Veo 3.1\",\n type: \"video\",\n adapter: \"google-genai\",\n providerModelId: \"veo-3.1-generate-preview\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...OMNI_RATIOS],\n resolutions: [\"720p\", \"1080p\", \"4k\"],\n durations: [8],\n references: { images: 3 },\n supports: [\"lastFrame\"],\n },\n defaults: { durationSeconds: 8, resolution: \"720p\", aspectRatio: \"16:9\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n },\n {\n id: \"veo-3.1-fast\",\n aliases: [\n \"veo-3.1-fast-generate-001\",\n \"veo-3.1-fast-generate-preview\",\n \"veo-3.1-fast-generate-001-frame-specific\",\n ],\n label: \"Veo 3.1 Fast\",\n type: \"video\",\n adapter: \"google-genai\",\n providerModelId: \"veo-3.1-fast-generate-preview\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...OMNI_RATIOS],\n resolutions: [\"720p\", \"1080p\", \"4k\"],\n durations: [4, 8],\n references: { images: 3 },\n supports: [\"lastFrame\"],\n },\n defaults: { durationSeconds: 8, resolution: \"720p\", aspectRatio: \"16:9\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n },\n {\n id: \"veo-3.1-lite\",\n aliases: [\n \"veo-3.1-lite-generate-001\",\n \"veo-3.1-lite-generate-preview\",\n \"veo-3.1-lite-generate-001-frame-specific\",\n ],\n label: \"Veo 3.1 Lite\",\n type: \"video\",\n adapter: \"google-genai\",\n providerModelId: \"veo-3.1-lite-generate-preview\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...OMNI_RATIOS],\n resolutions: [\"720p\", \"1080p\", \"4k\"],\n durations: [4, 8],\n references: { images: 3 },\n supports: [\"lastFrame\"],\n },\n defaults: { durationSeconds: 8, resolution: \"720p\", aspectRatio: \"16:9\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n },\n {\n id: \"gemini-omni-flash\",\n aliases: [\n \"gemini-omni-flash-preview\",\n \"geminiOmniFlash\",\n \"gemini-omni-video\",\n \"gemini-omni-reference\",\n \"gemini-omni-edit\",\n ],\n label: \"Gemini Omni Flash\",\n type: \"video\",\n adapter: \"google-genai\",\n providerModelId: \"gemini-omni-flash-preview\",\n lifecycle: \"active\",\n constraints: {\n // 1.0 rejects `resolution`; it renders 720p. No defaults: the adapter\n // sends ratio and duration only when the caller set them, so a\n // reference clip keeps its own framing.\n aspectRatios: [...OMNI_RATIOS],\n durations: [3, 4, 5, 6, 7, 8, 9, 10],\n references: { images: 6, videos: 1 },\n supports: [],\n },\n defaults: {},\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n },\n {\n id: \"gemini-omni-1.1-flash\",\n aliases: [\"gemini-omni-1.1-video\", \"gemini-omni-1.1-reference\", \"gemini-omni-1.1-edit\"],\n label: \"Gemini Omni 1.1 Flash\",\n type: \"video\",\n adapter: \"google-genai\",\n providerModelId: \"gemini-omni-1.1-flash\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...OMNI_RATIOS],\n resolutions: [\"360p\", \"720p\", \"1080p\", \"4k\"],\n durations: [3, 4, 5, 6, 7, 8, 9, 10],\n references: { images: 6, videos: 1 },\n supports: [],\n },\n defaults: {},\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n },\n {\n // vibe-triggers and Space Builder drop the ratio when a frame is wired; Cowork always sends it.\n id: \"seedance-2.0\",\n aliases: [\"seedance2\", \"seedance-2-0\", \"dreamina-seedance-2-0-260128\"],\n label: \"Seedance 2.0\",\n type: \"video\",\n adapter: \"ark\",\n providerModelId: \"dreamina-seedance-2-0-260128\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...SEEDANCE_RATIOS],\n resolutions: [\"480p\", \"720p\", \"1080p\", \"4k\"],\n durations: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],\n references: { images: 9, videos: 3, audios: 3, audioOnly: false },\n ratioIgnoredWith: [\"firstFrame\"],\n supports: [\"generateAudio\", \"seed\", \"lastFrame\", \"watermark\"],\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"720p\",\n aspectRatio: \"16:9\",\n generateAudio: true,\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n },\n {\n id: \"seedance-2.0-fast\",\n aliases: [\"seedance-2-0-fast\", \"dreamina-seedance-2-0-fast-260128\"],\n label: \"Seedance 2.0 Fast\",\n type: \"video\",\n adapter: \"ark\",\n providerModelId: \"dreamina-seedance-2-0-fast-260128\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...SEEDANCE_RATIOS],\n resolutions: [\"480p\", \"720p\"],\n durations: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],\n references: { images: 9, videos: 3, audios: 3, audioOnly: false },\n ratioIgnoredWith: [\"firstFrame\"],\n supports: [\"generateAudio\", \"seed\", \"lastFrame\", \"watermark\"],\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"720p\",\n aspectRatio: \"16:9\",\n generateAudio: true,\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n },\n {\n // generateAudio defaults to false here (trigger-workflows); Space Builder defaults it to true.\n id: \"seedance-2.5\",\n aliases: [\"seedance-2-5\", \"dreamina-seedance-2-5-260628\"],\n label: \"Seedance 2.5\",\n type: \"video\",\n adapter: \"ark\",\n providerModelId: \"dreamina-seedance-2-5-260628\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...SEEDANCE_RATIOS],\n resolutions: [\"480p\", \"720p\", \"1080p\"],\n durations: { min: 4, max: 30 },\n references: { images: 30, videos: 10, audios: 10 },\n ratioIgnoredWith: [\"firstFrame\"],\n supports: [\"generateAudio\", \"seed\", \"lastFrame\", \"watermark\"],\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"720p\",\n aspectRatio: \"16:9\",\n generateAudio: false,\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n },\n {\n // Cowork allows 7 reference images and durations 4/6/8/10; Space Builder allows 5 and 1-15s.\n id: \"grok-imagine\",\n aliases: [\"grok-imagine-video\", \"grokImagine\"],\n label: \"Grok Imagine\",\n type: \"video\",\n adapter: \"xai-video\",\n providerModelId: \"grok-imagine-video\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...GROK_RATIOS],\n resolutions: [\"480p\", \"720p\"],\n durations: { min: 1, max: 15 },\n references: { images: 7 },\n supports: [],\n },\n // No resolution default: xAI picks its own unless the caller asks.\n defaults: { durationSeconds: 8, aspectRatio: \"16:9\" },\n usage: { unit: \"reported_cost_usd\", modality: \"VIDEO\" },\n pricingKind: \"video_per_second\",\n },\n {\n id: \"kling-2.5\",\n aliases: [\"kling-v2.5-turbo-pro\", \"kling-2.5-turbo-pro\", \"kling-v2.5\"],\n label: \"Kling 2.5\",\n type: \"video\",\n adapter: \"higgsfield\",\n providerModelId: \"kling-video/v2.5-turbo/pro/image-to-video\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...KLING_RATIOS],\n durations: [5, 10],\n requires: [\"firstFrame\"],\n supports: [\"cfgScale\", \"negativePrompt\", \"lastFrame\"],\n },\n defaults: {\n durationSeconds: 5,\n aspectRatio: \"16:9\",\n cfgScale: 0.5,\n negativePrompt: NEGATIVE_PROMPT,\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n },\n {\n // trigger-workflows validates 5/10 only; Space Builder allows 3-15s (Kling30Input).\n id: \"kling-3.0\",\n aliases: [\"kling-v3.0-pro\", \"kling-v3.0\", \"kling-3.0-pro\"],\n label: \"Kling 3.0\",\n type: \"video\",\n adapter: \"higgsfield\",\n providerModelId: \"kling-video/v3.0/pro/image-to-video\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...KLING_RATIOS],\n durations: { min: 3, max: 15 },\n requires: [\"firstFrame\"],\n supports: [\"cfgScale\", \"negativePrompt\", \"lastFrame\"],\n },\n defaults: {\n durationSeconds: 5,\n aspectRatio: \"16:9\",\n cfgScale: 0.5,\n negativePrompt: NEGATIVE_PROMPT,\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n },\n {\n // mode standard/pro selects 720p/1080p; the endpoint takes no separate resolution.\n id: \"kling-v3-omni-video\",\n aliases: [\"kwaivgi/kling-v3-omni-video\", \"kling-v3-omni\"],\n label: \"Kling V3 Omni\",\n type: \"video\",\n adapter: \"replicate\",\n providerModelId: \"kwaivgi/kling-v3-omni-video\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [\n \"1:1\",\n \"16:9\",\n \"9:16\",\n \"4:3\",\n \"3:4\",\n \"3:2\",\n \"2:3\",\n \"21:9\",\n \"4:5\",\n \"adaptive\",\n ],\n resolutions: [\"720p\", \"1080p\"],\n durations: { min: 3, max: 15 },\n references: { images: 7 },\n supports: [\"generateAudio\", \"lastFrame\"],\n },\n defaults: { durationSeconds: 5, aspectRatio: \"16:9\", generateAudio: false, mode: \"pro\" },\n usage: { unit: \"compute_seconds\", modality: \"VIDEO\" },\n pricingKind: \"video_per_second\",\n },\n {\n id: \"minimax-h3\",\n aliases: [],\n label: \"MiniMax H3\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"minimax/h3\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...H3_RATIOS],\n resolutions: [\"480p\", \"768p\", \"2k\", \"4k\"],\n durations: { min: 5, max: 15 },\n supports: [\"seed\", \"promptExpansion\", \"lastFrame\", \"safetyChecker\"],\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"2k\",\n aspectRatio: \"16:9\",\n promptExpansion: \"balanced\",\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n },\n {\n id: \"minimax-h3-max\",\n aliases: [],\n label: \"MiniMax H3 Max\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"minimax/h3-max\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...H3_RATIOS],\n resolutions: [\"480p\", \"768p\"],\n durations: { min: 5, max: 15 },\n supports: [\"seed\", \"promptExpansion\", \"lastFrame\", \"safetyChecker\"],\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"768p\",\n aspectRatio: \"16:9\",\n promptExpansion: \"balanced\",\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n },\n {\n id: \"minimax-h3-reference\",\n aliases: [],\n label: \"MiniMax H3 Reference\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"minimax/h3/reference-to-video\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...H3_REFERENCE_RATIOS],\n resolutions: [\"480p\", \"768p\", \"2k\", \"4k\"],\n durations: { min: 5, max: 15 },\n references: { images: 9, videos: 3, audios: 3, total: 12, audioOnly: false },\n supports: [\"seed\", \"promptExpansion\", \"safetyChecker\"],\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"2k\",\n aspectRatio: \"adaptive\",\n promptExpansion: \"balanced\",\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n },\n {\n id: \"minimax-h3-max-reference\",\n aliases: [],\n label: \"MiniMax H3 Max Reference\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"minimax/h3-max/reference-to-video\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...H3_REFERENCE_RATIOS],\n resolutions: [\"480p\", \"768p\"],\n durations: { min: 5, max: 15 },\n references: { images: 9, videos: 3, audios: 3, total: 12, audioOnly: false },\n supports: [\"seed\", \"promptExpansion\", \"safetyChecker\"],\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"768p\",\n aspectRatio: \"adaptive\",\n promptExpansion: \"balanced\",\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n },\n {\n // Duration 3-10s per trigger-workflows mapDuration; the endpoint takes no resolution.\n id: \"kling-o1-v2v\",\n aliases: [],\n label: \"Kling O1 Video to Video\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/kling-video/o1/video-to-video/reference\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...KLING_RATIOS],\n durations: { min: 3, max: 10 },\n requires: [\"sourceVideo\"],\n supports: [],\n },\n defaults: { durationSeconds: 5, aspectRatio: \"16:9\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n },\n {\n id: \"hailuo-02\",\n aliases: [],\n label: \"Hailuo 02\",\n type: \"video\",\n adapter: \"replicate\",\n providerModelId: \"minimax/hailuo-02\",\n lifecycle: \"active\",\n constraints: {\n resolutions: [\"768p\"],\n durations: [6, 10],\n supports: [\"lastFrame\"],\n },\n defaults: { durationSeconds: 6, resolution: \"768p\" },\n usage: { unit: \"compute_seconds\", modality: \"VIDEO\" },\n pricingKind: \"video_per_second\",\n },\n {\n id: \"higgsfield-dop-preview\",\n aliases: [],\n label: \"Higgsfield DOP Preview\",\n type: \"video\",\n adapter: \"higgsfield\",\n providerModelId: \"dop-preview\",\n lifecycle: \"active\",\n constraints: {\n requires: [\"firstFrame\"],\n supports: [\"seed\", \"lastFrame\"],\n },\n defaults: {},\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n },\n];\n","import type { CatalogModel } from \"../types.js\";\nimport { IMAGE_MODELS } from \"./image.js\";\nimport { OTHER_MODELS } from \"./other.js\";\nimport { TEXT_MODELS } from \"./text.js\";\nimport { VIDEO_MODELS } from \"./video.js\";\n\n/** Seeded from Cowork, Space Builder and trigger-workflows. See catalog/*.ts. */\nexport const MODELS: CatalogModel[] = [\n ...TEXT_MODELS,\n ...IMAGE_MODELS,\n ...VIDEO_MODELS,\n ...OTHER_MODELS,\n];\n","import { ModelKitError } from \"./errors.js\";\nimport type {\n AspectRatio,\n AudioRequest,\n CatalogModel,\n ImageRequest,\n ImageSize,\n MediaRef,\n VideoRequest,\n VideoResolution,\n Warning,\n} from \"./types.js\";\n\nexport type OnUnsupported = \"error\" | \"coerce\";\n\nexport interface ResolveResult<T> {\n request: T;\n warnings: Warning[];\n}\n\nconst SIZE_ORDER: ImageSize[] = [\"512\", \"1K\", \"2K\", \"4K\"];\nconst RESOLUTION_ORDER: VideoResolution[] = [\"360p\", \"480p\", \"720p\", \"768p\", \"1080p\", \"2k\", \"4k\"];\n\nfunction ratioValue(r: AspectRatio): number {\n if (r === \"adaptive\") return 1;\n // SAFETY: every non-adaptive AspectRatio literal is \"<int>:<int>\", so the split has two numbers.\n const [w, h] = r.split(\":\").map(Number) as [number, number];\n return w / h;\n}\n\ntype Orientation = \"landscape\" | \"portrait\" | \"square\";\nfunction orientation(r: AspectRatio): Orientation {\n const v = ratioValue(r);\n return v > 1 ? \"landscape\" : v < 1 ? \"portrait\" : \"square\";\n}\n\n/** Nearest supported ratio in the same orientation bucket, else nearest overall, by log distance. */\nexport function nearestAspectRatio(requested: AspectRatio, supported: AspectRatio[]): AspectRatio {\n if (supported.includes(requested)) return requested;\n const target = requested === \"adaptive\" ? \"1:1\" : requested;\n const sameBucket = supported.filter(\n (s) => s !== \"adaptive\" && orientation(s) === orientation(target),\n );\n const pool = sameBucket.length > 0 ? sameBucket : supported.filter((s) => s !== \"adaptive\");\n const fallback = pool[0] ?? supported[0];\n if (!fallback) return target;\n const dist = (s: AspectRatio) =>\n Math.abs(Math.log(ratioValue(s)) - Math.log(ratioValue(target)));\n return pool.reduce((best, s) => (dist(s) < dist(best) ? s : best), fallback);\n}\n\nfunction nearestLowerTier<T extends string>(requested: T, supported: T[], order: T[]): T {\n const idx = order.indexOf(requested);\n for (let i = idx; i >= 0; i--) {\n const candidate = order[i];\n if (candidate !== undefined && supported.includes(candidate)) return candidate;\n }\n for (let i = idx + 1; i < order.length; i++) {\n const candidate = order[i];\n if (candidate !== undefined && supported.includes(candidate)) return candidate;\n }\n return requested;\n}\n\nfunction resolveTier<T extends string>(\n field: string,\n code: Warning[\"code\"],\n requested: T | undefined,\n supported: T[] | undefined,\n order: T[],\n model: CatalogModel,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): T | undefined {\n if (requested === undefined || !supported || supported.includes(requested)) return requested;\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} does not support ${field} \"${requested}\". Supported: ${supported.join(\", \")}.`,\n model: model.id,\n });\n }\n const to = nearestLowerTier(requested, supported, order);\n warnings.push({\n code,\n field,\n from: requested,\n to,\n message: `${field} ${requested} coerced to ${to} for ${model.id}`,\n });\n return to;\n}\n\nfunction resolveDuration(\n requested: number | undefined,\n durations: CatalogModel[\"constraints\"][\"durations\"],\n model: CatalogModel,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): number | undefined {\n if (requested === undefined || !durations) return requested;\n const inSet = Array.isArray(durations)\n ? durations.includes(requested)\n : requested >= durations.min && requested <= durations.max;\n if (inSet) return requested;\n if (onUnsupported === \"error\") {\n const supported = Array.isArray(durations)\n ? `Supported: ${durations.join(\", \")}.`\n : `Supported range: ${durations.min}-${durations.max}.`;\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} does not support durationSeconds ${requested}. ${supported}`,\n model: model.id,\n });\n }\n const to = Array.isArray(durations)\n ? durations.reduce(\n (best, d) => (Math.abs(d - requested) < Math.abs(best - requested) ? d : best),\n durations[0] ?? requested,\n )\n : Math.min(Math.max(requested, durations.min), durations.max);\n warnings.push({\n code: \"duration_coerced\",\n field: \"durationSeconds\",\n from: requested,\n to,\n message: `duration ${requested}s coerced to ${to}s for ${model.id}`,\n });\n return to;\n}\n\n/** An unsupported ratio errors under \"error\"; under \"coerce\" it snaps with a warning. */\nfunction resolveAspectRatio(\n requested: AspectRatio | undefined,\n supported: AspectRatio[] | undefined,\n model: CatalogModel,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): AspectRatio | undefined {\n if (requested === undefined || requested === \"adaptive\" || !supported) return requested;\n if (supported.includes(requested)) return requested;\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} does not support aspectRatio \"${requested}\". Supported: ${supported.join(\", \")}.`,\n model: model.id,\n });\n }\n const to = nearestAspectRatio(requested, supported);\n warnings.push({\n code: \"ratio_coerced\",\n field: \"aspectRatio\",\n from: requested,\n to,\n message: `aspect ratio ${requested} coerced to ${to} for ${model.id}`,\n });\n return to;\n}\n\nfunction compact(refs: MediaRef[] | undefined): MediaRef[] {\n return (refs ?? []).filter((r): r is MediaRef => Boolean(r));\n}\n\nfunction trim(\n field: string,\n refs: MediaRef[],\n limit: number | undefined,\n model: CatalogModel,\n warnings: Warning[],\n): MediaRef[] {\n if (limit === undefined || refs.length <= limit) return refs;\n warnings.push({\n code: \"references_trimmed\",\n field,\n from: refs.length,\n to: limit,\n message: `${field} trimmed from ${refs.length} to ${limit} for ${model.id}`,\n });\n return refs.slice(0, limit);\n}\n\nexport function resolveImageOptions(\n model: CatalogModel,\n request: ImageRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<ImageRequest> {\n const warnings: Warning[] = [];\n const c = model.constraints;\n const merged: ImageRequest = { ...model.defaults, ...stripUndefined(request), model: model.id };\n\n const aspectRatio = resolveAspectRatio(\n merged.aspectRatio,\n c.aspectRatios,\n model,\n onUnsupported,\n warnings,\n );\n if (aspectRatio !== undefined) merged.aspectRatio = aspectRatio;\n const size = resolveTier(\n \"size\",\n \"size_coerced\",\n merged.size,\n c.sizes,\n SIZE_ORDER,\n model,\n onUnsupported,\n warnings,\n );\n if (size !== undefined) merged.size = size;\n\n const references = trim(\n \"references\",\n compact(merged.references),\n c.references?.images ?? c.references?.total,\n model,\n warnings,\n );\n if (references.length > 0) merged.references = references;\n else delete merged.references;\n if (c.requires?.includes(\"references\") && references.length === 0) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} requires at least one reference image`,\n model: model.id,\n });\n }\n dropUnsupported(merged, model, warnings, [\n \"seed\",\n \"quality\",\n \"count\",\n \"outputFormat\",\n \"scaleFactor\",\n \"safetySettings\",\n \"temperature\",\n \"upscale\",\n ]);\n return { request: merged, warnings };\n}\n\nexport function resolveVideoOptions(\n model: CatalogModel,\n request: VideoRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<VideoRequest> {\n const warnings: Warning[] = [];\n const c = model.constraints;\n const merged: VideoRequest = { ...model.defaults, ...stripUndefined(request), model: model.id };\n\n for (const input of c.requires ?? []) {\n const present =\n input === \"references\"\n ? compact(merged.referenceImages).length +\n compact(merged.referenceVideos).length +\n compact(merged.referenceAudios).length >\n 0\n : merged[input] !== undefined;\n if (!present)\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} requires ${input}`,\n model: model.id,\n });\n }\n\n for (const input of c.ratioIgnoredWith ?? []) {\n if (merged[input] !== undefined && merged.aspectRatio !== undefined) {\n // Only the caller's own ratio deserves a warning; a catalog default dropping is expected.\n if (request.aspectRatio !== undefined) {\n warnings.push({\n code: \"ratio_dropped\",\n field: \"aspectRatio\",\n from: merged.aspectRatio,\n message: `${model.id} ignores aspectRatio when ${input} is set`,\n });\n }\n delete merged.aspectRatio;\n }\n }\n const aspectRatio = resolveAspectRatio(\n merged.aspectRatio,\n c.aspectRatios,\n model,\n onUnsupported,\n warnings,\n );\n if (aspectRatio !== undefined) merged.aspectRatio = aspectRatio;\n const resolution = resolveTier(\n \"resolution\",\n \"resolution_coerced\",\n merged.resolution,\n c.resolutions,\n RESOLUTION_ORDER,\n model,\n onUnsupported,\n warnings,\n );\n if (resolution !== undefined) merged.resolution = resolution;\n const duration = resolveDuration(\n merged.durationSeconds,\n c.durations,\n model,\n onUnsupported,\n warnings,\n );\n if (duration !== undefined) merged.durationSeconds = duration;\n\n const limits = c.references ?? {};\n let images = trim(\n \"referenceImages\",\n compact(merged.referenceImages),\n limits.images,\n model,\n warnings,\n );\n let videos = trim(\n \"referenceVideos\",\n compact(merged.referenceVideos),\n limits.videos,\n model,\n warnings,\n );\n let audios = trim(\n \"referenceAudios\",\n compact(merged.referenceAudios),\n limits.audios,\n model,\n warnings,\n );\n if (limits.total !== undefined) {\n let over = images.length + videos.length + audios.length - limits.total;\n if (over > 0) {\n const cut = Math.min(over, audios.length);\n audios = trim(\"referenceAudios\", audios, audios.length - cut, model, warnings);\n over -= cut;\n }\n if (over > 0) {\n const cut = Math.min(over, videos.length);\n videos = trim(\"referenceVideos\", videos, videos.length - cut, model, warnings);\n over -= cut;\n }\n if (over > 0)\n images = trim(\"referenceImages\", images, images.length - over, model, warnings);\n }\n if (\n limits.audioOnly === false &&\n audios.length > 0 &&\n images.length === 0 &&\n videos.length === 0 &&\n !merged.firstFrame &&\n !merged.sourceVideo\n ) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} rejects audio-only references`,\n model: model.id,\n });\n }\n setOrDelete(merged, \"referenceImages\", images);\n setOrDelete(merged, \"referenceVideos\", videos);\n setOrDelete(merged, \"referenceAudios\", audios);\n\n dropUnsupported(merged, model, warnings, [\n \"seed\",\n \"negativePrompt\",\n \"cfgScale\",\n \"generateAudio\",\n \"promptExpansion\",\n \"lastFrame\",\n \"watermark\",\n \"safetyChecker\",\n ]);\n return { request: merged, warnings };\n}\n\nexport function resolveAudioOptions(\n model: CatalogModel,\n request: AudioRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<AudioRequest> {\n const warnings: Warning[] = [];\n const c = model.constraints;\n const merged: AudioRequest = { ...model.defaults, ...stripUndefined(request), model: model.id };\n\n for (const input of c.requires ?? []) {\n const present =\n input === \"references\"\n ? compact(merged.references).length > 0\n : input === \"sourceVideo\" && merged.sourceVideo !== undefined;\n if (!present)\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} requires ${input}`,\n model: model.id,\n });\n }\n\n const duration = resolveDuration(\n merged.durationSeconds,\n c.durations,\n model,\n onUnsupported,\n warnings,\n );\n if (duration !== undefined) merged.durationSeconds = duration;\n\n const references = trim(\n \"references\",\n compact(merged.references),\n c.references?.images ?? c.references?.total,\n model,\n warnings,\n );\n if (references.length > 0) merged.references = references;\n else delete merged.references;\n\n dropUnsupported(merged, model, warnings, [\"seed\", \"negativePrompt\", \"instrumental\"]);\n return { request: merged, warnings };\n}\n\nfunction dropUnsupported<T extends object>(\n req: T,\n model: CatalogModel,\n warnings: Warning[],\n fields: (keyof T & string)[],\n): void {\n const supports = model.constraints.supports ?? [];\n for (const field of fields) {\n // SAFETY: `fields` are a subset of SupportedOption; the cast only bridges the generic key type.\n if (req[field] !== undefined && !supports.includes(field as never)) {\n warnings.push({\n code: \"option_ignored\",\n field,\n from: req[field],\n message: `${model.id} does not support ${field}; ignored`,\n });\n delete req[field];\n }\n }\n}\n\nfunction setOrDelete(\n req: VideoRequest,\n field: \"referenceImages\" | \"referenceVideos\" | \"referenceAudios\",\n refs: MediaRef[],\n): void {\n if (refs.length > 0) req[field] = refs;\n else delete req[field];\n}\n\nfunction stripUndefined<T extends object>(obj: T): T {\n // SAFETY: only undefined-valued keys are removed, which does not change the static type of T.\n return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as T;\n}\n","import { ModelKitError } from \"./errors.js\";\nimport type { AdapterId, ModelKitConfig, ProviderKeyName, ProviderKeys } from \"./types.js\";\n\n/** Which key names an adapter needs. All of them must be set on a tier for that tier to win. */\nexport const ADAPTER_KEYS: Record<AdapterId, ProviderKeyName[]> = {\n \"ai-sdk-text\": [],\n \"google-image\": [\"google\"],\n \"openai-image\": [\"openai\"],\n \"google-genai\": [\"google\"],\n ark: [\"ark\"],\n fal: [\"fal\"],\n replicate: [\"replicate\"],\n prodia: [\"prodia\"],\n higgsfield: [\"higgsfield\"],\n \"xai-video\": [\"xai\"],\n};\n\nfunction hasAll(keys: ProviderKeys | undefined, names: ProviderKeyName[]): keys is ProviderKeys {\n if (!keys) return false;\n return names.every(\n (n) => Boolean(keys[n]) && (n !== \"higgsfield\" || Boolean(keys.higgsfieldSecret)),\n );\n}\n\n/** The required names the enterprise tier is missing, so the call must fall back to pro. */\nexport function missingEnterpriseKeys(\n config: ModelKitConfig,\n names: ProviderKeyName[],\n): ProviderKeyName[] {\n return names.filter((name) => !hasAll(config.keys.enterprise, [name]));\n}\n\n/**\n * Enterprise wins only when every key the adapter needs is set on the\n * enterprise tier; otherwise the pro keys are used. Mirrors trigger-workflows\n * enterprise-keys.ts, extended to Ark and Prodia.\n */\nexport function resolveKeys(\n config: ModelKitConfig,\n names: ProviderKeyName[],\n tier: \"pro\" | \"enterprise\" = \"pro\",\n): ProviderKeys {\n if (tier === \"enterprise\" && hasAll(config.keys.enterprise, names))\n return config.keys.enterprise;\n if (names.length > 0 && !hasAll(config.keys.pro, names)) {\n throw new ModelKitError({\n code: \"auth\",\n message: `Missing API key for ${names.join(\", \")}`,\n retryable: false,\n });\n }\n return config.keys.pro;\n}\n\n/** Build a ProviderKeys map from env with the given prefix (\"\" for pro, \"ENTERPRISE_\" for enterprise). */\nexport function keysFromEnv(env: NodeJS.ProcessEnv, prefix = \"\"): ProviderKeys {\n const pick = (...names: string[]) =>\n names.map((n) => env[`${prefix}${n}`]).find((v) => v && v.length > 0);\n const keys: ProviderKeys = {};\n const set = (k: Exclude<keyof ProviderKeys, \"aws\">, v: string | undefined) => {\n if (v) keys[k] = v;\n };\n set(\"openai\", pick(\"OPENAI_API_KEY\"));\n set(\"anthropic\", pick(\"ANTHROPIC_API_KEY\"));\n set(\"google\", pick(\"GOOGLE_GENERATIVE_AI_API_KEY\", \"GEMINI_API_KEY\", \"GOOGLE_API_KEY\"));\n set(\"xai\", pick(\"XAI_API_KEY\"));\n set(\"perplexity\", pick(\"PERPLEXITY_API_KEY\"));\n set(\"deepseek\", pick(\"DEEPSEEK_API_KEY\"));\n set(\"moonshot\", pick(\"MOONSHOT_API_KEY\"));\n set(\"minimax\", pick(\"MINIMAX_API_KEY\"));\n set(\"ark\", pick(\"ARK_API_KEY\", \"BYTEPLUS_ARK_API_KEY\", \"BYTEDANCE_API_KEY\"));\n set(\"fal\", pick(\"FAL_KEY\", \"FAL_API_KEY\"));\n set(\"replicate\", pick(\"REPLICATE_API_TOKEN\", \"REPLICATE_API_KEY\"));\n set(\"prodia\", pick(\"PRODIA_API_KEY\", \"PRODIA_TOKEN\"));\n set(\"higgsfield\", pick(\"HIGGSFIELD_API_KEY\"));\n set(\"higgsfieldSecret\", pick(\"HIGGSFIELD_API_SECRET\"));\n set(\"cloudflare\", pick(\"CLOUDFLARE_AI_GATEWAY_TOKEN\", \"CF_AIG_TOKEN\"));\n return keys;\n}\n","import { z } from \"zod\";\nimport { ModelKitError, type ModelKitErrorCode, type ProviderErrorBody } from \"./errors.js\";\nimport { describeThrown } from \"./json.js\";\n\nconst textBody = z.string();\n\n/**\n * One classifier for every adapter. Never retry safety blocks,\n * content_policy_violation, or 4xx other than 429. Retry 429, 5xx, timeouts\n * and network failures. Adapters must not stack their own retry loop on top.\n */\nexport function classifyHttpError(\n status: number | undefined,\n body: ProviderErrorBody,\n provider: string,\n model?: string,\n): ModelKitError {\n const asText = textBody.safeParse(body);\n const text = asText.success ? asText.data : JSON.stringify(body);\n // Match content-block signals that are provider values, not field names:\n // \"safety_settings\" is an invalid-argument field, not a safety block.\n const blocked =\n /content_policy_violation|blockReason|PROHIBITED_CONTENT|moderation_blocked|safety(?![_A-Za-z])/i.test(\n text,\n );\n let code: ModelKitErrorCode = \"provider_rejected\";\n if (blocked) code = \"content_blocked\";\n else if (status === 401 || status === 403) code = \"auth\";\n else if (status === 429) code = \"rate_limited\";\n else if (status === 408 || status === 504) code = \"timeout\";\n else if (status !== undefined && status >= 500) code = \"network\";\n const retryable = code === \"rate_limited\" || code === \"timeout\" || code === \"network\";\n const init: ConstructorParameters<typeof ModelKitError>[0] = {\n code,\n message: `${provider} responded ${status ?? \"?\"}: ${text.slice(0, 500)}`,\n provider,\n body,\n retryable,\n };\n if (status !== undefined) init.status = status;\n if (model !== undefined) init.model = model;\n return new ModelKitError(init);\n}\n\nexport function shouldRetry(err: Error): boolean {\n if (err instanceof ModelKitError) return err.retryable;\n // A caller abort is final, like transportError; a pre-response network failure is not.\n if (err.name === \"AbortError\") return false;\n if (/ECONNRESET|ETIMEDOUT|fetch failed|socket hang up/i.test(err.message)) return true;\n return false;\n}\n\nexport interface RetryOptions {\n attempts?: number;\n baseDelayMs?: number;\n maxDelayMs?: number;\n factor?: number;\n signal?: AbortSignal;\n}\n\nexport async function withRetry<T>(\n fn: (attempt: number) => Promise<T>,\n opts: RetryOptions = {},\n): Promise<T> {\n const attempts = opts.attempts ?? 3;\n const base = opts.baseDelayMs ?? 1000;\n const max = opts.maxDelayMs ?? 10_000;\n const factor = opts.factor ?? 2;\n let last: Error | undefined;\n for (let attempt = 1; attempt <= attempts; attempt++) {\n try {\n return await fn(attempt);\n } catch (cause) {\n last = cause instanceof Error ? cause : new Error(String(cause), { cause });\n if (attempt === attempts || !shouldRetry(last) || opts.signal?.aborted) throw cause;\n await sleep(Math.min(max, base * factor ** (attempt - 1)), opts.signal);\n }\n }\n throw last;\n}\n\nexport function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n const rejectAborted = (): void => {\n reject(new ModelKitError({ code: \"timeout\", message: \"aborted\", retryable: false }));\n };\n if (signal?.aborted) {\n rejectAborted();\n return;\n }\n let timer: ReturnType<typeof setTimeout> | undefined;\n const onAbort = (): void => {\n if (timer !== undefined) clearTimeout(timer);\n rejectAborted();\n };\n timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nfunction throwAborted(): ModelKitError {\n return new ModelKitError({ code: \"timeout\", message: \"aborted\", retryable: false });\n}\n\n/**\n * A rejected fetch (no HTTP status): connection reset, timeout, DNS failure,\n * socket hang up, or a caller abort. Retryable, unlike a provider response.\n */\nexport function transportError(provider: string, cause: unknown, model?: string): ModelKitError {\n const message = cause instanceof Error ? cause.message : String(cause);\n // A caller abort is final; every other pre-response failure is worth another attempt.\n const aborted = cause instanceof Error && cause.name === \"AbortError\";\n const init: ConstructorParameters<typeof ModelKitError>[0] = {\n code: aborted ? \"timeout\" : \"network\",\n message: `${provider} request failed before a response: ${message}`,\n provider,\n retryable: !aborted,\n cause,\n };\n if (model !== undefined) init.model = model;\n return new ModelKitError(init);\n}\n\n/**\n * One classifier for anything an SDK call throws. A ModelKitError passes\n * through; a throw carrying an HTTP status is a provider response; a throw\n * without one (fetch failed, ECONNRESET, DNS, abort) is a transport failure\n * and stays retryable. `status` and `body` override what `describeThrown`\n * reads when the SDK keeps them somewhere else.\n */\nexport function classifyThrown(\n provider: string,\n cause: unknown,\n model?: string,\n override: { status?: number | undefined; body?: ProviderErrorBody } = {},\n): ModelKitError {\n if (cause instanceof ModelKitError) return cause;\n const info = describeThrown(cause);\n const status = override.status ?? info.status;\n if (status === undefined) return transportError(provider, cause, model);\n return classifyHttpError(status, override.body ?? info.body, provider, model);\n}\n\n/** Poll until `check` returns a value. Throws timeout after `timeoutMs`. */\nexport async function pollUntil<T>(\n check: () => Promise<T | undefined>,\n opts: {\n intervalMs: number;\n timeoutMs: number;\n signal?: AbortSignal;\n backoff?: number;\n maxIntervalMs?: number;\n },\n): Promise<T> {\n const start = Date.now();\n let interval = opts.intervalMs;\n for (;;) {\n if (opts.signal?.aborted) throw throwAborted();\n const value = await check();\n if (value !== undefined) return value;\n if (Date.now() - start > opts.timeoutMs)\n throw new ModelKitError({\n code: \"timeout\",\n message: `poll timed out after ${opts.timeoutMs}ms`,\n retryable: false,\n });\n if (opts.signal?.aborted) throw throwAborted();\n await sleep(interval, opts.signal);\n if (opts.backoff)\n interval = Math.min(opts.maxIntervalMs ?? interval * 4, interval * opts.backoff);\n }\n}\n","import { z } from \"zod\";\nimport type { JsonObject, JsonValue } from \"./types.js\";\n\n/** Decodes any provider payload into JsonValue at the I/O boundary. Non-JSON input becomes null. */\nexport const JsonValueSchema: z.ZodType<JsonValue> = z.lazy(() =>\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n z.array(JsonValueSchema),\n z.record(z.string(), JsonValueSchema),\n ]),\n);\n\nexport const JsonObjectSchema: z.ZodType<JsonObject> = z.record(z.string(), JsonValueSchema);\n\n/** Body text of a failed response, decoded to JSON when possible. */\nexport async function readErrorBody(res: Response): Promise<JsonValue> {\n const text = await res.text().catch(() => \"\");\n try {\n return JsonValueSchema.parse(JSON.parse(text));\n } catch {\n return text;\n }\n}\n\n/** Message and status of a thrown SDK error, without typeof probing. */\nconst thrownErrorSchema = z.object({\n message: z.string().optional(),\n status: z.number().optional(),\n statusCode: z.number().optional(),\n responseBody: z.string().optional(),\n});\n\nexport interface ThrownErrorInfo {\n message: string;\n status: number | undefined;\n body: JsonValue;\n}\n\nexport function describeThrown(cause: unknown): ThrownErrorInfo {\n const parsed = thrownErrorSchema.safeParse(cause);\n if (!parsed.success) return { message: String(cause), status: undefined, body: String(cause) };\n const { message, status, statusCode, responseBody } = parsed.data;\n const body: JsonValue = responseBody ?? message ?? String(cause);\n return { message: message ?? String(cause), status: status ?? statusCode, body };\n}\n","import type { LanguageModelV2, LanguageModelV3 } from \"@ai-sdk/provider\";\nimport type {\n FlexibleSchema,\n InferSchema,\n JSONValue,\n LanguageModel,\n LanguageModelUsage,\n Output,\n ToolSet,\n} from \"ai\";\nimport {\n generateObject as aiGenerateObject,\n generateText as aiGenerateText,\n streamObject as aiStreamObject,\n streamText as aiStreamText,\n} from \"ai\";\nimport type { CallContext, CatalogModel, UsageEvent } from \"./types.js\";\n\n/**\n * The AI SDK `LanguageModel` type. A string is a catalog id or alias; a provider\n * instance (`openai(\"gpt-4o\")`) runs through the SDK unchanged, with usage\n * attributed to its own provider and model id.\n */\nexport type CatalogTextModel = LanguageModel;\n\n/** A provider instance the caller built; anything that is not a catalog id string. */\nexport type TextModelInstance = LanguageModelV3 | LanguageModelV2;\n\n// Distribute over Prompt and object-output unions so their required fields survive.\ntype WithCatalogModel<T> = { [K in keyof T]: K extends \"model\" ? CatalogTextModel : T[K] };\ntype DistributiveOmit<T, K extends PropertyKey> = T extends T ? Omit<T, K> : never;\n// Keep schema/output directly inferable; mapping Parameters over the conditional\n// SDK output type would infer its defaults instead of the caller's schema.\ntype ObjectMode<\n SCHEMA extends FlexibleSchema,\n OUTPUT extends ObjectOutput,\n RESULT,\n> = (OUTPUT extends \"enum\"\n ? { enum: Array<RESULT>; output: \"enum\" }\n : OUTPUT extends \"no-schema\"\n ? {}\n : { schema: SCHEMA; schemaName?: string; schemaDescription?: string }) & {\n output?: OUTPUT;\n model: CatalogTextModel;\n};\n\nexport type ObjectOutput = \"object\" | \"array\" | \"enum\" | \"no-schema\";\nexport type DefaultObjectOutput<S extends FlexibleSchema> =\n InferSchema<S> extends string ? \"enum\" : \"object\";\nexport type ObjectResult<S extends FlexibleSchema, O extends ObjectOutput> = O extends \"array\"\n ? Array<InferSchema<S>>\n : InferSchema<S>;\n\nexport type ModelkitGenerateTextOptions<\n TOOLS extends ToolSet,\n OUTPUT extends Output.Output = Output.Output<string, string>,\n> = WithCatalogModel<Parameters<typeof aiGenerateText<TOOLS, OUTPUT>>[0]>;\nexport type ModelkitStreamTextOptions<\n TOOLS extends ToolSet,\n OUTPUT extends Output.Output = Output.Output<string, string, never>,\n> = WithCatalogModel<Parameters<typeof aiStreamText<TOOLS, OUTPUT>>[0]>;\nexport type ModelkitGenerateObjectOptions<\n SCHEMA extends FlexibleSchema = FlexibleSchema<JSONValue>,\n OUTPUT extends ObjectOutput = DefaultObjectOutput<SCHEMA>,\n RESULT = ObjectResult<SCHEMA, OUTPUT>,\n> = DistributiveOmit<\n Parameters<typeof aiGenerateObject<SCHEMA, \"no-schema\", RESULT>>[0],\n \"model\" | \"output\"\n> &\n ObjectMode<SCHEMA, OUTPUT, RESULT>;\nexport type ModelkitStreamObjectOptions<\n SCHEMA extends FlexibleSchema = FlexibleSchema<JSONValue>,\n OUTPUT extends ObjectOutput = DefaultObjectOutput<SCHEMA>,\n RESULT = ObjectResult<SCHEMA, OUTPUT>,\n> = DistributiveOmit<\n Parameters<typeof aiStreamObject<SCHEMA, \"no-schema\", RESULT>>[0],\n \"model\" | \"output\"\n> &\n ObjectMode<SCHEMA, OUTPUT, RESULT>;\n\nexport interface TextMethods {\n generateText<\n TOOLS extends ToolSet,\n OUTPUT extends Output.Output = Output.Output<string, string>,\n >(\n options: ModelkitGenerateTextOptions<TOOLS, OUTPUT>,\n call?: CallContext,\n ): ReturnType<typeof aiGenerateText<TOOLS, OUTPUT>>;\n streamText<\n TOOLS extends ToolSet,\n OUTPUT extends Output.Output = Output.Output<string, string, never>,\n >(\n options: ModelkitStreamTextOptions<TOOLS, OUTPUT>,\n call?: CallContext,\n ): ReturnType<typeof aiStreamText<TOOLS, OUTPUT>>;\n generateObject<\n SCHEMA extends FlexibleSchema = FlexibleSchema<JSONValue>,\n OUTPUT extends ObjectOutput = DefaultObjectOutput<SCHEMA>,\n RESULT = ObjectResult<SCHEMA, OUTPUT>,\n >(\n options: ModelkitGenerateObjectOptions<SCHEMA, OUTPUT, RESULT>,\n call?: CallContext,\n ): ReturnType<typeof aiGenerateObject<SCHEMA, OUTPUT, RESULT>>;\n streamObject<\n SCHEMA extends FlexibleSchema = FlexibleSchema<JSONValue>,\n OUTPUT extends ObjectOutput = DefaultObjectOutput<SCHEMA>,\n RESULT = ObjectResult<SCHEMA, OUTPUT>,\n >(\n options: ModelkitStreamObjectOptions<SCHEMA, OUTPUT, RESULT>,\n call?: CallContext,\n ): ReturnType<typeof aiStreamObject<SCHEMA, OUTPUT, RESULT>>;\n}\n\nexport type AiTextProviderOptions = NonNullable<\n Parameters<typeof aiGenerateText>[0][\"providerOptions\"]\n>;\n\n/**\n * Merge catalog providerOptions under caller providerOptions. The catalog\n * `modelkit` routing hint never reaches the provider. Per-provider objects\n * merge shallowly so a caller can override one key without dropping the rest.\n */\nexport function mergeTextProviderOptions(\n catalog: CatalogModel,\n caller: AiTextProviderOptions | undefined,\n): AiTextProviderOptions {\n const merged: AiTextProviderOptions = {};\n const catalogOptions = catalog.providerOptions ?? {};\n for (const provider of Object.keys(catalogOptions)) {\n if (provider === \"modelkit\") continue;\n const options = catalogOptions[provider];\n if (options) merged[provider] = { ...options };\n }\n if (caller) {\n for (const provider of Object.keys(caller)) {\n if (provider === \"modelkit\") continue;\n const override = caller[provider];\n const base = merged[provider];\n if (base && override) {\n merged[provider] = { ...base, ...override };\n } else if (override) {\n merged[provider] = { ...override };\n }\n }\n }\n return merged;\n}\n\n/**\n * A catalog row standing in for a provider instance the caller passed as `model`.\n * It has no aliases, defaults or providerOptions; usage carries the SDK model id.\n */\nexport function passthroughTextModel(model: TextModelInstance): CatalogModel {\n return {\n id: model.modelId,\n aliases: [],\n label: model.modelId,\n type: \"text\",\n adapter: \"ai-sdk-text\",\n providerModelId: model.modelId,\n lifecycle: \"active\",\n constraints: {},\n defaults: {},\n usage: { unit: \"tokens\", modality: \"TEXT\" },\n pricingKind: \"token\",\n };\n}\n\n/** Canonical token usage for a completed text call. Quantity is total tokens. */\nexport function textUsageEvent(\n model: CatalogModel,\n provider: string,\n usage: LanguageModelUsage,\n): UsageEvent {\n const inputTokens = usage.inputTokens ?? 0;\n const outputTokens = usage.outputTokens ?? 0;\n const total = usage.totalTokens ?? inputTokens + outputTokens;\n return {\n model: model.id,\n provider,\n modality: \"TEXT\",\n unit: \"tokens\",\n quantity: total,\n inputTokens,\n outputTokens,\n };\n}\n","import type { LanguageModel, generateText, StepResult, ToolSet } from \"ai\";\nimport {\n mergeTextProviderOptions,\n textUsageEvent,\n type AiTextProviderOptions,\n type TextModelInstance,\n} from \"./text.js\";\nimport type { CatalogModel, UsageEvent } from \"./types.js\";\n\n/** A text model ready for the SDK: its catalog row (or pass-through stand-in) and billing provider. */\nexport interface ResolvedTextModel {\n entry: CatalogModel;\n languageModel: TextModelInstance;\n provider: string;\n}\n\ntype ResolveTextModel = (model: LanguageModel) => ResolvedTextModel;\ntype PrepareStep<TOOLS extends ToolSet> = NonNullable<\n Parameters<typeof generateText<TOOLS>>[0][\"prepareStep\"]\n>;\ntype StepUsage = Pick<StepResult<ToolSet>, \"usage\">;\n\nexport function createTextSteps(\n initial: ResolvedTextModel,\n resolve: ResolveTextModel,\n callerProviderOptions?: AiTextProviderOptions,\n) {\n const steps = new Map<number, ResolvedTextModel>();\n\n function wrap<TOOLS extends ToolSet>(\n prepareStep: PrepareStep<TOOLS> | undefined,\n ): PrepareStep<TOOLS> {\n return async (options) => {\n const prepared = await prepareStep?.(options);\n const override = prepared?.model;\n const resolved = override === undefined ? undefined : resolve(override);\n // The SDK resets to the initial model for every step without an explicit override.\n const target = resolved ?? initial;\n steps.set(options.stepNumber, target);\n const providerOptions = mergeTextProviderOptions(target.entry, callerProviderOptions);\n for (const [provider, patch] of Object.entries(prepared?.providerOptions ?? {})) {\n if (provider !== \"modelkit\") {\n providerOptions[provider] = { ...providerOptions[provider], ...patch };\n }\n }\n if (resolved) return { ...prepared, model: resolved.languageModel, providerOptions };\n return { ...prepared, providerOptions };\n };\n }\n\n function usage(results: StepUsage[]): UsageEvent[] {\n const grouped = new Map<string, UsageEvent>();\n for (const [index, step] of results.entries()) {\n const target = steps.get(index) ?? initial;\n const event = textUsageEvent(target.entry, target.provider, step.usage);\n const previous = grouped.get(target.entry.id);\n if (previous) {\n previous.quantity += event.quantity;\n previous.inputTokens = (previous.inputTokens ?? 0) + (event.inputTokens ?? 0);\n previous.outputTokens = (previous.outputTokens ?? 0) + (event.outputTokens ?? 0);\n } else {\n grouped.set(target.entry.id, event);\n }\n }\n return [...grouped.values()];\n }\n\n return { wrap, usage };\n}\n","import { createTextSteps, type ResolvedTextModel } from \"./text-steps.js\";\nimport type { CallSettings, DataContent, FlexibleSchema, LanguageModel, ToolSet, Output } from \"ai\";\nimport type { LanguageModelV3 } from \"@ai-sdk/provider\";\nimport {\n generateImage as aiGenerateImage,\n experimental_generateVideo as aiGenerateVideo,\n generateObject as aiGenerateObject,\n generateText as aiGenerateText,\n streamObject as aiStreamObject,\n streamText as aiStreamText,\n} from \"ai\";\nimport { z } from \"zod\";\nimport { toGeneratedImage } from \"./generated-image.js\";\nimport type { Adapter, AdapterContext } from \"./adapters/adapter.js\";\nimport { textKeyName, textProviderOf, textUsesCloudflareGateway } from \"./adapters/ai-sdk-text.js\";\nimport { Catalog } from \"./catalog/registry.js\";\nimport { MODELS } from \"./catalog/models.js\";\nimport { ModelKitError } from \"./errors.js\";\nimport { ADAPTER_KEYS, missingEnterpriseKeys, resolveKeys } from \"./keys.js\";\nimport {\n resolveAudioOptions,\n resolveImageOptions,\n resolveVideoOptions,\n} from \"./resolve-options.js\";\nimport {\n mergeTextProviderOptions,\n passthroughTextModel,\n textUsageEvent,\n type TextMethods,\n type ModelkitGenerateTextOptions,\n type ModelkitStreamTextOptions,\n type ObjectOutput,\n type ModelkitGenerateObjectOptions,\n type ModelkitStreamObjectOptions,\n} from \"./text.js\";\nimport type {\n AdapterId,\n CallContext,\n CatalogModel,\n ImageCallOptions,\n ImageCallResult,\n ImageRequest,\n AudioRequest,\n AudioResult,\n MediaPart,\n MediaRef,\n ModelKitConfig,\n ProviderOptions,\n ProviderKeyName,\n UsageEvent,\n VideoCallJob,\n VideoCallOptions,\n VideoRequest,\n VideoResult,\n Warning,\n} from \"./types.js\";\n\n/** The SDK's streamText option union; `experimental_prepareStep` is a generateText-only alias. */\nexport type StreamTextCallOptions<\n TOOLS extends ToolSet,\n OUTPUT extends Output.Output = Output.Output<string, string, never>,\n> = ModelkitStreamTextOptions<TOOLS, OUTPUT> & {\n /** @deprecated Use `prepareStep`; accepted for parity with `generateText`. */\n experimental_prepareStep?: Parameters<typeof aiStreamText<TOOLS, OUTPUT>>[0][\"prepareStep\"];\n};\n\nexport interface ModelKit extends TextMethods {\n catalog: Catalog;\n /**\n * Generate one or more images. Blocks until the provider returns bytes.\n * `model` is a catalog id or an AI SDK image model instance.\n */\n generateImage(req: ImageCallOptions, call?: CallContext): Promise<ImageCallResult>;\n /**\n * Submit a video job. Await `job.result()` for the final asset.\n * `model` is a catalog id or an AI SDK video model instance.\n */\n generateVideo(req: VideoCallOptions, call?: CallContext): Promise<VideoCallJob>;\n /** AI SDK LanguageModel for chat models. Pair with the catalog's providerOptions. */\n languageModel(modelId: string, call?: CallContext): LanguageModelHandle;\n /** Generate music or a soundtrack. Blocks until the provider returns audio. */\n generateAudio(req: AudioRequest, call?: CallContext): Promise<AudioResult>;\n /**\n * Stream text. Mirrors `TextMethods.streamText` and also accepts the\n * deprecated `experimental_prepareStep` alias that `generateText` takes.\n */\n streamText<\n TOOLS extends ToolSet,\n OUTPUT extends Output.Output = Output.Output<string, string, never>,\n >(\n options: StreamTextCallOptions<TOOLS, OUTPUT>,\n call?: CallContext,\n ): ReturnType<typeof aiStreamText<TOOLS, OUTPUT>>;\n /**\n * Prepare a video or document for a language model call (video understanding).\n * Uses the provider file store when the payload is too large to inline.\n */\n prepareMediaPart(\n modelId: string,\n ref: MediaRef,\n mediaType: string,\n call?: CallContext,\n ): Promise<MediaPart>;\n /** Which options a caller may show for this model. */\n describe(modelId: string): CatalogModel;\n}\n\nexport interface LanguageModelHandle {\n model: LanguageModelV3;\n providerOptions: ProviderOptions;\n catalog: CatalogModel;\n}\n\n/** fal through the Cloudflare passthrough may rely on a key stored on the gateway (BYOK). */\nfunction requiredKeys(model: CatalogModel, config: ModelKitConfig): ProviderKeyName[] {\n if (model.adapter === \"fal\" && config.routing?.fal === \"cloudflare-passthrough\")\n return [\"cloudflare\"];\n if (model.adapter === \"ai-sdk-text\") {\n // The cloudflare route sends both the vendor key and the gateway token, but only\n // for vendors with a gateway slug; the rest fall back to direct and need no token.\n const routing = config.routing ?? {};\n const names: ProviderKeyName[] = [textKeyName(model, routing)];\n if (textUsesCloudflareGateway(model, routing)) names.push(\"cloudflare\");\n return names;\n }\n return ADAPTER_KEYS[model.adapter];\n}\n\n/** Catalog types whose result is an image. */\nconst IMAGE_OUTPUT_TYPES = new Set<CatalogModel[\"type\"]>([\"image\", \"upscale\", \"bg-remove\"]);\n\ninterface DispatchTarget {\n adapter: Adapter;\n ctx: AdapterContext;\n}\n\nexport type AdapterRegistry = Partial<Record<AdapterId, Adapter>>;\n\nfunction combineSignals(\n sdk: AbortSignal | undefined,\n context: AbortSignal | undefined,\n): AbortSignal | undefined {\n return sdk && context ? AbortSignal.any([sdk, context]) : (sdk ?? context);\n}\n\nfunction textAbortOptions(\n sdk: AbortSignal | undefined,\n context: AbortSignal | undefined,\n): Pick<CallSettings, \"abortSignal\"> {\n const abortSignal = combineSignals(sdk, context);\n if (abortSignal) return { abortSignal };\n return {};\n}\n\nconst catalogId = z.string();\nconst exactSize = z.templateLiteral([z.number(), \"x\", z.number()]);\nconst sdkRatio = z.templateLiteral([z.number(), \":\", z.number()]);\nconst sizeTier = z.enum([\"512\", \"1K\", \"2K\", \"4K\"]);\n\n/** A string model is a catalog id or alias; anything else is a provider instance. */\nfunction isCatalogId<M>(model: M | string): model is string {\n return catalogId.safeParse(model).success;\n}\n\n/** An adapter request split from the AI SDK-only extras, with any dropped-option warnings. */\ninterface SplitRequest<R> {\n request: R;\n warnings: Warning[];\n}\n\n/** Split the AI SDK-shaped image options into the adapter request and the SDK-only extras. */\nfunction imageRequestOf(req: ImageCallOptions & { model: string }): SplitRequest<ImageRequest> {\n const { n, size, abortSignal: _signal, providerOptions, ...rest } = req;\n const request: ImageRequest = { ...rest };\n if (n !== undefined && request.count === undefined) request.count = n;\n if (size !== undefined) {\n const exact = exactSize.safeParse(size);\n const tier = sizeTier.safeParse(size);\n if (exact.success) request.exactSize ??= exact.data;\n else if (tier.success) request.size = tier.data;\n }\n const warnings: Warning[] = [];\n if (providerOptions && Object.keys(providerOptions).length > 0) {\n warnings.push({\n code: \"option_ignored\",\n field: \"providerOptions\",\n message: `${req.model} is a catalog model; its provider options come from the catalog row`,\n });\n }\n return { request, warnings };\n}\n\nfunction videoRequestOf(req: VideoCallOptions & { model: string }): SplitRequest<VideoRequest> {\n const { duration, abortSignal: _signal, providerOptions, ...rest } = req;\n const request: VideoRequest = { ...rest };\n if (duration !== undefined && request.durationSeconds === undefined)\n request.durationSeconds = duration;\n const warnings: Warning[] = [];\n if (providerOptions && Object.keys(providerOptions).length > 0) {\n warnings.push({\n code: \"option_ignored\",\n field: \"providerOptions\",\n message: `${req.model} is a catalog model; its provider options come from the catalog row`,\n });\n }\n return { request, warnings };\n}\n\n/** The SDK takes `W:H` only; the kit's \"adaptive\" ratio has no SDK spelling. */\nfunction sdkAspectRatio(ratio: string | undefined): `${number}:${number}` | undefined {\n const parsed = sdkRatio.safeParse(ratio);\n return parsed.success ? parsed.data : undefined;\n}\n\n/** MediaRef as AI SDK data content: url strings stay, bytes pass as a Uint8Array. */\nfunction sdkDataContent(ref: MediaRef): DataContent {\n return \"url\" in ref ? ref.url : ref.bytes;\n}\n\n/** A byte ref keeps its mime type through the SDK's object reference form. */\nfunction sdkReference(ref: MediaRef): DataContent | { data: DataContent; mediaType: string } {\n return \"url\" in ref ? ref.url : { data: ref.bytes, mediaType: ref.mime };\n}\n\n/** An `option_ignored` warning for a field the AI SDK call cannot express. */\nfunction pushIgnored(\n warnings: Warning[],\n field: string,\n from: string | number | undefined,\n modelId: string,\n): void {\n warnings.push({\n code: \"option_ignored\",\n field,\n from,\n message: `${modelId} provider instance does not support ${field}; ignored`,\n });\n}\n\n/** The catalog `modelkit` routing hint is internal; it must never reach the SDK. */\nfunction withoutModelkit(options: ProviderOptions | undefined): ProviderOptions {\n if (!options) return {};\n const { modelkit: _modelkit, ...rest } = options;\n return rest;\n}\n\n/** One log line per call when the resolver or an adapter coerced anything. */\nfunction logCoercions(logger: Pick<Console, \"warn\">, modelId: string, warnings: Warning[]): void {\n if (warnings.length === 0) return;\n logger.warn(`[modelkit] ${modelId} request coerced`, { model: modelId, warnings });\n}\n\nexport function createModelKit(config: ModelKitConfig, adapters: AdapterRegistry): ModelKit {\n const catalog = new Catalog(MODELS).withOverrides(config.catalogOverride ?? []);\n const logger = config.logger ?? console;\n const fetchImpl = config.fetch ?? globalThis.fetch;\n\n function context(model: CatalogModel, call: CallContext, warnings: Warning[]): DispatchTarget {\n const adapter = adapters[model.adapter];\n if (!adapter)\n throw new ModelKitError({\n code: \"unknown_model\",\n message: `No adapter registered for ${model.adapter}`,\n model: model.id,\n });\n const names = requiredKeys(model, config);\n if (call.tier === \"enterprise\") {\n const missing = missingEnterpriseKeys(config, names);\n if (missing.length > 0)\n logger.warn(\n `[modelkit] enterprise keys incomplete for ${model.adapter}; using pro`,\n { missing },\n );\n }\n const keys = resolveKeys(config, names, call.tier);\n const ctx: AdapterContext = {\n model,\n keys,\n routing: config.routing ?? {},\n fetch: fetchImpl,\n logger,\n call,\n warnings,\n };\n if (config.endpoints) ctx.endpoints = config.endpoints;\n if (call.signal) ctx.signal = call.signal;\n return { adapter, ctx };\n }\n\n async function emit(event: UsageEvent): Promise<void> {\n try {\n await config.onUsage?.(event);\n } catch (err) {\n logger.warn(\"[modelkit] usage emit failed\", err);\n }\n }\n\n /** The catalog row's usage unit wins over whatever the adapter declared. */\n function withRowUnit(event: UsageEvent): UsageEvent {\n const row = catalog.get(event.model);\n return row ? { ...event, unit: row.usage.unit } : event;\n }\n\n function textTarget(model: LanguageModel, call: CallContext): ResolvedTextModel {\n if (!isCatalogId(model)) {\n return {\n entry: passthroughTextModel(model),\n languageModel: model,\n provider: model.provider,\n };\n }\n const entry = catalog.require(model);\n if (entry.type !== \"text\")\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${entry.id} is not a text model`,\n model: entry.id,\n });\n const { adapter, ctx } = context(entry, call, []);\n if (!adapter.languageModel)\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${adapter.id} has no language model`,\n model: entry.id,\n });\n return {\n entry,\n languageModel: adapter.languageModel(ctx),\n provider: textProviderOf(entry),\n };\n }\n\n async function passthroughImage(\n req: ImageCallOptions & { model: Exclude<ImageCallOptions[\"model\"], string> },\n call: CallContext,\n ): Promise<ImageCallResult> {\n const {\n model,\n prompt,\n n,\n count,\n size,\n aspectRatio,\n seed,\n providerOptions,\n references,\n exactSize: exactSizeField,\n scaleFactor,\n quality: _quality,\n outputFormat: _outputFormat,\n } = req;\n const options: Parameters<typeof aiGenerateImage>[0] = { model, prompt };\n const warnings: Warning[] = [];\n const quantity = n ?? count;\n if (quantity !== undefined) options.n = quantity;\n // The SDK prompt is string | { images, text }; references ride inside it.\n if (references !== undefined && references.length > 0)\n options.prompt = { images: references.map(sdkDataContent), text: prompt };\n const exact =\n exactSizeField === undefined ? undefined : exactSize.safeParse(exactSizeField);\n if (exact?.success) options.size = exact.data;\n else if (exactSizeField !== undefined)\n pushIgnored(warnings, \"exactSize\", exactSizeField, model.modelId);\n const requested = size === undefined ? undefined : exactSize.safeParse(size);\n if (requested?.success) options.size ??= requested.data;\n else if (size !== undefined) pushIgnored(warnings, \"size\", size, model.modelId);\n const ratio = sdkAspectRatio(aspectRatio);\n if (ratio) options.aspectRatio = ratio;\n else if (aspectRatio !== undefined)\n pushIgnored(warnings, \"aspectRatio\", aspectRatio, model.modelId);\n if (seed !== undefined) options.seed = seed;\n if (providerOptions) options.providerOptions = providerOptions;\n // The SDK image call has no quality or output-format input; the model\n // decides the encoding itself.\n if (_quality !== undefined) pushIgnored(warnings, \"quality\", _quality, model.modelId);\n if (_outputFormat !== undefined)\n pushIgnored(warnings, \"outputFormat\", _outputFormat, model.modelId);\n if (scaleFactor !== undefined)\n pushIgnored(warnings, \"scaleFactor\", scaleFactor, model.modelId);\n logCoercions(logger, model.modelId, warnings);\n const abortSignal = combineSignals(req.abortSignal, call.signal);\n if (abortSignal) options.abortSignal = abortSignal;\n const result = await aiGenerateImage(options);\n const images = result.images.map((file) =>\n toGeneratedImage({ bytes: file.uint8Array, mime: file.mediaType }),\n );\n const usage: UsageEvent = {\n model: model.modelId,\n provider: model.provider,\n modality: \"IMAGE\",\n unit: \"images\",\n quantity: images.length,\n };\n await emit(usage);\n return { image: images[0]!, images, usage, raw: result, warnings };\n }\n\n function passthroughVideo(\n req: VideoCallOptions & { model: Exclude<VideoCallOptions[\"model\"], string> },\n call: CallContext,\n ): VideoCallJob {\n const {\n model,\n prompt,\n aspectRatio,\n duration,\n durationSeconds,\n seed,\n providerOptions,\n firstFrame,\n lastFrame,\n sourceVideo,\n referenceImages,\n referenceVideos,\n referenceAudios,\n resolution,\n generateAudio,\n negativePrompt: _negativePrompt,\n cfgScale: _cfgScale,\n promptExpansion: _promptExpansion,\n mode: _mode,\n } = req;\n const seconds = duration ?? durationSeconds;\n const abortSignal = combineSignals(req.abortSignal, call.signal);\n const options: Parameters<typeof aiGenerateVideo>[0] = { model, prompt };\n const warnings: Warning[] = [];\n const ratio =\n sdkAspectRatio(aspectRatio) ?? (aspectRatio === \"adaptive\" ? \"adaptive\" : undefined);\n if (ratio) options.aspectRatio = ratio;\n else if (aspectRatio !== undefined)\n pushIgnored(warnings, \"aspectRatio\", aspectRatio, model.modelId);\n if (seconds !== undefined) options.duration = seconds;\n if (seed !== undefined) options.seed = seed;\n if (generateAudio !== undefined) options.generateAudio = generateAudio;\n const frames = [\n ...(firstFrame\n ? [{ image: sdkDataContent(firstFrame), frameType: \"first_frame\" as const }]\n : []),\n ...(lastFrame\n ? [{ image: sdkDataContent(lastFrame), frameType: \"last_frame\" as const }]\n : []),\n ];\n if (frames.length > 0) options.frameImages = frames;\n const references = [\n ...(referenceImages ?? []).map(sdkDataContent),\n ...(referenceVideos ?? []).map(sdkReference),\n ];\n if (references.length > 0) {\n if (frames.length > 0) {\n // The SDK drops inputReferences when frameImages are present.\n warnings.push({\n code: \"option_ignored\",\n field: \"inputReferences\",\n from: references.length,\n message: `${model.modelId} provider instance ignores references when frames are set`,\n });\n } else {\n options.inputReferences = references;\n }\n }\n // The SDK video call has no edit or audio-reference input; the tiered\n // resolution labels are provider spellings the SDK cannot express.\n if (sourceVideo) pushIgnored(warnings, \"sourceVideo\", undefined, model.modelId);\n if (referenceAudios?.length)\n pushIgnored(warnings, \"referenceAudios\", referenceAudios.length, model.modelId);\n if (resolution !== undefined)\n pushIgnored(warnings, \"resolution\", resolution, model.modelId);\n if (_negativePrompt !== undefined)\n pushIgnored(warnings, \"negativePrompt\", undefined, model.modelId);\n if (_cfgScale !== undefined) pushIgnored(warnings, \"cfgScale\", _cfgScale, model.modelId);\n if (_promptExpansion !== undefined)\n pushIgnored(warnings, \"promptExpansion\", _promptExpansion, model.modelId);\n if (_mode !== undefined) pushIgnored(warnings, \"mode\", _mode, model.modelId);\n if (providerOptions) options.providerOptions = providerOptions;\n if (abortSignal) options.abortSignal = abortSignal;\n logCoercions(logger, model.modelId, warnings);\n const pending = aiGenerateVideo(options);\n let settled: VideoResult | undefined;\n let failed = false;\n const done = pending.then(async (result) => {\n const usage: UsageEvent = {\n model: model.modelId,\n provider: model.provider,\n modality: \"VIDEO\",\n unit: \"seconds\",\n quantity: seconds ?? 0,\n ...(seconds !== undefined && { durationSeconds: seconds }),\n };\n settled = {\n video: { bytes: result.video.uint8Array, mime: result.video.mediaType },\n usage,\n raw: result,\n };\n await emit(usage);\n return settled;\n });\n // The job may be polled without result() being awaited yet.\n done.catch(() => {\n failed = true;\n });\n return {\n jobId: `ai-sdk:${model.provider}:${model.modelId}`,\n warnings,\n async poll() {\n if (settled) return { status: \"succeeded\", raw: settled.raw };\n if (failed) return { status: \"failed\" };\n return { status: \"running\" };\n },\n result: () => done,\n };\n }\n\n return {\n catalog,\n describe: (id) => catalog.require(id),\n async generateImage(req, call = {}) {\n if (!isCatalogId(req.model)) {\n return passthroughImage({ ...req, model: req.model }, call);\n }\n const model = catalog.require(req.model);\n if (!IMAGE_OUTPUT_TYPES.has(model.type))\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} is not an image model`,\n model: model.id,\n });\n const { request: input, warnings: inputWarnings } = imageRequestOf({\n ...req,\n model: req.model,\n });\n const { request, warnings } = resolveImageOptions(\n model,\n input,\n call.onUnsupported ?? \"error\",\n );\n warnings.push(...inputWarnings);\n logCoercions(logger, model.id, warnings);\n const signal = combineSignals(req.abortSignal, call.signal);\n const { adapter, ctx } = context(model, signal ? { ...call, signal } : call, warnings);\n if (!adapter.generateImage)\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${adapter.id} cannot generate images`,\n model: model.id,\n });\n const result = await adapter.generateImage(request, ctx);\n const usage = { ...result.usage, model: model.id, unit: model.usage.unit };\n await emit(usage);\n const images = result.images.map(toGeneratedImage);\n const first = images[0];\n if (!first)\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: `${model.id} returned no image`,\n model: model.id,\n });\n return { ...result, usage, image: first, images, warnings };\n },\n async generateVideo(req, call = {}) {\n if (!isCatalogId(req.model)) {\n return passthroughVideo({ ...req, model: req.model }, call);\n }\n const model = catalog.require(req.model);\n if (model.type !== \"video\")\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} is not a video model`,\n model: model.id,\n });\n const { request: input, warnings: inputWarnings } = videoRequestOf({\n ...req,\n model: req.model,\n });\n const { request, warnings } = resolveVideoOptions(\n model,\n input,\n call.onUnsupported ?? \"error\",\n );\n warnings.push(...inputWarnings);\n logCoercions(logger, model.id, warnings);\n const signal = combineSignals(req.abortSignal, call.signal);\n const { adapter, ctx } = context(model, signal ? { ...call, signal } : call, warnings);\n if (!adapter.generateVideo)\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${adapter.id} cannot generate video`,\n model: model.id,\n });\n const job = await adapter.generateVideo(request, ctx);\n const result = job.result.bind(job);\n let settled: Promise<VideoResult> | undefined;\n return {\n ...job,\n warnings,\n result(opts) {\n if (settled) return settled;\n // Concurrent and repeated readers share one usage emit; a failed wait\n // clears the cache so the caller can retry the wait.\n const pending = result(opts).then(\n (out) =>\n emit({\n ...out.usage,\n model: model.id,\n unit: model.usage.unit,\n }).then(() => out),\n (cause) => {\n settled = undefined;\n throw cause;\n },\n );\n settled = pending;\n return pending;\n },\n };\n },\n async generateAudio(req, call = {}) {\n const model = catalog.require(req.model);\n if (model.type !== \"audio\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} is not an audio model`,\n model: model.id,\n });\n }\n const { abortSignal: _signal, ...request } = req;\n const { request: resolved, warnings } = resolveAudioOptions(\n model,\n request,\n call.onUnsupported ?? \"error\",\n );\n logCoercions(logger, model.id, warnings);\n const signal = combineSignals(req.abortSignal, call.signal);\n const { adapter, ctx } = context(model, signal ? { ...call, signal } : call, warnings);\n if (!adapter.generateAudio) {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${adapter.id} cannot generate audio`,\n model: model.id,\n });\n }\n const result = await adapter.generateAudio(resolved, ctx);\n await emit({ ...result.usage, model: model.id, unit: model.usage.unit });\n return result;\n },\n async prepareMediaPart(modelId, ref, mediaType, call = {}) {\n const model = catalog.require(modelId);\n const { adapter, ctx } = context(model, call, []);\n // Gemini text models share Google's file store with the google-genai adapter.\n const fileStore =\n model.adapter === \"ai-sdk-text\" &&\n textKeyName(model, config.routing ?? {}) === \"google\"\n ? adapters[\"google-genai\"]\n : adapter;\n if (fileStore?.prepareMediaPart) return fileStore.prepareMediaPart(ref, mediaType, ctx);\n // Providers without a file store take the reference inline.\n return \"url\" in ref\n ? { type: \"file\", data: ref.url, mediaType }\n : { type: \"file\", data: ref.bytes, mediaType };\n },\n languageModel(modelId, call = {}) {\n const { entry, languageModel: model } = textTarget(modelId, call);\n if (model.specificationVersion !== \"v3\")\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${entry.id} did not resolve to a v3 language model`,\n model: entry.id,\n });\n return {\n model,\n providerOptions: withoutModelkit(entry.providerOptions),\n catalog: entry,\n };\n },\n async generateText<TOOLS extends ToolSet, OUTPUT extends Output.Output>(\n options: ModelkitGenerateTextOptions<TOOLS, OUTPUT>,\n call: CallContext = {},\n ) {\n const target = textTarget(options.model, call);\n const steps = createTextSteps(\n target,\n (model) => textTarget(model, call),\n options.providerOptions,\n );\n const result = await aiGenerateText({\n ...options,\n ...textAbortOptions(options.abortSignal, call.signal),\n model: target.languageModel,\n providerOptions: {},\n prepareStep: steps.wrap<TOOLS>(\n options.prepareStep ?? options.experimental_prepareStep,\n ),\n });\n for (const event of steps.usage(result.steps)) await emit(withRowUnit(event));\n return result;\n },\n streamText<TOOLS extends ToolSet, OUTPUT extends Output.Output>(\n options: StreamTextCallOptions<TOOLS, OUTPUT>,\n call: CallContext = {},\n ) {\n const target = textTarget(options.model, call);\n const steps = createTextSteps(\n target,\n (model) => textTarget(model, call),\n options.providerOptions,\n );\n const callerOnFinish = options.onFinish;\n return aiStreamText({\n ...options,\n ...textAbortOptions(options.abortSignal, call.signal),\n model: target.languageModel,\n providerOptions: {},\n prepareStep: steps.wrap<TOOLS>(\n options.prepareStep ?? options.experimental_prepareStep,\n ),\n onFinish: async (event) => {\n for (const usage of steps.usage(event.steps)) await emit(withRowUnit(usage));\n await callerOnFinish?.(event);\n },\n });\n },\n async generateObject<SCHEMA extends FlexibleSchema, OUTPUT extends ObjectOutput, RESULT>(\n options: ModelkitGenerateObjectOptions<SCHEMA, OUTPUT, RESULT>,\n call: CallContext = {},\n ) {\n const { entry, languageModel, provider } = textTarget(options.model, call);\n // SAFETY: The public options change only model. Replacing it restores the exact SDK\n // options; TypeScript cannot reduce the generic conditional output union.\n const sdkOptions = {\n ...options,\n ...textAbortOptions(options.abortSignal, call.signal),\n model: languageModel,\n providerOptions: mergeTextProviderOptions(entry, options.providerOptions),\n } as Parameters<typeof aiGenerateObject<SCHEMA, OUTPUT, RESULT>>[0];\n const result = await aiGenerateObject<SCHEMA, OUTPUT, RESULT>(sdkOptions);\n await emit(withRowUnit(textUsageEvent(entry, provider, result.usage)));\n return result;\n },\n streamObject<SCHEMA extends FlexibleSchema, OUTPUT extends ObjectOutput, RESULT>(\n options: ModelkitStreamObjectOptions<SCHEMA, OUTPUT, RESULT>,\n call: CallContext = {},\n ) {\n const { entry, languageModel, provider } = textTarget(options.model, call);\n const callerOnFinish = options.onFinish;\n // SAFETY: Only the catalog model is replaced; every SDK option retains its\n // original value and generic type, including schema and finish callbacks.\n const sdkOptions = {\n ...options,\n ...textAbortOptions(options.abortSignal, call.signal),\n model: languageModel,\n providerOptions: mergeTextProviderOptions(entry, options.providerOptions),\n onFinish: async (\n event: Parameters<\n NonNullable<\n Parameters<typeof aiStreamObject<SCHEMA, OUTPUT, RESULT>>[0][\"onFinish\"]\n >\n >[0],\n ) => {\n await emit(withRowUnit(textUsageEvent(entry, provider, event.usage)));\n await callerOnFinish?.(event);\n },\n } as Parameters<typeof aiStreamObject<SCHEMA, OUTPUT, RESULT>>[0];\n return aiStreamObject<SCHEMA, OUTPUT, RESULT>(sdkOptions);\n },\n };\n}\n","import { ModelKitError } from \"../errors.js\";\nimport { JsonValueSchema } from \"../json.js\";\nimport { classifyHttpError } from \"../retry.js\";\nimport type { JsonValue, MediaRef } from \"../types.js\";\n\n/** Narrow a MediaRef to its URL variant. */\nexport function isUrlRef(ref: MediaRef): ref is { url: string } {\n return \"url\" in ref;\n}\n\n/** The kit's canonical abort error; a caller abort is final and never retried. */\nexport function abortedError(): ModelKitError {\n return new ModelKitError({ code: \"timeout\", message: \"aborted\", retryable: false });\n}\n\n/** Reject before any provider request when the caller's signal is already aborted. */\nexport function throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) throw abortedError();\n}\n\n/** Base64-encode raw bytes without depending on node Buffer. */\nexport function mediaRefToBase64(bytes: Uint8Array): string {\n let binary = \"\";\n const CHUNK = 0x8000;\n for (let i = 0; i < bytes.length; i += CHUNK) {\n binary += String.fromCharCode(...bytes.subarray(i, i + CHUNK));\n }\n return btoa(binary);\n}\n\n/** Decode a base64 string to bytes without depending on node Buffer. */\nexport function base64ToBytes(b64: string): Uint8Array {\n const binary = atob(b64);\n const out = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) out[i] = binary.charCodeAt(i);\n return out;\n}\n\n/**\n * Encode a ref as a data URL. URL refs pass through unchanged; byte refs are\n * base64-encoded with their mime type.\n */\nexport function mediaRefToDataUrl(ref: MediaRef): string {\n if (isUrlRef(ref)) return ref.url;\n return `data:${ref.mime};base64,${mediaRefToBase64(ref.bytes)}`;\n}\n\n/** A ref as a provider URL; the adapter-facing name for `mediaRefToDataUrl`. */\nexport const refToUrl = mediaRefToDataUrl;\n\n/** Read a response body as JSON, falling back to its text for non-JSON payloads. */\nexport async function readBody(res: Response): Promise<JsonValue> {\n const text = await res.text().catch(() => \"\");\n try {\n const decoded = JsonValueSchema.safeParse(JSON.parse(text));\n return decoded.success ? decoded.data : text;\n } catch {\n return text;\n }\n}\n\nexport interface MediaRefFetchOptions {\n signal?: AbortSignal | undefined;\n provider?: string;\n model?: string;\n}\n\n/**\n * Resolve a ref to bytes. Byte refs pass through; URL refs are fetched with\n * the adapter's fetch so tests can inject vi.fn(). An HTTP failure is\n * classified like any provider response, so a 5xx stays a retryable network\n * error instead of a plain rejected promise.\n */\nexport async function mediaRefToBytes(\n ref: MediaRef,\n fetch: typeof globalThis.fetch,\n options: MediaRefFetchOptions = {},\n): Promise<{ bytes: Uint8Array; mime: string }> {\n if (!isUrlRef(ref)) return { bytes: ref.bytes, mime: ref.mime };\n const init: RequestInit = {};\n if (options.signal !== undefined) init.signal = options.signal;\n const res = await fetch(ref.url, init);\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw classifyHttpError(\n res.status,\n text,\n options.provider ?? \"media-reference\",\n options.model,\n );\n }\n const mime =\n res.headers.get(\"content-type\")?.split(\";\")[0]?.trim().toLowerCase() || \"image/png\";\n return { bytes: new Uint8Array(await res.arrayBuffer()), mime };\n}\n","import { mediaRefToBase64 } from \"./adapters/media-ref.js\";\nimport type { GeneratedImage, ImageBytes } from \"./types.js\";\n\n/** Add the AI SDK `GeneratedFile` accessors to adapter image bytes. base64 is computed on first read. */\nexport function toGeneratedImage(image: ImageBytes): GeneratedImage {\n let base64: string | undefined;\n return {\n bytes: image.bytes,\n mime: image.mime,\n get uint8Array() {\n return image.bytes;\n },\n get mediaType() {\n return image.mime;\n },\n get base64() {\n base64 ??= mediaRefToBase64(image.bytes);\n return base64;\n },\n };\n}\n","import { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createPerplexity } from \"@ai-sdk/perplexity\";\nimport { createXai } from \"@ai-sdk/xai\";\nimport { createDeepSeek } from \"@ai-sdk/deepseek\";\nimport { createMoonshotAI } from \"@ai-sdk/moonshotai\";\nimport type { LanguageModelV3 } from \"@ai-sdk/provider\";\nimport { z } from \"zod\";\nimport { ModelKitError } from \"../errors.js\";\nimport type { CatalogModel, ProviderKeyName, Routing } from \"../types.js\";\nimport type { Adapter, AdapterContext } from \"./adapter.js\";\n\nconst TEXT_PROVIDERS = [\n \"openai\",\n \"anthropic\",\n \"google\",\n \"xai\",\n \"perplexity\",\n \"deepseek\",\n \"moonshot\",\n \"minimax\",\n] as const;\n\nexport type TextProvider = (typeof TEXT_PROVIDERS)[number];\n\nconst textProviderSchema = z.enum(TEXT_PROVIDERS);\n\nfunction isTextProvider(value: unknown): value is TextProvider {\n return textProviderSchema.safeParse(value).success;\n}\n\n/** Providers without a native @ai-sdk package speak the OpenAI chat protocol. */\nconst OPENAI_COMPATIBLE_BASE_URLS: Partial<Record<TextProvider, string>> = {\n minimax: \"https://api.minimax.io/v1\",\n};\n\n/**\n * Cloudflare AI Gateway path per provider. Others cannot go through the gateway.\n * The gateway mirrors each vendor's URL after the host, and the SDK clients only\n * append the resource path (Anthropic \"/messages\", xAI \"/chat/completions\",\n * Google \"/models/...\"), so a vendor whose default base has an API version needs\n * it here: Anthropic and xAI both use \"/v1\", Google uses \"/v1beta\".\n */\nconst GATEWAY_SLUGS: Partial<Record<TextProvider, string>> = {\n openai: \"openai\",\n anthropic: \"anthropic/v1\",\n google: \"google-ai-studio/v1beta\",\n xai: \"grok/v1\",\n perplexity: \"perplexity-ai\",\n deepseek: \"deepseek\",\n};\n\n/**\n * Provider detection: an explicit `providerOptions.modelkit.provider` in the catalog\n * row wins; otherwise the providerModelId prefix decides.\n * Bedrock inference-profile ids (us.anthropic.*) detect as anthropic.\n */\nexport function detectTextProvider(modelId: string): TextProvider {\n const id = modelId.toLowerCase();\n if (id.startsWith(\"claude\") || id.includes(\"anthropic.\")) return \"anthropic\";\n if (id.startsWith(\"gemini\") || id.startsWith(\"gemma\")) return \"google\";\n if (id.startsWith(\"grok\")) return \"xai\";\n if (id.startsWith(\"sonar\")) return \"perplexity\";\n if (id.startsWith(\"deepseek\")) return \"deepseek\";\n if (id.startsWith(\"kimi\") || id.startsWith(\"moonshot\")) return \"moonshot\";\n if (id.startsWith(\"minimax\")) return \"minimax\";\n if (\n id.startsWith(\"gpt-\") ||\n id.startsWith(\"chatgpt\") ||\n /^o[134]/.test(id) ||\n id.startsWith(\"openai/\")\n )\n return \"openai\";\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `ai-sdk-text cannot detect a provider for \"${modelId}\". Set providerOptions.provider to one of ${TEXT_PROVIDERS.join(\", \")}.`,\n });\n}\n\n/** The single key a text call needs, so enterprise-to-pro fallback works per provider. */\nexport function textKeyName(model: CatalogModel, _routing: Routing): ProviderKeyName {\n return textProviderOf(model);\n}\n\n/**\n * Provider for a text catalog row: an explicit `providerOptions.modelkit.provider`\n * wins; otherwise the providerModelId prefix decides.\n */\nexport function textProviderOf(model: CatalogModel): TextProvider {\n const explicit = model.providerOptions?.[\"modelkit\"]?.[\"provider\"];\n return isTextProvider(explicit) ? explicit : detectTextProvider(model.providerModelId);\n}\n\n/**\n * True when the cloudflare route actually sends this row through the gateway.\n * Vendors without a gateway slug fall back to direct, so the gateway token is not required.\n */\nexport function textUsesCloudflareGateway(model: CatalogModel, routing: Routing): boolean {\n if (routing.text !== \"cloudflare\") return false;\n return GATEWAY_SLUGS[textProviderOf(model)] !== undefined;\n}\n\nexport interface TextRoute {\n provider: TextProvider;\n /** Which native client builds the model. \"openai-compatible\" uses createOpenAI with a custom baseURL. */\n client:\n | \"openai\"\n | \"anthropic\"\n | \"google\"\n | \"xai\"\n | \"perplexity\"\n | \"deepseek\"\n | \"moonshot\"\n | \"openai-compatible\";\n modelId: string;\n keyName: ProviderKeyName;\n baseURL?: string;\n headers?: Record<string, string>;\n}\n\nexport interface TextClientSettings {\n apiKey: string;\n fetch: typeof fetch;\n baseURL?: string;\n headers?: Record<string, string>;\n name?: string;\n}\n\nfunction nativeClientFor(provider: TextProvider): TextRoute[\"client\"] {\n switch (provider) {\n case \"openai\":\n return \"openai\";\n case \"anthropic\":\n return \"anthropic\";\n case \"google\":\n return \"google\";\n case \"xai\":\n return \"xai\";\n case \"perplexity\":\n return \"perplexity\";\n case \"deepseek\":\n return \"deepseek\";\n case \"moonshot\":\n return \"moonshot\";\n default:\n return \"openai-compatible\";\n }\n}\n\n/**\n * Pure routing decision, exported as a test seam.\n * direct: native client, provider default baseURL (OpenAI-compatible baseURL for the small vendors).\n * cloudflare: native client pointed at the AI Gateway slug with cf-aig-authorization; vendors\n * without a gateway slug fall back to direct with a warning.\n */\nexport function resolveTextRoute(ctx: AdapterContext): TextRoute {\n const provider = textProviderOf(ctx.model);\n const mode = ctx.routing.text ?? \"direct\";\n\n if (provider === \"anthropic\" && ctx.routing.anthropic === \"bedrock\") {\n // @ai-sdk/amazon-bedrock is not a dependency. Cowork keeps its Bedrock client\n // and passes the model through catalogOverride until the transport lands here.\n throw new ModelKitError({\n code: \"unsupported_option\",\n message:\n \"ai-sdk-text has no Bedrock transport (@ai-sdk/amazon-bedrock is not installed). \" +\n \"Pass the Bedrock model through catalogOverride with providerOptions.bedrockModel and resolve it outside the SDK.\",\n provider: \"ai-sdk-text\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n\n const compatBase = OPENAI_COMPATIBLE_BASE_URLS[provider];\n const route: TextRoute = {\n provider,\n client: compatBase ? \"openai-compatible\" : nativeClientFor(provider),\n modelId: ctx.model.providerModelId,\n keyName: provider,\n };\n if (compatBase) route.baseURL = compatBase;\n\n if (mode === \"cloudflare\") {\n const slug = GATEWAY_SLUGS[provider];\n if (!slug) {\n ctx.logger.warn(\n `[modelkit] ${provider} has no Cloudflare AI Gateway slug; using direct`,\n );\n return route;\n }\n const cf = ctx.routing.cloudflare;\n if (!cf) {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: \"routing.text is cloudflare but routing.cloudflare is not configured\",\n provider: \"ai-sdk-text\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const token = ctx.keys.cloudflare;\n if (!token) throw missingKey(ctx, \"cloudflare\");\n route.baseURL = `https://gateway.ai.cloudflare.com/v1/${cf.accountId}/${cf.gatewayId}/${slug}`;\n route.headers = { \"cf-aig-authorization\": `Bearer ${token}` };\n }\n return route;\n}\n\nfunction missingKey(ctx: AdapterContext, name: ProviderKeyName): ModelKitError {\n return new ModelKitError({\n code: \"auth\",\n message: `Missing API key for ${name}`,\n provider: \"ai-sdk-text\",\n model: ctx.model.id,\n retryable: false,\n });\n}\n\nexport const aiSdkTextAdapter: Adapter = {\n id: \"ai-sdk-text\",\n languageModel(ctx: AdapterContext): LanguageModelV3 {\n const route = resolveTextRoute(ctx);\n const apiKey = ctx.keys[route.keyName];\n if (!apiKey) throw missingKey(ctx, route.keyName);\n // Every create* accepts the same subset; ctx.fetch is threaded through so tests can inject vi.fn().\n const settings: TextClientSettings = { apiKey, fetch: ctx.fetch };\n if (route.baseURL !== undefined) settings.baseURL = route.baseURL;\n if (route.headers !== undefined) settings.headers = route.headers;\n switch (route.client) {\n case \"anthropic\":\n return createAnthropic(settings)(route.modelId);\n case \"google\":\n return createGoogleGenerativeAI(settings)(route.modelId);\n case \"xai\":\n return createXai(settings)(route.modelId);\n case \"perplexity\":\n // Native provider keeps providerMetadata.perplexity.cost for usage records.\n return createPerplexity(settings)(route.modelId);\n case \"deepseek\":\n return createDeepSeek(settings)(route.modelId);\n case \"moonshot\":\n return createMoonshotAI(settings)(route.modelId);\n case \"openai-compatible\":\n return createOpenAI({\n ...settings,\n name: route.provider,\n }).chat(route.modelId);\n case \"openai\":\n return createOpenAI(settings)(route.modelId);\n }\n },\n};\n","import { z } from \"zod\";\nimport { ModelKitError, type ProviderErrorBody } from \"../errors.js\";\nimport {\n classifyHttpError,\n classifyThrown,\n pollUntil,\n withRetry,\n type RetryOptions,\n} from \"../retry.js\";\nimport type {\n AspectRatio,\n ImageRequest,\n ImageSize,\n UsageEvent,\n VideoJob,\n VideoRequest,\n} from \"../types.js\";\nimport type { Adapter, AdapterContext } from \"./adapter.js\";\nimport { refToUrl, throwIfAborted } from \"./media-ref.js\";\n\nconst ARK_BASE_URL = \"https://ark.ap-southeast.bytepluses.com/api/v3\";\nconst SUBMIT_PATH = \"/contents/generations/tasks\";\nconst SEEDANCE_POLL_INTERVAL_MS = 15000;\nconst RESULT_TIMEOUT_MS = 15 * 60 * 1000;\nconst VIDEO_URL_TTL_MS = 24 * 60 * 60 * 1000;\n\n/** config.endpoints.ark override, else the documented BytePlus endpoint. */\nfunction arkBaseUrl(ctx: AdapterContext): string {\n return ctx.endpoints?.ark ?? ARK_BASE_URL;\n}\n\nconst SEEDREAM_SIZES: Record<\"1K\" | \"2K\" | \"4K\", Record<string, string>> = {\n \"1K\": {\n \"1:1\": \"1024x1024\",\n \"4:3\": \"1152x864\",\n \"3:4\": \"864x1152\",\n \"16:9\": \"1424x800\",\n \"9:16\": \"800x1424\",\n \"3:2\": \"1248x832\",\n \"2:3\": \"832x1248\",\n \"21:9\": \"1568x672\",\n \"9:21\": \"672x1568\",\n \"4:5\": \"864x1080\",\n \"5:4\": \"1080x864\",\n },\n \"2K\": {\n \"1:1\": \"2048x2048\",\n \"4:3\": \"2304x1728\",\n \"3:4\": \"1728x2304\",\n \"16:9\": \"2848x1600\",\n \"9:16\": \"1600x2848\",\n \"3:2\": \"2496x1664\",\n \"2:3\": \"1664x2496\",\n \"21:9\": \"3136x1344\",\n \"9:21\": \"1344x3136\",\n \"4:5\": \"1728x2160\",\n \"5:4\": \"2160x1728\",\n },\n // 4K keeps the long edge at Ark's 4096 cap (a doubled 2K entry would exceed\n // it); sides are multiples of 16.\n \"4K\": {\n \"1:1\": \"4096x4096\",\n \"4:3\": \"4096x3072\",\n \"3:4\": \"3072x4096\",\n \"16:9\": \"4096x2304\",\n \"9:16\": \"2304x4096\",\n \"3:2\": \"4096x2736\",\n \"2:3\": \"2736x4096\",\n \"21:9\": \"4096x1760\",\n \"9:21\": \"1760x4096\",\n \"4:5\": \"3280x4096\",\n \"5:4\": \"4096x3280\",\n },\n};\n\nexport const arkAdapter: Adapter = {\n id: \"ark\",\n async generateImage(req: ImageRequest, ctx: AdapterContext) {\n throwIfAborted(ctx.signal);\n return generateSeedreamImage(req, ctx);\n },\n async generateVideo(req: VideoRequest, ctx: AdapterContext): Promise<VideoJob> {\n throwIfAborted(ctx.signal);\n return generateSeedanceVideo(req, ctx);\n },\n};\n\nfunction arkKey(ctx: AdapterContext): string {\n const key = ctx.keys.ark;\n if (!key) {\n throw new ModelKitError({\n code: \"auth\",\n message: \"Missing Ark API key\",\n provider: \"ark\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n return key;\n}\n\nfunction throwArkError(status: number | undefined, body: ProviderErrorBody, model: string): never {\n const parsed = z.string().safeParse(body);\n const text = parsed.success ? parsed.data : JSON.stringify(body ?? \"\");\n if (/sensitive.?content|human.?face/i.test(text)) {\n const init: ConstructorParameters<typeof ModelKitError>[0] = {\n code: \"content_blocked\",\n message: `ark rejected the request: ${text.slice(0, 500)}`,\n provider: \"ark\",\n model,\n body,\n retryable: false,\n };\n if (status !== undefined) init.status = status;\n throw new ModelKitError(init);\n }\n if (status === undefined) {\n // A provider verdict with no HTTP status (task completed but empty): not a transport failure.\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: `ark rejected the request: ${text.slice(0, 500)}`,\n provider: \"ark\",\n model,\n body,\n retryable: false,\n });\n }\n throw classifyHttpError(status, body, \"ark\", model);\n}\n\nfunction seedreamSize(aspect: AspectRatio | undefined, size: ImageSize | undefined): string {\n const tier = size === \"4K\" || size === \"1K\" ? size : \"2K\";\n const table = SEEDREAM_SIZES[tier];\n return table[aspect ?? \"\"] ?? table[\"1:1\"] ?? \"2048x2048\";\n}\n\n// response_format b64_json carries no mime; the encoding is whatever the model\n// produced, so read it off the bytes instead of the requested outputFormat.\nfunction sniffedImageMime(bytes: Uint8Array): string {\n if (\n bytes.length >= 4 &&\n bytes[0] === 0x89 &&\n bytes[1] === 0x50 &&\n bytes[2] === 0x4e &&\n bytes[3] === 0x47\n )\n return \"image/png\";\n if (\n bytes.length >= 12 &&\n bytes[0] === 0x52 &&\n bytes[1] === 0x49 &&\n bytes[2] === 0x46 &&\n bytes[3] === 0x46 &&\n bytes[8] === 0x57 &&\n bytes[9] === 0x45 &&\n bytes[10] === 0x42 &&\n bytes[11] === 0x50\n )\n return \"image/webp\";\n return \"image/jpeg\";\n}\n\nconst SeedreamImageSchema = z.object({\n url: z.string().optional(),\n b64_json: z.string().optional(),\n});\n\nconst SeedreamResponseSchema = z.object({\n data: z.array(SeedreamImageSchema).optional(),\n error: z.object({ message: z.string().optional(), code: z.string().optional() }).optional(),\n});\n\ntype SeedreamResponse = z.infer<typeof SeedreamResponseSchema>;\n\ninterface SeedreamImageBody {\n model: string;\n prompt: string;\n size: string;\n response_format: string;\n watermark: boolean;\n seed?: number;\n image?: string | string[];\n}\n\nfunction retryOptsFor(ctx: AdapterContext, attempts = 3): RetryOptions {\n const opts: RetryOptions = { attempts };\n if (ctx.signal !== undefined) opts.signal = ctx.signal;\n return opts;\n}\n\nfunction fetchInitFor(ctx: AdapterContext, init: RequestInit): RequestInit {\n if (ctx.signal !== undefined) init.signal = ctx.signal;\n return init;\n}\n\n/** A rejected fetch is a transport failure; callers wrap in withRetry to retry it. */\nfunction arkFetch(ctx: AdapterContext, url: string, init: RequestInit): Promise<Response> {\n return ctx.fetch(url, fetchInitFor(ctx, init)).catch((cause: unknown) => {\n throw classifyThrown(\"ark\", cause, ctx.model.id);\n });\n}\n\nasync function generateSeedreamImage(req: ImageRequest, ctx: AdapterContext) {\n const key = arkKey(ctx);\n const modelId = ctx.model.id;\n const size = seedreamSize(req.aspectRatio, req.size);\n const refs = (req.references ?? []).map(refToUrl);\n const body: SeedreamImageBody = {\n model: ctx.model.providerModelId,\n prompt: req.prompt,\n size,\n response_format: \"b64_json\",\n watermark: false,\n };\n if (req.seed !== undefined) body.seed = req.seed;\n const firstRef = refs[0];\n if (refs.length === 1 && firstRef !== undefined) body.image = firstRef;\n else if (refs.length > 1) body.image = refs;\n\n const data = await withRetry(async () => {\n const res = await arkFetch(ctx, `${arkBaseUrl(ctx)}/images/generations`, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${key}`, \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throwArkError(res.status, text, modelId);\n }\n const parsed = SeedreamResponseSchema.safeParse(await res.json());\n const decoded: SeedreamResponse = parsed.success ? parsed.data : {};\n return decoded;\n }, retryOptsFor(ctx));\n const first = data.data?.[0];\n let bytes: Uint8Array;\n if (first?.b64_json) {\n bytes = Buffer.from(first.b64_json, \"base64\");\n } else if (first?.url) {\n const imageUrl = first.url;\n const res = await arkFetch(ctx, imageUrl, {});\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throwArkError(res.status, text, modelId);\n }\n bytes = new Uint8Array(await res.arrayBuffer());\n } else {\n throwArkError(undefined, \"Seedream returned no image URL or base64 data\", modelId);\n }\n const usage: UsageEvent = {\n model: modelId,\n provider: \"ark\",\n modality: \"IMAGE\",\n unit: \"images\",\n quantity: 1,\n };\n if (req.size !== undefined) usage.imageSize = req.size;\n if (req.quality !== undefined) usage.imageQuality = req.quality;\n return { images: [{ bytes, mime: sniffedImageMime(bytes) }], usage, raw: data };\n}\n\nconst SeedanceUsageSchema = z.object({\n total_tokens: z.number().optional(),\n completion_tokens: z.number().optional(),\n});\n\nconst SeedanceResponseSchema = z.object({\n id: z.string().optional(),\n status: z.string().optional(),\n content: z.object({ video_url: z.string().optional() }).optional(),\n usage: SeedanceUsageSchema.optional(),\n duration: z.number().optional(),\n framespersecond: z.number().optional(),\n resolution: z.string().optional(),\n error: z.union([z.string(), z.object({ message: z.string().optional() })]).optional(),\n});\n\ntype SeedanceResponse = z.infer<typeof SeedanceResponseSchema>;\n\nconst SeedanceErrorMessageSchema = z.object({ message: z.string().optional() });\n\ntype SeedanceContentPart =\n | { type: \"text\"; text: string }\n | { type: \"image_url\"; image_url: { url: string }; role: string }\n | { type: \"video_url\"; video_url: { url: string }; role: string }\n | { type: \"audio_url\"; audio_url: { url: string }; role: string };\n\ninterface SeedanceSubmitBody {\n model: string;\n content: SeedanceContentPart[];\n duration: number;\n resolution: string;\n ratio?: string;\n generate_audio?: boolean;\n seed?: number;\n watermark?: boolean;\n}\n\ninterface SeedancePollOpts {\n intervalMs: number;\n timeoutMs: number;\n signal?: AbortSignal;\n}\n\nfunction seedanceUsage(ctx: AdapterContext, req: VideoRequest, duration: number): UsageEvent {\n const usage: UsageEvent = {\n model: ctx.model.id,\n provider: \"ark\",\n modality: \"VIDEO\",\n unit: \"seconds\",\n quantity: duration,\n durationSeconds: duration,\n };\n if (req.resolution !== undefined) usage.resolution = req.resolution;\n return usage;\n}\n\nfunction seedanceErrorMessage(error: SeedanceResponse[\"error\"], status: string): string {\n const asString = z.string().safeParse(error);\n if (asString.success) return asString.data;\n const asObject = SeedanceErrorMessageSchema.safeParse(error);\n if (asObject.success && asObject.data.message !== undefined) return asObject.data.message;\n return `Seedance task ${status}`;\n}\n\nasync function generateSeedanceVideo(req: VideoRequest, ctx: AdapterContext): Promise<VideoJob> {\n const key = arkKey(ctx);\n const modelId = ctx.model.id;\n const duration = req.durationSeconds ?? 5;\n const resolution = req.resolution ?? \"720p\";\n\n const content: SeedanceContentPart[] = [{ type: \"text\", text: req.prompt }];\n if (req.firstFrame) {\n content.push({\n type: \"image_url\",\n image_url: { url: refToUrl(req.firstFrame) },\n role: \"first_frame\",\n });\n }\n if (req.lastFrame) {\n content.push({\n type: \"image_url\",\n image_url: { url: refToUrl(req.lastFrame) },\n role: \"last_frame\",\n });\n }\n for (const ref of req.referenceImages ?? []) {\n content.push({\n type: \"image_url\",\n image_url: { url: refToUrl(ref) },\n role: \"reference_image\",\n });\n }\n if (req.sourceVideo) {\n content.push({\n type: \"video_url\",\n video_url: { url: refToUrl(req.sourceVideo) },\n role: \"reference_video\",\n });\n }\n for (const ref of req.referenceVideos ?? []) {\n content.push({\n type: \"video_url\",\n video_url: { url: refToUrl(ref) },\n role: \"reference_video\",\n });\n }\n for (const ref of req.referenceAudios ?? []) {\n content.push({\n type: \"audio_url\",\n audio_url: { url: refToUrl(ref) },\n role: \"reference_audio\",\n });\n }\n\n // ratio is omitted for frame-anchored runs; resolveOptions already dropped\n // it there, never re-add it here.\n const hasFrameAnchor = Boolean(req.firstFrame ?? req.sourceVideo);\n const body: SeedanceSubmitBody = {\n model: ctx.model.providerModelId,\n content,\n duration,\n resolution,\n };\n if (!hasFrameAnchor && req.aspectRatio !== undefined) body.ratio = req.aspectRatio;\n if (req.generateAudio !== undefined) body.generate_audio = req.generateAudio;\n if (req.seed !== undefined) body.seed = req.seed;\n if (req.watermark !== undefined) body.watermark = req.watermark;\n\n const submit = await withRetry(async () => {\n const res = await arkFetch(ctx, `${arkBaseUrl(ctx)}${SUBMIT_PATH}`, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${key}`, \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throwArkError(res.status, text, modelId);\n }\n const parsed = SeedanceResponseSchema.safeParse(await res.json());\n const decoded: SeedanceResponse = parsed.success ? parsed.data : {};\n return decoded;\n }, retryOptsFor(ctx));\n if (!submit.id) throwArkError(undefined, \"Seedance task create returned no id\", modelId);\n const jobId: string = submit.id;\n const usage = seedanceUsage(ctx, req, duration);\n\n const fetchStatus = async (): Promise<SeedanceResponse | undefined> => {\n const res = await arkFetch(ctx, `${arkBaseUrl(ctx)}${SUBMIT_PATH}/${jobId}`, {\n headers: { Authorization: `Bearer ${key}` },\n });\n if (!res.ok) {\n if (res.status === 429 || res.status >= 500) return undefined;\n const text = await res.text().catch(() => \"\");\n throwArkError(res.status, text, modelId);\n }\n const parsed = SeedanceResponseSchema.safeParse(await res.json());\n if (!parsed.success) return {};\n return parsed.data;\n };\n\n return {\n jobId,\n async poll() {\n const polled = await fetchStatus();\n if (!polled) return { status: \"running\" };\n const status = (polled.status ?? \"queued\").toLowerCase();\n if (status === \"succeeded\") return { status: \"succeeded\", raw: polled };\n if (status === \"failed\" || status === \"expired\" || status === \"cancelled\") {\n return { status: \"failed\", raw: polled };\n }\n if (status === \"queued\" || status === \"pending\")\n return { status: \"pending\", raw: polled };\n return { status: \"running\", raw: polled };\n },\n async result(opts) {\n const optSignal = opts?.signal ?? ctx.signal;\n const pollOpts: SeedancePollOpts = {\n intervalMs: opts?.pollIntervalMs ?? SEEDANCE_POLL_INTERVAL_MS,\n timeoutMs: opts?.timeoutMs ?? RESULT_TIMEOUT_MS,\n };\n if (optSignal !== undefined) pollOpts.signal = optSignal;\n return pollUntil(async () => {\n const polled = await fetchStatus();\n if (!polled) return undefined;\n const status = (polled.status ?? \"queued\").toLowerCase();\n if (status === \"succeeded\") {\n const url = polled.content?.video_url;\n if (!url)\n throwArkError(\n undefined,\n \"Seedance task succeeded but returned no video_url\",\n modelId,\n );\n // Ark splits the bill as completion (output) plus the\n // remainder (input); a bare total is not enough to split.\n const tokens = polled.usage;\n if (\n tokens?.total_tokens !== undefined &&\n tokens.completion_tokens !== undefined\n ) {\n usage.inputTokens = tokens.total_tokens - tokens.completion_tokens;\n usage.outputTokens = tokens.completion_tokens;\n }\n return {\n video: { url, expiresAt: new Date(Date.now() + VIDEO_URL_TTL_MS) },\n usage,\n raw: polled,\n };\n }\n if (status === \"failed\" || status === \"expired\" || status === \"cancelled\") {\n throwArkError(undefined, seedanceErrorMessage(polled.error, status), modelId);\n }\n return undefined;\n }, pollOpts);\n },\n };\n}\n","import { z } from \"zod\";\nimport { createFalClient } from \"@fal-ai/client\";\nimport type { Adapter, AdapterContext } from \"./adapter.js\";\nimport { ModelKitError, isModelKitError } from \"../errors.js\";\nimport type { ProviderErrorBody } from \"../errors.js\";\nimport { classifyHttpError, classifyThrown, pollUntil, sleep, withRetry } from \"../retry.js\";\nimport { JsonValueSchema, describeThrown } from \"../json.js\";\nimport { readBody, refToUrl, throwIfAborted } from \"./media-ref.js\";\nimport type {\n ImageRequest,\n ImageResult,\n JsonObject,\n JsonValue,\n UsageEvent,\n VideoJob,\n VideoRequest,\n} from \"../types.js\";\n\nconst MUSE_T2I_ENDPOINT = \"meta/muse-image/text-to-image\";\nconst MUSE_EDIT_ENDPOINT = \"meta/muse-image/edit\";\nconst KLING_O1_ENDPOINT = \"fal-ai/kling-video/o1/video-to-video/reference\";\n\nconst FAL_QUEUE_HOST = \"https://queue.fal.run\";\nconst PASSTHROUGH_POLL_MS = 2000;\nconst PASSTHROUGH_MAX_WAIT_MS = 180_000;\n\n/** Minimal structural subset of the fal SDK the adapter uses. */\nexport interface FalClientLike {\n subscribe(\n endpoint: string,\n options: { input: JsonObject; abortSignal?: AbortSignal },\n ): Promise<JsonValue>;\n queue: {\n submit(\n endpoint: string,\n options: { input: JsonObject; abortSignal?: AbortSignal },\n ): Promise<{ requestId: string }>;\n status(\n endpoint: string,\n options: { requestId: string; abortSignal?: AbortSignal },\n ): Promise<{ status: string }>;\n result(\n endpoint: string,\n options: { requestId: string; abortSignal?: AbortSignal },\n ): Promise<JsonValue>;\n };\n}\n\nexport interface FalAdapterDeps {\n createFalClient: (opts: { credentials: string; fetch?: typeof fetch }) => FalClientLike;\n}\n\nconst falSubscribePayloadSchema = z.object({ data: JsonValueSchema });\n\nfunction defaultCreateFalClient(opts: {\n credentials: string;\n fetch?: typeof fetch;\n}): FalClientLike {\n const client = createFalClient(opts);\n return {\n async subscribe(endpoint, options) {\n const outcome = await client.subscribe(endpoint, options);\n const unwrapped = falSubscribePayloadSchema.safeParse(outcome);\n if (unwrapped.success) return unwrapped.data.data;\n return JsonValueSchema.parse(outcome);\n },\n queue: {\n async submit(endpoint, options) {\n const submitted = await client.queue.submit(endpoint, {\n input: options.input,\n ...(options.abortSignal !== undefined\n ? { abortSignal: options.abortSignal }\n : {}),\n });\n return { requestId: submitted.request_id };\n },\n async status(endpoint, options) {\n const current = await client.queue.status(endpoint, {\n requestId: options.requestId,\n ...(options.abortSignal !== undefined\n ? { abortSignal: options.abortSignal }\n : {}),\n });\n return { status: current.status };\n },\n async result(endpoint, options) {\n const outcome = await client.queue.result(endpoint, {\n requestId: options.requestId,\n ...(options.abortSignal !== undefined\n ? { abortSignal: options.abortSignal }\n : {}),\n });\n return JsonValueSchema.parse(outcome.data);\n },\n },\n };\n}\n\nconst defaultDeps: FalAdapterDeps = { createFalClient: defaultCreateFalClient };\n\nexport function createFalAdapter(deps: FalAdapterDeps = defaultDeps): Adapter {\n return {\n id: \"fal\",\n generateImage: (req, ctx) => {\n throwIfAborted(ctx.signal);\n return generateMuseImage(req, ctx, deps);\n },\n generateVideo: (req, ctx) => {\n throwIfAborted(ctx.signal);\n return generateFalVideo(req, ctx, deps);\n },\n };\n}\n\nexport const falAdapter: Adapter = createFalAdapter();\n\nconst falDetailSchema = z.object({ detail: JsonValueSchema });\n\n// fal wraps failures as { detail: ... }; surface the detail so the classifier\n// sees content_policy_violation and the message quotes the real reason.\nfunction liftDetail(body: ProviderErrorBody): ProviderErrorBody {\n const parsed = falDetailSchema.safeParse(body);\n const detail = parsed.success ? parsed.data.detail : undefined;\n return detail ?? body;\n}\n\nfunction falError(\n status: number | undefined,\n body: ProviderErrorBody,\n model: string,\n): ModelKitError {\n return classifyHttpError(status, liftDetail(body), \"fal\", model);\n}\n\nconst falSdkThrownSchema = z.object({\n status: z.number().optional(),\n statusCode: z.number().optional(),\n body: JsonValueSchema.optional(),\n message: z.string().optional(),\n});\n\nfunction falSdkError(cause: unknown, model: string): ModelKitError {\n const parsed = falSdkThrownSchema.safeParse(cause);\n if (parsed.success) {\n const status = parsed.data.status ?? parsed.data.statusCode;\n const body: ProviderErrorBody = parsed.data.body ?? parsed.data.message ?? String(cause);\n return classifyThrown(\"fal\", cause, model, { status, body: liftDetail(body) });\n }\n const info = describeThrown(cause);\n return classifyThrown(\"fal\", cause, model, {\n status: info.status,\n body: liftDetail(info.body),\n });\n}\n\ninterface GatewayConfig {\n baseUrl: string;\n falKey?: string;\n cfToken?: string;\n}\n\n/**\n * Passthrough needs the gateway plus at least one credential: the fal key\n * (forwarded as Bearer) or the gateway token alone when the fal key is stored\n * on the gateway (BYOK), which is how Cowork's gateway is set up.\n */\nfunction gatewayConfig(ctx: AdapterContext): GatewayConfig {\n const cf = ctx.routing.cloudflare;\n const falKey = ctx.keys.fal;\n const cfToken = ctx.keys.cloudflare;\n if (!cf?.accountId || !cf?.gatewayId || (!falKey && !cfToken)) {\n throw new ModelKitError({\n code: \"auth\",\n message:\n \"fal passthrough is not configured. Set routing.cloudflare and FAL_KEY or the gateway token (BYOK).\",\n provider: \"fal\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const config: GatewayConfig = {\n baseUrl: `https://gateway.ai.cloudflare.com/v1/${cf.accountId}/${cf.gatewayId}/fal`,\n };\n if (falKey) config.falKey = falKey;\n if (cfToken) config.cfToken = cfToken;\n return config;\n}\n\ntype FalGatewayHeaders = {\n Authorization?: string;\n \"x-fal-target-url\": string;\n \"Content-Type\"?: string;\n \"cf-aig-authorization\"?: string;\n};\n\nasync function gatewayFetch(\n cfg: GatewayConfig,\n fetchImpl: typeof fetch,\n targetUrl: string,\n init: { method: \"GET\" | \"POST\"; body?: string },\n): Promise<Response> {\n const headers: FalGatewayHeaders = { \"x-fal-target-url\": targetUrl };\n if (cfg.falKey) headers.Authorization = `Bearer ${cfg.falKey}`;\n if (init.body) headers[\"Content-Type\"] = \"application/json\";\n if (cfg.cfToken) headers[\"cf-aig-authorization\"] = `Bearer ${cfg.cfToken}`;\n const request: RequestInit = { method: init.method, headers };\n if (init.body !== undefined) request.body = init.body;\n return fetchImpl(cfg.baseUrl, request);\n}\n\nconst falQueueSubmitSchema = z.object({\n request_id: z.string(),\n status_url: z.string(),\n response_url: z.string(),\n});\n\nconst falQueueStatusSchema = z.object({ status: z.string() });\n\ninterface FalPollOptions {\n intervalMs: number;\n timeoutMs: number;\n signal?: AbortSignal;\n}\n\n// Submit → poll → result through the Cloudflare passthrough, exactly as\n// cowork's fal-gateway does. sync_mode forces inline data: URIs for images.\nasync function passthroughRequest(\n ctx: AdapterContext,\n endpoint: string,\n input: JsonObject,\n): Promise<JsonValue> {\n const cfg = gatewayConfig(ctx);\n const submitRes = await gatewayFetch(cfg, ctx.fetch, `${FAL_QUEUE_HOST}/${endpoint}`, {\n method: \"POST\",\n body: JSON.stringify({ ...input, sync_mode: true }),\n });\n if (!submitRes.ok) {\n throw falError(submitRes.status, await readBody(submitRes), ctx.model.id);\n }\n const submitParsed = falQueueSubmitSchema.safeParse(await submitRes.json());\n if (!submitParsed.success) {\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: `fal ${endpoint} submit returned no status URL`,\n provider: \"fal\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const submit = submitParsed.data;\n const deadline = Date.now() + PASSTHROUGH_MAX_WAIT_MS;\n for (;;) {\n if (Date.now() > deadline) {\n throw new ModelKitError({\n code: \"timeout\",\n message: `fal job timed out after ${PASSTHROUGH_MAX_WAIT_MS}ms (${endpoint})`,\n provider: \"fal\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n await sleep(PASSTHROUGH_POLL_MS, ctx.signal);\n const statusRes = await gatewayFetch(cfg, ctx.fetch, submit.status_url, { method: \"GET\" });\n if (!statusRes.ok) {\n throw falError(statusRes.status, await readBody(statusRes), ctx.model.id);\n }\n const statusParsed = falQueueStatusSchema.safeParse(await statusRes.json());\n if (statusParsed.success && statusParsed.data.status === \"COMPLETED\") break;\n }\n const resultRes = await gatewayFetch(cfg, ctx.fetch, submit.response_url, { method: \"GET\" });\n if (!resultRes.ok) {\n throw falError(resultRes.status, await readBody(resultRes), ctx.model.id);\n }\n return JsonValueSchema.parse(await resultRes.json());\n}\n\nfunction falClientOf(ctx: AdapterContext, deps: FalAdapterDeps): FalClientLike {\n const falKey = ctx.keys.fal;\n if (!falKey) {\n throw new ModelKitError({\n code: \"auth\",\n message: \"Missing API key for fal\",\n provider: \"fal\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n return deps.createFalClient({ credentials: falKey, fetch: ctx.fetch });\n}\n\nasync function subscribe(\n ctx: AdapterContext,\n deps: FalAdapterDeps,\n endpoint: string,\n input: JsonObject,\n): Promise<JsonValue> {\n const client = falClientOf(ctx, deps);\n const options = {\n input,\n ...(ctx.signal !== undefined ? { abortSignal: ctx.signal } : {}),\n };\n try {\n return await withRetry(\n async () => {\n try {\n return await client.subscribe(endpoint, options);\n } catch (cause) {\n throw falSdkError(cause, ctx.model.id);\n }\n },\n ctx.signal !== undefined ? { signal: ctx.signal } : {},\n );\n } catch (cause) {\n throw falSdkError(cause, ctx.model.id);\n }\n}\n\nasync function runJob(\n ctx: AdapterContext,\n deps: FalAdapterDeps,\n endpoint: string,\n input: JsonObject,\n): Promise<JsonValue> {\n if (ctx.routing.fal === \"cloudflare-passthrough\") {\n try {\n return await passthroughRequest(ctx, endpoint, input);\n } catch (cause) {\n if (isModelKitError(cause)) throw cause;\n throw falSdkError(cause, ctx.model.id);\n }\n }\n return subscribe(ctx, deps, endpoint, input);\n}\n\nfunction imageUsage(ctx: AdapterContext, req: ImageRequest, quantity: number): UsageEvent {\n const event: UsageEvent = {\n model: ctx.model.id,\n provider: \"fal\",\n modality: \"IMAGE\",\n unit: \"images\",\n quantity,\n };\n if (req.size !== undefined) event.imageSize = req.size;\n if (req.quality !== undefined) event.imageQuality = req.quality;\n return event;\n}\n\nfunction videoUsage(ctx: AdapterContext, req: VideoRequest, duration: number): UsageEvent {\n const event: UsageEvent = {\n model: ctx.model.id,\n provider: \"fal\",\n modality: \"VIDEO\",\n unit: \"seconds\",\n quantity: duration,\n durationSeconds: duration,\n };\n if (req.resolution !== undefined) event.resolution = req.resolution;\n return event;\n}\n\nasync function decodeImage(\n ctx: AdapterContext,\n url: string,\n contentType?: string | null,\n): Promise<{ bytes: Uint8Array; mime: string }> {\n if (url.startsWith(\"data:\")) {\n const comma = url.indexOf(\",\");\n const mime = url.slice(5, comma).split(\";\")[0] || contentType || \"image/png\";\n return { bytes: Uint8Array.from(Buffer.from(url.slice(comma + 1), \"base64\")), mime };\n }\n const res = await ctx.fetch(url);\n if (!res.ok) throw falError(res.status, await readBody(res), ctx.model.id);\n const mime = res.headers.get(\"content-type\") ?? contentType ?? \"image/png\";\n return { bytes: new Uint8Array(await res.arrayBuffer()), mime };\n}\n\ntype MuseImageInput = {\n prompt: string;\n num_images: number;\n output_format: string;\n aspect_ratio?: string;\n image_urls?: string[];\n};\n\nconst museImageResultSchema = z.object({\n images: z\n .array(\n z.object({\n url: z.string().optional(),\n content_type: z.string().nullable().optional(),\n }),\n )\n .optional(),\n});\n\nasync function generateMuseImage(\n req: ImageRequest,\n ctx: AdapterContext,\n deps: FalAdapterDeps,\n): Promise<ImageResult> {\n const refs = (req.references ?? []).map(refToUrl);\n const isEdit = refs.length > 0;\n const input: MuseImageInput = {\n prompt: req.prompt,\n num_images: req.count ?? 1,\n output_format: req.outputFormat ?? \"png\",\n };\n // resolveOptions already snapped the ratio; adaptive has no fal equivalent.\n if (req.aspectRatio !== undefined && req.aspectRatio !== \"adaptive\") {\n input.aspect_ratio = req.aspectRatio;\n }\n if (isEdit) input.image_urls = refs;\n // Reference images over 4096px on either side are rejected by fal\n // (image_too_large). This package has no resizer; callers downscale first.\n // A catalog row may name a full fal endpoint id (\"owner/model/path\") for other\n // fal image models with the same {images:[{url}]} result contract.\n const id = ctx.model.providerModelId;\n const custom = id.includes(\"/\") && !id.startsWith(\"meta/muse-image\") ? id : undefined;\n const endpoint = custom ?? (isEdit ? MUSE_EDIT_ENDPOINT : MUSE_T2I_ENDPOINT);\n const payload = await runJob(ctx, deps, endpoint, input);\n const parsed = museImageResultSchema.safeParse(payload);\n const images = parsed.success ? (parsed.data.images ?? []) : [];\n const firstUrl = images[0]?.url;\n if (images.length === 0 || firstUrl === undefined) {\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: \"fal Meta Muse returned no image\",\n provider: \"fal\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const files = await Promise.all(\n images.flatMap((img) => {\n if (img.url === undefined) return [];\n return [decodeImage(ctx, img.url, img.content_type ?? undefined)];\n }),\n );\n return {\n images: files.map((f) => ({ bytes: f.bytes, mime: f.mime })),\n usage: imageUsage(ctx, req, files.length),\n raw: payload,\n };\n}\n\n// Exact catalog ids, not substrings: the family decides the endpoint path and\n// resolution default, so an unrelated id must not inherit h3-max behavior.\nconst H3_MAX_MODEL_IDS: ReadonlySet<string> = new Set([\n \"minimax/h3-max\",\n \"minimax/h3-max/reference-to-video\",\n]);\n\nfunction minimaxFamily(providerModelId: string): \"h3\" | \"h3-max\" {\n return H3_MAX_MODEL_IDS.has(providerModelId.toLowerCase()) ? \"h3-max\" : \"h3\";\n}\n\ntype MinimaxVideoInput = {\n prompt: string;\n duration: number;\n resolution: string;\n prompt_expansion_mode: string;\n enable_safety_checker?: boolean;\n seed?: number;\n aspect_ratio?: string;\n reference_image_urls?: string[];\n reference_video_urls?: string[];\n reference_audio_urls?: string[];\n image_url?: string;\n end_image_url?: string;\n};\n\nfunction minimaxBase(req: VideoRequest, family: \"h3\" | \"h3-max\"): MinimaxVideoInput {\n const resolution = (\n family === \"h3-max\" ? (req.resolution ?? \"768p\") : (req.resolution ?? \"2k\")\n ).toUpperCase();\n const input: MinimaxVideoInput = {\n prompt: req.prompt.trim(),\n duration: req.durationSeconds ?? 5,\n resolution,\n prompt_expansion_mode: req.promptExpansion ?? \"balanced\",\n };\n // fal defaults enable_safety_checker to true; only override when the caller opts out.\n if (req.safetyChecker !== undefined) input.enable_safety_checker = req.safetyChecker;\n if (req.seed !== undefined) input.seed = req.seed;\n return input;\n}\n\nconst KLING_MODEL_IDS: ReadonlySet<string> = new Set([\n \"fal-ai/kling-video/o1/video-to-video/reference\",\n]);\n\nfunction isKling(providerModelId: string): boolean {\n return KLING_MODEL_IDS.has(providerModelId.toLowerCase());\n}\n\ntype KlingO1VideoInput = {\n prompt: string;\n video_url: string;\n duration: string;\n aspect_ratio?: string;\n image_urls?: string[];\n};\n\nfunction klingO1Input(req: VideoRequest): KlingO1VideoInput {\n const source = req.sourceVideo ? refToUrl(req.sourceVideo) : undefined;\n if (!source) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: \"kling-o1-v2v requires sourceVideo\",\n provider: \"fal\",\n retryable: false,\n });\n }\n const duration = Math.min(10, Math.max(3, Math.round(req.durationSeconds ?? 5)));\n const input: KlingO1VideoInput = {\n prompt: req.prompt,\n video_url: source,\n duration: String(duration),\n };\n // The endpoint has no \"adaptive\" literal: omit the ratio so Kling infers it.\n if (req.aspectRatio !== \"adaptive\") {\n input.aspect_ratio =\n req.aspectRatio === \"16:9\" || req.aspectRatio === \"9:16\" || req.aspectRatio === \"1:1\"\n ? req.aspectRatio\n : \"auto\";\n }\n const refs = (req.referenceImages ?? []).map(refToUrl);\n if (refs.length > 0) input.image_urls = refs;\n return input;\n}\n\nconst falVideoResultSchema = z.object({\n video: z.object({ url: z.string().optional() }).optional(),\n});\n\nfunction extractVideoUrl(result: JsonValue, endpoint: string, model: string): string {\n const parsed = falVideoResultSchema.safeParse(result);\n const url = parsed.success ? parsed.data.video?.url : undefined;\n if (url === undefined) {\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: `fal ${endpoint} returned no video URL`,\n provider: \"fal\",\n model,\n retryable: false,\n });\n }\n return url;\n}\n\nasync function generateFalVideo(\n req: VideoRequest,\n ctx: AdapterContext,\n deps: FalAdapterDeps,\n): Promise<VideoJob> {\n const providerModelId = ctx.model.providerModelId;\n if (isKling(providerModelId)) {\n const input = klingO1Input(req);\n if (ctx.routing.fal === \"cloudflare-passthrough\") {\n return await passthroughVideoJob(ctx, req, KLING_O1_ENDPOINT, input);\n }\n return await submitQueueJob(ctx, req, deps, KLING_O1_ENDPOINT, input);\n }\n const family = minimaxFamily(providerModelId);\n const refs = {\n images: (req.referenceImages ?? []).map(refToUrl),\n videos: (req.referenceVideos ?? []).map(refToUrl),\n audios: (req.referenceAudios ?? []).map(refToUrl),\n };\n const firstFrame = req.firstFrame ? refToUrl(req.firstFrame) : undefined;\n const lastFrame = req.lastFrame ? refToUrl(req.lastFrame) : undefined;\n const base = minimaxBase(req, family);\n let endpoint: string;\n if (refs.images.length + refs.videos.length + refs.audios.length > 0) {\n endpoint = `minimax/${family}/reference-to-video`;\n base.aspect_ratio = req.aspectRatio ?? \"adaptive\";\n if (refs.images.length > 0) base.reference_image_urls = refs.images;\n if (refs.videos.length > 0) base.reference_video_urls = refs.videos;\n if (refs.audios.length > 0) base.reference_audio_urls = refs.audios;\n } else if (firstFrame ?? lastFrame) {\n endpoint = `minimax/${family}/image-to-video`;\n if (firstFrame) base.image_url = firstFrame;\n if (lastFrame) base.end_image_url = lastFrame;\n } else {\n endpoint = `minimax/${family}/text-to-video`;\n // The t2v schema only accepts concrete ratios; \"adaptive\" means \"let the\n // model infer\", which here is the provider's own 16:9 default.\n if (req.aspectRatio !== undefined && req.aspectRatio !== \"adaptive\") {\n base.aspect_ratio = req.aspectRatio;\n }\n }\n if (ctx.routing.fal === \"cloudflare-passthrough\") {\n return await passthroughVideoJob(ctx, req, endpoint, base);\n }\n return await submitQueueJob(ctx, req, deps, endpoint, base);\n}\n\n// Direct video endpoints submit to the queue and poll; result() waits with the\n// caller's timeout and signal. Only the submit is retried, so a late 429 during\n// polling cannot re-run a finished job.\nasync function submitQueueJob(\n ctx: AdapterContext,\n req: VideoRequest,\n deps: FalAdapterDeps,\n endpoint: string,\n input: JsonObject,\n): Promise<VideoJob> {\n const client = falClientOf(ctx, deps);\n let submitted: { requestId: string };\n try {\n submitted = await withRetry(\n async () => {\n try {\n return await client.queue.submit(endpoint, {\n input,\n ...(ctx.signal !== undefined ? { abortSignal: ctx.signal } : {}),\n });\n } catch (cause) {\n throw falSdkError(cause, ctx.model.id);\n }\n },\n ctx.signal !== undefined ? { signal: ctx.signal } : {},\n );\n } catch (cause) {\n throw falSdkError(cause, ctx.model.id);\n }\n return queuedVideoJob(ctx, req, client, endpoint, submitted.requestId);\n}\n\nfunction queuedVideoJob(\n ctx: AdapterContext,\n req: VideoRequest,\n client: FalClientLike,\n endpoint: string,\n requestId: string,\n): VideoJob {\n const readStatus = async (): Promise<string> => {\n try {\n const options = {\n requestId,\n ...(ctx.signal !== undefined ? { abortSignal: ctx.signal } : {}),\n };\n return (await client.queue.status(endpoint, options)).status;\n } catch (cause) {\n throw falSdkError(cause, ctx.model.id);\n }\n };\n const duration = req.durationSeconds ?? 5;\n return {\n jobId: requestId,\n async poll() {\n try {\n const status = await readStatus();\n if (status === \"COMPLETED\") return { status: \"succeeded\" as const };\n if (status === \"IN_QUEUE\") return { status: \"pending\" as const };\n return { status: \"running\" as const };\n } catch (cause) {\n if (isModelKitError(cause) && !cause.retryable)\n return { status: \"failed\" as const };\n return { status: \"pending\" as const };\n }\n },\n async result(opts) {\n const signal = opts?.signal ?? ctx.signal;\n const pollOptions: FalPollOptions = {\n intervalMs: opts?.pollIntervalMs ?? PASSTHROUGH_POLL_MS,\n timeoutMs: opts?.timeoutMs ?? 15 * 60_000,\n };\n if (signal !== undefined) pollOptions.signal = signal;\n const queueOptions = {\n requestId,\n ...(signal !== undefined ? { abortSignal: signal } : {}),\n };\n const payload = await pollUntil<JsonValue>(async () => {\n try {\n const current = await client.queue.status(endpoint, queueOptions);\n if (current.status !== \"COMPLETED\") return undefined;\n return await client.queue.result(endpoint, queueOptions);\n } catch (cause) {\n const err = falSdkError(cause, ctx.model.id);\n if (err.retryable) return undefined;\n throw err;\n }\n }, pollOptions);\n const url = extractVideoUrl(payload, endpoint, ctx.model.id);\n return { video: { url }, usage: videoUsage(ctx, req, duration), raw: payload };\n },\n };\n}\n\n// Passthrough video jobs poll the fal queue status URL; result() waits with\n// the adapter interval and honours the caller's abort signal. The submit is\n// awaited here so a submit failure surfaces to the generateVideo caller\n// instead of sitting on a detached promise until result() runs.\nasync function passthroughVideoJob(\n ctx: AdapterContext,\n req: VideoRequest,\n endpoint: string,\n input: JsonObject,\n): Promise<VideoJob> {\n const cfg = gatewayConfig(ctx);\n const res = await gatewayFetch(cfg, ctx.fetch, `${FAL_QUEUE_HOST}/${endpoint}`, {\n method: \"POST\",\n body: JSON.stringify({ ...input, sync_mode: true }),\n });\n if (!res.ok) throw falError(res.status, await readBody(res), ctx.model.id);\n const parsed = falQueueSubmitSchema.safeParse(await res.json());\n if (!parsed.success) {\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: `fal ${endpoint} submit returned no status URL`,\n provider: \"fal\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const { request_id: jobId, status_url, response_url } = parsed.data;\n const checkStatus = async (): Promise<string | undefined> => {\n const statusRes = await gatewayFetch(cfg, ctx.fetch, status_url, { method: \"GET\" });\n if (!statusRes.ok)\n throw falError(statusRes.status, await readBody(statusRes), ctx.model.id);\n const statusParsed = falQueueStatusSchema.safeParse(await statusRes.json());\n if (!statusParsed.success || statusParsed.data.status !== \"COMPLETED\") return undefined;\n const resultRes = await gatewayFetch(cfg, ctx.fetch, response_url, { method: \"GET\" });\n if (!resultRes.ok) {\n throw falError(resultRes.status, await readBody(resultRes), ctx.model.id);\n }\n const result: JsonValue = JsonValueSchema.parse(await resultRes.json());\n return extractVideoUrl(result, endpoint, ctx.model.id);\n };\n const duration = req.durationSeconds ?? 5;\n return {\n jobId,\n async poll() {\n try {\n const url = await checkStatus();\n return url ? { status: \"succeeded\" as const } : { status: \"pending\" as const };\n } catch (cause) {\n if (isModelKitError(cause) && !cause.retryable)\n return { status: \"failed\" as const };\n return { status: \"pending\" as const };\n }\n },\n async result(opts) {\n const signal = opts?.signal ?? ctx.signal;\n const pollOptions: FalPollOptions = {\n intervalMs: opts?.pollIntervalMs ?? PASSTHROUGH_POLL_MS,\n timeoutMs: opts?.timeoutMs ?? 15 * 60_000,\n };\n if (signal !== undefined) pollOptions.signal = signal;\n const url = await pollUntil(checkStatus, pollOptions);\n return { video: { url }, usage: videoUsage(ctx, req, duration) };\n },\n };\n}\n","import { z } from \"zod\";\nimport {\n GoogleGenAI,\n type GenerateVideosOperation,\n type GenerateVideosParameters,\n type GenerateVideosResponse,\n type OperationGetParameters,\n} from \"@google/genai\";\nimport { ModelKitError } from \"../errors.js\";\nimport { describeThrown } from \"../json.js\";\nimport {\n classifyHttpError,\n classifyThrown,\n pollUntil,\n withRetry,\n type RetryOptions,\n} from \"../retry.js\";\nimport type {\n AudioRequest,\n AudioResult,\n JsonObject,\n MediaPart,\n MediaRef,\n UsageEvent,\n VideoJob,\n VideoRequest,\n} from \"../types.js\";\nimport type { Adapter, AdapterContext } from \"./adapter.js\";\nimport { deleteGoogleFile, uploadGoogleFile, type GoogleFilesOptions } from \"./google-files.js\";\n\nexport interface VeoImagePayload {\n imageBytes: string;\n mimeType: string;\n}\n\nexport interface VeoReferenceImage {\n image: VeoImagePayload;\n referenceType: string;\n}\n\nexport interface VeoGenerationConfig {\n aspectRatio?: string;\n durationSeconds: number;\n resolution?: string;\n personGeneration: string;\n lastFrame?: VeoImagePayload;\n referenceImages?: VeoReferenceImage[];\n}\n\nexport interface VeoGenerateBody {\n model: string;\n prompt: string;\n image?: VeoImagePayload;\n config: VeoGenerationConfig;\n}\n\nexport interface VeoVideoRef {\n uri?: string;\n}\n\nexport interface VeoGeneratedVideo {\n video?: VeoVideoRef;\n}\n\nexport interface VeoOperationResponse {\n generatedVideos?: VeoGeneratedVideo[];\n}\n\nexport interface VeoOperation {\n name?: string;\n done?: boolean;\n error?: JsonObject;\n response?: VeoOperationResponse;\n}\n\nexport interface VeoOperationRef {\n operation: VeoOperation;\n}\n\nexport interface OmniVideoRef {\n data?: string;\n uri?: string;\n mime_type?: string;\n}\n\nexport interface OmniStepContent {\n type?: string;\n data?: string;\n uri?: string;\n mime_type?: string;\n}\n\nexport interface OmniStep {\n type?: string;\n content?: OmniStepContent[];\n}\n\nexport interface OmniInteraction {\n id?: string;\n status?: string;\n output_video?: OmniVideoRef | null;\n steps?: OmniStep[];\n}\n\nexport interface OmniContentPart {\n type: string;\n text?: string;\n data?: string;\n uri?: string;\n mime_type?: string;\n}\n\nexport interface OmniResponseFormat {\n type: string;\n /** Files API delivery; required with store=true to dodge the 4 MB inline cap. */\n delivery?: string;\n aspect_ratio?: string;\n resolution?: string;\n duration?: string;\n}\n\nexport interface OmniVideoConfig {\n task: OmniTask;\n}\n\nexport interface OmniGenerationConfig {\n video_config: OmniVideoConfig;\n}\n\nexport interface OmniCreateArgs {\n model: string;\n input: OmniContentPart[];\n response_format: OmniResponseFormat;\n generation_config: OmniGenerationConfig;\n /** The Interactions API requires this with uri delivery. */\n store?: boolean;\n}\n\nexport interface OmniGetParams {\n stream: boolean;\n}\n\nexport interface OmniUploadedEntry {\n type: string;\n bytes: Uint8Array;\n mime: string;\n}\n\nexport type OmniTask = \"text_to_video\" | \"image_to_video\" | \"reference_to_video\" | \"edit\";\n\nexport interface GeminiInlineData {\n mimeType?: string;\n data?: string;\n}\n\nexport interface GeminiPart {\n text?: string;\n inlineData?: GeminiInlineData;\n}\n\nexport interface GeminiContent {\n parts?: GeminiPart[];\n}\n\nexport interface GeminiGenerateContentBody {\n model: string;\n contents: GeminiContent[];\n}\n\nexport interface GeminiUsageMetadata {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n}\n\nexport interface GeminiCandidate {\n content?: GeminiContent;\n}\n\nexport interface GeminiGenerateContentResponse {\n candidates?: GeminiCandidate[];\n usageMetadata?: GeminiUsageMetadata;\n}\n\nexport interface GoogleGenaiClientOptions {\n apiKey: string;\n}\n\nexport interface GoogleGenaiModelsClient {\n generateVideos: (body: VeoGenerateBody) => Promise<VeoOperation>;\n /** Lyria: music comes back as an inlineData part of a plain generateContent call. */\n generateContent: (body: GeminiGenerateContentBody) => Promise<GeminiGenerateContentResponse>;\n}\n\nexport interface GoogleGenaiOperationsClient {\n getVideosOperation: (args: VeoOperationRef) => Promise<VeoOperation>;\n}\n\nexport interface GoogleGenaiInteractionsClient {\n create: (args: OmniCreateArgs) => Promise<OmniInteraction>;\n get: (jobId: string, params: OmniGetParams) => Promise<OmniInteraction>;\n}\n\nexport interface GoogleGenaiClient {\n models: GoogleGenaiModelsClient;\n operations: GoogleGenaiOperationsClient;\n interactions: GoogleGenaiInteractionsClient;\n}\n\nexport interface GoogleGenaiAdapterDeps {\n createGenAIClient: (opts: GoogleGenaiClientOptions) => GoogleGenaiClient;\n}\n\ntype SdkCreateParams = Parameters<GoogleGenAI[\"interactions\"][\"create\"]>[0];\n\nfunction defaultCreateGenAIClient(opts: GoogleGenaiClientOptions): GoogleGenaiClient {\n // Pin the Gemini API path. Otherwise GOOGLE_GENAI_USE_VERTEXAI in the host env\n // flips the SDK to Vertex, which rejects API keys.\n const sdk = new GoogleGenAI({ ...opts, vertexai: false });\n return {\n models: {\n generateVideos: async (body) => {\n // SAFETY: VeoGenerateBody carries the Veo JSON fields the SDK serializes unchanged; the SDK's wider GenerateVideosParameters only adds options this adapter never sets.\n const params = body as GenerateVideosParameters;\n const operation = await sdk.models.generateVideos(params);\n // SAFETY: the API returns the full operation JSON; VeoOperation lists the polling fields this adapter reads, all optional, so the value always satisfies it.\n return operation as VeoOperation;\n },\n generateContent: (body) => sdk.models.generateContent(body),\n },\n operations: {\n getVideosOperation: async (args) => {\n // SAFETY: VeoOperation is the operation JSON the API returned; the SDK re-sends it unchanged to refresh it, which matches the SDK's operation parameter.\n const inner = args.operation as GenerateVideosOperation;\n const params: OperationGetParameters<\n GenerateVideosResponse,\n GenerateVideosOperation\n > = { operation: inner };\n const operation = await sdk.operations.getVideosOperation(params);\n // SAFETY: the API returns the full operation JSON; VeoOperation lists the polling fields this adapter reads, all optional, so the value always satisfies it.\n return operation as VeoOperation;\n },\n },\n interactions: {\n create: async (args) => {\n // SAFETY: the SDK serializes these preview interaction fields to JSON unchanged; its closed TS union omits this surface but the wire call carries it through.\n const params = args as SdkCreateParams;\n const response = await sdk.interactions.create(params);\n // SAFETY: the API returns the full interaction JSON; OmniInteraction lists the video fields this adapter reads, all optional, so the value always satisfies it.\n return response as OmniInteraction;\n },\n get: async (jobId, params) => {\n const response = await sdk.interactions.get(jobId, params);\n // SAFETY: the API returns the full interaction JSON; OmniInteraction lists the video fields this adapter reads, all optional, so the value always satisfies it.\n return response as OmniInteraction;\n },\n },\n };\n}\n\nconst defaultDeps: GoogleGenaiAdapterDeps = {\n createGenAIClient: (opts) => defaultCreateGenAIClient(opts),\n};\n\nconst VEO_POLL_INTERVAL_MS = 5000;\nconst OMNI_POLL_INTERVAL_MS = 10000;\nconst RESULT_TIMEOUT_MS = 15 * 60 * 1000;\nconst OMNI_INLINE_LIMIT_BYTES = 4 * 1024 * 1024;\n/** Gemini rejects inline request bodies over 20 MB; larger media goes through the Files API. */\nconst MEDIA_PART_INLINE_LIMIT_BYTES = 20 * 1024 * 1024;\n\nconst errorTextSchema = z.string();\n\ninterface PollOptions {\n intervalMs: number;\n timeoutMs: number;\n signal?: AbortSignal;\n}\n\nexport function createGoogleGenaiAdapter(deps: GoogleGenaiAdapterDeps = defaultDeps): Adapter {\n const { createGenAIClient } = deps;\n return {\n id: \"google-genai\",\n async generateVideo(req: VideoRequest, ctx: AdapterContext): Promise<VideoJob> {\n const providerModelId = ctx.model.providerModelId;\n if (providerModelId.startsWith(\"veo-\"))\n return generateVeoVideo(req, ctx, createGenAIClient);\n if (providerModelId.startsWith(\"gemini-omni\"))\n return generateOmniVideo(req, ctx, createGenAIClient);\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `google-genai cannot serve ${providerModelId}`,\n provider: \"google-genai\",\n model: ctx.model.id,\n });\n },\n async generateAudio(req: AudioRequest, ctx: AdapterContext): Promise<AudioResult> {\n const providerModelId = ctx.model.providerModelId;\n if (providerModelId.startsWith(\"lyria-\"))\n return generateLyriaAudio(req, ctx, createGenAIClient);\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `google-genai cannot serve ${providerModelId}`,\n provider: \"google-genai\",\n model: ctx.model.id,\n });\n },\n prepareMediaPart(\n ref: MediaRef,\n mediaType: string,\n ctx: AdapterContext,\n ): Promise<MediaPart> {\n return prepareGoogleMediaPart(ref, mediaType, ctx);\n },\n };\n}\n\nexport const googleGenaiAdapter: Adapter = createGoogleGenaiAdapter();\n\nfunction googleKey(ctx: AdapterContext): string {\n const key = ctx.keys.google;\n if (!key) {\n throw new ModelKitError({\n code: \"auth\",\n message: \"Missing Google API key\",\n provider: \"google-genai\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n return key;\n}\n\nfunction sdkStatus(cause: unknown): number | undefined {\n return describeThrown(cause).status;\n}\n\nfunction throwSdkError(cause: unknown, model: string): never {\n throw classifyThrown(\"google-genai\", cause, model);\n}\n\nfunction toBase64(bytes: Uint8Array): string {\n return Buffer.from(bytes).toString(\"base64\");\n}\n\nasync function resolveMedia(\n ref: MediaRef,\n fetchImpl: typeof fetch,\n signal: AbortSignal | undefined,\n defaultMime: string,\n model: string,\n): Promise<{ bytes: Uint8Array; mime: string }> {\n if (\"bytes\" in ref) return { bytes: ref.bytes, mime: ref.mime };\n const init: RequestInit = {};\n if (signal !== undefined) init.signal = signal;\n const res = await fetchImpl(ref.url, init);\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw classifyHttpError(res.status, text, \"google-genai\", model);\n }\n return {\n bytes: new Uint8Array(await res.arrayBuffer()),\n mime: res.headers.get(\"content-type\")?.split(\";\")[0]?.trim() || defaultMime,\n };\n}\n\nasync function downloadVideo(\n ctx: AdapterContext,\n url: string,\n apiKey: string,\n signal: AbortSignal | undefined,\n): Promise<{ bytes: Uint8Array; mime: string }> {\n const init: RequestInit = { headers: { \"x-goog-api-key\": apiKey } };\n if (signal !== undefined) init.signal = signal;\n const res = await ctx.fetch(url, init);\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw classifyHttpError(res.status, text, \"google-genai\", ctx.model.id);\n }\n return {\n bytes: new Uint8Array(await res.arrayBuffer()),\n mime: res.headers.get(\"content-type\")?.split(\";\")[0]?.trim() || \"video/mp4\",\n };\n}\n\nfunction videoUsage(ctx: AdapterContext, req: VideoRequest, duration: number): UsageEvent {\n const event: UsageEvent = {\n model: ctx.model.id,\n provider: \"google-genai\",\n modality: \"VIDEO\",\n unit: \"seconds\",\n quantity: duration,\n durationSeconds: duration,\n };\n if (req.resolution !== undefined) event.resolution = req.resolution;\n return event;\n}\n\ntype GenAIClientFactory = GoogleGenaiAdapterDeps[\"createGenAIClient\"];\n\nasync function generateVeoVideo(\n req: VideoRequest,\n ctx: AdapterContext,\n createGenAIClient: GenAIClientFactory,\n): Promise<VideoJob> {\n const apiKey = googleKey(ctx);\n const modelId = ctx.model.id;\n const refs = req.referenceImages ?? [];\n if (req.firstFrame && refs.length > 0) {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: \"Veo takes image or referenceImages, never both\",\n provider: \"google-genai\",\n model: modelId,\n });\n }\n // Veo's config.lastFrame is only valid for image-to-video; dropping it silently\n // would generate the wrong clip, so reject the missing first frame instead.\n if (req.lastFrame !== undefined && req.firstFrame === undefined) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${modelId} requires firstFrame when lastFrame is set`,\n provider: \"google-genai\",\n model: modelId,\n });\n }\n const duration = req.durationSeconds ?? 8;\n const personGeneration = (req.firstFrame ?? refs.length > 0) ? \"allow_adult\" : \"allow_all\";\n\n let image: VeoImagePayload | undefined;\n let lastFrame: VeoImagePayload | undefined;\n let referenceImages: VeoReferenceImage[] | undefined;\n if (req.firstFrame) {\n const first = await resolveMedia(\n req.firstFrame,\n ctx.fetch,\n ctx.signal,\n \"image/png\",\n modelId,\n );\n image = { imageBytes: toBase64(first.bytes), mimeType: first.mime };\n if (req.lastFrame) {\n const last = await resolveMedia(\n req.lastFrame,\n ctx.fetch,\n ctx.signal,\n \"image/png\",\n modelId,\n );\n lastFrame = { imageBytes: toBase64(last.bytes), mimeType: last.mime };\n }\n } else if (refs.length > 0) {\n const loaded = await Promise.all(\n refs.map((ref) => resolveMedia(ref, ctx.fetch, ctx.signal, \"image/png\", modelId)),\n );\n referenceImages = loaded.map((img) => ({\n image: { imageBytes: toBase64(img.bytes), mimeType: img.mime },\n referenceType: \"ASSET\",\n }));\n }\n\n const client = createGenAIClient({ apiKey });\n const config: VeoGenerationConfig = { durationSeconds: duration, personGeneration };\n if (req.aspectRatio !== undefined) config.aspectRatio = req.aspectRatio;\n if (req.resolution !== undefined) config.resolution = req.resolution;\n if (lastFrame !== undefined) config.lastFrame = lastFrame;\n if (referenceImages !== undefined) config.referenceImages = referenceImages;\n const requestBody: VeoGenerateBody = {\n model: ctx.model.providerModelId,\n prompt: req.prompt,\n config,\n };\n if (image !== undefined) requestBody.image = image;\n const retryOptions: RetryOptions = { attempts: 3 };\n if (ctx.signal !== undefined) retryOptions.signal = ctx.signal;\n let operation: VeoOperation;\n try {\n operation = await withRetry(async () => {\n try {\n return await client.models.generateVideos(requestBody);\n } catch (cause) {\n throwSdkError(cause, modelId);\n }\n }, retryOptions);\n } catch (cause) {\n throwSdkError(cause, modelId);\n }\n\n const getOperation = async (): Promise<VeoOperation> => {\n try {\n return await client.operations.getVideosOperation({ operation });\n } catch (cause) {\n throwSdkError(cause, modelId);\n }\n };\n const jobId = operation.name ?? crypto.randomUUID();\n const usage = videoUsage(ctx, req, duration);\n\n return {\n jobId,\n async poll() {\n const current = await getOperation();\n if (current.error) return { status: \"failed\", raw: current };\n if (current.done) return { status: \"succeeded\", raw: current };\n return { status: \"running\", raw: current };\n },\n async result(opts) {\n const signal = opts?.signal ?? ctx.signal;\n const pollOptions: PollOptions = {\n intervalMs: opts?.pollIntervalMs ?? VEO_POLL_INTERVAL_MS,\n timeoutMs: opts?.timeoutMs ?? RESULT_TIMEOUT_MS,\n };\n if (signal !== undefined) pollOptions.signal = signal;\n const finished = await pollUntil<VeoOperation>(async () => {\n const current = await getOperation();\n if (current.error) {\n throw classifyHttpError(\n undefined,\n `Veo task failed: ${JSON.stringify(current.error).slice(0, 500)}`,\n \"google-genai\",\n modelId,\n );\n }\n if (!current.done) return undefined;\n return current;\n }, pollOptions);\n const uri = finished.response?.generatedVideos?.[0]?.video?.uri;\n if (!uri) {\n throw classifyHttpError(\n undefined,\n \"No video URI in Veo response\",\n \"google-genai\",\n modelId,\n );\n }\n return { video: await downloadVideo(ctx, uri, apiKey, signal), usage, raw: finished };\n },\n };\n}\n\nfunction toOmniAspect(aspect: VideoRequest[\"aspectRatio\"]): \"16:9\" | \"9:16\" {\n return aspect === \"16:9\" || aspect === \"9:16\" ? aspect : \"16:9\";\n}\n\nfunction toOmniResolution(resolution: VideoRequest[\"resolution\"]): string | undefined {\n if (\n resolution === \"360p\" ||\n resolution === \"720p\" ||\n resolution === \"1080p\" ||\n resolution === \"4k\"\n ) {\n return resolution;\n }\n return undefined;\n}\n\nfunction isFileReferenceRejected(cause: unknown): boolean {\n if (sdkStatus(cause) !== 400) return false;\n const info = describeThrown(cause);\n const body = errorTextSchema.safeParse(info.body);\n const text = `${info.message} ${body.success ? body.data : JSON.stringify(info.body)}`;\n return /file|uri|not\\s*found|failed_precondition/i.test(text);\n}\n\nfunction extractOmniVideo(interaction: OmniInteraction, model: string): OmniVideoRef {\n const direct = interaction.output_video;\n if (direct && (direct.data ?? direct.uri)) return direct;\n for (const step of interaction.steps ?? []) {\n if (step.type !== undefined && step.type !== \"model_output\") continue;\n for (const content of step.content ?? []) {\n if (content.type === \"video\" && (content.data ?? content.uri)) return content;\n }\n }\n throw classifyHttpError(\n undefined,\n \"No video content in Gemini Omni response\",\n \"google-genai\",\n model,\n );\n}\n\nasync function generateOmniVideo(\n req: VideoRequest,\n ctx: AdapterContext,\n createGenAIClient: GenAIClientFactory,\n): Promise<VideoJob> {\n const apiKey = googleKey(ctx);\n const modelId = ctx.model.id;\n const providerModelId = ctx.model.providerModelId;\n const duration = req.durationSeconds ?? 8;\n const images = req.referenceImages ?? [];\n const videos = req.referenceVideos ?? [];\n const task: OmniTask = req.sourceVideo\n ? \"edit\"\n : req.firstFrame\n ? \"image_to_video\"\n : images.length > 0 || videos.length > 0\n ? \"reference_to_video\"\n : \"text_to_video\";\n\n // The Omni rows carry no ratio/duration/resolution defaults, so a field is\n // present here only when the caller asked for it. 1.0 rejects resolution.\n const isOmniV1 = providerModelId === \"gemini-omni-flash-preview\";\n const responseFormat: OmniResponseFormat = { type: \"video\", delivery: \"uri\" };\n if (\n req.sourceVideo === undefined &&\n req.aspectRatio !== undefined &&\n req.aspectRatio !== \"adaptive\"\n ) {\n responseFormat.aspect_ratio = toOmniAspect(req.aspectRatio);\n }\n if (!isOmniV1) {\n const omniResolution = toOmniResolution(req.resolution);\n if (omniResolution !== undefined) responseFormat.resolution = omniResolution;\n }\n if (req.durationSeconds !== undefined) responseFormat.duration = `${req.durationSeconds}s`;\n\n const client = createGenAIClient({ apiKey });\n const uploadedByUri = new Map<string, OmniUploadedEntry>();\n const uploadedNames: string[] = [];\n const uploadOne = async (\n kind: \"image\" | \"video\",\n bytes: Uint8Array,\n mime: string,\n ): Promise<string> => {\n const uploadOptions: GoogleFilesOptions = {\n apiKey,\n fetchImpl: ctx.fetch,\n model: modelId,\n label: \"gemini-omni\",\n };\n if (ctx.signal !== undefined) uploadOptions.signal = ctx.signal;\n const file = await uploadGoogleFile({ bytes, mime }, uploadOptions);\n uploadedByUri.set(file.fileUri, { type: kind, bytes, mime: file.mimeType });\n uploadedNames.push(file.fileName);\n return file.fileUri;\n };\n\n const cleanupUploads = async (): Promise<void> => {\n for (const fileName of uploadedNames) await deleteGoogleFile(fileName, apiKey, ctx.fetch);\n };\n const callCreate = (input: OmniContentPart[]): Promise<OmniInteraction> =>\n client.interactions.create({\n model: providerModelId,\n input,\n response_format: responseFormat,\n generation_config: { video_config: { task } },\n store: true,\n });\n\n const createRetryOptions: RetryOptions = { attempts: 3 };\n if (ctx.signal !== undefined) createRetryOptions.signal = ctx.signal;\n let interaction: OmniInteraction;\n try {\n // Preparation and submission share the cleanup-owning scope: a failure\n // while fetching or uploading a later reference must not leak the\n // uploads that already succeeded.\n const parts: OmniContentPart[] = [];\n if (req.sourceVideo) {\n const media = await resolveMedia(\n req.sourceVideo,\n ctx.fetch,\n ctx.signal,\n \"video/mp4\",\n modelId,\n );\n parts.push({\n type: \"video\",\n uri: await uploadOne(\"video\", media.bytes, media.mime),\n mime_type: media.mime,\n });\n }\n for (const ref of videos) {\n if (ref.label !== undefined) parts.push({ type: \"text\", text: ref.label });\n const media = await resolveMedia(ref, ctx.fetch, ctx.signal, \"video/mp4\", modelId);\n parts.push({\n type: \"video\",\n uri: await uploadOne(\"video\", media.bytes, media.mime),\n mime_type: media.mime,\n });\n }\n if (req.firstFrame) {\n if (req.firstFrame.label !== undefined)\n parts.push({ type: \"text\", text: req.firstFrame.label });\n const media = await resolveMedia(\n req.firstFrame,\n ctx.fetch,\n ctx.signal,\n \"image/png\",\n modelId,\n );\n if (media.bytes.length > OMNI_INLINE_LIMIT_BYTES) {\n parts.push({\n type: \"image\",\n uri: await uploadOne(\"image\", media.bytes, media.mime),\n mime_type: media.mime,\n });\n } else {\n parts.push({ type: \"image\", data: toBase64(media.bytes), mime_type: media.mime });\n }\n }\n for (const ref of images) {\n if (ref.label !== undefined) parts.push({ type: \"text\", text: ref.label });\n const media = await resolveMedia(ref, ctx.fetch, ctx.signal, \"image/png\", modelId);\n if (media.bytes.length > OMNI_INLINE_LIMIT_BYTES) {\n parts.push({\n type: \"image\",\n uri: await uploadOne(\"image\", media.bytes, media.mime),\n mime_type: media.mime,\n });\n } else {\n parts.push({ type: \"image\", data: toBase64(media.bytes), mime_type: media.mime });\n }\n }\n parts.push({ type: \"text\", text: req.prompt });\n\n try {\n interaction = await withRetry(async () => {\n try {\n return await callCreate(parts);\n } catch (cause) {\n throwSdkError(cause, modelId);\n }\n }, createRetryOptions);\n } catch (cause) {\n if (uploadedByUri.size === 0 || !isFileReferenceRejected(cause))\n throwSdkError(cause, modelId);\n const inlineParts = parts.map((part) => {\n if (part.uri === undefined) return part;\n const found = uploadedByUri.get(part.uri);\n if (!found) return part;\n const inline: OmniContentPart = {\n type: found.type,\n data: toBase64(found.bytes),\n mime_type: found.mime,\n };\n return inline;\n });\n // A whole-video inline body is large; never retry it, just try once.\n try {\n interaction = await callCreate(inlineParts);\n } catch (inlineCause) {\n throwSdkError(inlineCause, modelId);\n }\n }\n } finally {\n // Delete the uploads as soon as the create settles so a poll-only\n // consumer does not leak them.\n await cleanupUploads();\n }\n\n const jobId = interaction.id ?? crypto.randomUUID();\n const usage = videoUsage(ctx, req, duration);\n const getInteraction = async (): Promise<OmniInteraction> => {\n try {\n const getParams: OmniGetParams = { stream: false };\n return await client.interactions.get(jobId, getParams);\n } catch (cause) {\n throwSdkError(cause, modelId);\n }\n };\n\n return {\n jobId,\n async poll() {\n const current = await getInteraction();\n const status = (current.status ?? \"\").toUpperCase();\n if (status === \"COMPLETED\") return { status: \"succeeded\", raw: current };\n if (status === \"FAILED\") return { status: \"failed\", raw: current };\n if (status === \"PENDING\") return { status: \"pending\", raw: current };\n return { status: \"running\", raw: current };\n },\n async result(opts) {\n const signal = opts?.signal ?? ctx.signal;\n const pollOptions: PollOptions = {\n intervalMs: opts?.pollIntervalMs ?? OMNI_POLL_INTERVAL_MS,\n timeoutMs: opts?.timeoutMs ?? RESULT_TIMEOUT_MS,\n };\n if (signal !== undefined) pollOptions.signal = signal;\n const done = await pollUntil<OmniInteraction>(async () => {\n const current = await getInteraction();\n const status = (current.status ?? \"\").toUpperCase();\n if (status === \"COMPLETED\") return current;\n if (status === \"FAILED\") {\n throw classifyHttpError(\n undefined,\n `Gemini Omni interaction failed: ${JSON.stringify(current).slice(0, 500)}`,\n \"google-genai\",\n modelId,\n );\n }\n return undefined;\n }, pollOptions);\n const video = extractOmniVideo(done, modelId);\n if (video.data) {\n return {\n video: {\n bytes: Buffer.from(video.data, \"base64\"),\n mime: video.mime_type ?? \"video/mp4\",\n },\n usage,\n raw: done,\n };\n }\n if (video.uri)\n return {\n video: await downloadVideo(ctx, video.uri, apiKey, signal),\n usage,\n raw: done,\n };\n throw classifyHttpError(\n undefined,\n \"No video content in Gemini Omni response\",\n \"google-genai\",\n modelId,\n );\n },\n };\n}\n\n/**\n * Lyria has no duration in its response, so usage is one flat unit per call.\n * Token counts ride along as inputTokens/outputTokens when Gemini reports them.\n */\nfunction lyriaUsage(\n ctx: AdapterContext,\n req: AudioRequest,\n meta: GeminiUsageMetadata | undefined,\n): UsageEvent {\n const event: UsageEvent = {\n model: ctx.model.id,\n provider: \"google-genai\",\n modality: \"AUDIO\",\n unit: \"images\",\n quantity: 1,\n };\n if (req.durationSeconds !== undefined) event.durationSeconds = req.durationSeconds;\n if (meta?.promptTokenCount !== undefined) event.inputTokens = meta.promptTokenCount;\n if (meta?.candidatesTokenCount !== undefined) event.outputTokens = meta.candidatesTokenCount;\n return event;\n}\n\nasync function generateLyriaAudio(\n req: AudioRequest,\n ctx: AdapterContext,\n createGenAIClient: GenAIClientFactory,\n): Promise<AudioResult> {\n const apiKey = googleKey(ctx);\n const modelId = ctx.model.id;\n const parts: GeminiPart[] = [{ text: req.prompt }];\n for (const ref of req.references ?? []) {\n const image = await resolveMedia(ref, ctx.fetch, ctx.signal, \"image/jpeg\", modelId);\n parts.push({ inlineData: { mimeType: image.mime, data: toBase64(image.bytes) } });\n }\n const client = createGenAIClient({ apiKey });\n const retryOptions: RetryOptions = { attempts: 3 };\n if (ctx.signal !== undefined) retryOptions.signal = ctx.signal;\n let response: GeminiGenerateContentResponse;\n try {\n response = await withRetry(async () => {\n try {\n return await client.models.generateContent({\n model: ctx.model.providerModelId,\n contents: [{ parts }],\n });\n } catch (cause) {\n throwSdkError(cause, modelId);\n }\n }, retryOptions);\n } catch (cause) {\n throwSdkError(cause, modelId);\n }\n\n // Part order is not guaranteed, so scan every part.\n const lyrics: string[] = [];\n let audio: { bytes: Uint8Array; mime: string } | undefined;\n for (const part of response.candidates?.[0]?.content?.parts ?? []) {\n if (part.text) lyrics.push(part.text);\n else if (part.inlineData?.data && audio === undefined) {\n audio = {\n bytes: new Uint8Array(Buffer.from(part.inlineData.data, \"base64\")),\n mime: part.inlineData.mimeType ?? \"audio/mp3\",\n };\n }\n }\n if (audio === undefined) {\n throw classifyHttpError(\n undefined,\n \"No audio data in Lyria response\",\n \"google-genai\",\n modelId,\n );\n }\n const meta = response.usageMetadata;\n const rawUsage: JsonObject = {};\n if (meta?.promptTokenCount !== undefined) rawUsage.promptTokenCount = meta.promptTokenCount;\n if (meta?.candidatesTokenCount !== undefined)\n rawUsage.candidatesTokenCount = meta.candidatesTokenCount;\n if (meta?.totalTokenCount !== undefined) rawUsage.totalTokenCount = meta.totalTokenCount;\n const result: AudioResult = {\n audio,\n usage: lyriaUsage(ctx, req, meta),\n raw: { usageMetadata: rawUsage },\n };\n if (lyrics.length > 0) result.text = lyrics.join(\"\\n\");\n return result;\n}\n\nasync function prepareGoogleMediaPart(\n ref: MediaRef,\n mediaType: string,\n ctx: AdapterContext,\n): Promise<MediaPart> {\n if (\"url\" in ref) return { type: \"file\", data: ref.url, mediaType };\n if (ref.bytes.length <= MEDIA_PART_INLINE_LIMIT_BYTES) {\n return { type: \"file\", data: ref.bytes, mediaType };\n }\n const apiKey = googleKey(ctx);\n const uploadOptions: GoogleFilesOptions = {\n apiKey,\n fetchImpl: ctx.fetch,\n model: ctx.model.id,\n label: \"media-part\",\n };\n if (ctx.signal !== undefined) uploadOptions.signal = ctx.signal;\n const file = await uploadGoogleFile({ bytes: ref.bytes, mime: mediaType }, uploadOptions);\n return {\n type: \"file\",\n data: file.fileUri,\n mediaType: file.mimeType,\n cleanup: () => deleteGoogleFile(file.fileName, apiKey, ctx.fetch),\n };\n}\n","import { z } from \"zod\";\nimport { ModelKitError } from \"../errors.js\";\nimport { classifyHttpError, pollUntil, withRetry, type RetryOptions } from \"../retry.js\";\n\nexport const GOOGLE_FILES_BASE = \"https://generativelanguage.googleapis.com\";\nexport const GOOGLE_FILES_POLL_INTERVAL_MS = 2000;\nexport const GOOGLE_FILES_POLL_TIMEOUT_MS = 5 * 60 * 1000;\nexport const GOOGLE_FILES_MAX_BYTES = 2 * 1024 * 1024 * 1024;\n\nconst GENERIC_MEDIA_TYPES = new Set([\n \"application/octet-stream\",\n \"binary/octet-stream\",\n \"application/binary\",\n]);\n\nexport type GoogleFilesSource = { bytes: Uint8Array; mime: string } | { url: string; mime: string };\n\nexport interface GoogleUploadedFile {\n fileUri: string;\n fileName: string;\n mimeType: string;\n}\n\nexport interface GoogleFilesOptions {\n apiKey: string;\n fetchImpl: typeof fetch;\n signal?: AbortSignal;\n model?: string;\n label?: string;\n}\n\ninterface UploadedFileRef {\n fileUri: string;\n fileName: string;\n mimeType: string;\n state?: string;\n}\n\ninterface PollOptions {\n intervalMs: number;\n timeoutMs: number;\n signal?: AbortSignal;\n}\n\nconst uploadedFileSchema = z.object({\n file: z\n .object({\n uri: z.string().optional(),\n name: z.string().optional(),\n state: z.string().optional(),\n mimeType: z.string().optional(),\n })\n .optional(),\n});\n\nconst fileStateSchema = z.object({\n state: z.string().optional(),\n error: z.object({ message: z.string().optional() }).optional(),\n});\n\nfunction resolveMime(declared: string | null, fallback: string): string {\n const clean = declared?.split(\";\")[0]?.trim().toLowerCase();\n if (!clean || GENERIC_MEDIA_TYPES.has(clean)) return fallback;\n if (clean.split(\"/\")[0] !== fallback.split(\"/\")[0]) return fallback;\n return clean;\n}\n\nfunction fileNameFromUri(fileUri: string, model?: string): string {\n const name = fileUri.match(/files\\/[^/?]+/)?.[0];\n if (!name)\n throw classifyHttpError(\n undefined,\n `Files API returned an unparseable file URI`,\n \"google-genai\",\n model,\n );\n return name;\n}\n\nfunction oversizeError(bytes: number, label: string, model?: string): ModelKitError {\n const init: ConstructorParameters<typeof ModelKitError>[0] = {\n code: \"unsupported_option\",\n message: `${label}: source is ${bytes} bytes, over the Files API limit of ${GOOGLE_FILES_MAX_BYTES}`,\n provider: \"google-genai\",\n retryable: false,\n };\n if (model !== undefined) init.model = model;\n return new ModelKitError(init);\n}\n\nasync function resolveSource(\n source: GoogleFilesSource,\n fetchImpl: typeof fetch,\n signal: AbortSignal | undefined,\n label: string,\n model?: string,\n): Promise<{ bytes: Uint8Array; mimeType: string }> {\n if (\"bytes\" in source) return { bytes: source.bytes, mimeType: source.mime };\n const init: RequestInit = {};\n if (signal !== undefined) init.signal = signal;\n const res = await fetchImpl(source.url, init);\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw classifyHttpError(res.status, text, \"google-genai\", model);\n }\n const declared = Number(res.headers.get(\"content-length\"));\n if (Number.isFinite(declared) && declared > GOOGLE_FILES_MAX_BYTES) {\n throw oversizeError(declared, label, model);\n }\n const bytes = new Uint8Array(await res.arrayBuffer());\n return { bytes, mimeType: resolveMime(res.headers.get(\"content-type\"), source.mime) };\n}\n\nasync function startAndUpload(\n bytes: Uint8Array,\n mimeType: string,\n opts: GoogleFilesOptions,\n): Promise<UploadedFileRef> {\n const startInit: RequestInit = {\n method: \"POST\",\n headers: {\n \"x-goog-api-key\": opts.apiKey,\n \"X-Goog-Upload-Protocol\": \"resumable\",\n \"X-Goog-Upload-Command\": \"start\",\n \"X-Goog-Upload-Header-Content-Length\": String(bytes.length),\n \"X-Goog-Upload-Header-Content-Type\": mimeType,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ file: {} }),\n };\n if (opts.signal !== undefined) startInit.signal = opts.signal;\n const startRes = await opts.fetchImpl(`${GOOGLE_FILES_BASE}/upload/v1beta/files`, startInit);\n if (!startRes.ok) {\n const text = await startRes.text().catch(() => \"\");\n throw classifyHttpError(startRes.status, text, \"google-genai\", opts.model);\n }\n const uploadUrl = startRes.headers.get(\"x-goog-upload-url\");\n if (!uploadUrl) {\n throw classifyHttpError(\n undefined,\n \"Files API start response carried no upload URL\",\n \"google-genai\",\n opts.model,\n );\n }\n const uploadInit: RequestInit = {\n method: \"POST\",\n headers: {\n \"X-Goog-Upload-Command\": \"upload, finalize\",\n \"X-Goog-Upload-Offset\": \"0\",\n \"Content-Type\": mimeType,\n \"Content-Length\": String(bytes.length),\n },\n body: bytes,\n };\n if (opts.signal !== undefined) uploadInit.signal = opts.signal;\n const upRes = await opts.fetchImpl(uploadUrl, uploadInit);\n if (!upRes.ok) {\n const text = await upRes.text().catch(() => \"\");\n throw classifyHttpError(upRes.status, text, \"google-genai\", opts.model);\n }\n const uploaded = uploadedFileSchema.parse(await upRes.json());\n const fileUri = uploaded.file?.uri;\n if (!fileUri) {\n throw classifyHttpError(\n undefined,\n \"Files API upload returned no file URI\",\n \"google-genai\",\n opts.model,\n );\n }\n const ref: UploadedFileRef = {\n fileUri,\n fileName: uploaded.file?.name ?? fileNameFromUri(fileUri, opts.model),\n mimeType: uploaded.file?.mimeType ?? mimeType,\n };\n if (uploaded.file?.state !== undefined) ref.state = uploaded.file.state;\n return ref;\n}\n\nasync function waitForActive(fileName: string, opts: GoogleFilesOptions): Promise<void> {\n const pollOptions: PollOptions = {\n intervalMs: GOOGLE_FILES_POLL_INTERVAL_MS,\n timeoutMs: GOOGLE_FILES_POLL_TIMEOUT_MS,\n };\n const retryInit: RequestInit = {\n headers: { \"x-goog-api-key\": opts.apiKey },\n };\n if (opts.signal !== undefined) {\n pollOptions.signal = opts.signal;\n retryInit.signal = opts.signal;\n }\n await pollUntil<true>(async () => {\n const res = await opts.fetchImpl(`${GOOGLE_FILES_BASE}/v1beta/${fileName}`, retryInit);\n if (res.ok) {\n const json = fileStateSchema.parse(await res.json());\n if (json.state === \"ACTIVE\") return true;\n if (json.state === \"FAILED\") {\n throw classifyHttpError(\n undefined,\n `Files API processing failed for ${fileName}: ${json.error?.message ?? \"unknown error\"}`,\n \"google-genai\",\n opts.model,\n );\n }\n return undefined;\n }\n if (res.status === 429 || res.status >= 500) return undefined;\n const text = await res.text().catch(() => \"\");\n throw classifyHttpError(res.status, text, \"google-genai\", opts.model);\n }, pollOptions);\n}\n\nexport async function deleteGoogleFile(\n fileName: string,\n apiKey: string,\n fetchImpl: typeof fetch,\n): Promise<void> {\n try {\n await fetchImpl(`${GOOGLE_FILES_BASE}/v1beta/${fileName}`, {\n method: \"DELETE\",\n headers: { \"x-goog-api-key\": apiKey },\n });\n } catch {\n // Best-effort quota cleanup; never mask the real result.\n }\n}\n\nexport async function uploadGoogleFile(\n source: GoogleFilesSource,\n opts: GoogleFilesOptions,\n): Promise<GoogleUploadedFile> {\n const label = opts.label ?? \"google-files\";\n const { bytes, mimeType } = await resolveSource(\n source,\n opts.fetchImpl,\n opts.signal,\n label,\n opts.model,\n );\n if (bytes.length > GOOGLE_FILES_MAX_BYTES) throw oversizeError(bytes.length, label, opts.model);\n const retryOptions: RetryOptions = { attempts: 3 };\n if (opts.signal !== undefined) retryOptions.signal = opts.signal;\n const uploaded = await withRetry(() => startAndUpload(bytes, mimeType, opts), retryOptions);\n if (uploaded.state !== \"ACTIVE\") {\n try {\n await waitForActive(uploaded.fileName, opts);\n } catch (err) {\n await deleteGoogleFile(uploaded.fileName, opts.apiKey, opts.fetchImpl);\n throw err;\n }\n }\n return { fileUri: uploaded.fileUri, fileName: uploaded.fileName, mimeType: uploaded.mimeType };\n}\n","import { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { generateText } from \"ai\";\nimport type { LanguageModel } from \"ai\";\nimport { z } from \"zod\";\nimport { ModelKitError } from \"../errors.js\";\nimport { describeThrown } from \"../json.js\";\nimport { classifyHttpError, transportError, withRetry } from \"../retry.js\";\nimport type { RetryOptions } from \"../retry.js\";\nimport type { Adapter, AdapterContext } from \"./adapter.js\";\nimport type { ImageRequest, ImageResult, ImageSafetySetting } from \"../types.js\";\n\n/** 4K Gemini payloads are ~22MB JSON and take 40-50s; bound each attempt at 10m. */\nconst GEMINI_IMAGE_TIMEOUT_MS = 600_000;\n\nexport interface GoogleImageClientOptions {\n apiKey: string;\n fetch: typeof fetch;\n}\n\nexport type GeminiImageConfig = {\n aspectRatio?: string;\n imageSize?: string;\n};\n\nexport type GoogleImageProviderConfig = {\n imageConfig: GeminiImageConfig;\n responseModalities: string[];\n safetySettings?: ImageSafetySetting[];\n};\n\nexport type GoogleImageContentPart =\n | { type: \"text\"; text: string }\n | { type: \"image\"; image: string | Uint8Array; mediaType?: string };\n\nexport interface GoogleImageGenOptions {\n model: LanguageModel;\n messages: Array<{ role: \"user\"; content: GoogleImageContentPart[] }>;\n maxRetries: number;\n providerOptions: {\n google: GoogleImageProviderConfig;\n };\n abortSignal: AbortSignal;\n temperature?: number;\n}\n\nexport interface GoogleImageGenFile {\n mediaType: string;\n uint8Array: Uint8Array;\n}\n\nexport interface GoogleImageGenResult {\n files?: GoogleImageGenFile[];\n text?: string;\n finishReason?: string;\n // `| undefined` matches the SDK's LanguageModelUsage under exactOptionalPropertyTypes.\n usage?: { inputTokens?: number | undefined; outputTokens?: number | undefined };\n}\n\nexport interface GoogleImageAdapterDeps {\n createGoogleClient: (opts: GoogleImageClientOptions) => (modelId: string) => LanguageModel;\n runTextGeneration: (opts: GoogleImageGenOptions) => Promise<GoogleImageGenResult>;\n}\n\nconst defaultGoogleImageDeps: GoogleImageAdapterDeps = {\n createGoogleClient: (opts) => createGoogleGenerativeAI(opts),\n runTextGeneration: (opts) => generateText(opts),\n};\n\nconst causeChainNodeSchema = z.object({\n message: z.string().optional(),\n cause: z.unknown().optional(),\n});\n\n/**\n * Gemini's blockReason arrives wrapped as AI_APICallError(\"Invalid JSON\n * response\") -> cause AI_TypeValidationError whose message embeds the raw\n * Gemini JSON. Walk the whole cause chain for it.\n */\nexport function extractBlockReason(cause: unknown): string | null {\n let current: unknown = cause;\n const seen = new Set<unknown>();\n for (;;) {\n if (current === null || current !== Object(current)) return null;\n if (seen.has(current)) return null;\n seen.add(current);\n const parsed = causeChainNodeSchema.safeParse(current);\n if (!parsed.success) return null;\n const message = parsed.data.message;\n if (message !== undefined) {\n const match = message.match(/\"blockReason\"\\s*:\\s*\"([^\"]+)\"/);\n const found = match?.[1];\n if (found !== undefined) return found;\n }\n current = parsed.data.cause ?? null;\n }\n}\n\nfunction toProviderError(cause: unknown, ctx: AdapterContext): ModelKitError {\n const blockReason = extractBlockReason(cause);\n if (blockReason) {\n return new ModelKitError({\n code: \"content_blocked\",\n message:\n `google-image blocked the request (blockReason: ${blockReason}). ` +\n \"Try removing or replacing the reference image.\",\n provider: \"google-image\",\n model: ctx.model.id,\n body: { blockReason },\n cause,\n retryable: false,\n });\n }\n const info = describeThrown(cause);\n // No status means the request never got a response: a dropped connection, not a verdict.\n if (info.status === undefined) return transportError(\"google-image\", cause, ctx.model.id);\n return classifyHttpError(info.status, info.body, \"google-image\", ctx.model.id);\n}\n\nexport function createGoogleImageAdapter(\n deps: GoogleImageAdapterDeps = defaultGoogleImageDeps,\n): Adapter {\n return {\n id: \"google-image\",\n async generateImage(req: ImageRequest, ctx: AdapterContext): Promise<ImageResult> {\n const apiKey = ctx.keys.google;\n if (!apiKey)\n throw new ModelKitError({\n code: \"auth\",\n message: \"Missing API key for google\",\n provider: \"google-image\",\n model: ctx.model.id,\n retryable: false,\n });\n // Never route through Cloudflare: the gateway buffers upstream\n // responses and closes the connection at ~60s, but a 4K Gemini image\n // can take 40-50s to come back from Google.\n const google = deps.createGoogleClient({ apiKey, fetch: ctx.fetch });\n const model = google(ctx.model.providerModelId);\n\n const content: GoogleImageContentPart[] = [];\n for (const ref of req.references ?? []) {\n if (ref.label !== undefined) content.push({ type: \"text\", text: ref.label });\n if (\"url\" in ref) content.push({ type: \"image\", image: ref.url });\n else content.push({ type: \"image\", image: ref.bytes, mediaType: ref.mime });\n }\n content.push({ type: \"text\", text: req.prompt });\n\n const imageConfig: GeminiImageConfig = {};\n if (req.aspectRatio !== undefined && req.aspectRatio !== \"adaptive\")\n imageConfig.aspectRatio = req.aspectRatio;\n if (req.size !== undefined) imageConfig.imageSize = req.size;\n\n const googleOptions: GoogleImageProviderConfig = {\n imageConfig,\n responseModalities: [\"IMAGE\"],\n };\n if (req.safetySettings !== undefined) googleOptions.safetySettings = req.safetySettings;\n\n const retryOptions: RetryOptions = {};\n if (ctx.signal !== undefined) retryOptions.signal = ctx.signal;\n const result = await withRetry(async () => {\n const timeout = AbortSignal.timeout(GEMINI_IMAGE_TIMEOUT_MS);\n const signal =\n ctx.signal !== undefined ? AbortSignal.any([ctx.signal, timeout]) : timeout;\n try {\n const genOptions: GoogleImageGenOptions = {\n model,\n messages: [{ role: \"user\", content }],\n maxRetries: 0,\n providerOptions: {\n google: googleOptions,\n },\n abortSignal: signal,\n };\n // generateText's call setting lands as generationConfig.temperature.\n if (req.temperature !== undefined) genOptions.temperature = req.temperature;\n return await deps.runTextGeneration(genOptions);\n } catch (cause) {\n throw toProviderError(cause, ctx);\n }\n }, retryOptions);\n\n const images = (result.files ?? [])\n .filter((file) => file.mediaType.startsWith(\"image/\"))\n .map((file) => ({ bytes: file.uint8Array, mime: file.mediaType }));\n if (images.length === 0) {\n // Gemini reports a filtered prompt as finishReason \"other\" or \"content-filter\" with no\n // files and often a refusal in `text`, not as an HTTP error.\n const filtered =\n result.finishReason === \"content-filter\" || result.finishReason === \"other\";\n throw new ModelKitError({\n code: filtered ? \"content_blocked\" : \"provider_rejected\",\n message:\n `google-image returned no image (finishReason: ${result.finishReason}). ${result.text}`.trim(),\n provider: \"google-image\",\n model: ctx.model.id,\n body: { finishReason: result.finishReason ?? null, text: result.text ?? \"\" },\n retryable: false,\n });\n }\n\n const usage: ImageResult[\"usage\"] = {\n model: ctx.model.id,\n provider: \"google-image\",\n modality: \"IMAGE\",\n unit: \"images\",\n quantity: images.length,\n imageQuality: \"auto\",\n };\n if (req.size !== undefined) usage.imageSize = req.size;\n if (result.usage?.inputTokens !== undefined)\n usage.inputTokens = result.usage.inputTokens;\n if (result.usage?.outputTokens !== undefined)\n usage.outputTokens = result.usage.outputTokens;\n return { images, usage, raw: result };\n },\n };\n}\n\nexport const googleImageAdapter: Adapter = createGoogleImageAdapter();\n","import { z } from \"zod\";\nimport type { Adapter, AdapterContext } from \"./adapter.js\";\nimport { ModelKitError, isModelKitError, type ModelKitErrorInit } from \"../errors.js\";\nimport { classifyHttpError, classifyThrown, pollUntil, withRetry } from \"../retry.js\";\nimport type { RetryOptions } from \"../retry.js\";\nimport { JsonValueSchema } from \"../json.js\";\nimport type { JsonValue, UsageEvent, VideoJob, VideoRequest, VideoResult } from \"../types.js\";\nimport { DEFAULT_MOTION, resolveMotionId } from \"./higgsfield-motions.js\";\nimport { readBody, refToUrl, throwIfAborted } from \"./media-ref.js\";\n\nconst PLATFORM = \"https://platform.higgsfield.ai\";\nconst DOP_ENDPOINT = `${PLATFORM}/v1/image2video/dop`;\nconst DOP_STATUS = `${PLATFORM}/requests/{set_id}/status`;\n\nconst KLING_INTERVAL_MS = 2000;\nconst KLING_BACKOFF = 1.2;\nconst KLING_MAX_INTERVAL_MS = 10_000;\nconst KLING_TIMEOUT_MS = 15 * 60_000;\nconst DOP_INTERVAL_MS = 5000;\nconst DOP_TIMEOUT_MS = 5 * 60_000;\n/** DOP output length is provider-fixed; bill it when the caller requests no duration. */\nconst DOP_FALLBACK_DURATION_SECONDS = 5;\n\nconst DEFAULT_NEGATIVE_PROMPT =\n \"text, watermark, copyright, blur, low quality, distortion, abstract, weird, deformed\";\n\ninterface HiggsfieldCredentials {\n key: string;\n secret: string;\n}\n\ntype HiggsfieldHeaders = {\n \"Content-Type\": string;\n \"hf-api-key\": string;\n \"hf-secret\": string;\n};\n\ninterface PollSettings {\n intervalMs: number;\n timeoutMs: number;\n signal?: AbortSignal;\n backoff?: number;\n maxIntervalMs?: number;\n}\n\nfunction credentials(ctx: AdapterContext): HiggsfieldCredentials {\n const key = ctx.keys.higgsfield;\n const secret = ctx.keys.higgsfieldSecret;\n if (!key || !secret) {\n throw new ModelKitError({\n code: \"auth\",\n message: \"Missing API key for higgsfield\",\n provider: \"higgsfield\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n return { key, secret };\n}\n\nfunction headers(ctx: AdapterContext): HiggsfieldHeaders {\n const { key, secret } = credentials(ctx);\n return { \"Content-Type\": \"application/json\", \"hf-api-key\": key, \"hf-secret\": secret };\n}\n\n// providerModelId may be a relative model path; prefix the platform host.\nfunction klingEndpoint(providerModelId: string): string {\n if (providerModelId.startsWith(\"http\")) return providerModelId;\n const path = providerModelId.startsWith(\"/\") ? providerModelId.slice(1) : providerModelId;\n return `${PLATFORM}/${path}`;\n}\n\n// DOP is picked by exact providerModelId, never by substring; every other\n// higgsfield row is Kling.\ntype HiggsfieldVideoKind = \"dop\" | \"kling\";\n\nconst DOP_MODEL_IDS: ReadonlySet<string> = new Set([\"dop\", \"dop-preview\"]);\n\nfunction higgsfieldVideoKind(providerModelId: string): HiggsfieldVideoKind {\n return DOP_MODEL_IDS.has(providerModelId.toLowerCase()) ? \"dop\" : \"kling\";\n}\n\nfunction videoUsage(ctx: AdapterContext, req: VideoRequest, duration?: number): UsageEvent {\n const event: UsageEvent = {\n model: ctx.model.id,\n provider: \"higgsfield\",\n modality: \"VIDEO\",\n unit: \"seconds\",\n quantity: duration ?? req.durationSeconds ?? 0,\n };\n if (req.resolution !== undefined) event.resolution = req.resolution;\n if (req.durationSeconds !== undefined) event.durationSeconds = req.durationSeconds;\n return event;\n}\n\ninterface KlingCreate {\n prompt: string;\n image_url: string;\n duration?: number;\n aspect_ratio?: string;\n cfg_scale: number;\n negative_prompt: string;\n last_image_url?: string;\n}\n\nconst klingCreateSchema = z.object({ status_url: z.string() });\n\nconst klingStatusSchema = z.object({\n status: z.string().optional(),\n video: z.object({ url: z.string().optional() }).optional(),\n error: JsonValueSchema.optional(),\n});\n\nconst errorMessageSchema = z.object({ message: z.string().optional() });\nconst textValueSchema = z.string();\n\nfunction klingErrorDetail(error: JsonValue | undefined): string {\n if (error === undefined) return \"unknown_error\";\n const asText = textValueSchema.safeParse(error);\n if (asText.success) return asText.data;\n const asObject = errorMessageSchema.safeParse(error);\n if (asObject.success) return asObject.data.message ?? \"unknown_error\";\n return \"unknown_error\";\n}\n\nfunction requestInit(\n ctx: AdapterContext,\n init: { method: \"GET\" | \"POST\"; body?: string },\n): RequestInit {\n const request: RequestInit = { method: init.method, headers: headers(ctx) };\n if (init.body !== undefined) request.body = init.body;\n if (ctx.signal !== undefined) request.signal = ctx.signal;\n return request;\n}\n\n/**\n * Submit a create request. A rejected fetch is a transport failure (retryable\n * network); an HTTP response is classified by its status. The caller wraps this\n * in `withRetry`, so a retryable failure is retried on the next attempt.\n */\nasync function createRequest(\n ctx: AdapterContext,\n url: string,\n init: { method: \"GET\" | \"POST\"; body?: string },\n): Promise<Response> {\n let res: Response;\n try {\n res = await ctx.fetch(url, requestInit(ctx, init));\n } catch (cause) {\n throw classifyThrown(\"higgsfield\", cause, ctx.model.id);\n }\n if (!res.ok) {\n throw classifyHttpError(res.status, await readBody(res), \"higgsfield\", ctx.model.id);\n }\n return res;\n}\n\nasync function generateKlingVideo(req: VideoRequest, ctx: AdapterContext): Promise<VideoJob> {\n const firstFrame = req.firstFrame ? refToUrl(req.firstFrame) : undefined;\n if (!firstFrame) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${ctx.model.id} requires firstFrame`,\n provider: \"higgsfield\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const body: KlingCreate = {\n prompt: req.prompt.trim(),\n image_url: firstFrame,\n cfg_scale: req.cfgScale ?? 0.5,\n negative_prompt: req.negativePrompt ?? DEFAULT_NEGATIVE_PROMPT,\n };\n if (req.durationSeconds !== undefined) body.duration = req.durationSeconds;\n if (req.aspectRatio !== undefined && req.aspectRatio !== \"adaptive\")\n body.aspect_ratio = req.aspectRatio;\n if (req.lastFrame) body.last_image_url = refToUrl(req.lastFrame);\n\n const endpoint = klingEndpoint(ctx.model.providerModelId);\n const retryOptions: RetryOptions = {};\n if (ctx.signal !== undefined) retryOptions.signal = ctx.signal;\n const createRes = await withRetry(\n () => createRequest(ctx, endpoint, { method: \"POST\", body: JSON.stringify(body) }),\n retryOptions,\n );\n const created = klingCreateSchema.safeParse(await createRes.json());\n if (!created.success) {\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: \"Higgsfield create returned no status_url\",\n provider: \"higgsfield\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const statusUrl = created.data.status_url;\n const check = async (): Promise<string | undefined> => {\n let res: Response;\n try {\n res = await ctx.fetch(statusUrl, requestInit(ctx, { method: \"GET\" }));\n } catch {\n return undefined;\n }\n // A status poll that hits a 429 or 5xx is transient: keep polling until\n // the timeout instead of failing an otherwise healthy job.\n if (res.status === 429 || res.status >= 500) return undefined;\n if (!res.ok) {\n throw classifyHttpError(res.status, await readBody(res), \"higgsfield\", ctx.model.id);\n }\n const payload: JsonValue = JsonValueSchema.parse(await res.json());\n const parsed = klingStatusSchema.safeParse(payload);\n const statusValue = parsed.success ? parsed.data.status : undefined;\n if (statusValue === \"completed\") {\n const videoUrl = parsed.success ? parsed.data.video?.url : undefined;\n if (videoUrl === undefined) {\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: \"Higgsfield completed without a video URL\",\n provider: \"higgsfield\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n return videoUrl;\n }\n if (statusValue === \"failed\") {\n const errorValue = parsed.success ? parsed.data.error : undefined;\n const detail = klingErrorDetail(errorValue);\n const failure: ModelKitErrorInit = {\n code: \"provider_rejected\",\n message: `Higgsfield generation failed: ${detail}`,\n provider: \"higgsfield\",\n model: ctx.model.id,\n retryable: false,\n };\n if (errorValue !== undefined) failure.body = errorValue;\n throw new ModelKitError(failure);\n }\n return undefined;\n };\n return {\n jobId: statusUrl,\n async poll() {\n try {\n const url = await check();\n return url ? { status: \"succeeded\" } : { status: \"pending\" };\n } catch (cause) {\n if (isModelKitError(cause) && !cause.retryable) return { status: \"failed\" };\n throw cause;\n }\n },\n async result(opts) {\n const klingSignal = opts?.signal ?? ctx.signal;\n const pollSettings: PollSettings = {\n intervalMs: opts?.pollIntervalMs ?? KLING_INTERVAL_MS,\n backoff: KLING_BACKOFF,\n maxIntervalMs: KLING_MAX_INTERVAL_MS,\n timeoutMs: opts?.timeoutMs ?? KLING_TIMEOUT_MS,\n };\n if (klingSignal !== undefined) pollSettings.signal = klingSignal;\n const url = await pollUntil(check, pollSettings);\n const result: VideoResult = { video: { url }, usage: videoUsage(ctx, req) };\n return result;\n },\n };\n}\n\nconst dopMotionOptionsSchema = z.object({\n modelkit: z.object({ motion: z.string().optional() }).optional(),\n});\n\n// Motion name comes from the catalog row's providerOptions.modelkit.motion; unknown names\n// fall back to the General motion, mirroring resolveMotionId's null case.\nfunction dopMotionId(ctx: AdapterContext): string {\n const parsed = dopMotionOptionsSchema.safeParse(ctx.model.providerOptions);\n const motion = parsed.success ? parsed.data.modelkit?.motion : undefined;\n const id =\n motion === undefined\n ? resolveMotionId(DEFAULT_MOTION)\n : (resolveMotionId(motion) ?? resolveMotionId(DEFAULT_MOTION));\n if (id === null)\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: \"no DOP motion\",\n provider: \"higgsfield\",\n model: ctx.model.id,\n retryable: false,\n });\n return id;\n}\n\nconst jsonRecordSchema = z.record(z.string(), JsonValueSchema);\n\nconst DOP_URL_KEYS = [\"url\", \"video_url\", \"output_url\", \"result_url\", \"download_url\"];\nconst DOP_NESTED_KEYS = [\"video\", \"result\", \"results\"];\n\nfunction dopUrl(body: JsonValue): string | undefined {\n if (Array.isArray(body)) {\n for (const item of body) {\n const found = dopUrl(item);\n if (found !== undefined) return found;\n }\n return undefined;\n }\n const record = jsonRecordSchema.safeParse(body);\n if (!record.success) return undefined;\n const obj = record.data;\n for (const key of DOP_URL_KEYS) {\n const candidate = obj[key];\n if (candidate === undefined) continue;\n const asUrl = textValueSchema.safeParse(candidate);\n if (asUrl.success && asUrl.data !== \"\") return asUrl.data;\n }\n for (const key of DOP_NESTED_KEYS) {\n const nested = obj[key];\n if (nested === undefined || nested === null) continue;\n const found = dopUrl(nested);\n if (found !== undefined) return found;\n }\n return undefined;\n}\n\ninterface DopMotionEntry {\n id: string;\n strength: number;\n}\n\ninterface DopInputImage {\n type: string;\n image_url: string;\n}\n\ninterface DopSubmitParams {\n model: string;\n prompt: string;\n motions: DopMotionEntry[];\n check_nsfw: boolean;\n input_images: DopInputImage[];\n enhance_prompt: boolean;\n webhook: null;\n input_images_end?: DopInputImage[];\n seed?: number;\n}\n\nconst dopCreateSchema = z.object({ id: z.string() });\n\nconst dopStatusSchema = z.object({ status: z.string().optional() });\n\nasync function generateDopVideo(req: VideoRequest, ctx: AdapterContext): Promise<VideoJob> {\n const firstFrame = req.firstFrame ? refToUrl(req.firstFrame) : undefined;\n if (!firstFrame) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${ctx.model.id} requires firstFrame`,\n provider: \"higgsfield\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const params: DopSubmitParams = {\n model: \"dop-preview\",\n prompt: req.prompt,\n motions: [{ id: dopMotionId(ctx), strength: 1.0 }],\n check_nsfw: true,\n input_images: [{ type: \"image_url\", image_url: firstFrame }],\n enhance_prompt: true,\n webhook: null,\n };\n if (req.lastFrame) {\n params.input_images_end = [{ type: \"image_url\", image_url: refToUrl(req.lastFrame) }];\n }\n if (req.seed !== undefined) params.seed = req.seed;\n\n const retryOptions: RetryOptions = {};\n if (ctx.signal !== undefined) retryOptions.signal = ctx.signal;\n const createRes = await withRetry(\n () =>\n createRequest(ctx, DOP_ENDPOINT, {\n method: \"POST\",\n body: JSON.stringify({ params, webhook: null }),\n }),\n retryOptions,\n );\n const created = dopCreateSchema.safeParse(await createRes.json());\n if (!created.success) {\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: \"Higgsfield DOP submit returned no set id\",\n provider: \"higgsfield\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const setId = created.data.id;\n const statusUrl = DOP_STATUS.replace(\"{set_id}\", setId);\n const check = async (): Promise<string | undefined> => {\n let res: Response;\n try {\n res = await ctx.fetch(statusUrl, requestInit(ctx, { method: \"GET\" }));\n } catch {\n return undefined;\n }\n if (!res.ok) {\n // Unlike Kling, DOP treats poll-time 4xx as transient and keeps waiting.\n return undefined;\n }\n const payload: JsonValue = JsonValueSchema.parse(await res.json());\n const parsed = dopStatusSchema.safeParse(payload);\n const statusValue = parsed.success ? parsed.data.status : undefined;\n if (statusValue === \"completed\") {\n const url = dopUrl(payload);\n if (!url) {\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: \"Higgsfield DOP completed without a video URL\",\n provider: \"higgsfield\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n return url;\n }\n if (statusValue === \"failed\" || statusValue === \"error\" || statusValue === \"cancelled\") {\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: `Higgsfield DOP generation failed: ${statusValue}`,\n provider: \"higgsfield\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n return undefined;\n };\n return {\n jobId: setId,\n async poll() {\n try {\n const url = await check();\n return url ? { status: \"succeeded\" } : { status: \"pending\" };\n } catch (cause) {\n if (isModelKitError(cause) && !cause.retryable) return { status: \"failed\" };\n throw cause;\n }\n },\n async result(opts) {\n const dopSignal = opts?.signal ?? ctx.signal;\n const pollSettings: PollSettings = {\n intervalMs: opts?.pollIntervalMs ?? DOP_INTERVAL_MS,\n timeoutMs: opts?.timeoutMs ?? DOP_TIMEOUT_MS,\n };\n if (dopSignal !== undefined) pollSettings.signal = dopSignal;\n const url = await pollUntil(check, pollSettings);\n const result: VideoResult = {\n video: { url },\n usage: videoUsage(ctx, req, req.durationSeconds ?? DOP_FALLBACK_DURATION_SECONDS),\n };\n return result;\n },\n };\n}\n\nexport const higgsfieldAdapter: Adapter = {\n id: \"higgsfield\",\n generateVideo: (req, ctx) => {\n throwIfAborted(ctx.signal);\n return higgsfieldVideoKind(ctx.model.providerModelId) === \"dop\"\n ? generateDopVideo(req, ctx)\n : generateKlingVideo(req, ctx);\n },\n};\n","/**\n * Motion name → UUID for the Higgsfield DOP API.\n * Copied verbatim from trigger-workflows higgsfield-dop.ts MOTION_MAP.\n * Upstream holds 121 entries; the spec's 131st entries do not exist there,\n * so this file ports the list as-is. Lookup is case-insensitive.\n */\nexport interface MotionTable {\n [motionName: string]: string;\n}\n\nexport const MOTION_MAP: MotionTable = {\n \"360 Orbit\": \"ea035f68-b350-40f1-b7f4-7dff999fdd67\",\n \"3D Rotation\": \"2bae49e6-ffe7-42a8-a73f-d44632c4acaa\",\n Abstract: \"7f8971a6-9e96-45b6-a05a-8f5c99b1e13d\",\n \"Action Run\": \"dc8d7d9c-ae0c-45fc-b780-7d470b171b45\",\n \"Agent Reveal\": \"65b0a5a3-953d-471c-86d5-967ab44d0dab\",\n \"Angel Wings\": \"d21ff628-0d91-40b2-8508-cd5a0ce375d4\",\n \"Arc Left\": \"c5881721-05b1-47d9-94d6-0203863114e1\",\n \"Arc Right\": \"a85cb3f2-f2be-4ee2-b3b9-808fc6a81acc\",\n \"Baseball Kick\": \"ab0fa3d8-fcbe-4a6a-96bb-eae7a0e2c2cb\",\n \"Basketball Dunks\": \"1b4c1b9a-898b-451c-bff8-7288382ccaf2\",\n \"Black Tears\": \"161d2898-f7ed-43f5-8daa-1175bcc69ba9\",\n \"Bloom Mouth\": \"4a79cff8-ef78-42ca-aed9-3fb9acaed4ad\",\n Boxing: \"4ac80533-015b-49c1-a2eb-891603823883\",\n \"Buckle Up\": \"a652ae99-c21b-4bdf-965c-e4a6d07fb262\",\n \"Building Explosion\": \"cb8cfb5a-245d-4d96-92d7-7e0791967d75\",\n \"Bullet Time\": \"22d7c60a-b76f-4082-9928-d2a42357759a\",\n \"Car Chasing\": \"b98810ad-e51d-4680-a800-cd6fc8037bc4\",\n \"Car Explosion\": \"0235b1a9-428a-4df5-aa5a-93b6dba41834\",\n \"Car Grip\": \"b3fd6f79-dd5e-48f7-b5b4-5c2f1655822c\",\n Catwalk: \"0e339850-d8f1-4c9d-be3a-97fc2cdb628e\",\n \"Clone Explosion\": \"fd6272d6-7b7c-4c4e-9afd-c5c98aaa1b5c\",\n \"Crane Down\": \"b26dcbe5-e784-4893-b8a3-2bd4f848e90a\",\n \"Crane Over The Head\": \"0d736605-3a09-4a39-bcfe-b556fba7dd22\",\n \"Crane Up\": \"68af9add-43ea-4261-a706-16b640fdcff9\",\n \"Crash Zoom In\": \"3ec247ed-063d-476d-8266-48829c2eced6\",\n \"Crash Zoom Out\": \"3f7a86be-c78f-4c5d-8dbf-7395a3fbeea1\",\n Datamosh: \"e3112849-0c04-4af2-be93-ccbb0f8f4cd5\",\n Diamond: \"81d6b1c4-dd8a-4130-9c01-fe85bf80babc\",\n \"Dirty Lens\": \"29168a2c-04db-4ad1-8e19-f2a24371d413\",\n Disintegration: \"97ffe32a-ab9a-4067-9cf9-9adc30c2656f\",\n \"Dolly In\": \"81ca2cd2-05db-4222-9ba0-a32e5185adfb\",\n \"Dolly Left\": \"71f0f8bc-0e5d-4d32-b34f-bd74a5e3cba8\",\n \"Dolly Out\": \"12ac8798-5370-4801-91a6-f1acb425fc4a\",\n \"Dolly Right\": \"15ddc007-4723-42c1-8446-2af69af4879f\",\n \"Dolly Zoom In\": \"f0ca4e62-f65d-4a6d-83c1-ecbaa4d492ba\",\n \"Dolly Zoom Out\": \"2df82f5f-064a-4a7e-8b59-24ac446cb1df\",\n \"Double Dolly\": \"bd133fba-ed35-433b-9cb2-87b1f5bb1139\",\n \"Downhill Pov\": \"381fcf9a-ca91-4eac-a3c4-43d4302d6404\",\n Duplicate: \"1d21b411-b706-4233-ad83-7599290ac51f\",\n \"Dutch Angle\": \"915d6b95-6b9c-4a09-a0df-7ecd69c9bf64\",\n \"Earth Zoom Out\": \"46fa79e3-efce-41e8-95bc-1dc5a1a30795\",\n \"Eyes In\": \"0c5d9955-706e-4b21-b499-39f1b5e5ea0e\",\n \"Face Punch\": \"d6772bfc-272d-4396-a972-deecb09b17cb\",\n \"Fire Breathe\": \"eeb51fed-dfdc-4b99-804a-6ae8f550e95d\",\n Fisheye: \"ec365c4d-c130-48b3-923d-4b4359d96095\",\n \"Floating Fish\": \"ca339f47-c2a5-4f3f-a1fb-4f12344cd5da\",\n Flood: \"6597fc71-86dc-4f65-90c2-11330022cd1c\",\n \"Floral Eyes\": \"f0426395-607f-4753-83e3-85ee2151a840\",\n Flying: \"1d5ee550-a8b2-4200-8909-4ca7795911dc\",\n \"Focus Change\": \"797e27b5-2e6e-4b9a-a3c1-d437e9d386fc\",\n \"Fpv Drone\": \"7673d9e0-208c-4cf8-8b72-fce5b0e92ecb\",\n Freezing: \"9390496c-0547-4a70-98a7-31ad27d334cd\",\n \"Garden Bloom\": \"60049b87-68f5-4c34-b833-e2ef3b9d807d\",\n General: \"31177282-bde3-4870-b283-1135ca0a201a\",\n Glam: \"a2046ff7-26fc-4d97-aab7-54bbb55fca97\",\n \"Glowing Fish\": \"cb3d5fee-d874-41cf-b0aa-c1092af79da0\",\n Glowshift: \"f2db4c02-4d29-4401-a26e-0cf8ae14b9b3\",\n Handheld: \"5be9d262-82d7-4a74-babf-ee8fefd5c3c3\",\n \"Head Explosion\": \"92141609-85f7-4c8a-866e-9a542c164fe9\",\n \"Head Off\": \"d57404a2-5d6f-4bce-b9d5-1242666cae02\",\n \"Head Tracking\": \"d38d2084-dde6-4c16-90d2-19603bceb901\",\n Hyperlapse: \"aebcaa0d-525d-4a74-b497-26da8f81957b\",\n Incline: \"cff69c3b-0178-4f72-bae5-e301ccb97f28\",\n Innerlight: \"7c01086d-92a1-43f8-a69b-63ce07d4f19d\",\n Invisible: \"6fdc8fa8-6373-4a5e-aeac-4aa84c8cfd4b\",\n \"Jelly Drift\": \"c5b339cd-9f1c-44fe-91a1-464cf83f3749\",\n \"Jib Down\": \"2ce412eb-2e66-4d73-9c9c-d1fba4c8a494\",\n \"Jib Up\": \"cc5d4b42-f05d-41ef-9f51-c4b28f3fd2d2\",\n Kiss: \"83a8902b-4531-4893-9ee8-044b2d92b758\",\n \"Lazy Susan\": \"ce9dc38e-d6da-4368-9742-f73b559d802e\",\n \"Lens Crack\": \"080dd954-0d90-4346-8fef-83aebfe63ce5\",\n \"Lens Flare\": \"e98b3fee-79e8-4d87-881c-8ddd03ca738e\",\n Levitation: \"0a5a48d7-6716-41a4-9a9f-7ad9229c879b\",\n \"Low Shutter\": \"790ca797-703e-44c1-8d77-53080ea3c6a3\",\n \"Medusa Gorgona\": \"473fd7e0-18f5-467f-a146-3b6cbfddf46a\",\n Melting: \"eb3b0cd9-f924-410c-94c7-9e1850ed04c7\",\n \"Moonwalk Left\": \"70f3014c-ee77-4c33-83b9-7f7e68726aa9\",\n \"Moonwalk Right\": \"cf8c7490-7bc0-433d-860c-d1be982a520a\",\n Morphskin: \"8968b3f5-8d71-432a-a579-2d1aeae21439\",\n \"Mouth In\": \"21bbd0c4-ca4f-4ea3-82a8-607437d63e8e\",\n \"Object Pov\": \"b29cff3b-2494-4f3f-a74c-70ceee7b1ccf\",\n Overhead: \"40245735-2670-4572-b46e-854151281f55\",\n \"Paint Splash\": \"aa8d80db-ca0e-4535-952f-6fa040f2306b\",\n Paparazzi: \"556ab276-23b1-4604-a501-2513a71e2eea\",\n \"Powder Explosion\": \"7aa6fbad-55eb-4930-bf75-cc9a2f0b3b5b\",\n \"Push To Glass\": \"30a02896-cdda-469d-9ed9-52cbba1c04a8\",\n \"Rap Flex\": \"c3dbf04b-2ba5-4986-ab4f-872a9d71826f\",\n \"Robo Arm\": \"153afe86-20f1-45d3-99ea-106c37f94506\",\n \"Roll Transition\": \"c718443d-fc3c-4a79-bccf-6c98b56737ec\",\n \"Sand Storm\": \"ba778a3b-e6ff-4563-9253-a8ae4e04b1a7\",\n \"Set On Fire\": \"3f003f41-dbdc-41d9-94a8-de3942ebeb67\",\n \"Skateboard Glide\": \"26864aa2-010c-458c-bdf5-963babc756d2\",\n \"Skateboard Ollie\": \"023bf31f-23d2-4432-90be-cab4ae332e59\",\n \"Skate Cruise\": \"2bf184fb-47a3-41ba-93ac-846b9307b1bd\",\n \"Ski Carving\": \"9015dd00-4325-4679-b3da-bb25cd948899\",\n \"Skin Surge\": \"8c8f12b1-732f-4faf-8b2b-6029b964afd3\",\n \"Ski Powder\": \"e65a92e6-7a9e-43ce-8d35-6f6a16bfe716\",\n Snorricam: \"984834d9-72a7-4074-97c2-f98d265a49de\",\n \"Snowboard Carving\": \"f933ee1b-329e-41e9-8aad-5a1f60ecd6f5\",\n \"Snowboard Powder\": \"f6fdf448-6309-497b-85ee-79517a9ff097\",\n \"Soul Jump\": \"87d67a56-8d80-42db-8e1c-ebc3d2483cbd\",\n Static: \"fa3ddb7c-53ee-4383-aa17-97ae65f180e5\",\n \"Super 8Mm\": \"b604bd5f-22eb-4920-ad7e-47306805d7c6\",\n \"Super Dolly In\": \"3a24a20d-b494-4e8a-9b5f-4ef05ee5073d\",\n \"Super Dolly Out\": \"679c128d-a109-4267-8007-12f653f6346d\",\n Tentacles: \"20a5fdc3-c92b-4134-900c-4f47bbb0edb7\",\n \"Through Object In\": \"ebf152b3-f794-4d5c-886f-ff61ec6498bc\",\n \"Through Object Out\": \"ea0d11ac-b4e2-4ea7-89c2-a4a44a62dc79\",\n \"Thunder God\": \"27169770-288b-4ee7-b3ab-bb2bcf0e136b\",\n \"Tilt Down\": \"ff67b0eb-a621-45a0-b92d-ce2549250149\",\n \"Tilt Up\": \"2c9af101-fe7a-4299-91f3-e44431a0576f\",\n \"Timelapse Human\": \"9463e9ef-3242-46bf-b1ec-41eec6b2d6bf\",\n \"Timelapse Landscape\": \"130b5a9d-522f-467b-bb22-a9109c1710c1\",\n \"Turning Metal\": \"3e735d99-34f6-469c-83fb-ba608f299424\",\n Vhs: \"2b7c1db3-862a-4373-8435-ae4464ae5892\",\n \"Whip Pan\": \"25c72c28-7857-4aa0-af92-d9acd5e44b81\",\n Wiggle: \"8a660d27-dfe9-4bb1-8ad0-c6603e79fc95\",\n \"Wind To Face\": \"e8027924-b97d-43c3-9676-3c0f16da6c5f\",\n \"Yoyo Zoom\": \"bd639dee-00a3-407b-b539-f4516ce9d214\",\n \"Zoom In\": \"fbcbec5b-30f8-4b17-ba6e-8e8d5b265562\",\n \"Zoom Out\": \"263600e4-45c0-4c13-9579-40a9278af37c\",\n};\n\nconst MOTION_LOWER: MotionTable = Object.fromEntries(\n Object.keys(MOTION_MAP).map((k) => [k.toLowerCase(), k]),\n);\n\nexport const DEFAULT_MOTION = \"General\";\n\nexport function resolveMotionId(motionName: string | null | undefined): string | null {\n if (!motionName?.trim()) return null;\n const canonical = MOTION_LOWER[motionName.trim().toLowerCase()];\n if (!canonical) return null;\n return MOTION_MAP[canonical] ?? null;\n}\n","import OpenAI from \"openai\";\nimport { z } from \"zod\";\nimport { ModelKitError } from \"../errors.js\";\nimport { classifyHttpError, withRetry } from \"../retry.js\";\nimport type { RetryOptions } from \"../retry.js\";\nimport type { Adapter, AdapterContext } from \"./adapter.js\";\nimport type { ImageRequest, ImageResult, ImageSize, UsageEvent } from \"../types.js\";\nimport { base64ToBytes, mediaRefToBytes, throwIfAborted } from \"./media-ref.js\";\n\nexport type OpenAIImageQuality = \"auto\" | \"high\" | \"medium\" | \"low\" | \"xhigh\" | \"max\";\n/** Intersection of the generate and edit quality unions in the installed SDK. */\ntype SdkImageQuality = NonNullable<Parameters<OpenAI[\"images\"][\"edit\"]>[0][\"quality\"]> &\n NonNullable<Parameters<OpenAI[\"images\"][\"generate\"]>[0][\"quality\"]>;\n\nconst MAX_EDIT_REFERENCES = 16;\n\n/**\n * Vibe's aspect_ratio + image_size tier to a WIDTHxHEIGHT string for\n * gpt-image-2. All tiers honor the true aspect ratio; the tier only sets the\n * target long edge (1K->1024, 2K->2048, 4K->3840). gpt-image-2 hard constraints\n * (see OpenAI docs - \"Size and quality options\"):\n * - both edges divisible by 16\n * - max edge <= 3840\n * - long:short ratio <= 3:1 (all mapped ratios already satisfy this)\n * - total pixels between 655,360 and 8,294,400\n * We scale UP to clear the pixel floor (a literal 16:9 @ 1024 long edge is only\n * 589,824 px, below the minimum) and DOWN to clear the ceiling.\n */\nexport function aspectRatioToSize(ratio: string, tier: ImageSize): string {\n // The catalog never resolves \"512\" for an OpenAI row; treat it as the 1K floor.\n const TIER_LONG_EDGE: Partial<Record<ImageSize, number>> = {\n \"1K\": 1024,\n \"2K\": 2048,\n \"4K\": 3840,\n };\n const MIN_PIXELS = 655_360;\n const MAX_PIXELS = 8_294_400;\n const maxLong = TIER_LONG_EDGE[tier] ?? 1024;\n\n const RATIO_MAP = new Map<string, [number, number]>([\n [\"1:1\", [1, 1]],\n [\"16:9\", [16, 9]],\n [\"9:16\", [9, 16]],\n [\"4:3\", [4, 3]],\n [\"3:4\", [3, 4]],\n [\"3:2\", [3, 2]],\n [\"2:3\", [2, 3]],\n [\"21:9\", [21, 9]],\n [\"4:5\", [4, 5]],\n [\"5:4\", [5, 4]],\n ]);\n\n // \"adaptive\" and any unknown ratio fall back to a square at the tier's\n // long edge (clamped to the pixel caps below).\n const dims = RATIO_MAP.get(ratio) ?? [1, 1];\n const [wp, hp] = dims;\n const ar = wp / hp;\n\n let w: number;\n let h: number;\n if (ar >= 1) {\n w = maxLong;\n h = Math.round(maxLong / ar);\n } else {\n h = maxLong;\n w = Math.round(maxLong * ar);\n }\n\n // Snap to multiples of 16 (hard requirement, min one block per edge).\n const snap = (n: number) => Math.max(16, Math.round(n / 16) * 16);\n w = snap(w);\n h = snap(h);\n\n // Enforce the pixel floor (scale up) and ceiling (scale down); both edges\n // stay divisible by 16. Only one branch can apply since MIN < MAX.\n if (w * h < MIN_PIXELS) {\n const scale = Math.sqrt(MIN_PIXELS / (w * h));\n w = Math.ceil((w * scale) / 16) * 16;\n h = Math.ceil((h * scale) / 16) * 16;\n } else if (w * h > MAX_PIXELS) {\n const scale = Math.sqrt(MAX_PIXELS / (w * h));\n w = Math.floor((w * scale) / 16) * 16;\n h = Math.floor((h * scale) / 16) * 16;\n }\n\n return `${w}x${h}`;\n}\n\nfunction toProviderError(cause: unknown, ctx: AdapterContext): ModelKitError {\n if (cause instanceof OpenAI.APIConnectionTimeoutError) {\n return new ModelKitError({\n code: \"timeout\",\n message: `openai-image timed out: ${cause.message}`,\n provider: \"openai-image\",\n model: ctx.model.id,\n cause,\n });\n }\n if (cause instanceof OpenAI.APIConnectionError) {\n return new ModelKitError({\n code: \"network\",\n message: `openai-image connection failed: ${cause.message}`,\n provider: \"openai-image\",\n model: ctx.model.id,\n cause,\n });\n }\n if (cause instanceof OpenAI.APIError) {\n return classifyHttpError(\n cause.status,\n cause.error ?? cause.message,\n \"openai-image\",\n ctx.model.id,\n );\n }\n return classifyHttpError(\n undefined,\n cause instanceof Error ? cause.message : String(cause),\n \"openai-image\",\n ctx.model.id,\n );\n}\n\nconst openaiUsageSchema = z.object({\n input_tokens: z.number().optional(),\n output_tokens: z.number().optional(),\n});\n\nexport const openaiImageAdapter: Adapter = {\n id: \"openai-image\",\n async generateImage(req: ImageRequest, ctx: AdapterContext): Promise<ImageResult> {\n throwIfAborted(ctx.signal);\n const apiKey = ctx.keys.openai;\n if (!apiKey)\n throw new ModelKitError({\n code: \"auth\",\n message: \"Missing API key for openai\",\n provider: \"openai-image\",\n model: ctx.model.id,\n retryable: false,\n });\n // The Images API carries no per-reference caption, so labels are dropped\n // wholesale rather than reordering the multipart parts.\n if ((req.references ?? []).some((ref) => ref.label !== undefined)) {\n ctx.warnings.push({\n code: \"option_ignored\",\n field: \"references.label\",\n message: \"openai-image cannot express reference labels; ignoring them\",\n });\n }\n // maxRetries 0: withRetry below owns the retry budget so a 429 pays\n // one backoff instead of stacking the SDK loop under ours.\n const client = new OpenAI({ apiKey, fetch: ctx.fetch, maxRetries: 0 });\n // exactSize bypasses tier mapping and preserves legacy pixel contracts.\n // Auto (no aspect ratio) omits size so the provider picks.\n const size =\n req.exactSize !== undefined\n ? req.exactSize\n : req.aspectRatio === undefined || req.aspectRatio === \"adaptive\"\n ? undefined\n : aspectRatioToSize(req.aspectRatio, req.size ?? \"1K\");\n const refs = req.references ?? [];\n const isEdit = refs.length > 0;\n // gpt-image-2 fixes input fidelity high on edits itself (it rejects the parameter), so medium output quality is enough.\n const quality: OpenAIImageQuality = req.quality ?? (isEdit ? \"medium\" : \"auto\");\n // SAFETY: gpt-image-2.5 accepts \"xhigh\" and \"max\"; the installed openai SDK (6.x)\n // types predate them (they arrive in 7.12.1). The API validates the value per model.\n const sdkQuality = quality as SdkImageQuality;\n const count = req.count !== undefined && req.count > 1 ? { n: req.count } : {};\n\n const retryOptions: RetryOptions = {};\n if (ctx.signal !== undefined) retryOptions.signal = ctx.signal;\n const response = await withRetry(async () => {\n try {\n if (!isEdit) {\n if (size !== undefined) {\n return await client.images.generate(\n {\n model: ctx.model.providerModelId,\n prompt: req.prompt,\n size,\n quality: sdkQuality,\n ...count,\n },\n { signal: ctx.signal },\n );\n }\n return await client.images.generate(\n {\n model: ctx.model.providerModelId,\n prompt: req.prompt,\n quality: sdkQuality,\n ...count,\n },\n { signal: ctx.signal },\n );\n }\n const files = await Promise.all(\n refs.slice(0, MAX_EDIT_REFERENCES).map(async (ref, i) => {\n const { bytes, mime } = await mediaRefToBytes(ref, ctx.fetch, {\n signal: ctx.signal,\n provider: \"openai-image\",\n model: ctx.model.id,\n });\n const ext = mime.includes(\"jpeg\")\n ? \"jpg\"\n : mime.includes(\"webp\")\n ? \"webp\"\n : \"png\";\n return new File([bytes], `ref-${i}.${ext}`, { type: mime });\n }),\n );\n const single = files.length === 1 ? files[0] : undefined;\n const imageInput = single ?? files;\n if (size !== undefined) {\n return await client.images.edit(\n {\n model: ctx.model.providerModelId,\n image: imageInput,\n prompt: req.prompt,\n size,\n quality: sdkQuality,\n ...count,\n },\n { signal: ctx.signal },\n );\n }\n return await client.images.edit(\n {\n model: ctx.model.providerModelId,\n image: imageInput,\n prompt: req.prompt,\n quality: sdkQuality,\n ...count,\n },\n { signal: ctx.signal },\n );\n } catch (cause) {\n throw toProviderError(cause, ctx);\n }\n }, retryOptions);\n\n const images = (response.data ?? []).flatMap((item) =>\n item.b64_json ? [{ bytes: base64ToBytes(item.b64_json), mime: \"image/png\" }] : [],\n );\n if (images.length === 0)\n throw classifyHttpError(\n undefined,\n \"no image data in OpenAI response\",\n \"openai-image\",\n ctx.model.id,\n );\n\n // Never send response_format: it is DALL-E-only and gpt-image models\n // reject it with 400 Unknown parameter (they return b64_json anyway).\n const usageParsed = openaiUsageSchema.safeParse(response.usage);\n const inputTokens = usageParsed.success ? usageParsed.data.input_tokens : undefined;\n const outputTokens = usageParsed.success ? usageParsed.data.output_tokens : undefined;\n // OpenAI rows are priced per image; token counts ride along for context.\n const usage: UsageEvent = {\n model: ctx.model.id,\n provider: \"openai-image\",\n modality: \"IMAGE\",\n unit: \"images\",\n quantity: images.length,\n imageQuality: quality,\n };\n if (inputTokens !== undefined) usage.inputTokens = inputTokens;\n if (outputTokens !== undefined) usage.outputTokens = outputTokens;\n if (req.size !== undefined) usage.imageSize = req.size;\n return { images, usage, raw: response };\n },\n};\n","import type { Adapter, AdapterContext } from \"./adapter.js\";\nimport { ModelKitError, type ProviderErrorBody } from \"../errors.js\";\nimport { classifyHttpError, classifyThrown, withRetry, type RetryOptions } from \"../retry.js\";\nimport type { AspectRatio, ImageRequest, ImageResult, MediaRef, UsageEvent } from \"../types.js\";\nimport { throwIfAborted } from \"./media-ref.js\";\n\nconst PRODIA_JOB_URL = \"https://inference.prodia.com/v2/job\";\nconst FLUX_2_PRO_JOB = \"inference.flux-2.pro.img2img.v1\";\nconst FLUX_KLEIN_T2I_JOB = \"inference.flux-2.klein.txt2img.v1\";\nconst FLUX_KLEIN_I2I_JOB = \"inference.flux-2.klein.img2img.v1\";\nconst BG_REMOVE_JOB = \"inference.remove-background.v1\";\n\ninterface ProdiaDims {\n width: number;\n height: number;\n}\n\n// vibe-triggers aspectRatioToFluxDimensions. trigger-workflows' Flux Klein\n// table differs (16:9 1344x768, 4:3 1152x864, 3:2 1216x832, 9:16 768x1344,\n// 3:4 864x1152, 2:3 832x1216, 4:5 896x1152, plus explicit 1:1 and 5:4);\n// only 21:9 agrees. This adapter keeps the vibe-triggers table for every job;\n// 5:4 is the transpose of the 4:5 entry.\nconst RATIO_TO_DIMS: Partial<Record<AspectRatio, ProdiaDims>> = {\n \"16:9\": { width: 1360, height: 768 },\n \"4:3\": { width: 1024, height: 768 },\n \"3:2\": { width: 1152, height: 768 },\n \"21:9\": { width: 1536, height: 640 },\n \"9:16\": { width: 768, height: 1360 },\n \"3:4\": { width: 768, height: 1024 },\n \"2:3\": { width: 768, height: 1152 },\n \"4:5\": { width: 896, height: 1120 },\n \"5:4\": { width: 1120, height: 896 },\n};\n\nfunction dimsFor(aspectRatio: ImageRequest[\"aspectRatio\"]): ProdiaDims {\n if (aspectRatio !== undefined) {\n const dims = RATIO_TO_DIMS[aspectRatio];\n if (dims !== undefined) return dims;\n }\n return { width: 1024, height: 1024 };\n}\n\n// aspect_ratio values the Prodia job types accept. Nano Banana (img2img.v2)\n// additionally takes \"auto\" (match the first input) which the kit has no\n// spelling for; its enum otherwise drops 3:2. https://docs.prodia.com/models/nano-banana/\nconst GEMINI_JOB_RATIOS: ReadonlySet<AspectRatio> = new Set([\n \"1:1\",\n \"2:3\",\n \"3:2\",\n \"3:4\",\n \"4:3\",\n \"4:5\",\n \"5:4\",\n \"9:16\",\n \"16:9\",\n \"21:9\",\n]);\nconst NANO_BANANA_RATIOS: ReadonlySet<AspectRatio> = new Set([\n \"1:1\",\n \"2:3\",\n \"3:4\",\n \"4:3\",\n \"9:16\",\n \"16:9\",\n \"21:9\",\n]);\n\n// trigger-workflows downsizes inputs to 1900px via sharp before upload; this\n// package has no image resizer, so bytes go up as-is and oversize inputs are\n// the caller's responsibility.\nasync function refToBytes(\n ctx: AdapterContext,\n ref: MediaRef,\n): Promise<{ bytes: Uint8Array; mime: string }> {\n if (\"bytes\" in ref) return { bytes: ref.bytes, mime: ref.mime };\n let res: Response;\n try {\n res = await ctx.fetch(ref.url, ctx.signal ? { signal: ctx.signal } : {});\n } catch (cause) {\n throw classifyThrown(\"prodia\", cause, ctx.model.id);\n }\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw classifyHttpError(res.status, text, \"prodia\", ctx.model.id);\n }\n const mime = res.headers.get(\"content-type\") ?? \"image/jpeg\";\n return { bytes: new Uint8Array(await res.arrayBuffer()), mime };\n}\n\nfunction prodiaError(status: number, body: ProviderErrorBody, model: string): ModelKitError {\n return classifyHttpError(status, body, \"prodia\", model);\n}\n\n// First image part of a multipart response, else the whole body when Prodia\n// answers with a bare image. Mirrors parseMultipartResponse in the sources.\nfunction parseImageResponse(buffer: Uint8Array, contentType: string | null): Uint8Array {\n if (!contentType?.includes(\"multipart\")) {\n if (buffer.length === 0) throw emptyImage();\n return buffer;\n }\n const match = contentType.match(/boundary=(?:\"([^\"]+)\"|([^;,\\s]+))/);\n const boundary = match?.[1] ?? match?.[2];\n if (!boundary) {\n if (buffer.length === 0) throw emptyImage();\n return buffer;\n }\n const text = Buffer.from(buffer).toString(\"binary\");\n const parts = text.split(`--${boundary}`);\n for (const part of parts) {\n if (!part.includes(\"Content-Type: image/\")) continue;\n const headerEnd = part.indexOf(\"\\r\\n\\r\\n\");\n if (headerEnd < 0) continue;\n let body = part.slice(headerEnd + 4);\n body = body.replace(/\\r\\n--.*$/s, \"\").replace(/\\r\\n$/, \"\");\n if (body.length === 0) continue;\n return Uint8Array.from(Buffer.from(body, \"binary\"));\n }\n throw emptyImage();\n}\n\nfunction emptyImage(): ModelKitError {\n return new ModelKitError({\n code: \"provider_rejected\",\n message: \"No image found in Prodia API response\",\n provider: \"prodia\",\n retryable: false,\n });\n}\n\n/** File extension for the fetched input content type; the input is uploaded verbatim. */\nfunction inputExtension(mime: string): string {\n if (mime.includes(\"jpeg\") || mime.includes(\"jpg\")) return \"jpg\";\n if (mime.includes(\"webp\")) return \"webp\";\n if (mime.includes(\"gif\")) return \"gif\";\n return \"png\";\n}\n\nfunction isBgRemove(providerModelId: string): boolean {\n const id = providerModelId.toLowerCase();\n return id.includes(\"remove-background\") || id.includes(\"bg-remove\");\n}\n\nfunction isKlein(providerModelId: string): boolean {\n return providerModelId.toLowerCase().includes(\"klein\");\n}\n\ninterface ProdiaJobConfig {\n prompt?: string;\n width?: number;\n height?: number;\n // Gemini 3 and Nano Banana jobs take an aspect ratio (and, for Gemini 3, a\n // resolution tier) instead of width/height.\n // https://docs.prodia.com/models/gemini-3/ https://docs.prodia.com/models/nano-banana/\n aspect_ratio?: string;\n resolution?: string;\n safety_tolerance?: number;\n seed?: number;\n}\n\ninterface ProdiaJob {\n type: string;\n config?: ProdiaJobConfig;\n}\n\nasync function generateProdiaImage(req: ImageRequest, ctx: AdapterContext): Promise<ImageResult> {\n throwIfAborted(ctx.signal);\n const key = ctx.keys.prodia;\n if (!key) {\n throw new ModelKitError({\n code: \"auth\",\n message: \"Missing API key for prodia\",\n provider: \"prodia\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const providerModelId = ctx.model.providerModelId;\n const refs = await Promise.all((req.references ?? []).map((r) => refToBytes(ctx, r)));\n\n let job: ProdiaJob;\n let inputs: { bytes: Uint8Array; mime: string }[];\n let accept: string;\n let mime: string;\n if (isBgRemove(providerModelId)) {\n const first = refs[0];\n if (!first) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${ctx.model.id} requires a reference image`,\n provider: \"prodia\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n job = { type: BG_REMOVE_JOB };\n inputs = [first];\n accept = \"multipart/form-data\";\n mime = \"image/png\";\n } else if (isKlein(providerModelId)) {\n const dims = dimsFor(req.aspectRatio);\n const config: ProdiaJobConfig = {\n prompt: req.prompt,\n width: dims.width,\n height: dims.height,\n };\n job = {\n type: refs.length > 0 ? FLUX_KLEIN_I2I_JOB : FLUX_KLEIN_T2I_JOB,\n config,\n };\n const firstRef = refs[0];\n inputs = refs.length > 0 && firstRef !== undefined ? [firstRef] : [];\n accept = req.outputFormat === \"png\" ? \"image/png\" : \"image/jpeg\";\n mime = accept;\n } else if (providerModelId === \"flux-2-pro\" || providerModelId === FLUX_2_PRO_JOB) {\n const dims = dimsFor(req.aspectRatio);\n const config: ProdiaJobConfig = {\n prompt: req.prompt,\n width: dims.width,\n height: dims.height,\n safety_tolerance: 5,\n };\n if (req.seed !== undefined) config.seed = req.seed;\n job = { type: FLUX_2_PRO_JOB, config };\n inputs = refs;\n accept = \"image/png\";\n mime = \"image/png\";\n } else if (\n providerModelId === \"inference.gemini-3-pro.img2img.v1\" ||\n providerModelId === \"inference.nano-banana.img2img.v2\"\n ) {\n // FLUX.2 takes width/height; the Google jobs take aspect_ratio and (for\n // Gemini 3) a 1K/2K/4K resolution tier — the same tiers usage reports.\n const allowed =\n providerModelId === \"inference.nano-banana.img2img.v2\"\n ? NANO_BANANA_RATIOS\n : GEMINI_JOB_RATIOS;\n const config: ProdiaJobConfig = {\n prompt: req.prompt,\n safety_tolerance: 5,\n };\n if (req.aspectRatio !== undefined && req.aspectRatio !== \"adaptive\") {\n if (allowed.has(req.aspectRatio)) config.aspect_ratio = req.aspectRatio;\n else\n ctx.warnings.push({\n code: \"option_ignored\",\n field: \"aspectRatio\",\n from: req.aspectRatio,\n message: `${providerModelId} has no ${req.aspectRatio} aspect_ratio; using the provider default`,\n });\n }\n if (providerModelId === \"inference.gemini-3-pro.img2img.v1\")\n config.resolution = req.size ?? \"1K\";\n if (req.seed !== undefined) config.seed = req.seed;\n job = { type: providerModelId, config };\n inputs = refs;\n accept = \"image/png\";\n mime = \"image/png\";\n } else {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `prodia has no job mapping for \"${providerModelId}\"`,\n provider: \"prodia\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n\n const form = new FormData();\n form.append(\"job\", new File([JSON.stringify(job)], \"job.json\", { type: \"application/json\" }));\n inputs.forEach((input, i) => {\n form.append(\n \"input\",\n // Uint8Array<ArrayBufferLike> is not a valid BlobPart under the\n // strict lib types; copy into a fresh ArrayBuffer-backed view.\n new File([new Uint8Array(input.bytes)], `input-${i}.${inputExtension(input.mime)}`, {\n type: input.mime,\n }),\n );\n });\n\n const retryOpts: RetryOptions = {\n attempts: 3,\n baseDelayMs: 1000,\n factor: 2,\n maxDelayMs: 10_000,\n };\n if (ctx.signal !== undefined) retryOpts.signal = ctx.signal;\n let res: Response;\n try {\n res = await withRetry(async () => {\n let attemptRes: Response;\n try {\n const init: RequestInit = {\n method: \"POST\",\n headers: { Authorization: `Bearer ${key}`, Accept: accept },\n body: form,\n };\n if (ctx.signal !== undefined) init.signal = ctx.signal;\n attemptRes = await ctx.fetch(PRODIA_JOB_URL, init);\n } catch (err) {\n throw classifyThrown(\"prodia\", err, ctx.model.id);\n }\n if (!attemptRes.ok) {\n const text = await attemptRes.text().catch(() => \"\");\n throw prodiaError(attemptRes.status, text || attemptRes.statusText, ctx.model.id);\n }\n return attemptRes;\n }, retryOpts);\n } catch (err) {\n throw classifyThrown(\"prodia\", err, ctx.model.id);\n }\n const bytes = parseImageResponse(\n new Uint8Array(await res.arrayBuffer()),\n res.headers.get(\"content-type\"),\n );\n const usage: UsageEvent = {\n model: ctx.model.id,\n provider: \"prodia\",\n modality: \"IMAGE\",\n unit: \"images\",\n quantity: 1,\n };\n if (req.size !== undefined) usage.imageSize = req.size;\n if (req.quality !== undefined) usage.imageQuality = req.quality;\n return { images: [{ bytes, mime }], usage, raw: undefined };\n}\n\nexport const prodiaAdapter: Adapter = {\n id: \"prodia\",\n generateImage: generateProdiaImage,\n};\n","import Replicate from \"replicate\";\nimport { z } from \"zod\";\nimport type { Adapter, AdapterContext } from \"./adapter.js\";\nimport { ModelKitError, isModelKitError, type ProviderErrorBody } from \"../errors.js\";\nimport { JsonValueSchema, describeThrown } from \"../json.js\";\nimport { classifyHttpError, classifyThrown, pollUntil, withRetry } from \"../retry.js\";\nimport { refToUrl, throwIfAborted } from \"./media-ref.js\";\nimport type {\n AudioRequest,\n AudioResult,\n ImageRequest,\n ImageResult,\n ImageSize,\n JsonObject,\n JsonValue,\n UsageEvent,\n VideoJob,\n VideoRequest,\n VideoResult,\n} from \"../types.js\";\n\nconst POLL_INTERVAL_MS = 1000;\nconst POLL_TIMEOUT_MS = 15 * 60_000;\n\ntype ReplicateUrlFn = () => string | URL | JsonValue;\n\ninterface ReplicateRecordOutput {\n [key: string]: JsonValue | ReplicateUrlFn;\n}\n\ntype ReplicatePredictionOutput = JsonValue | URL | ReplicateRecordOutput;\n\ninterface PredictionLike {\n id: string;\n status: string;\n output?: ReplicatePredictionOutput;\n error?: unknown;\n metrics?: { predict_time?: number };\n}\n\ntype ReplicateCreateOptions =\n | { input: ReplicateModelInput; model: string; version?: string }\n | { input: ReplicateModelInput; version: string; model?: string };\n\nexport interface ReplicatePredictionsClient {\n create(options: ReplicateCreateOptions & { signal?: AbortSignal }): Promise<PredictionLike>;\n get(predictionId: string, options?: { signal?: AbortSignal }): Promise<PredictionLike>;\n}\n\nexport interface ReplicateClientLike {\n predictions: ReplicatePredictionsClient;\n}\n\nexport interface ReplicateAdapterDeps {\n createReplicateClient: (opts: { auth: string; fetch: typeof fetch }) => ReplicateClientLike;\n}\n\nconst defaultReplicateDeps: ReplicateAdapterDeps = {\n createReplicateClient: (opts) => new Replicate(opts),\n};\n\nexport function createReplicateAdapter(deps: ReplicateAdapterDeps = defaultReplicateDeps): Adapter {\n return {\n id: \"replicate\",\n generateImage: (req, ctx) => generateReplicateImage(req, ctx, deps),\n generateVideo: (req, ctx) => generateReplicateVideo(req, ctx, deps),\n generateAudio: (req, ctx) => generateReplicateAudio(req, ctx, deps),\n };\n}\n\nexport const replicateAdapter: Adapter = createReplicateAdapter();\n\nfunction client(ctx: AdapterContext, deps: ReplicateAdapterDeps): ReplicateClientLike {\n const token = ctx.keys.replicate;\n if (!token) {\n throw new ModelKitError({\n code: \"auth\",\n message: \"Missing API key for replicate\",\n provider: \"replicate\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n return deps.createReplicateClient({ auth: token, fetch: ctx.fetch });\n}\n\ntype ReplicateRoute = { model: string; version?: string } | { version: string; model?: string };\n\n// \"owner/name:version\" routes by version, bare hashes route by version,\n// otherwise the unpinned \"owner/name\" slug routes by model.\nfunction route(providerModelId: string): ReplicateRoute {\n if (providerModelId.includes(\":\")) {\n const version = providerModelId.slice(providerModelId.indexOf(\":\") + 1);\n return { version };\n }\n if (!providerModelId.includes(\"/\")) return { version: providerModelId };\n return { model: providerModelId };\n}\n\nconst replicateResponseStatusSchema = z.object({\n response: z.object({ status: z.number() }).partial(),\n});\n\nfunction replicateError(cause: unknown, ctx: AdapterContext): ModelKitError {\n if (isModelKitError(cause)) return cause;\n const info = describeThrown(cause);\n const nested = replicateResponseStatusSchema.safeParse(cause);\n const status = info.status ?? (nested.success ? nested.data.response?.status : undefined);\n return classifyThrown(\"replicate\", cause, ctx.model.id, { status, body: info.body });\n}\n\n/** Drop a \":version\" suffix so a pinned prediction routes by its base model id. */\nfunction baseModelId(providerModelId: string): string {\n const colon = providerModelId.indexOf(\":\");\n return colon === -1 ? providerModelId : providerModelId.slice(0, colon);\n}\n\nfunction predictionErrorBody(cause: unknown): ProviderErrorBody {\n const parsed = JsonValueSchema.safeParse(cause);\n if (parsed.success) return parsed.data;\n return String(cause);\n}\n\nfunction isObjectOutput(value: ReplicatePredictionOutput): value is ReplicateRecordOutput {\n return Object(value) === value && !Array.isArray(value) && !(value instanceof URL);\n}\n\nfunction isUrlFn(value: JsonValue | ReplicateUrlFn): value is ReplicateUrlFn {\n return value instanceof Function;\n}\n\n// First output URL from the output values replicate models return: a string, a\n// single-element array, a FileOutput with .url(), or a { default } wrapper.\nfunction extractOutputUrl(output: ReplicatePredictionOutput): string {\n const root = Array.isArray(output) ? output[0] : output;\n if (root === undefined) throw noOutput();\n const asString = z.string().safeParse(root);\n if (asString.success && asString.data) return asString.data;\n if (root instanceof URL) return root.href;\n if (isObjectOutput(root)) {\n if (\"url\" in root) {\n const urlValue = root.url;\n if (urlValue !== undefined && isUrlFn(urlValue)) {\n const called = urlValue();\n if (called instanceof URL) return called.href;\n const calledString = z.string().safeParse(called);\n if (calledString.success && calledString.data) return calledString.data;\n } else {\n const direct = z.string().safeParse(urlValue);\n if (direct.success && direct.data) return direct.data;\n }\n }\n if (\"default\" in root) {\n const fallback = z.string().safeParse(root.default);\n if (fallback.success && fallback.data) return fallback.data;\n }\n }\n throw noOutput();\n}\n\nfunction noOutput(): ModelKitError {\n return new ModelKitError({\n code: \"provider_rejected\",\n message: \"No output returned by Replicate\",\n provider: \"replicate\",\n retryable: false,\n });\n}\n\ninterface PollOpts {\n intervalMs: number;\n timeoutMs: number;\n signal?: AbortSignal;\n}\n\ninterface PredictionRun {\n url: string;\n predictTime: number;\n raw: PredictionLike;\n}\n\nasync function runPrediction(\n ctx: AdapterContext,\n input: ReplicateModelInput,\n deps: ReplicateAdapterDeps,\n): Promise<PredictionRun> {\n throwIfAborted(ctx.signal);\n const api = client(ctx, deps);\n const createOptions = { ...route(ctx.model.providerModelId), input };\n let prediction: PredictionLike;\n try {\n prediction = await withRetry(\n async () => {\n try {\n // The Replicate SDK has no constructor switch and retries a 429\n // itself up to 5 times, so the kit runs the create once (attempts: 1)\n // instead of stacking its own loop on top (which would be 3x5).\n return await api.predictions.create(\n ctx.signal ? { ...createOptions, signal: ctx.signal } : createOptions,\n );\n } catch (cause) {\n throw replicateError(cause, ctx);\n }\n },\n { attempts: 1 },\n );\n } catch (cause) {\n throw replicateError(cause, ctx);\n }\n const pollOpts: PollOpts = {\n intervalMs: POLL_INTERVAL_MS,\n timeoutMs: POLL_TIMEOUT_MS,\n };\n if (ctx.signal) pollOpts.signal = ctx.signal;\n const done = await pollUntil(async () => {\n let current: PredictionLike;\n try {\n current = await api.predictions.get(\n prediction.id,\n ctx.signal ? { signal: ctx.signal } : undefined,\n );\n } catch (cause) {\n throw replicateError(cause, ctx);\n }\n if (current.status === \"succeeded\") return current;\n if (current.status === \"failed\" || current.status === \"canceled\") {\n throw classifyHttpError(\n undefined,\n predictionErrorBody(current.error),\n \"replicate\",\n ctx.model.id,\n );\n }\n return undefined;\n }, pollOpts);\n const predictTime = z.number().safeParse(done.metrics?.predict_time);\n if (done.output === undefined) throw noOutput();\n return {\n url: extractOutputUrl(done.output),\n predictTime: predictTime.success ? predictTime.data : 0,\n raw: done,\n };\n}\n\nfunction imageUsage(ctx: AdapterContext, req: ImageRequest): UsageEvent {\n const event: UsageEvent = {\n model: ctx.model.id,\n provider: \"replicate\",\n modality: \"IMAGE\",\n unit: \"compute_seconds\",\n quantity: 0,\n };\n if (req.size !== undefined) event.imageSize = req.size;\n if (req.quality !== undefined) event.imageQuality = req.quality;\n return event;\n}\n\nfunction videoUsage(ctx: AdapterContext, req: VideoRequest): UsageEvent {\n const event: UsageEvent = {\n model: ctx.model.id,\n provider: \"replicate\",\n modality: \"VIDEO\",\n unit: \"compute_seconds\",\n quantity: 0,\n };\n if (req.resolution !== undefined) event.resolution = req.resolution;\n if (req.durationSeconds !== undefined) event.durationSeconds = req.durationSeconds;\n return event;\n}\n\nfunction audioUsage(ctx: AdapterContext, req: AudioRequest): UsageEvent {\n const event: UsageEvent = {\n model: ctx.model.id,\n provider: \"replicate\",\n modality: \"AUDIO\",\n unit: ctx.model.usage.unit,\n quantity: 0,\n };\n if (req.durationSeconds !== undefined) event.durationSeconds = req.durationSeconds;\n return event;\n}\n\nasync function download(\n ctx: AdapterContext,\n url: string,\n): Promise<{ bytes: Uint8Array; mime: string }> {\n const res = await ctx.fetch(url);\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw classifyHttpError(res.status, text, \"replicate\", ctx.model.id);\n }\n const mime = res.headers.get(\"content-type\") ?? \"image/png\";\n return { bytes: new Uint8Array(await res.arrayBuffer()), mime };\n}\n\n/**\n * Dispatch by exact catalog providerModelId, never by substring: an unrelated\n * model whose id happens to contain \"qwen\" or \"edit\" must not inherit another\n * model's input schema. Add a row here when the catalog gains a model.\n */\ntype ReplicateImageKind = \"topaz\" | \"upscaler\" | \"wan\" | \"qwen-image\" | \"qwen-edit\" | \"generic\";\n\nconst REPLICATE_IMAGE_KINDS: Readonly<Record<string, Exclude<ReplicateImageKind, \"generic\">>> = {\n \"topazlabs/image-upscale\": \"topaz\",\n \"philz1337x/crystal-upscaler\": \"upscaler\",\n \"wan-video/wan-2.7-image-pro\": \"wan\",\n \"qwen/qwen-image-2-pro\": \"qwen-image\",\n \"qwen-edit-apps/qwen-image-edit-plus-lora-skin\": \"qwen-edit\",\n};\n\nfunction imageKind(providerModelId: string): ReplicateImageKind {\n return REPLICATE_IMAGE_KINDS[baseModelId(providerModelId)] ?? \"generic\";\n}\n\ntype ReplicateVideoKind = \"kling\" | \"kling-omni\" | \"hailuo\" | \"wan\";\n\nconst REPLICATE_VIDEO_KINDS: Readonly<Record<string, Exclude<ReplicateVideoKind, \"wan\">>> = {\n \"kling-video/v2.5-turbo/pro/image-to-video\": \"kling\",\n \"kling-video/v3.0/pro/image-to-video\": \"kling\",\n \"kwaivgi/kling-v3-video\": \"kling\",\n \"kwaivgi/kling-v3-omni-video\": \"kling-omni\",\n \"minimax/hailuo-02\": \"hailuo\",\n};\n\nfunction videoKind(providerModelId: string): ReplicateVideoKind {\n return REPLICATE_VIDEO_KINDS[baseModelId(providerModelId)] ?? \"wan\";\n}\n\ntype ReplicateAudioKind = \"mmaudio\" | \"elevenlabs\" | \"lyria\";\n\nconst REPLICATE_AUDIO_KINDS: Readonly<Record<string, Exclude<ReplicateAudioKind, \"lyria\">>> = {\n \"zsxkib/mmaudio\": \"mmaudio\",\n \"elevenlabs/music\": \"elevenlabs\",\n};\n\nfunction audioKind(providerModelId: string): ReplicateAudioKind {\n return REPLICATE_AUDIO_KINDS[baseModelId(providerModelId)] ?? \"lyria\";\n}\n\n// aspect_ratio enums from the model input schemas:\n// qwen-image-2-pro also accepts 2:1 and 1:2, which the kit's AspectRatio\n// vocabulary has no spelling for.\n// https://api.replicate.com/v1/models/qwen/qwen-image-2-pro\n// https://api.replicate.com/v1/models/qwen-edit-apps/qwen-image-edit-plus-lora-skin\nconst QWEN_IMAGE_RATIOS: ReadonlySet<string> = new Set([\n \"1:1\",\n \"16:9\",\n \"9:16\",\n \"4:3\",\n \"3:4\",\n \"3:2\",\n \"2:3\",\n]);\nconst QWEN_EDIT_RATIOS: ReadonlySet<string> = new Set([\"1:1\", \"16:9\", \"9:16\", \"4:3\", \"3:4\"]);\n\ninterface ReplicateImageInput {\n prompt: string;\n image?: string;\n images?: string[];\n aspect_ratio?: string;\n creativity?: number;\n scale_factor?: number;\n output_format?: string;\n match_input_image?: boolean;\n size?: string;\n}\n\n// topazlabs/image-upscale takes no prompt/creativity/scale_factor input; its\n// factor is the \"2x\"|\"4x\"|\"6x\" upscale_factor enum (api.replicate.com schema).\ninterface TopazImageInput {\n image: string;\n enhance_model: string;\n output_format: string;\n upscale_factor: string;\n face_enhancement: boolean;\n subject_detection?: string;\n face_enhancement_creativity?: number;\n face_enhancement_strength?: number;\n}\n\ninterface KlingVideoInput {\n prompt: string;\n duration: number;\n mode: string;\n generate_audio: boolean;\n start_image?: string;\n end_image?: string;\n aspect_ratio?: string;\n negative_prompt?: string;\n}\n\ninterface HailuoVideoInput {\n prompt: string;\n duration: number;\n resolution: string;\n prompt_optimizer: boolean;\n first_frame_image?: string;\n last_frame_image?: string;\n}\n\ninterface WanVideoInput {\n prompt: string;\n duration: number;\n size: string;\n image?: string;\n}\n\ninterface LyriaAudioInput {\n prompt: string;\n seed?: number;\n negative_prompt?: string;\n}\n\ninterface ElevenLabsMusicInput {\n prompt: string;\n music_length_ms: number;\n force_instrumental: boolean;\n output_format: \"wav_cd_quality\";\n}\n\ninterface MmaudioInput {\n video: string;\n duration: number;\n seed: number;\n prompt?: string;\n negative_prompt?: string;\n}\n\ntype ReplicateModelInput =\n | ReplicateImageInput\n | TopazImageInput\n | KlingVideoInput\n | HailuoVideoInput\n | WanVideoInput\n | LyriaAudioInput\n | MmaudioInput\n | ElevenLabsMusicInput;\n\n// WAN 2.7's `size` enum spells exact W*H per tier (the bare tier names are\n// ambiguous for 1:1, so every ratio resolves to an exact value).\n// https://api.replicate.com/v1/models/wan-video/wan-2.7-image-pro (input schema)\nconst WAN_IMAGE_SIZES: Record<\"1K\" | \"2K\" | \"4K\", Record<string, string>> = {\n \"1K\": {\n \"1:1\": \"1024*1024\",\n \"16:9\": \"1280*720\",\n \"9:16\": \"720*1280\",\n \"4:3\": \"1024*768\",\n \"3:4\": \"768*1024\",\n },\n \"2K\": {\n \"1:1\": \"2048*2048\",\n \"16:9\": \"2048*1152\",\n \"9:16\": \"1152*2048\",\n \"4:3\": \"2048*1536\",\n \"3:4\": \"1536*2048\",\n },\n \"4K\": {\n \"1:1\": \"4096*4096\",\n \"16:9\": \"4096*2304\",\n \"9:16\": \"2304*4096\",\n \"4:3\": \"4096*3072\",\n \"3:4\": \"3072*4096\",\n },\n};\n\nfunction wanImageSize(\n aspectRatio: ImageRequest[\"aspectRatio\"],\n size: ImageSize | undefined,\n): string {\n const tier = size === \"2K\" || size === \"4K\" ? size : \"1K\";\n const table = WAN_IMAGE_SIZES[tier];\n return table[aspectRatio ?? \"\"] ?? table[\"1:1\"] ?? \"1024*1024\";\n}\n\nasync function generateReplicateImage(\n req: ImageRequest,\n ctx: AdapterContext,\n deps: ReplicateAdapterDeps,\n): Promise<ImageResult> {\n const id = ctx.model.providerModelId;\n let input: ReplicateModelInput;\n switch (imageKind(id)) {\n case \"topaz\": {\n const first = (req.references ?? [])[0];\n if (!first) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${ctx.model.id} requires a reference image to upscale`,\n provider: \"replicate\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n let format = req.outputFormat === \"jpeg\" ? \"jpg\" : (req.outputFormat ?? \"png\");\n if (format !== \"png\" && format !== \"jpg\") {\n ctx.warnings.push({\n code: \"option_ignored\",\n field: \"outputFormat\",\n from: format,\n message: \"topazlabs/image-upscale supports only png and jpg; using png\",\n });\n format = \"png\";\n }\n // Standard V2 + face_enhancement false are the model's own defaults.\n const upscale = req.upscale;\n const topaz: TopazImageInput = {\n image: refToUrl(first),\n enhance_model: upscale?.enhanceModel ?? \"Standard V2\",\n output_format: format,\n upscale_factor: `${req.scaleFactor ?? 2}x`,\n face_enhancement: upscale?.faceEnhancement ?? false,\n };\n if (upscale?.subjectDetection !== undefined)\n topaz.subject_detection = upscale.subjectDetection;\n if (upscale?.faceEnhancementCreativity !== undefined)\n topaz.face_enhancement_creativity = upscale.faceEnhancementCreativity;\n if (upscale?.faceEnhancementStrength !== undefined)\n topaz.face_enhancement_strength = upscale.faceEnhancementStrength;\n input = topaz;\n break;\n }\n case \"upscaler\": {\n const first = (req.references ?? [])[0];\n if (!first) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${ctx.model.id} requires a reference image to upscale`,\n provider: \"replicate\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const imageInput: ReplicateImageInput = { prompt: req.prompt };\n imageInput.image = refToUrl(first);\n imageInput.creativity = 0;\n imageInput.scale_factor = 2;\n imageInput.output_format = \"png\";\n input = imageInput;\n break;\n }\n case \"wan\": {\n const refs = (req.references ?? []).map(refToUrl);\n const imageInput: ReplicateImageInput = { prompt: req.prompt };\n if (refs.length > 0) imageInput.images = refs;\n imageInput.size = wanImageSize(req.aspectRatio, req.size);\n input = imageInput;\n break;\n }\n case \"qwen-image\": {\n const refs = (req.references ?? []).map(refToUrl);\n const firstUrl = refs[0];\n const imageInput: ReplicateImageInput = { prompt: req.prompt };\n if (firstUrl !== undefined) {\n // The schema ignores aspect_ratio when match_input_image is set, and\n // this row always has a reference, so the input image owns the ratio.\n imageInput.image = firstUrl;\n imageInput.match_input_image = true;\n } else if (req.aspectRatio !== undefined && QWEN_IMAGE_RATIOS.has(req.aspectRatio)) {\n imageInput.aspect_ratio = req.aspectRatio;\n }\n input = imageInput;\n break;\n }\n case \"qwen-edit\": {\n const refs = (req.references ?? []).map(refToUrl);\n const firstUrl = refs[0];\n const imageInput: ReplicateImageInput = { prompt: req.prompt };\n if (firstUrl !== undefined) imageInput.image = firstUrl;\n if (req.aspectRatio !== undefined) {\n if (QWEN_EDIT_RATIOS.has(req.aspectRatio))\n imageInput.aspect_ratio = req.aspectRatio;\n else\n ctx.warnings.push({\n code: \"option_ignored\",\n field: \"aspectRatio\",\n from: req.aspectRatio,\n message: `${id} has no ${req.aspectRatio} aspect_ratio; using the provider default`,\n });\n }\n if (req.outputFormat !== undefined) {\n // The edit-plus enum spells jpeg as \"jpg\".\n imageInput.output_format = req.outputFormat === \"jpeg\" ? \"jpg\" : req.outputFormat;\n }\n input = imageInput;\n break;\n }\n default: {\n const first = (req.references ?? [])[0];\n const imageInput: ReplicateImageInput = { prompt: req.prompt };\n if (first) imageInput.image = refToUrl(first);\n input = imageInput;\n }\n }\n const { url, predictTime, raw } = await runPrediction(ctx, input, deps);\n const file = await download(ctx, url);\n const usage = imageUsage(ctx, req);\n usage.quantity = predictTime;\n return { images: [{ bytes: file.bytes, mime: file.mime }], usage, raw, outputUrl: url };\n}\n\n// WAN 2.7 size enum, mapped from the canonical ratio the same way\n// trigger-workflows resolveWan27ImageProSize does (ties pick the smaller area).\nfunction wanSize(aspectRatio: VideoRequest[\"aspectRatio\"]): string {\n if (!aspectRatio || aspectRatio === \"adaptive\" || aspectRatio === \"1:1\") return \"2K\";\n const parts = aspectRatio.split(\":\");\n const w = Number(parts[0] ?? \"\");\n const h = Number(parts[1] ?? \"\");\n if (!Number.isFinite(w) || !Number.isFinite(h) || w === h) return \"2K\";\n return w > h ? \"2048*1152\" : \"1536*2048\";\n}\n\nfunction klingInput(req: VideoRequest): KlingVideoInput {\n const images = (req.firstFrame ? [req.firstFrame] : []).map(refToUrl);\n if (req.lastFrame) images.push(refToUrl(req.lastFrame));\n // resolveOptions already dropped the ratio when a start image is wired.\n const input: KlingVideoInput = {\n prompt: req.prompt,\n duration: req.durationSeconds ?? 10,\n mode: req.mode ?? \"standard\",\n generate_audio: req.generateAudio ?? false,\n };\n const startImage = images[0];\n if (startImage !== undefined) {\n input.start_image = startImage;\n const endImage = images[1];\n if (endImage !== undefined) input.end_image = endImage;\n } else if (req.aspectRatio !== \"adaptive\") {\n input.aspect_ratio = req.aspectRatio ?? \"16:9\";\n }\n if (req.negativePrompt !== undefined) input.negative_prompt = req.negativePrompt;\n return input;\n}\n\ninterface KlingOmniVideoInput {\n prompt: string;\n duration: number;\n mode: string;\n generate_audio: boolean;\n start_image?: string;\n end_image?: string;\n aspect_ratio?: string;\n reference_images?: string[];\n}\n\n// kwaivgi/kling-v3-omni-video has no resolution field: its mode enum selects\n// 720p (standard) or 1080p (pro). A resolution wins over an explicit mode.\nfunction klingOmniMode(req: VideoRequest): string {\n if (req.resolution === \"1080p\") return \"pro\";\n if (req.resolution === \"720p\") return \"standard\";\n return req.mode ?? \"standard\";\n}\n\n// kwaivgi/kling-v3-omni-video takes reference_images (max 7 without a\n// reference video) but has no negative_prompt field, so it gets its own\n// serializer instead of sharing klingInput.\nfunction klingOmniInput(req: VideoRequest): KlingOmniVideoInput {\n const images = (req.firstFrame ? [req.firstFrame] : []).map(refToUrl);\n if (req.lastFrame) images.push(refToUrl(req.lastFrame));\n const input: KlingOmniVideoInput = {\n prompt: req.prompt,\n duration: req.durationSeconds ?? 10,\n mode: klingOmniMode(req),\n generate_audio: req.generateAudio ?? false,\n };\n const startImage = images[0];\n if (startImage !== undefined) {\n input.start_image = startImage;\n const endImage = images[1];\n if (endImage !== undefined) input.end_image = endImage;\n } else if (req.aspectRatio !== \"adaptive\") {\n input.aspect_ratio = req.aspectRatio ?? \"16:9\";\n }\n const refs = (req.referenceImages ?? []).map(refToUrl);\n if (refs.length > 0) input.reference_images = refs;\n return input;\n}\n\nfunction hailuoInput(req: VideoRequest): HailuoVideoInput {\n const input: HailuoVideoInput = {\n prompt: req.prompt,\n duration: req.durationSeconds ?? 6,\n resolution: req.resolution ?? \"768p\",\n prompt_optimizer: true,\n };\n if (req.firstFrame) input.first_frame_image = refToUrl(req.firstFrame);\n if (req.lastFrame) input.last_frame_image = refToUrl(req.lastFrame);\n return input;\n}\n\nfunction wanInput(req: VideoRequest): WanVideoInput {\n const input: WanVideoInput = {\n prompt: req.prompt,\n duration: req.durationSeconds ?? 5,\n size: wanSize(req.aspectRatio),\n };\n if (req.firstFrame) input.image = refToUrl(req.firstFrame);\n return input;\n}\n\nasync function generateReplicateVideo(\n req: VideoRequest,\n ctx: AdapterContext,\n deps: ReplicateAdapterDeps,\n): Promise<VideoJob> {\n throwIfAborted(ctx.signal);\n const kind = videoKind(ctx.model.providerModelId);\n const input =\n kind === \"kling\"\n ? klingInput(req)\n : kind === \"kling-omni\"\n ? klingOmniInput(req)\n : kind === \"hailuo\"\n ? hailuoInput(req)\n : wanInput(req);\n const api = client(ctx, deps);\n const createOptions = { ...route(ctx.model.providerModelId), input };\n let prediction: PredictionLike;\n try {\n prediction = await withRetry(\n async () => {\n try {\n // See runPrediction: the Replicate SDK owns the 429 retry, so the\n // kit does not stack its own attempts on the create call.\n return await api.predictions.create(\n ctx.signal ? { ...createOptions, signal: ctx.signal } : createOptions,\n );\n } catch (cause) {\n throw replicateError(cause, ctx);\n }\n },\n { attempts: 1 },\n );\n } catch (cause) {\n throw replicateError(cause, ctx);\n }\n const jobId = prediction.id;\n const check = async (): Promise<PredictionRun | undefined> => {\n let current: PredictionLike;\n try {\n current = await api.predictions.get(\n jobId,\n ctx.signal ? { signal: ctx.signal } : undefined,\n );\n } catch (cause) {\n throw replicateError(cause, ctx);\n }\n if (current.status === \"succeeded\") {\n const predictTime = z.number().safeParse(current.metrics?.predict_time);\n if (current.output === undefined) throw noOutput();\n return {\n url: extractOutputUrl(current.output),\n predictTime: predictTime.success ? predictTime.data : 0,\n raw: current,\n };\n }\n if (current.status === \"failed\" || current.status === \"canceled\") {\n throw classifyHttpError(\n undefined,\n predictionErrorBody(current.error),\n \"replicate\",\n ctx.model.id,\n );\n }\n return undefined;\n };\n const toResult = (done: PredictionRun): VideoResult => {\n const usage = videoUsage(ctx, req);\n usage.quantity = done.predictTime;\n return { video: { url: done.url }, usage, raw: done.raw };\n };\n return {\n jobId,\n async poll() {\n try {\n const done = await check();\n return done ? { status: \"succeeded\", raw: done.raw } : { status: \"pending\" };\n } catch (cause) {\n if (isModelKitError(cause) && !cause.retryable) return { status: \"failed\" };\n throw cause;\n }\n },\n async result(opts) {\n const videoSignal = opts?.signal ?? ctx.signal;\n const resultOpts: PollOpts = {\n intervalMs: opts?.pollIntervalMs ?? POLL_INTERVAL_MS,\n timeoutMs: opts?.timeoutMs ?? POLL_TIMEOUT_MS,\n };\n if (videoSignal) resultOpts.signal = videoSignal;\n const done = await pollUntil(check, resultOpts);\n return toResult(done);\n },\n };\n}\n\nfunction lyriaAudioInput(req: AudioRequest, ctx: AdapterContext): LyriaAudioInput {\n const prompt = req.prompt.trim();\n if (!prompt) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${ctx.model.id} requires a prompt`,\n provider: \"replicate\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const input: LyriaAudioInput = { prompt };\n if (req.seed !== undefined) input.seed = req.seed;\n const negative = req.negativePrompt?.trim();\n if (negative) input.negative_prompt = negative;\n return input;\n}\n\n/** ElevenLabs accepts 5-300s; one resolution feeds the provider input and the usage event. */\nexport function elevenLabsMusicDuration(seconds: number | undefined): number {\n return Math.min(300, Math.max(5, seconds ?? 15));\n}\n\nfunction elevenLabsMusicInput(req: AudioRequest, ctx: AdapterContext): ElevenLabsMusicInput {\n const prompt = req.prompt.trim();\n if (!prompt) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${ctx.model.id} requires a prompt`,\n provider: \"replicate\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n return {\n prompt,\n music_length_ms: elevenLabsMusicDuration(req.durationSeconds) * 1000,\n force_instrumental: req.instrumental ?? true,\n output_format: \"wav_cd_quality\",\n };\n}\n\nfunction mmaudioInput(req: AudioRequest, ctx: AdapterContext): MmaudioInput {\n const video = req.sourceVideo ?? req.references?.[0];\n if (!video) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${ctx.model.id} requires a source video to score`,\n provider: \"replicate\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const input: MmaudioInput = {\n video: refToUrl(video),\n duration: req.durationSeconds ?? 8,\n seed: req.seed ?? -1,\n };\n const prompt = req.prompt.trim();\n if (prompt) input.prompt = prompt;\n const negative = req.negativePrompt?.trim();\n if (negative) input.negative_prompt = negative;\n return input;\n}\n\n// AudioResult.raw is JsonValue; FileOutput values in `output` carry functions, so keep only what decodes.\nfunction predictionRaw(prediction: PredictionLike): JsonValue {\n const raw: JsonObject = { id: prediction.id, status: prediction.status };\n if (prediction.metrics?.predict_time !== undefined)\n raw.metrics = { predict_time: prediction.metrics.predict_time };\n const output = JsonValueSchema.safeParse(prediction.output);\n if (output.success) raw.output = output.data;\n return raw;\n}\n\nasync function generateReplicateAudio(\n req: AudioRequest,\n ctx: AdapterContext,\n deps: ReplicateAdapterDeps,\n): Promise<AudioResult> {\n const kind = audioKind(ctx.model.providerModelId);\n const input =\n kind === \"mmaudio\"\n ? mmaudioInput(req, ctx)\n : kind === \"elevenlabs\"\n ? elevenLabsMusicInput(req, ctx)\n : lyriaAudioInput(req, ctx);\n const { url, predictTime, raw } = await runPrediction(ctx, input, deps);\n const usage = audioUsage(ctx, req);\n // Models billed by generated length report the clamped seconds in both fields; the rest bill compute time.\n if (ctx.model.usage.unit === \"seconds\") {\n const seconds = elevenLabsMusicDuration(req.durationSeconds);\n usage.quantity = seconds;\n usage.durationSeconds = seconds;\n } else {\n usage.quantity = predictTime;\n }\n return { audio: { url }, usage, raw: predictionRaw(raw) };\n}\n","import { experimental_generateVideo } from \"ai\";\nimport { createXai } from \"@ai-sdk/xai\";\nimport { z } from \"zod\";\nimport type { Adapter, AdapterContext } from \"./adapter.js\";\nimport { ModelKitError } from \"../errors.js\";\nimport { describeThrown, JsonValueSchema } from \"../json.js\";\nimport { classifyHttpError, classifyThrown, pollUntil } from \"../retry.js\";\nimport type { JsonValue, UsageEvent, VideoJob, VideoRequest, VideoResult } from \"../types.js\";\nimport { refToUrl } from \"./media-ref.js\";\n\nconst POLL_INTERVAL_MS = 10_000;\nconst POLL_TIMEOUT_MS = 15 * 60_000;\n\nexport interface XaiVideoMeta {\n videoUrl?: JsonValue | undefined;\n costInUsdTicks?: JsonValue | undefined;\n duration?: JsonValue | undefined;\n}\n\nexport interface XaiVideoClient {\n generateVideo: typeof experimental_generateVideo;\n}\n\nexport interface XaiVideoAdapterDeps {\n createXaiClient: (opts: { apiKey: string }) => XaiVideoClient;\n}\n\nconst defaultXaiDeps: XaiVideoAdapterDeps = {\n createXaiClient: () => ({ generateVideo: experimental_generateVideo }),\n};\n\nexport function createXaiVideoAdapter(deps: XaiVideoAdapterDeps = defaultXaiDeps): Adapter {\n return {\n id: \"xai-video\",\n generateVideo: (req, ctx) => generateXaiVideo(req, ctx, deps),\n };\n}\n\nexport const xaiVideoAdapter: Adapter = createXaiVideoAdapter();\n\nconst xaiResponseStatusSchema = z.object({\n response: z.object({ status: z.number() }).partial(),\n});\n\nfunction xaiError(cause: unknown, ctx: AdapterContext): ModelKitError {\n const info = describeThrown(cause);\n const nested = xaiResponseStatusSchema.safeParse(cause);\n const status = info.status ?? (nested.success ? nested.data.response?.status : undefined);\n return classifyThrown(\"xai-video\", cause, ctx.model.id, { status, body: info.body });\n}\n\nconst xaiMetaSchema = z.object({\n videoUrl: JsonValueSchema.optional(),\n costInUsdTicks: JsonValueSchema.optional(),\n duration: JsonValueSchema.optional(),\n});\n\nconst xaiProviderMetadataSchema = z.object({ xai: xaiMetaSchema });\n\nfunction metaOf(result: { providerMetadata?: unknown }): XaiVideoMeta {\n const parsed = xaiProviderMetadataSchema.partial().safeParse(result.providerMetadata);\n if (!parsed.success) return {};\n return parsed.data.xai ?? {};\n}\n\ntype XaiProviderOptions = {\n resolution?: string;\n pollIntervalMs: number;\n pollTimeoutMs: number;\n mode?: string;\n referenceImageUrls?: string[];\n};\n\ninterface PollOpts {\n intervalMs: number;\n timeoutMs: number;\n signal?: AbortSignal;\n}\n\nasync function generateXaiVideo(\n req: VideoRequest,\n ctx: AdapterContext,\n deps: XaiVideoAdapterDeps,\n): Promise<VideoJob> {\n const apiKey = ctx.keys.xai;\n if (!apiKey) {\n throw new ModelKitError({\n code: \"auth\",\n message: \"Missing API key for xai\",\n provider: \"xai-video\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n // firstFrame is xAI's start image (SDK frameImages); referenceImages are R2V\n // references, capped at the 7 the provider accepts. Bytes refs go up as data URLs.\n const refUrls = (req.referenceImages ?? []).map(refToUrl).slice(0, 7);\n const xaiOptions: XaiProviderOptions = {\n pollIntervalMs: POLL_INTERVAL_MS,\n pollTimeoutMs: POLL_TIMEOUT_MS,\n };\n // xAI accepts only these three; leave the field off so the provider default applies.\n if (req.resolution === \"480p\" || req.resolution === \"720p\" || req.resolution === \"1080p\") {\n xaiOptions.resolution = req.resolution;\n }\n if (refUrls.length > 0) {\n xaiOptions.mode = \"reference-to-video\";\n xaiOptions.referenceImageUrls = refUrls;\n }\n if (req.lastFrame !== undefined) {\n ctx.warnings.push({\n code: \"option_ignored\",\n field: \"lastFrame\",\n message: \"xai-video does not support lastFrame; ignored\",\n });\n }\n const client = deps.createXaiClient({ apiKey });\n const model = createXai({ apiKey, fetch: ctx.fetch }).video(ctx.model.providerModelId);\n\n type GenerateVideoArgs = Parameters<typeof experimental_generateVideo>[0];\n const callBody: GenerateVideoArgs = {\n model,\n prompt: req.prompt,\n providerOptions: { xai: xaiOptions },\n };\n if (req.firstFrame) {\n callBody.frameImages = [{ image: refToUrl(req.firstFrame), frameType: \"first_frame\" }];\n }\n if (req.aspectRatio !== undefined && req.aspectRatio !== \"adaptive\") {\n callBody.aspectRatio = req.aspectRatio;\n }\n if (req.durationSeconds !== undefined) callBody.duration = req.durationSeconds;\n if (ctx.signal) callBody.abortSignal = ctx.signal;\n\n const pending = (async () => {\n try {\n return await client.generateVideo(callBody);\n } catch (cause) {\n throw xaiError(cause, ctx);\n }\n })();\n\n let settled: VideoResult | undefined;\n let failed: unknown;\n pending.then(\n (result) => {\n void mapResult(ctx, req, result).then(\n (mapped) => {\n settled = mapped;\n },\n (cause: unknown) => {\n failed = cause;\n },\n );\n },\n (cause: unknown) => {\n failed = cause;\n },\n );\n\n const check = async (): Promise<VideoResult | undefined> => {\n if (failed !== undefined) throw failed;\n return settled;\n };\n return {\n // xAI exposes no request id on the synchronous handle, so each job gets a fresh one.\n jobId: crypto.randomUUID(),\n async poll() {\n if (failed !== undefined) return { status: \"failed\" };\n return settled ? { status: \"succeeded\" } : { status: \"pending\" };\n },\n async result(opts) {\n const resultSignal = opts?.signal ?? ctx.signal;\n const resultOpts: PollOpts = {\n intervalMs: opts?.pollIntervalMs ?? POLL_INTERVAL_MS,\n timeoutMs: opts?.timeoutMs ?? POLL_TIMEOUT_MS,\n };\n if (resultSignal) resultOpts.signal = resultSignal;\n return pollUntil(check, resultOpts);\n },\n };\n}\n\nasync function mapResult(\n ctx: AdapterContext,\n req: VideoRequest,\n result: Awaited<ReturnType<typeof experimental_generateVideo>>,\n): Promise<VideoResult> {\n const first = result.videos[0];\n if (first) {\n return {\n video: { bytes: Uint8Array.from(first.uint8Array), mime: first.mediaType },\n usage: usage(ctx, req, metaOf(result)),\n raw: result.providerMetadata,\n };\n }\n const meta = metaOf(result);\n const videoUrl = z.string().safeParse(meta.videoUrl);\n if (videoUrl.success && videoUrl.data) {\n const res = await ctx.fetch(videoUrl.data);\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw classifyHttpError(res.status, text, \"xai-video\", ctx.model.id);\n }\n const mime = res.headers.get(\"content-type\") ?? \"video/mp4\";\n return {\n video: { bytes: new Uint8Array(await res.arrayBuffer()), mime },\n usage: usage(ctx, req, meta),\n raw: result.providerMetadata,\n };\n }\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: \"xai-video returned no video\",\n provider: \"xai-video\",\n model: ctx.model.id,\n retryable: false,\n });\n}\n\nfunction usage(ctx: AdapterContext, req: VideoRequest, meta: XaiVideoMeta): UsageEvent {\n // The row bills by reported cost; when xAI omits it the quantity is 0 and the\n // requested duration rides along so a sink can still price the call.\n const costTicks = z.number().safeParse(meta.costInUsdTicks);\n const cost = costTicks.success ? costTicks.data / 1e10 : undefined;\n const event: UsageEvent = {\n model: ctx.model.id,\n provider: \"xai-video\",\n modality: \"VIDEO\",\n unit: \"reported_cost_usd\",\n quantity: cost ?? 0,\n };\n if (cost !== undefined) event.reportedCostUsd = cost;\n if (req.durationSeconds !== undefined) event.durationSeconds = req.durationSeconds;\n if (req.resolution !== undefined) event.resolution = req.resolution;\n return event;\n}\n","import type { AdapterRegistry } from \"../client.js\";\nimport { aiSdkTextAdapter } from \"./ai-sdk-text.js\";\nimport { arkAdapter } from \"./ark.js\";\nimport { falAdapter } from \"./fal.js\";\nimport { googleGenaiAdapter } from \"./google-genai.js\";\nimport { googleImageAdapter } from \"./google-image.js\";\nimport { higgsfieldAdapter } from \"./higgsfield.js\";\nimport { openaiImageAdapter } from \"./openai-image.js\";\nimport { prodiaAdapter } from \"./prodia.js\";\nimport { replicateAdapter } from \"./replicate.js\";\nimport { xaiVideoAdapter } from \"./xai-video.js\";\n\nexport const DEFAULT_ADAPTERS: AdapterRegistry = {\n \"ai-sdk-text\": aiSdkTextAdapter,\n \"google-image\": googleImageAdapter,\n \"openai-image\": openaiImageAdapter,\n \"google-genai\": googleGenaiAdapter,\n ark: arkAdapter,\n fal: falAdapter,\n replicate: replicateAdapter,\n prodia: prodiaAdapter,\n higgsfield: higgsfieldAdapter,\n \"xai-video\": xaiVideoAdapter,\n};\n\nexport {\n aiSdkTextAdapter,\n arkAdapter,\n falAdapter,\n googleGenaiAdapter,\n googleImageAdapter,\n higgsfieldAdapter,\n openaiImageAdapter,\n prodiaAdapter,\n replicateAdapter,\n xaiVideoAdapter,\n};\nexport { aspectRatioToSize } from \"./openai-image.js\";\n","import { DEFAULT_ADAPTERS } from \"./adapters/index.js\";\nimport { createModelKit, type ModelKit } from \"./client.js\";\nimport { keysFromEnv } from \"./keys.js\";\nimport type { ModelKitConfig } from \"./types.js\";\n\n/**\n * All adapters registered. Keys default to process.env (pro = bare names,\n * enterprise = ENTERPRISE_ prefix) when `keys` is omitted.\n */\nexport function createDefaultModelKit(config: Partial<ModelKitConfig> = {}): ModelKit {\n const keys = config.keys ?? {\n pro: keysFromEnv(process.env),\n enterprise: keysFromEnv(process.env, \"ENTERPRISE_\"),\n };\n return createModelKit({ ...config, keys }, DEFAULT_ADAPTERS);\n}\n\n/**\n * Environment-backed calls with the `ai` function names and shapes. Use a configured\n * kit for routing, tier keys, or a usage sink.\n */\nexport const generateText: ModelKit[\"generateText\"] = (options, call) =>\n createDefaultModelKit().generateText(options, call);\nexport const streamText: ModelKit[\"streamText\"] = (options, call) =>\n createDefaultModelKit().streamText(options, call);\nexport const generateObject: ModelKit[\"generateObject\"] = (options, call) =>\n createDefaultModelKit().generateObject(options, call);\nexport const streamObject: ModelKit[\"streamObject\"] = (options, call) =>\n createDefaultModelKit().streamObject(options, call);\nexport const generateImage: ModelKit[\"generateImage\"] = (req, call) =>\n createDefaultModelKit().generateImage(req, call);\nexport const generateVideo: ModelKit[\"generateVideo\"] = (req, call) =>\n createDefaultModelKit().generateVideo(req, call);\nexport const generateAudio: ModelKit[\"generateAudio\"] = (req, call) =>\n createDefaultModelKit().generateAudio(req, call);\nexport const prepareMediaPart: ModelKit[\"prepareMediaPart\"] = (modelId, ref, mediaType, call) =>\n createDefaultModelKit().prepareMediaPart(modelId, ref, mediaType, call);\nexport const languageModel: ModelKit[\"languageModel\"] = (modelId, call) =>\n createDefaultModelKit().languageModel(modelId, call);\nexport const describe: ModelKit[\"describe\"] = (modelId) =>\n createDefaultModelKit().describe(modelId);\n"],"mappings":"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","names":["generateText","import_zod","text","text","usage","usage","import_ai","import_zod","text","import_zod","route","aiGenerateImage","usage","generateAudio","aiGenerateVideo","aiGenerateText","aiStreamText","languageModel","aiGenerateObject","aiStreamObject","import_zod","text","usage","import_zod","client","headers","mime","import_zod","import_zod","text","defaultDeps","RESULT_TIMEOUT_MS","text","videoUsage","client","usage","import_google","import_ai","import_zod","usage","import_zod","videoUsage","import_openai","import_zod","toProviderError","OpenAI","client","usage","text","usage","import_zod","Replicate","imageUsage","videoUsage","text","usage","import_ai","import_xai","import_zod","POLL_INTERVAL_MS","POLL_TIMEOUT_MS","client","text","generateText"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/catalog/registry.ts","../src/catalog/image.ts","../src/catalog/other.ts","../src/catalog/text.ts","../src/catalog/video.ts","../src/catalog/models.ts","../src/resolve-options.ts","../src/keys.ts","../src/retry.ts","../src/json.ts","../src/text.ts","../src/text-steps.ts","../src/client.ts","../src/adapters/media-ref.ts","../src/generated-image.ts","../src/adapters/ai-sdk-text.ts","../src/adapters/ark.ts","../src/adapters/fal.ts","../src/adapters/google-genai.ts","../src/adapters/google-files.ts","../src/adapters/google-image.ts","../src/adapters/higgsfield.ts","../src/adapters/higgsfield-motions.ts","../src/adapters/openai-image.ts","../src/adapters/prodia.ts","../src/adapters/replicate.ts","../src/adapters/xai-video.ts","../src/adapters/index.ts","../src/default.ts"],"sourcesContent":["/**\n * Everything `ai` exports is available here, so `import { ... } from \"ai\"` can become\n * `import { ... } from \"@shop-os/modelkit\"` unchanged. The generation functions below\n * replace their `ai` namesakes: they accept a catalog id or alias as `model` next to\n * the provider instances `ai` accepts, and they emit canonical usage.\n */\nexport * from \"ai\";\n\nexport * from \"./types.js\";\nexport * from \"./errors.js\";\nexport { Catalog } from \"./catalog/registry.js\";\nexport { MODELS } from \"./catalog/models.js\";\nexport {\n resolveAudioOptions,\n resolveImageOptions,\n resolveVideoOptions,\n nearestAspectRatio,\n} from \"./resolve-options.js\";\nexport type { OnUnsupported, ResolveResult } from \"./resolve-options.js\";\nexport { resolveKeys, keysFromEnv, ADAPTER_KEYS } from \"./keys.js\";\nexport { classifyHttpError, shouldRetry, withRetry, pollUntil, sleep } from \"./retry.js\";\nexport type { Adapter, AdapterContext } from \"./adapters/adapter.js\";\nexport { createModelKit } from \"./client.js\";\nexport type { ModelKit, AdapterRegistry, LanguageModelHandle } from \"./client.js\";\nexport * from \"./adapters/index.js\";\nexport {\n createDefaultModelKit,\n describe,\n generateAudio,\n generateImage,\n generateImage as experimental_generateImage,\n generateObject,\n generateText,\n generateVideo,\n languageModel,\n prepareMediaPart,\n streamObject,\n streamText,\n} from \"./default.js\";\nexport { JsonValueSchema, JsonObjectSchema, readErrorBody, describeThrown } from \"./json.js\";\nexport { toGeneratedImage } from \"./generated-image.js\";\nexport * from \"./text.js\";\n\n// The kit's coercion warning keeps the `Warning` name; the SDK's is `AiWarning`.\nexport type { Warning } from \"./types.js\";\nexport type { Warning as AiWarning } from \"ai\";\n","import type { JsonValue } from \"./types.js\";\n\n/** Provider body or the lifted detail (Gemini blockReason, fal body.detail). */\nexport type ProviderErrorBody = string | JsonValue;\n\nexport type ModelKitErrorCode =\n | \"unknown_model\"\n | \"unsupported_option\"\n | \"missing_input\"\n | \"content_blocked\"\n | \"provider_rejected\"\n | \"timeout\"\n | \"auth\"\n | \"network\"\n | \"rate_limited\";\n\nexport interface ModelKitErrorInit {\n code: ModelKitErrorCode;\n message: string;\n provider?: string;\n model?: string;\n status?: number;\n body?: ProviderErrorBody;\n cause?: unknown;\n retryable?: boolean;\n}\n\nexport class ModelKitError extends Error {\n readonly code: ModelKitErrorCode;\n readonly provider: string | undefined;\n readonly model: string | undefined;\n readonly status: number | undefined;\n readonly body: ProviderErrorBody | undefined;\n readonly retryable: boolean;\n\n constructor(init: ModelKitErrorInit) {\n super(init.message, { cause: init.cause });\n this.name = \"ModelKitError\";\n this.code = init.code;\n this.provider = init.provider;\n this.model = init.model;\n this.status = init.status;\n this.body = init.body;\n this.retryable = init.retryable ?? defaultRetryable(init.code);\n }\n}\n\nfunction defaultRetryable(code: ModelKitErrorCode): boolean {\n return code === \"timeout\" || code === \"network\" || code === \"rate_limited\";\n}\n\nexport function isModelKitError(err: unknown): err is ModelKitError {\n return err instanceof ModelKitError;\n}\n","import { ModelKitError } from \"../errors.js\";\nimport type { CatalogModel, Lifecycle, ModelType } from \"../types.js\";\n\nexport class Catalog {\n private readonly byId = new Map<string, CatalogModel>();\n private readonly byAlias = new Map<string, string>();\n\n constructor(models: CatalogModel[]) {\n for (const model of models) this.add(model);\n }\n\n add(model: CatalogModel): void {\n this.byId.set(model.id, model);\n this.byAlias.set(model.id, model.id);\n for (const alias of model.aliases) this.byAlias.set(alias, model.id);\n }\n\n /** Resolves a canonical id or any historical alias. */\n resolveId(idOrAlias: string): string | undefined {\n return this.byAlias.get(idOrAlias);\n }\n\n get(idOrAlias: string): CatalogModel | undefined {\n const id = this.resolveId(idOrAlias);\n return id ? this.byId.get(id) : undefined;\n }\n\n require(idOrAlias: string): CatalogModel {\n const model = this.get(idOrAlias);\n if (!model) {\n throw new ModelKitError({\n code: \"unknown_model\",\n message: `Unknown model \"${idOrAlias}\"`,\n model: idOrAlias,\n });\n }\n if (model.lifecycle === \"retired\") {\n const hint = model.replacedBy ? ` Use \"${model.replacedBy}\".` : \"\";\n throw new ModelKitError({\n code: \"unknown_model\",\n message: `Model \"${model.id}\" is retired.${hint}`,\n model: model.id,\n });\n }\n return model;\n }\n\n list(filter: { type?: ModelType; lifecycle?: Lifecycle[] } = {}): CatalogModel[] {\n const lifecycles = filter.lifecycle ?? [\"active\"];\n return [...this.byId.values()].filter(\n (m) =>\n (filter.type ? m.type === filter.type : true) && lifecycles.includes(m.lifecycle),\n );\n }\n\n /** Merge rows by id. Used for catalogOverride. */\n withOverrides(rows: CatalogModel[]): Catalog {\n return new Catalog([\n ...[...this.byId.values()].filter((m) => !rows.some((r) => r.id === m.id)),\n ...rows,\n ]);\n }\n}\n","import type {\n AspectRatio,\n CatalogCapabilities,\n CatalogDisplay,\n CatalogModel,\n ImageSize,\n} from \"../types.js\";\n\nconst IMAGE_USAGE = { unit: \"images\", modality: \"IMAGE\" } as const;\n\n// Every image row generates from a prompt and conditions on references, so the\n// two flags travel together; vendor rows still declare them per row below.\nconst IMAGE_GENERATE_EDIT: CatalogCapabilities = { imageGenerate: true, imageEdit: true };\n\n// https://ai.google.dev/gemini-api/docs/image-generation#aspect_ratios\nconst GEMINI_RATIOS: AspectRatio[] = [\n \"1:1\",\n \"2:3\",\n \"3:2\",\n \"16:9\",\n \"9:16\",\n \"4:3\",\n \"3:4\",\n \"21:9\",\n \"4:5\",\n \"5:4\",\n \"adaptive\",\n];\n\nfunction geminiImage(\n id: string,\n label: string,\n aliases: string[],\n sizes: ImageSize[],\n display: CatalogDisplay,\n): CatalogModel {\n const model: CatalogModel = {\n id,\n aliases,\n label,\n type: \"image\",\n adapter: \"google-image\",\n providerModelId: id,\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...GEMINI_RATIOS],\n sizes,\n supports: [\"safetySettings\", \"temperature\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display,\n capabilities: { ...IMAGE_GENERATE_EDIT },\n };\n return model;\n}\n\nexport const IMAGE_MODELS: CatalogModel[] = [\n geminiImage(\"gemini-3-pro-image-preview\", \"Nano Banana Pro\", [\"nb-pro\"], [\"1K\", \"2K\", \"4K\"], {\n provider: \"google\",\n description:\n \"Create stunning, production-quality visuals with exceptional realism, detail, and typography. Best for campaigns, e-commerce, product photography, and hero creatives.\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png\",\n }),\n geminiImage(\n \"gemini-3.1-flash-image-preview\",\n \"Nano Banana Flash\",\n [\"nb-2\"],\n // Flash 3.1 is the only Gemini image model with the 512 tier.\n [\"512\", \"1K\", \"2K\", \"4K\"],\n {\n provider: \"google\",\n description:\n \"Generate high-quality images at speed. Perfect for brainstorming, moodboards, concept testing, creative exploration, and large batch workflows.\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png\",\n },\n ),\n geminiImage(\"gemini-3.1-flash-lite-image\", \"Nano Banana Lite\", [\"nb-lite\"], [\"1K\"], {\n provider: \"google\",\n description:\n \"The fastest and most affordable image model. Ideal for rapid drafts, bulk exploration, and iterative concept testing at 1K resolution.\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png\",\n }),\n // trigger-workflows validates 1K only; pricing seeds 2K/4K rows so allow all three.\n geminiImage(\"gemini-2.5-flash-image\", \"Gemini 2.5 Flash Image\", [], [\"1K\", \"2K\", \"4K\"], {\n provider: \"google\",\n description:\n \"Nano Banana (legacy Gemini 2.5 Flash Image) native image generation and editing model for high-volume, low-latency creative workflows.\",\n }),\n {\n // Cowork \"auto\" lets OpenAI pick the size; the canonical equivalent is adaptive.\n id: \"gpt-image-2\",\n aliases: [],\n label: \"GPT Image 2\",\n type: \"image\",\n adapter: \"openai-image\",\n providerModelId: \"gpt-image-2\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [\"1:1\", \"3:2\", \"2:3\", \"16:9\", \"9:16\", \"4:5\", \"5:4\", \"adaptive\"],\n sizes: [\"1K\", \"2K\", \"4K\"],\n references: { images: 16 },\n supports: [\"quality\", \"count\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"adaptive\", quality: \"auto\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"openai\",\n description:\n \"The most capable model for image editing and complex creative instructions. Excels at text rendering, visual consistency, design generation, and iterative refinement.\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/1204b494-8962-4f7f-af5e-699a8bdc98e3_compressed.png\",\n },\n capabilities: { ...IMAGE_GENERATE_EDIT },\n },\n {\n // Same Images API surface as gpt-image-2 plus the \"xhigh\" and \"max\" quality tiers.\n id: \"gpt-image-2.5-sunburst\",\n aliases: [],\n label: \"GPT Image 2.5 Sunburst\",\n type: \"image\",\n adapter: \"openai-image\",\n providerModelId: \"gpt-image-2.5-sunburst\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [\"1:1\", \"3:2\", \"2:3\", \"16:9\", \"9:16\", \"4:5\", \"5:4\", \"adaptive\"],\n sizes: [\"1K\", \"2K\", \"4K\"],\n references: { images: 16 },\n supports: [\"quality\", \"count\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"adaptive\", quality: \"auto\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"openai\",\n description:\n \"OpenAI's most capable GPT Image 2.5 tier, built for editing precision; takes text and image input and outputs images in low, medium, high, xhigh, or max quality.\",\n },\n capabilities: { ...IMAGE_GENERATE_EDIT },\n },\n {\n // Same Images API surface as gpt-image-2 plus the \"xhigh\" and \"max\" quality tiers.\n id: \"gpt-image-2.5-flare\",\n aliases: [],\n label: \"GPT Image 2.5 Flare\",\n type: \"image\",\n adapter: \"openai-image\",\n providerModelId: \"gpt-image-2.5-flare\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [\"1:1\", \"3:2\", \"2:3\", \"16:9\", \"9:16\", \"4:5\", \"5:4\", \"adaptive\"],\n sizes: [\"1K\", \"2K\", \"4K\"],\n references: { images: 16 },\n supports: [\"quality\", \"count\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"adaptive\", quality: \"auto\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"openai\",\n description:\n \"OpenAI's fastest GPT Image 2.5 tier for high-quality everyday image generation and editing; takes text and image input and outputs images.\",\n },\n capabilities: { ...IMAGE_GENERATE_EDIT },\n },\n {\n // Cowork allows 7 ratios; trigger-workflows allows 9 (adds 3:2, 9:21, drops 4:5/5:4).\n id: \"muse-image-1.0\",\n aliases: [],\n label: \"Meta Muse\",\n type: \"image\",\n adapter: \"fal\",\n providerModelId: \"muse-image-1.0\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [\n \"21:9\",\n \"16:9\",\n \"4:3\",\n \"3:2\",\n \"1:1\",\n \"2:3\",\n \"3:4\",\n \"9:16\",\n \"4:5\",\n \"5:4\",\n \"9:21\",\n \"adaptive\",\n ],\n sizes: [\"1K\"],\n references: { images: 10 },\n supports: [\"count\", \"outputFormat\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\", outputFormat: \"png\", count: 1 },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"meta\",\n description:\n \"Meta's image model with built-in world knowledge and strong prompt adherence. Great for concept-rich scenes, realistic compositions, and reference-guided edits.\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/characters/1787909065794-k9a7zz.png\",\n },\n capabilities: { ...IMAGE_GENERATE_EDIT },\n },\n {\n id: \"seedream-5-0-pro\",\n aliases: [\"seedream-4-5\"],\n label: \"Seedream 5 Pro\",\n type: \"image\",\n adapter: \"ark\",\n providerModelId: \"dola-seedream-5-0-pro-260628\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [\"1:1\", \"4:3\", \"3:4\", \"16:9\", \"9:16\", \"3:2\", \"2:3\", \"21:9\", \"4:5\", \"5:4\"],\n sizes: [\"1K\", \"2K\"],\n references: { images: 10 },\n // Ark's Images API has no output-format, quality or count field; only\n // the seed is forwarded, so anything else must warn, not vanish.\n supports: [\"seed\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"bytedance\",\n description:\n \"ByteDance Seedream 5.0 Pro text-to-image and multi-reference image-to-image (up to 10 inputs) with region editing; outputs 1K, 1.5K, or 2K.\",\n },\n capabilities: { ...IMAGE_GENERATE_EDIT },\n },\n {\n id: \"seedream-4.5\",\n aliases: [],\n label: \"Seedream 4.5\",\n type: \"image\",\n adapter: \"ark\",\n providerModelId: \"seedream-4-5-251128\",\n lifecycle: \"active\",\n constraints: {\n // 97:30 has no Ark size spelling; the A+ flow pads inputs to 97:30 and\n // omits the ratio instead. Advertise only sizes the adapter can send.\n aspectRatios: [\n \"1:1\",\n \"2:3\",\n \"3:2\",\n \"4:3\",\n \"3:4\",\n \"4:5\",\n \"5:4\",\n \"9:16\",\n \"16:9\",\n \"21:9\",\n \"9:21\",\n ],\n sizes: [\"1K\", \"2K\", \"4K\"],\n references: { images: 10 },\n supports: [\"seed\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"bytedance\",\n description:\n \"ByteDance Seedream 4.5 text-to-image and image-to-image with up to 14 reference images and batch image-set generation; outputs 2K or 4K.\",\n },\n capabilities: { ...IMAGE_GENERATE_EDIT },\n },\n {\n id: \"flux-2-pro\",\n aliases: [],\n label: \"Flux 2 Pro\",\n type: \"image\",\n adapter: \"prodia\",\n providerModelId: \"flux-2-pro\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [\"1:1\", \"2:3\", \"3:2\", \"16:9\", \"9:16\", \"4:3\", \"3:4\", \"4:5\", \"5:4\", \"21:9\"],\n sizes: [\"1K\"],\n // flux-2-pro's job type always returns image/png; only the seed is forwarded.\n supports: [\"seed\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"black-forest-labs\",\n description:\n \"Black Forest Labs FLUX.2 [pro] text-to-image and multi-reference editing model served via Prodia; takes a prompt and up to 8 input images and outputs up to 4096x4096.\",\n },\n capabilities: { ...IMAGE_GENERATE_EDIT },\n },\n {\n // Prodia's gemini-3-pro jobs take aspect_ratio + resolution (1K/2K/4K), not\n // width/height; 97:30 is outside its aspect_ratio enum.\n // https://docs.prodia.com/models/gemini-3/\n id: \"prodia-nano-banana-pro\",\n aliases: [],\n label: \"Nano Banana Pro via Prodia\",\n type: \"image\",\n adapter: \"prodia\",\n providerModelId: \"inference.gemini-3-pro.img2img.v1\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [\"1:1\", \"2:3\", \"3:2\", \"4:3\", \"3:4\", \"4:5\", \"5:4\", \"9:16\", \"16:9\", \"21:9\"],\n sizes: [\"1K\", \"2K\", \"4K\"],\n requires: [\"references\"],\n supports: [\"seed\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"google\",\n description:\n \"Google Gemini 3 Pro image generation and editing served via Prodia; takes a prompt plus up to 3 reference images and outputs 1K, 2K, or 4K.\",\n },\n capabilities: { ...IMAGE_GENERATE_EDIT },\n },\n {\n // Nano Banana (img2img.v2) is flat-rate with aspect_ratio only; 3:2, 4:5,\n // 5:4 and 97:30 are not in its enum. https://docs.prodia.com/models/nano-banana/\n id: \"prodia-nano-banana\",\n aliases: [],\n label: \"Nano Banana via Prodia\",\n type: \"image\",\n adapter: \"prodia\",\n providerModelId: \"inference.nano-banana.img2img.v2\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [\"1:1\", \"2:3\", \"3:4\", \"4:3\", \"9:16\", \"16:9\", \"21:9\"],\n sizes: [\"1K\"],\n requires: [\"references\"],\n supports: [\"seed\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"google\",\n description:\n \"Google Nano Banana image generation and editing served via Prodia; takes a prompt plus 1-3 input images and matches the first input's aspect ratio in roughly 8 seconds.\",\n },\n capabilities: { ...IMAGE_GENERATE_EDIT },\n },\n {\n // WAN 2.7 takes `images` (up to 9) and a `size` enum whose exact values\n // cover 1:1/16:9/9:16/4:3/3:4 only; other ratios have no spelling.\n // https://replicate.com/wan-video/wan-2.7-image-pro (input schema)\n id: \"wan-2.7-image-pro\",\n aliases: [],\n label: \"WAN 2.7 Image Pro\",\n type: \"image\",\n adapter: \"replicate\",\n providerModelId: \"wan-video/wan-2.7-image-pro\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [\"1:1\", \"16:9\", \"9:16\", \"4:3\", \"3:4\"],\n sizes: [\"1K\", \"2K\", \"4K\"],\n references: { images: 9 },\n supports: [],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { unit: \"compute_seconds\", modality: \"IMAGE\" },\n pricingKind: \"image_size\",\n display: {\n provider: \"alibaba\",\n description:\n \"Alibaba Wan 2.7 Image Pro text-to-image and image-editing model; takes a prompt plus up to 9 reference images and generates up to 4K (4096x4096).\",\n },\n capabilities: { ...IMAGE_GENERATE_EDIT },\n },\n {\n // Qwen Image 2 Pro has aspect_ratio but no size input; resolution follows\n // the reference image (match_input_image) or the provider default.\n // https://replicate.com/qwen/qwen-image-2-pro (input schema)\n id: \"qwen-image-2-pro\",\n aliases: [],\n label: \"Qwen Image 2 Pro\",\n type: \"image\",\n adapter: \"replicate\",\n providerModelId: \"qwen/qwen-image-2-pro\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [\"1:1\", \"16:9\", \"9:16\", \"4:3\", \"3:4\", \"3:2\", \"2:3\"],\n sizes: [],\n references: { images: 1 },\n requires: [\"references\"],\n supports: [],\n },\n defaults: { aspectRatio: \"1:1\" },\n usage: { unit: \"compute_seconds\", modality: \"IMAGE\" },\n pricingKind: \"image_size\",\n display: {\n provider: \"alibaba\",\n description:\n \"Alibaba Qwen Image 2 Pro unified text-to-image and editing model; takes a prompt plus an optional single reference image and generates native 2K output.\",\n },\n capabilities: { ...IMAGE_GENERATE_EDIT },\n },\n {\n // Qwen Image Edit Plus takes aspect_ratio (or match_input_image) and\n // output_format, but no size; no default ratio so edits keep following\n // the input image. https://replicate.com/qwen-edit-apps/qwen-image-edit-plus-lora-skin\n id: \"qwen-image-edit-plus-lora-skin\",\n aliases: [],\n label: \"Qwen Image Edit Plus\",\n type: \"image\",\n adapter: \"replicate\",\n providerModelId: \"qwen-edit-apps/qwen-image-edit-plus-lora-skin\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [\"1:1\", \"16:9\", \"9:16\", \"4:3\", \"3:4\"],\n sizes: [],\n references: { images: 1 },\n requires: [\"references\"],\n supports: [\"outputFormat\"],\n },\n defaults: { outputFormat: \"png\" },\n usage: { unit: \"compute_seconds\", modality: \"IMAGE\" },\n pricingKind: \"image_size\",\n display: {\n provider: \"alibaba\",\n description:\n \"Alibaba Qwen Image Edit Plus with Lightning and a skin-retouching LoRA; takes one or more reference images plus an edit prompt and outputs webp, jpg, or png.\",\n },\n capabilities: { ...IMAGE_GENERATE_EDIT },\n },\n];\n","import type { CatalogModel } from \"../types.js\";\n\nexport const OTHER_MODELS: CatalogModel[] = [\n {\n id: \"lyria-3-clip-preview\",\n aliases: [],\n label: \"Lyria 3 Clip\",\n type: \"audio\",\n adapter: \"google-genai\",\n providerModelId: \"lyria-3-clip-preview\",\n lifecycle: \"active\",\n constraints: {\n durations: [30],\n references: { images: 10 },\n supports: [],\n },\n defaults: {},\n usage: { unit: \"images\", modality: \"AUDIO\" },\n pricingKind: \"flat\",\n display: {\n provider: \"google\",\n description:\n \"Google Lyria 3 Clip short music clips, loops, and previews; takes text and up to 10 image prompts and returns a fixed 30-second MP3 plus lyrics.\",\n },\n },\n {\n id: \"lyria-3-pro-preview\",\n aliases: [],\n label: \"Lyria 3 Pro\",\n type: \"audio\",\n adapter: \"google-genai\",\n providerModelId: \"lyria-3-pro-preview\",\n lifecycle: \"active\",\n constraints: {\n references: { images: 10 },\n supports: [],\n },\n defaults: {},\n usage: { unit: \"images\", modality: \"AUDIO\" },\n pricingKind: \"flat\",\n display: {\n provider: \"google\",\n description:\n \"Google Lyria 3 Pro flagship music model for full-length songs with verses, choruses, and bridges; takes text and up to 10 image prompts and returns MP3 plus lyrics.\",\n },\n },\n {\n id: \"google/lyria-2\",\n aliases: [],\n label: \"Lyria 2 via Replicate\",\n type: \"audio\",\n adapter: \"replicate\",\n providerModelId: \"google/lyria-2\",\n lifecycle: \"active\",\n constraints: {\n durations: [30],\n supports: [\"seed\", \"negativePrompt\"],\n },\n defaults: {},\n usage: { unit: \"compute_seconds\", modality: \"AUDIO\" },\n pricingKind: \"flat\",\n display: {\n provider: \"google\",\n description:\n \"Lyria 2 music generation on Replicate; produces 30 seconds of 48 kHz stereo audio from a text prompt.\",\n },\n },\n {\n id: \"mmaudio\",\n aliases: [\"zsxkib/mmaudio\", \"video-to-audio\"],\n label: \"MMAudio video-to-audio\",\n type: \"audio\",\n adapter: \"replicate\",\n providerModelId:\n \"zsxkib/mmaudio:62871fb59889b2d7c13777f08deb3b36bdff88f7e1d53a50ad7694548a41b484\",\n lifecycle: \"active\",\n constraints: {\n durations: { min: 1, max: 30 },\n requires: [\"sourceVideo\"],\n supports: [\"seed\", \"negativePrompt\"],\n },\n defaults: { durationSeconds: 8 },\n usage: { unit: \"compute_seconds\", modality: \"AUDIO\" },\n pricingKind: \"flat\",\n display: {\n provider: \"mmaudio\",\n description:\n \"MMAudio V2 video-to-audio model on Replicate; takes a source video and prompt and synthesizes synchronized environmental, action, and speech-like audio.\",\n },\n },\n {\n id: \"elevenlabs-music\",\n aliases: [\"elevenlabs/music\"],\n label: \"ElevenLabs Music via Replicate\",\n type: \"audio\",\n adapter: \"replicate\",\n providerModelId: \"elevenlabs/music\",\n lifecycle: \"active\",\n constraints: {\n durations: { min: 5, max: 300 },\n supports: [\"instrumental\"],\n },\n defaults: { durationSeconds: 15, instrumental: true },\n // Replicate's run() does not report predict_time; billed by generated length.\n usage: { unit: \"seconds\", modality: \"AUDIO\" },\n pricingKind: \"flat\",\n display: {\n provider: \"elevenlabs\",\n description:\n \"ElevenLabs Music text-to-music on Replicate; generates full songs, instrumental or with vocals, up to 5 minutes long at up to 44.1 kHz.\",\n },\n },\n {\n id: \"topaz\",\n aliases: [\"replicate-upscaler\", \"upscale\", \"topazlabs/image-upscale\"],\n label: \"Topaz Upscale\",\n type: \"upscale\",\n adapter: \"replicate\",\n providerModelId: \"topazlabs/image-upscale\",\n lifecycle: \"active\",\n constraints: {\n references: { images: 1 },\n requires: [\"references\"],\n supports: [\"scaleFactor\", \"outputFormat\", \"upscale\"],\n },\n defaults: { scaleFactor: 2, outputFormat: \"png\" },\n usage: { unit: \"compute_seconds\", modality: \"IMAGE\" },\n pricingKind: \"flat\",\n display: {\n provider: \"topaz\",\n description:\n \"Topaz Labs AI image upscaling on Replicate; takes one input image and upscales up to 6x with selectable enhancement models and optional face enhancement.\",\n },\n capabilities: { imageEdit: true },\n },\n {\n id: \"bg-remove\",\n aliases: [],\n label: \"Background Remover\",\n type: \"bg-remove\",\n adapter: \"prodia\",\n providerModelId: \"inference.remove-background.v1\",\n lifecycle: \"active\",\n constraints: {\n references: { images: 1 },\n requires: [\"references\"],\n supports: [],\n },\n defaults: {},\n usage: { unit: \"images\", modality: \"IMAGE\" },\n pricingKind: \"flat\",\n display: {\n provider: \"prodia\",\n description:\n \"Prodia background removal; takes one input image and returns a PNG cut-out of the subject plus an optional black-and-white mask.\",\n },\n capabilities: { imageEdit: true },\n },\n];\n","import type { CatalogModel } from \"../types.js\";\n\nconst TEXT_USAGE = { unit: \"tokens\", modality: \"TEXT\" } as const;\n\nfunction text(\n id: string,\n label: string,\n providerModelId: string,\n extra?: Partial<CatalogModel>,\n): CatalogModel {\n return {\n id,\n aliases: [],\n label,\n type: \"text\",\n adapter: \"ai-sdk-text\",\n providerModelId,\n lifecycle: \"active\",\n constraints: { supports: [] },\n defaults: {},\n usage: { ...TEXT_USAGE },\n pricingKind: \"token\",\n ...extra,\n };\n}\n\nexport const TEXT_MODELS: CatalogModel[] = [\n text(\"gpt-4o\", \"GPT-4o\", \"gpt-4o\", {\n display: {\n provider: \"openai\",\n description:\n \"OpenAI GPT-4o flagship multimodal model; text and image input, 128K-token context.\",\n },\n capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 128_000 },\n }),\n text(\"gpt-4o-mini\", \"GPT-4o mini\", \"gpt-4o-mini\", {\n display: {\n provider: \"openai\",\n description:\n \"OpenAI GPT-4o mini fast, low-cost multimodal model; text and image input, 128K-token context.\",\n },\n capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 128_000 },\n }),\n text(\"gpt-5.1\", \"GPT-5.1\", \"gpt-5.1\", {\n display: {\n provider: \"openai\",\n description:\n \"OpenAI GPT-5.1 reasoning model for coding and agentic tasks; text and image input, 400K-token context.\",\n },\n capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 400_000 },\n }),\n text(\"gpt-5.2\", \"GPT-5.2\", \"gpt-5.2\", {\n display: {\n provider: \"openai\",\n description:\n \"OpenAI GPT-5.2 reasoning model for complex professional work; text and image input, 400K-token context.\",\n },\n capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 400_000 },\n }),\n // 1.05M-token context: https://platform.openai.com/docs/models/gpt-5.4\n text(\"gpt-5.4\", \"GPT-5.4\", \"gpt-5.4\", {\n display: {\n provider: \"openai\",\n description:\n \"OpenAI GPT-5.4 flagship reasoning model; text and image input, 1.05M-token context.\",\n },\n capabilities: {\n vision: true,\n tools: true,\n structuredOutput: true,\n contextWindow: 1_050_000,\n },\n }),\n // OpenAI never shipped gpt-5.1-mini or gpt-5.2-mini; callers that still send them get 5.4 mini.\n text(\"gpt-5.4-mini\", \"GPT-5.4 mini\", \"gpt-5.4-mini\", {\n aliases: [\"gpt-5.1-mini\", \"gpt-5.2-mini\"],\n display: {\n provider: \"openai\",\n description:\n \"OpenAI GPT-5.4 mini efficient reasoning model for high-volume workloads; text and image input, 400K-token context.\",\n },\n capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 400_000 },\n }),\n text(\"gpt-5.5\", \"GPT-5.5\", \"gpt-5.5\", {\n display: {\n provider: \"openai\",\n description:\n \"OpenAI GPT-5.5 flagship reasoning model for the most complex professional and coding work; text and image input, 1.05M-token context.\",\n },\n capabilities: {\n vision: true,\n tools: true,\n structuredOutput: true,\n contextWindow: 1_050_000,\n },\n }),\n text(\"gpt-5.6-luna\", \"GPT-5.6 Luna\", \"gpt-5.6-luna\", {\n display: {\n provider: \"openai\",\n description:\n \"OpenAI GPT-5.6 Luna cost-optimized tier of the GPT-5.6 reasoning family; text and image input, 1.05M-token context.\",\n },\n capabilities: {\n vision: true,\n tools: true,\n structuredOutput: true,\n contextWindow: 1_050_000,\n },\n }),\n text(\"gpt-5.6-terra\", \"GPT-5.6 Terra\", \"gpt-5.6-terra\", {\n display: {\n provider: \"openai\",\n description:\n \"OpenAI GPT-5.6 Terra balanced tier of the GPT-5.6 reasoning family; text and image input, 1.05M-token context.\",\n },\n capabilities: {\n vision: true,\n tools: true,\n structuredOutput: true,\n contextWindow: 1_050_000,\n },\n }),\n text(\"gpt-5.6-sol\", \"GPT-5.6 Sol\", \"gpt-5.6-sol\", {\n display: {\n provider: \"openai\",\n description:\n \"OpenAI GPT-5.6 Sol flagship tier of the GPT-5.6 reasoning family; text and image input, 1.05M-token context.\",\n },\n capabilities: {\n vision: true,\n tools: true,\n structuredOutput: true,\n contextWindow: 1_050_000,\n },\n }),\n // Library key \"claude-sonnet-4.5\" maps to the SDK id \"claude-sonnet-4-5\".\n text(\"claude-sonnet-4-5\", \"Claude Sonnet 4.5\", \"claude-sonnet-4-5\", {\n aliases: [\"claude-sonnet-4.5\", \"claude-sonnet-4-5-20250929\"],\n display: {\n provider: \"anthropic\",\n description:\n \"Anthropic Claude Sonnet 4.5 (legacy) balanced model; text and image input, 200K-token context.\",\n },\n capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 200_000 },\n }),\n // Anthropic retired the dated 4.0 ids; callers that still send them get 4.6.\n text(\"claude-sonnet-4-6\", \"Claude Sonnet 4.6\", \"claude-sonnet-4-6\", {\n aliases: [\n \"claude-sonnet-4.6\",\n \"claude-sonnet-4\",\n \"claude-sonnet-4.0\",\n \"claude-sonnet-4-20250514\",\n ],\n display: {\n provider: \"anthropic\",\n description:\n \"Anthropic Claude Sonnet 4.6 (legacy) balanced model; text and image input, 1M-token context.\",\n },\n capabilities: {\n vision: true,\n tools: true,\n structuredOutput: true,\n contextWindow: 1_000_000,\n },\n }),\n text(\"claude-sonnet-5\", \"Claude Sonnet 5\", \"claude-sonnet-5\", {\n display: {\n provider: \"anthropic\",\n description:\n \"Anthropic Claude Sonnet 5 current balanced model; text and image input, 1M-token context.\",\n },\n capabilities: {\n vision: true,\n tools: true,\n structuredOutput: true,\n contextWindow: 1_000_000,\n },\n }),\n text(\"claude-opus-4-8\", \"Claude Opus 4.8\", \"claude-opus-4-8\", {\n aliases: [\"claude-opus-4.8\", \"claude-opus-4\", \"claude-opus-4.0\", \"claude-opus-4-20250514\"],\n display: {\n provider: \"anthropic\",\n description:\n \"Anthropic Claude Opus 4.8 (legacy) frontier model; text and image input, 1M-token context.\",\n },\n capabilities: {\n vision: true,\n tools: true,\n structuredOutput: true,\n contextWindow: 1_000_000,\n },\n }),\n text(\"claude-haiku-4-5\", \"Claude Haiku 4.5\", \"claude-haiku-4-5\", {\n aliases: [\"claude-haiku-4.5\", \"claude-haiku-4-5-20251001\", \"claude-haiku-4\"],\n display: {\n provider: \"anthropic\",\n description:\n \"Anthropic Claude Haiku 4.5 fast model with near-frontier intelligence; text and image input, 200K-token context.\",\n },\n capabilities: { vision: true, tools: true, structuredOutput: true, contextWindow: 200_000 },\n }),\n text(\"claude-opus-5\", \"Claude Opus 5\", \"claude-opus-5\", {\n aliases: [\"claude-opus-5.0\"],\n display: {\n provider: \"anthropic\",\n description:\n \"Anthropic Claude Opus 5 current frontier model for agentic coding and enterprise work; text and image input, 1M-token context.\",\n },\n capabilities: {\n vision: true,\n tools: true,\n structuredOutput: true,\n contextWindow: 1_000_000,\n },\n }),\n text(\"claude-fable-5\", \"Claude Fable 5\", \"claude-fable-5\", {\n display: {\n provider: \"anthropic\",\n description:\n \"Anthropic Claude Fable 5 (legacy) model for demanding reasoning and long-horizon agentic work; text and image input, 1M-token context.\",\n },\n capabilities: {\n vision: true,\n tools: true,\n structuredOutput: true,\n contextWindow: 1_000_000,\n },\n }),\n text(\"gemini-2.5-flash\", \"Gemini 2.5 Flash\", \"gemini-2.5-flash\", {\n display: {\n provider: \"google\",\n description:\n \"Google Gemini 2.5 Flash low-latency multimodal model for high-volume reasoning over text, images, video, and audio; 1M-token context.\",\n },\n capabilities: {\n vision: true,\n tools: true,\n structuredOutput: true,\n contextWindow: 1_048_576,\n },\n }),\n text(\"gemini-2.5-pro\", \"Gemini 2.5 Pro\", \"gemini-2.5-pro\", {\n display: {\n provider: \"google\",\n description:\n \"Google Gemini 2.5 Pro thinking model for complex reasoning over code, math, and documents; text, image, video, audio, and PDF input, 1M-token context.\",\n },\n capabilities: {\n vision: true,\n tools: true,\n structuredOutput: true,\n contextWindow: 1_048_576,\n },\n }),\n text(\"gemini-3.1-pro-preview\", \"Gemini 3.1 Pro (preview)\", \"gemini-3.1-pro-preview\", {\n display: {\n provider: \"google\",\n description:\n \"Google Gemini 3.1 Pro preview reasoning model for software engineering, tool use, and reliable agentic workflows; 1M-token context.\",\n },\n capabilities: {\n vision: true,\n tools: true,\n structuredOutput: true,\n contextWindow: 1_048_576,\n },\n }),\n text(\"gemini-3.5-flash\", \"Gemini 3.5 Flash\", \"gemini-3.5-flash\", {\n display: {\n provider: \"google\",\n description:\n \"Google Gemini 3.5 Flash high-throughput model for frontier-level agentic tasks; text, image, video, audio, and PDF input, 1M-token context.\",\n },\n capabilities: {\n vision: true,\n tools: true,\n structuredOutput: true,\n contextWindow: 1_048_576,\n },\n }),\n text(\"gemini-3.6-flash\", \"Gemini 3.6 Flash\", \"gemini-3.6-flash\", {\n display: {\n provider: \"google\",\n description:\n \"Google Gemini 3.6 Flash general-purpose multimodal agentic model balancing speed and capability; 1M-token context.\",\n },\n capabilities: {\n vision: true,\n tools: true,\n structuredOutput: true,\n contextWindow: 1_048_576,\n },\n }),\n text(\"gemini-3.7-flash\", \"Gemini 3.7 Flash\", \"gemini-3.7-flash\", {\n display: {\n provider: \"google\",\n description:\n \"Google Gemini 3.7 Flash natively multimodal reasoning model for coding, agentic workflows, and multi-step execution; 1M-token context.\",\n },\n capabilities: {\n vision: true,\n tools: true,\n structuredOutput: true,\n contextWindow: 1_048_576,\n },\n }),\n text(\"gemini-3.8-flash\", \"Gemini 3.8 Flash\", \"gemini-3.8-flash\", {\n display: {\n provider: \"google\",\n description:\n \"Google Gemini 3.8 Flash frontier model for long-horizon software engineering, autonomous agents, and enterprise workflows; 1M-token context.\",\n },\n capabilities: {\n vision: true,\n tools: true,\n structuredOutput: true,\n contextWindow: 1_048_576,\n },\n }),\n // Renamed to gemini-3.6-flash in vibe-shared model-migration.ts.\n text(\"gemini-3-flash-preview\", \"Gemini 3 Flash (preview)\", \"gemini-3-flash-preview\", {\n lifecycle: \"deprecated\",\n replacedBy: \"gemini-3.6-flash\",\n }),\n text(\"gemini-3.1-flash-lite\", \"Gemini 3.1 Flash Lite\", \"gemini-3.1-flash-lite\", {\n display: {\n provider: \"google\",\n description:\n \"Google Gemini 3.1 Flash-Lite low-latency multimodal model for high-volume agentic, translation, and data-extraction tasks; 1M-token context.\",\n },\n capabilities: {\n vision: true,\n tools: true,\n structuredOutput: true,\n contextWindow: 1_048_576,\n },\n }),\n text(\"sonar\", \"Sonar\", \"sonar\", {\n display: {\n provider: \"perplexity\",\n description:\n \"Perplexity Sonar lightweight web-grounded search model returning cited answers; 128K-token context.\",\n },\n capabilities: {\n vision: true,\n tools: false,\n structuredOutput: true,\n contextWindow: 128_000,\n },\n }),\n text(\"sonar-pro\", \"Sonar Pro\", \"sonar-pro\", {\n display: {\n provider: \"perplexity\",\n description:\n \"Perplexity Sonar Pro advanced web-grounded search model for complex multi-step queries; 200K-token context.\",\n },\n capabilities: {\n vision: true,\n tools: false,\n structuredOutput: true,\n contextWindow: 200_000,\n },\n }),\n text(\"sonar-reasoning-pro\", \"Sonar Reasoning Pro\", \"sonar-reasoning-pro\", {\n display: {\n provider: \"perplexity\",\n description:\n \"Perplexity Sonar Reasoning Pro chain-of-thought web-grounded search model for complex problem-solving; 128K-token context.\",\n },\n capabilities: {\n vision: true,\n tools: false,\n structuredOutput: true,\n contextWindow: 128_000,\n },\n }),\n text(\"deepseek-v4-flash\", \"DeepSeek V4 Flash\", \"deepseek-v4-flash\", {\n display: {\n provider: \"deepseek\",\n description:\n \"DeepSeek V4 Flash thinking/non-thinking model with vision, tool calls, and JSON output; 1M-token context and up to 384K output tokens.\",\n },\n capabilities: {\n vision: true,\n tools: true,\n structuredOutput: true,\n contextWindow: 1_000_000,\n },\n }),\n text(\"deepseek-v4-pro\", \"DeepSeek V4 Pro\", \"deepseek-v4-pro\", {\n display: {\n provider: \"deepseek\",\n description:\n \"DeepSeek V4 Pro thinking/non-thinking text model with tool calls and JSON output (no vision); 1M-token context and up to 384K output tokens.\",\n },\n capabilities: {\n vision: false,\n tools: true,\n structuredOutput: true,\n contextWindow: 1_000_000,\n },\n }),\n // 1M-token context: https://docs.x.ai/docs/models/grok-4.3\n text(\"grok-4.3\", \"Grok 4.3\", \"grok-4.3\", {\n display: {\n provider: \"xai\",\n description:\n \"xAI Grok 4.3 reasoning model with tool calling and structured outputs; text and image input, 1M-token context.\",\n },\n capabilities: {\n vision: true,\n tools: true,\n structuredOutput: true,\n contextWindow: 1_000_000,\n },\n }),\n // Moonshot retired kimi-k2.5 on 2026-08-31 and no longer publishes its specs.\n text(\"kimi-k2.5\", \"Kimi K2.5\", \"kimi-k2.5\", {\n display: {\n provider: \"moonshot\",\n description:\n \"Moonshot Kimi K2.5; the provider retired the model on 2026-08-31 and calls now return a model-not-found error.\",\n },\n capabilities: {},\n }),\n text(\"kimi-k3\", \"Kimi K3\", \"kimi-k3\", {\n display: {\n provider: \"moonshot\",\n description:\n \"Moonshot Kimi K3 flagship model with native visual understanding and always-on thinking; text, image, and video input, 1M-token context.\",\n },\n capabilities: {\n vision: true,\n tools: true,\n structuredOutput: true,\n contextWindow: 1_000_000,\n },\n }),\n // Cowork calls the provider \"MiniMax-M3\"; the pricing key is lowercase.\n // 1M-token context: https://platform.minimax.io/docs/api-reference/text-openai-api\n text(\"minimax-m3\", \"MiniMax M3\", \"MiniMax-M3\", {\n aliases: [\"MiniMax-M3\"],\n display: {\n provider: \"minimax\",\n description:\n \"MiniMax M3 frontier multimodal model for agentic reasoning, tool use, and coding; text, image, and video input, 1M-token context.\",\n },\n capabilities: { vision: true, tools: true, contextWindow: 1_000_000 },\n }),\n];\n","import type { AspectRatio, CatalogModel } from \"../types.js\";\n\nconst VIDEO_USAGE = { unit: \"seconds\", modality: \"VIDEO\" } as const;\n\nconst SEEDANCE_RATIOS: AspectRatio[] = [\"21:9\", \"16:9\", \"4:3\", \"1:1\", \"3:4\", \"9:16\", \"adaptive\"];\nconst KLING_RATIOS: AspectRatio[] = [\"16:9\", \"9:16\", \"1:1\", \"adaptive\"];\nconst OMNI_RATIOS: AspectRatio[] = [\"16:9\", \"9:16\"];\nconst GROK_RATIOS: AspectRatio[] = [\"1:1\", \"16:9\", \"9:16\", \"4:3\", \"3:4\", \"3:2\", \"2:3\"];\nconst H3_RATIOS: AspectRatio[] = [\"21:9\", \"16:9\", \"4:3\", \"1:1\", \"3:4\", \"9:16\"];\nconst H3_REFERENCE_RATIOS: AspectRatio[] = [\"adaptive\", ...H3_RATIOS];\n\nconst NEGATIVE_PROMPT = \"blur, distort, and low quality\";\n\n// Seedance, Grok, Veo and the frame-driven MiniMax rows route first/last frames\n// and reference images to different inputs; the Omni, reference-only MiniMax,\n// Kling Omni and Kling video-to-video rows can combine them.\nconst FRAMES_EXCLUDE_REFERENCES = { framesExcludeReferences: true } as const;\n\nconst GOOGLE_LOGO =\n \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png\";\n\nexport const VIDEO_MODELS: CatalogModel[] = [\n {\n id: \"veo-3.1\",\n aliases: [\n \"veo-3.1-generate-001\",\n \"veo-3.1-generate-preview\",\n \"veo3\",\n \"veo-3.1-frame-specific\",\n ],\n label: \"Veo 3.1\",\n type: \"video\",\n adapter: \"google-genai\",\n providerModelId: \"veo-3.1-generate-preview\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...OMNI_RATIOS],\n resolutions: [\"720p\", \"1080p\", \"4k\"],\n durations: [8],\n references: { images: 3 },\n supports: [\"lastFrame\"],\n },\n defaults: { durationSeconds: 8, resolution: \"720p\", aspectRatio: \"16:9\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"google\",\n description:\n \"Google's highest-quality video generation model. Supports up to 4K resolution and 8-second clips with reference image conditioning.\",\n logo: GOOGLE_LOGO,\n },\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n id: \"veo-3.1-fast\",\n aliases: [\n \"veo-3.1-fast-generate-001\",\n \"veo-3.1-fast-generate-preview\",\n \"veo-3.1-fast-generate-001-frame-specific\",\n ],\n label: \"Veo 3.1 Fast\",\n type: \"video\",\n adapter: \"google-genai\",\n providerModelId: \"veo-3.1-fast-generate-preview\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...OMNI_RATIOS],\n resolutions: [\"720p\", \"1080p\", \"4k\"],\n durations: [4, 8],\n references: { images: 3 },\n supports: [\"lastFrame\"],\n },\n defaults: { durationSeconds: 8, resolution: \"720p\", aspectRatio: \"16:9\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"google\",\n description:\n \"Faster variant of Google Veo 3.1; text- and image-to-video with natively generated audio at 4 or 8 seconds.\",\n },\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n id: \"veo-3.1-lite\",\n aliases: [\n \"veo-3.1-lite-generate-001\",\n \"veo-3.1-lite-generate-preview\",\n \"veo-3.1-lite-generate-001-frame-specific\",\n ],\n label: \"Veo 3.1 Lite\",\n type: \"video\",\n adapter: \"google-genai\",\n providerModelId: \"veo-3.1-lite-generate-preview\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...OMNI_RATIOS],\n resolutions: [\"720p\", \"1080p\", \"4k\"],\n durations: [4, 8],\n references: { images: 3 },\n supports: [\"lastFrame\"],\n },\n defaults: { durationSeconds: 8, resolution: \"720p\", aspectRatio: \"16:9\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"google\",\n description:\n \"Efficiency-focused Google Veo 3.1 Lite for high-volume video generation and editing; text and image input, with no 4K output or video extension.\",\n },\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n id: \"gemini-omni-flash\",\n aliases: [\n \"gemini-omni-flash-preview\",\n \"geminiOmniFlash\",\n \"gemini-omni-video\",\n \"gemini-omni-reference\",\n \"gemini-omni-edit\",\n ],\n label: \"Gemini Omni Flash\",\n type: \"video\",\n adapter: \"google-genai\",\n providerModelId: \"gemini-omni-flash-preview\",\n lifecycle: \"active\",\n constraints: {\n // 1.0 rejects `resolution`; it renders 720p. No defaults: the adapter\n // sends ratio and duration only when the caller set them, so a\n // reference clip keeps its own framing.\n aspectRatios: [...OMNI_RATIOS],\n durations: [3, 4, 5, 6, 7, 8, 9, 10],\n references: { images: 6, videos: 1 },\n supports: [],\n },\n defaults: {},\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"google\",\n description:\n \"Google's conversational video model with native audio, human support, and natural language editing. Aspect ratio only — resolution and duration are model-determined.\",\n logo: GOOGLE_LOGO,\n },\n capabilities: { acceptsSourceVideo: true },\n },\n {\n id: \"gemini-omni-1.1-flash\",\n aliases: [\"gemini-omni-1.1-video\", \"gemini-omni-1.1-reference\", \"gemini-omni-1.1-edit\"],\n label: \"Gemini Omni 1.1 Flash\",\n type: \"video\",\n adapter: \"google-genai\",\n providerModelId: \"gemini-omni-1.1-flash\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...OMNI_RATIOS],\n resolutions: [\"360p\", \"720p\", \"1080p\", \"4k\"],\n durations: [3, 4, 5, 6, 7, 8, 9, 10],\n references: { images: 6, videos: 1 },\n supports: [],\n },\n defaults: {},\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"google\",\n description:\n \"Google Gemini Omni Flash 1.1 conversational video generation and editing; text, image, and up to 10-second video input, 3-10 second output at up to 4K and 24 FPS.\",\n },\n capabilities: { acceptsSourceVideo: true },\n },\n {\n // vibe-triggers and Space Builder drop the ratio when a frame is wired; Cowork always sends it.\n id: \"seedance-2.0\",\n aliases: [\"seedance2\", \"seedance-2-0\", \"dreamina-seedance-2-0-260128\"],\n label: \"Seedance 2.0\",\n type: \"video\",\n adapter: \"ark\",\n providerModelId: \"dreamina-seedance-2-0-260128\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...SEEDANCE_RATIOS],\n resolutions: [\"480p\", \"720p\", \"1080p\", \"4k\"],\n durations: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],\n references: { images: 9, videos: 3, audios: 3, audioOnly: false },\n ratioIgnoredWith: [\"firstFrame\"],\n supports: [\"generateAudio\", \"seed\", \"lastFrame\", \"watermark\"],\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"720p\",\n aspectRatio: \"16:9\",\n generateAudio: true,\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"bytedance\",\n description:\n \"High-quality AI video generation with reference image conditioning. Supports 4-15 second clips with human preprocessing.\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/3bba5d81-4e57-4e71-911b-cdfa05acca2c_compressed.png\",\n },\n capabilities: { acceptsSourceVideo: true, ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n id: \"seedance-2.0-fast\",\n aliases: [\"seedance-2-0-fast\", \"dreamina-seedance-2-0-fast-260128\"],\n label: \"Seedance 2.0 Fast\",\n type: \"video\",\n adapter: \"ark\",\n providerModelId: \"dreamina-seedance-2-0-fast-260128\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...SEEDANCE_RATIOS],\n resolutions: [\"480p\", \"720p\"],\n durations: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],\n references: { images: 9, videos: 3, audios: 3, audioOnly: false },\n ratioIgnoredWith: [\"firstFrame\"],\n supports: [\"generateAudio\", \"seed\", \"lastFrame\", \"watermark\"],\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"720p\",\n aspectRatio: \"16:9\",\n generateAudio: true,\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"bytedance\",\n description:\n \"Speed- and cost-optimized ByteDance Seedance 2.0 Fast; text plus image, video, and audio references to generate or edit 4-15 second clips.\",\n },\n capabilities: { acceptsSourceVideo: true, ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n // generateAudio defaults to false here (trigger-workflows); Space Builder defaults it to true.\n id: \"seedance-2.5\",\n aliases: [\"seedance-2-5\", \"dreamina-seedance-2-5-260628\"],\n label: \"Seedance 2.5\",\n type: \"video\",\n adapter: \"ark\",\n providerModelId: \"dreamina-seedance-2-5-260628\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...SEEDANCE_RATIOS],\n resolutions: [\"480p\", \"720p\", \"1080p\"],\n durations: { min: 4, max: 30 },\n references: { images: 30, videos: 10, audios: 10 },\n ratioIgnoredWith: [\"firstFrame\"],\n supports: [\"generateAudio\", \"seed\", \"lastFrame\", \"watermark\"],\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"720p\",\n aspectRatio: \"16:9\",\n generateAudio: false,\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"bytedance\",\n description:\n \"ByteDance Seedance 2.5 for long-form storytelling and omni-reference generation/editing; up to 50 reference assets and 4-30 second clips at up to 1080p.\",\n },\n capabilities: { acceptsSourceVideo: true, ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n // Cowork allows 7 reference images and durations 4/6/8/10; Space Builder allows 5 and 1-15s.\n id: \"grok-imagine\",\n aliases: [\"grok-imagine-video\", \"grokImagine\"],\n label: \"Grok Imagine\",\n type: \"video\",\n adapter: \"xai-video\",\n providerModelId: \"grok-imagine-video\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...GROK_RATIOS],\n resolutions: [\"480p\", \"720p\"],\n durations: { min: 1, max: 15 },\n references: { images: 7 },\n supports: [],\n },\n // No resolution default: xAI picks its own unless the caller asks.\n defaults: { durationSeconds: 8, aspectRatio: \"16:9\" },\n usage: { unit: \"reported_cost_usd\", modality: \"VIDEO\" },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"xai\",\n description:\n \"xAI's reference-to-video model. Generates short clips conditioned on up to 7 reference images with flexible aspect ratios.\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/858b7fcc-9bd5-411d-aea1-a7b35ecfffab_compressed.png\",\n },\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n id: \"kling-2.5\",\n aliases: [\"kling-v2.5-turbo-pro\", \"kling-2.5-turbo-pro\", \"kling-v2.5\"],\n label: \"Kling 2.5\",\n type: \"video\",\n adapter: \"higgsfield\",\n providerModelId: \"kling-video/v2.5-turbo/pro/image-to-video\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...KLING_RATIOS],\n durations: [5, 10],\n requires: [\"firstFrame\"],\n supports: [\"cfgScale\", \"negativePrompt\", \"lastFrame\"],\n },\n defaults: {\n durationSeconds: 5,\n aspectRatio: \"16:9\",\n cfgScale: 0.5,\n negativePrompt: NEGATIVE_PROMPT,\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"kuaishou\",\n description:\n \"Kuaishou Kling 2.5 Turbo Pro image-to-video; animates a single input image from a text prompt with an optional end image, 5- or 10-second clips.\",\n },\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n // trigger-workflows validates 5/10 only; Space Builder allows 3-15s (Kling30Input).\n id: \"kling-3.0\",\n aliases: [\"kling-v3.0-pro\", \"kling-v3.0\", \"kling-3.0-pro\"],\n label: \"Kling 3.0\",\n type: \"video\",\n adapter: \"higgsfield\",\n providerModelId: \"kling-video/v3.0/pro/image-to-video\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...KLING_RATIOS],\n durations: { min: 3, max: 15 },\n requires: [\"firstFrame\"],\n supports: [\"cfgScale\", \"negativePrompt\", \"lastFrame\"],\n },\n defaults: {\n durationSeconds: 5,\n aspectRatio: \"16:9\",\n cfgScale: 0.5,\n negativePrompt: NEGATIVE_PROMPT,\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"kuaishou\",\n description:\n \"Kuaishou Kling 3.0 Pro image-to-video; a required start image plus a text prompt (or multi-shot prompts) with optional end image and native audio, 3-15 second clips.\",\n },\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n // mode standard/pro selects 720p/1080p; the endpoint takes no separate resolution.\n id: \"kling-v3-omni-video\",\n aliases: [\"kwaivgi/kling-v3-omni-video\", \"kling-v3-omni\"],\n label: \"Kling V3 Omni\",\n type: \"video\",\n adapter: \"replicate\",\n providerModelId: \"kwaivgi/kling-v3-omni-video\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [\n \"1:1\",\n \"16:9\",\n \"9:16\",\n \"4:3\",\n \"3:4\",\n \"3:2\",\n \"2:3\",\n \"21:9\",\n \"4:5\",\n \"adaptive\",\n ],\n resolutions: [\"720p\", \"1080p\"],\n durations: { min: 3, max: 15 },\n references: { images: 7 },\n supports: [\"generateAudio\", \"lastFrame\"],\n },\n defaults: { durationSeconds: 5, aspectRatio: \"16:9\", generateAudio: false, mode: \"pro\" },\n usage: { unit: \"compute_seconds\", modality: \"VIDEO\" },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"kuaishou\",\n description:\n \"Kuaishou Kling Video 3.0 Omni unified generation and editing from text, start/end images, up to 7 reference images, and reference video; up to 15 seconds at up to 1080p.\",\n },\n capabilities: {},\n },\n {\n id: \"minimax-h3\",\n aliases: [],\n label: \"MiniMax H3\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"minimax/h3\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...H3_RATIOS],\n resolutions: [\"480p\", \"768p\", \"2k\", \"4k\"],\n durations: { min: 5, max: 15 },\n supports: [\"seed\", \"promptExpansion\", \"lastFrame\", \"safetyChecker\"],\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"2k\",\n aspectRatio: \"16:9\",\n promptExpansion: \"balanced\",\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n description:\n \"MiniMax H3 multimodal video model for text-to-video, image-to-video (first/last frame), and reference-to-video with native audio, up to 2K.\",\n },\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n id: \"minimax-h3-max\",\n aliases: [],\n label: \"MiniMax H3 Max\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"minimax/h3-max\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...H3_RATIOS],\n resolutions: [\"480p\", \"768p\"],\n durations: { min: 5, max: 15 },\n supports: [\"seed\", \"promptExpansion\", \"lastFrame\", \"safetyChecker\"],\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"768p\",\n aspectRatio: \"16:9\",\n promptExpansion: \"balanced\",\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n description:\n \"High-speed MiniMax H3 Max variant for text-to-video and image-to-video (first/last frame) only, up to 768p.\",\n },\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n id: \"minimax-h3-reference\",\n aliases: [],\n label: \"MiniMax H3 Reference\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"minimax/h3/reference-to-video\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...H3_REFERENCE_RATIOS],\n resolutions: [\"480p\", \"768p\", \"2k\", \"4k\"],\n durations: { min: 5, max: 15 },\n references: { images: 9, videos: 3, audios: 3, total: 12, audioOnly: false },\n supports: [\"seed\", \"promptExpansion\", \"safetyChecker\"],\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"2k\",\n aspectRatio: \"adaptive\",\n promptExpansion: \"balanced\",\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n description:\n \"MiniMax H3 reference-to-video mode guided by up to 9 reference images, 3 reference videos, and 3 audio clips; reference and image-to-video inputs cannot be mixed.\",\n },\n capabilities: {},\n },\n {\n id: \"minimax-h3-max-reference\",\n aliases: [],\n label: \"MiniMax H3 Max Reference\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"minimax/h3-max/reference-to-video\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...H3_REFERENCE_RATIOS],\n resolutions: [\"480p\", \"768p\"],\n durations: { min: 5, max: 15 },\n references: { images: 9, videos: 3, audios: 3, total: 12, audioOnly: false },\n supports: [\"seed\", \"promptExpansion\", \"safetyChecker\"],\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"768p\",\n aspectRatio: \"adaptive\",\n promptExpansion: \"balanced\",\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n description:\n \"MiniMax H3 Max reference-to-video on fal; conditions on reference images, videos, and audio. MiniMax's own docs do not list a reference mode for H3 Max.\",\n },\n capabilities: {},\n },\n {\n // Duration 3-10s per trigger-workflows mapDuration; the endpoint takes no resolution.\n id: \"kling-o1-v2v\",\n aliases: [],\n label: \"Kling O1 Video to Video\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/kling-video/o1/video-to-video/reference\",\n lifecycle: \"active\",\n constraints: {\n aspectRatios: [...KLING_RATIOS],\n durations: { min: 3, max: 10 },\n requires: [\"sourceVideo\"],\n supports: [],\n },\n defaults: { durationSeconds: 5, aspectRatio: \"16:9\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"kuaishou\",\n description:\n \"Kuaishou Kling O1 Reference Video-to-Video; a prompt plus a 3-10 second reference video (optional reference images) generates 3-10 second clips preserving motion and camera language.\",\n },\n capabilities: { acceptsSourceVideo: true },\n },\n {\n id: \"hailuo-02\",\n aliases: [],\n label: \"Hailuo 02\",\n type: \"video\",\n adapter: \"replicate\",\n providerModelId: \"minimax/hailuo-02\",\n lifecycle: \"active\",\n constraints: {\n resolutions: [\"768p\"],\n durations: [6, 10],\n supports: [\"lastFrame\"],\n },\n defaults: { durationSeconds: 6, resolution: \"768p\" },\n usage: { unit: \"compute_seconds\", modality: \"VIDEO\" },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n description:\n \"MiniMax Hailuo 02 text-to-video and image-to-video model with realistic physics and strong prompt following; outputs 768p at 6 or 10 seconds.\",\n },\n capabilities: {},\n },\n {\n id: \"higgsfield-dop-preview\",\n aliases: [],\n label: \"Higgsfield DOP Preview\",\n type: \"video\",\n adapter: \"higgsfield\",\n providerModelId: \"dop-preview\",\n lifecycle: \"active\",\n constraints: {\n requires: [\"firstFrame\"],\n supports: [\"seed\", \"lastFrame\"],\n },\n defaults: {},\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"higgsfield\",\n description:\n \"Higgsfield DOP image-to-video model; animates a required first-frame image from a text prompt with an optional last-frame image and motion controls.\",\n },\n capabilities: {},\n },\n];\n","import type { CatalogModel } from \"../types.js\";\nimport { IMAGE_MODELS } from \"./image.js\";\nimport { OTHER_MODELS } from \"./other.js\";\nimport { TEXT_MODELS } from \"./text.js\";\nimport { VIDEO_MODELS } from \"./video.js\";\n\n/** Seeded from Cowork, Space Builder and trigger-workflows. See catalog/*.ts. */\nexport const MODELS: CatalogModel[] = [\n ...TEXT_MODELS,\n ...IMAGE_MODELS,\n ...VIDEO_MODELS,\n ...OTHER_MODELS,\n];\n","import { ModelKitError } from \"./errors.js\";\nimport type {\n AspectRatio,\n AudioRequest,\n CatalogModel,\n ImageRequest,\n ImageSize,\n MediaRef,\n VideoRequest,\n VideoResolution,\n Warning,\n} from \"./types.js\";\n\nexport type OnUnsupported = \"error\" | \"coerce\";\n\nexport interface ResolveResult<T> {\n request: T;\n warnings: Warning[];\n}\n\nconst SIZE_ORDER: ImageSize[] = [\"512\", \"1K\", \"2K\", \"4K\"];\nconst RESOLUTION_ORDER: VideoResolution[] = [\"360p\", \"480p\", \"720p\", \"768p\", \"1080p\", \"2k\", \"4k\"];\n\nfunction ratioValue(r: AspectRatio): number {\n if (r === \"adaptive\") return 1;\n // SAFETY: every non-adaptive AspectRatio literal is \"<int>:<int>\", so the split has two numbers.\n const [w, h] = r.split(\":\").map(Number) as [number, number];\n return w / h;\n}\n\ntype Orientation = \"landscape\" | \"portrait\" | \"square\";\nfunction orientation(r: AspectRatio): Orientation {\n const v = ratioValue(r);\n return v > 1 ? \"landscape\" : v < 1 ? \"portrait\" : \"square\";\n}\n\n/** Nearest supported ratio in the same orientation bucket, else nearest overall, by log distance. */\nexport function nearestAspectRatio(requested: AspectRatio, supported: AspectRatio[]): AspectRatio {\n if (supported.includes(requested)) return requested;\n const target = requested === \"adaptive\" ? \"1:1\" : requested;\n const sameBucket = supported.filter(\n (s) => s !== \"adaptive\" && orientation(s) === orientation(target),\n );\n const pool = sameBucket.length > 0 ? sameBucket : supported.filter((s) => s !== \"adaptive\");\n const fallback = pool[0] ?? supported[0];\n if (!fallback) return target;\n const dist = (s: AspectRatio) =>\n Math.abs(Math.log(ratioValue(s)) - Math.log(ratioValue(target)));\n return pool.reduce((best, s) => (dist(s) < dist(best) ? s : best), fallback);\n}\n\nfunction nearestLowerTier<T extends string>(requested: T, supported: T[], order: T[]): T {\n const idx = order.indexOf(requested);\n for (let i = idx; i >= 0; i--) {\n const candidate = order[i];\n if (candidate !== undefined && supported.includes(candidate)) return candidate;\n }\n for (let i = idx + 1; i < order.length; i++) {\n const candidate = order[i];\n if (candidate !== undefined && supported.includes(candidate)) return candidate;\n }\n return requested;\n}\n\nfunction resolveTier<T extends string>(\n field: string,\n code: Warning[\"code\"],\n requested: T | undefined,\n supported: T[] | undefined,\n order: T[],\n model: CatalogModel,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): T | undefined {\n if (requested === undefined || !supported || supported.includes(requested)) return requested;\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} does not support ${field} \"${requested}\". Supported: ${supported.join(\", \")}.`,\n model: model.id,\n });\n }\n const to = nearestLowerTier(requested, supported, order);\n warnings.push({\n code,\n field,\n from: requested,\n to,\n message: `${field} ${requested} coerced to ${to} for ${model.id}`,\n });\n return to;\n}\n\nfunction resolveDuration(\n requested: number | undefined,\n durations: CatalogModel[\"constraints\"][\"durations\"],\n model: CatalogModel,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): number | undefined {\n if (requested === undefined || !durations) return requested;\n const inSet = Array.isArray(durations)\n ? durations.includes(requested)\n : requested >= durations.min && requested <= durations.max;\n if (inSet) return requested;\n if (onUnsupported === \"error\") {\n const supported = Array.isArray(durations)\n ? `Supported: ${durations.join(\", \")}.`\n : `Supported range: ${durations.min}-${durations.max}.`;\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} does not support durationSeconds ${requested}. ${supported}`,\n model: model.id,\n });\n }\n const to = Array.isArray(durations)\n ? durations.reduce(\n (best, d) => (Math.abs(d - requested) < Math.abs(best - requested) ? d : best),\n durations[0] ?? requested,\n )\n : Math.min(Math.max(requested, durations.min), durations.max);\n warnings.push({\n code: \"duration_coerced\",\n field: \"durationSeconds\",\n from: requested,\n to,\n message: `duration ${requested}s coerced to ${to}s for ${model.id}`,\n });\n return to;\n}\n\n/** An unsupported ratio errors under \"error\"; under \"coerce\" it snaps with a warning. */\nfunction resolveAspectRatio(\n requested: AspectRatio | undefined,\n supported: AspectRatio[] | undefined,\n model: CatalogModel,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): AspectRatio | undefined {\n if (requested === undefined || requested === \"adaptive\" || !supported) return requested;\n if (supported.includes(requested)) return requested;\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} does not support aspectRatio \"${requested}\". Supported: ${supported.join(\", \")}.`,\n model: model.id,\n });\n }\n const to = nearestAspectRatio(requested, supported);\n warnings.push({\n code: \"ratio_coerced\",\n field: \"aspectRatio\",\n from: requested,\n to,\n message: `aspect ratio ${requested} coerced to ${to} for ${model.id}`,\n });\n return to;\n}\n\nfunction compact(refs: MediaRef[] | undefined): MediaRef[] {\n return (refs ?? []).filter((r): r is MediaRef => Boolean(r));\n}\n\nfunction trim(\n field: string,\n refs: MediaRef[],\n limit: number | undefined,\n model: CatalogModel,\n warnings: Warning[],\n): MediaRef[] {\n if (limit === undefined || refs.length <= limit) return refs;\n warnings.push({\n code: \"references_trimmed\",\n field,\n from: refs.length,\n to: limit,\n message: `${field} trimmed from ${refs.length} to ${limit} for ${model.id}`,\n });\n return refs.slice(0, limit);\n}\n\nexport function resolveImageOptions(\n model: CatalogModel,\n request: ImageRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<ImageRequest> {\n const warnings: Warning[] = [];\n const c = model.constraints;\n const merged: ImageRequest = { ...model.defaults, ...stripUndefined(request), model: model.id };\n\n const aspectRatio = resolveAspectRatio(\n merged.aspectRatio,\n c.aspectRatios,\n model,\n onUnsupported,\n warnings,\n );\n if (aspectRatio !== undefined) merged.aspectRatio = aspectRatio;\n const size = resolveTier(\n \"size\",\n \"size_coerced\",\n merged.size,\n c.sizes,\n SIZE_ORDER,\n model,\n onUnsupported,\n warnings,\n );\n if (size !== undefined) merged.size = size;\n\n const references = trim(\n \"references\",\n compact(merged.references),\n c.references?.images ?? c.references?.total,\n model,\n warnings,\n );\n if (references.length > 0) merged.references = references;\n else delete merged.references;\n if (c.requires?.includes(\"references\") && references.length === 0) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} requires at least one reference image`,\n model: model.id,\n });\n }\n dropUnsupported(merged, model, warnings, [\n \"seed\",\n \"quality\",\n \"count\",\n \"outputFormat\",\n \"scaleFactor\",\n \"safetySettings\",\n \"temperature\",\n \"upscale\",\n ]);\n return { request: merged, warnings };\n}\n\nexport function resolveVideoOptions(\n model: CatalogModel,\n request: VideoRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<VideoRequest> {\n const warnings: Warning[] = [];\n const c = model.constraints;\n const merged: VideoRequest = { ...model.defaults, ...stripUndefined(request), model: model.id };\n\n for (const input of c.requires ?? []) {\n const present =\n input === \"references\"\n ? compact(merged.referenceImages).length +\n compact(merged.referenceVideos).length +\n compact(merged.referenceAudios).length >\n 0\n : merged[input] !== undefined;\n if (!present)\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} requires ${input}`,\n model: model.id,\n });\n }\n\n for (const input of c.ratioIgnoredWith ?? []) {\n if (merged[input] !== undefined && merged.aspectRatio !== undefined) {\n // Only the caller's own ratio deserves a warning; a catalog default dropping is expected.\n if (request.aspectRatio !== undefined) {\n warnings.push({\n code: \"ratio_dropped\",\n field: \"aspectRatio\",\n from: merged.aspectRatio,\n message: `${model.id} ignores aspectRatio when ${input} is set`,\n });\n }\n delete merged.aspectRatio;\n }\n }\n const aspectRatio = resolveAspectRatio(\n merged.aspectRatio,\n c.aspectRatios,\n model,\n onUnsupported,\n warnings,\n );\n if (aspectRatio !== undefined) merged.aspectRatio = aspectRatio;\n const resolution = resolveTier(\n \"resolution\",\n \"resolution_coerced\",\n merged.resolution,\n c.resolutions,\n RESOLUTION_ORDER,\n model,\n onUnsupported,\n warnings,\n );\n if (resolution !== undefined) merged.resolution = resolution;\n const duration = resolveDuration(\n merged.durationSeconds,\n c.durations,\n model,\n onUnsupported,\n warnings,\n );\n if (duration !== undefined) merged.durationSeconds = duration;\n\n const limits = c.references ?? {};\n let images = trim(\n \"referenceImages\",\n compact(merged.referenceImages),\n limits.images,\n model,\n warnings,\n );\n let videos = trim(\n \"referenceVideos\",\n compact(merged.referenceVideos),\n limits.videos,\n model,\n warnings,\n );\n let audios = trim(\n \"referenceAudios\",\n compact(merged.referenceAudios),\n limits.audios,\n model,\n warnings,\n );\n if (limits.total !== undefined) {\n let over = images.length + videos.length + audios.length - limits.total;\n if (over > 0) {\n const cut = Math.min(over, audios.length);\n audios = trim(\"referenceAudios\", audios, audios.length - cut, model, warnings);\n over -= cut;\n }\n if (over > 0) {\n const cut = Math.min(over, videos.length);\n videos = trim(\"referenceVideos\", videos, videos.length - cut, model, warnings);\n over -= cut;\n }\n if (over > 0)\n images = trim(\"referenceImages\", images, images.length - over, model, warnings);\n }\n if (\n limits.audioOnly === false &&\n audios.length > 0 &&\n images.length === 0 &&\n videos.length === 0 &&\n !merged.firstFrame &&\n !merged.sourceVideo\n ) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} rejects audio-only references`,\n model: model.id,\n });\n }\n setOrDelete(merged, \"referenceImages\", images);\n setOrDelete(merged, \"referenceVideos\", videos);\n setOrDelete(merged, \"referenceAudios\", audios);\n\n dropUnsupported(merged, model, warnings, [\n \"seed\",\n \"negativePrompt\",\n \"cfgScale\",\n \"generateAudio\",\n \"promptExpansion\",\n \"lastFrame\",\n \"watermark\",\n \"safetyChecker\",\n ]);\n return { request: merged, warnings };\n}\n\nexport function resolveAudioOptions(\n model: CatalogModel,\n request: AudioRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<AudioRequest> {\n const warnings: Warning[] = [];\n const c = model.constraints;\n const merged: AudioRequest = { ...model.defaults, ...stripUndefined(request), model: model.id };\n\n for (const input of c.requires ?? []) {\n const present =\n input === \"references\"\n ? compact(merged.references).length > 0\n : input === \"sourceVideo\" && merged.sourceVideo !== undefined;\n if (!present)\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} requires ${input}`,\n model: model.id,\n });\n }\n\n const duration = resolveDuration(\n merged.durationSeconds,\n c.durations,\n model,\n onUnsupported,\n warnings,\n );\n if (duration !== undefined) merged.durationSeconds = duration;\n\n const references = trim(\n \"references\",\n compact(merged.references),\n c.references?.images ?? c.references?.total,\n model,\n warnings,\n );\n if (references.length > 0) merged.references = references;\n else delete merged.references;\n\n dropUnsupported(merged, model, warnings, [\"seed\", \"negativePrompt\", \"instrumental\"]);\n return { request: merged, warnings };\n}\n\nfunction dropUnsupported<T extends object>(\n req: T,\n model: CatalogModel,\n warnings: Warning[],\n fields: (keyof T & string)[],\n): void {\n const supports = model.constraints.supports ?? [];\n for (const field of fields) {\n // SAFETY: `fields` are a subset of SupportedOption; the cast only bridges the generic key type.\n if (req[field] !== undefined && !supports.includes(field as never)) {\n warnings.push({\n code: \"option_ignored\",\n field,\n from: req[field],\n message: `${model.id} does not support ${field}; ignored`,\n });\n delete req[field];\n }\n }\n}\n\nfunction setOrDelete(\n req: VideoRequest,\n field: \"referenceImages\" | \"referenceVideos\" | \"referenceAudios\",\n refs: MediaRef[],\n): void {\n if (refs.length > 0) req[field] = refs;\n else delete req[field];\n}\n\nfunction stripUndefined<T extends object>(obj: T): T {\n // SAFETY: only undefined-valued keys are removed, which does not change the static type of T.\n return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as T;\n}\n","import { ModelKitError } from \"./errors.js\";\nimport type { AdapterId, ModelKitConfig, ProviderKeyName, ProviderKeys } from \"./types.js\";\n\n/** Which key names an adapter needs. All of them must be set on a tier for that tier to win. */\nexport const ADAPTER_KEYS: Record<AdapterId, ProviderKeyName[]> = {\n \"ai-sdk-text\": [],\n \"google-image\": [\"google\"],\n \"openai-image\": [\"openai\"],\n \"google-genai\": [\"google\"],\n ark: [\"ark\"],\n fal: [\"fal\"],\n replicate: [\"replicate\"],\n prodia: [\"prodia\"],\n higgsfield: [\"higgsfield\"],\n \"xai-video\": [\"xai\"],\n};\n\nfunction hasAll(keys: ProviderKeys | undefined, names: ProviderKeyName[]): keys is ProviderKeys {\n if (!keys) return false;\n return names.every(\n (n) => Boolean(keys[n]) && (n !== \"higgsfield\" || Boolean(keys.higgsfieldSecret)),\n );\n}\n\n/** The required names the enterprise tier is missing, so the call must fall back to pro. */\nexport function missingEnterpriseKeys(\n config: ModelKitConfig,\n names: ProviderKeyName[],\n): ProviderKeyName[] {\n return names.filter((name) => !hasAll(config.keys.enterprise, [name]));\n}\n\n/**\n * Enterprise wins only when every key the adapter needs is set on the\n * enterprise tier; otherwise the pro keys are used. Mirrors trigger-workflows\n * enterprise-keys.ts, extended to Ark and Prodia.\n */\nexport function resolveKeys(\n config: ModelKitConfig,\n names: ProviderKeyName[],\n tier: \"pro\" | \"enterprise\" = \"pro\",\n): ProviderKeys {\n if (tier === \"enterprise\" && hasAll(config.keys.enterprise, names))\n return config.keys.enterprise;\n if (names.length > 0 && !hasAll(config.keys.pro, names)) {\n throw new ModelKitError({\n code: \"auth\",\n message: `Missing API key for ${names.join(\", \")}`,\n retryable: false,\n });\n }\n return config.keys.pro;\n}\n\n/** Build a ProviderKeys map from env with the given prefix (\"\" for pro, \"ENTERPRISE_\" for enterprise). */\nexport function keysFromEnv(env: NodeJS.ProcessEnv, prefix = \"\"): ProviderKeys {\n const pick = (...names: string[]) =>\n names.map((n) => env[`${prefix}${n}`]).find((v) => v && v.length > 0);\n const keys: ProviderKeys = {};\n const set = (k: Exclude<keyof ProviderKeys, \"aws\">, v: string | undefined) => {\n if (v) keys[k] = v;\n };\n set(\"openai\", pick(\"OPENAI_API_KEY\"));\n set(\"anthropic\", pick(\"ANTHROPIC_API_KEY\"));\n set(\"google\", pick(\"GOOGLE_GENERATIVE_AI_API_KEY\", \"GEMINI_API_KEY\", \"GOOGLE_API_KEY\"));\n set(\"xai\", pick(\"XAI_API_KEY\"));\n set(\"perplexity\", pick(\"PERPLEXITY_API_KEY\"));\n set(\"deepseek\", pick(\"DEEPSEEK_API_KEY\"));\n set(\"moonshot\", pick(\"MOONSHOT_API_KEY\"));\n set(\"minimax\", pick(\"MINIMAX_API_KEY\"));\n set(\"ark\", pick(\"ARK_API_KEY\", \"BYTEPLUS_ARK_API_KEY\", \"BYTEDANCE_API_KEY\"));\n set(\"fal\", pick(\"FAL_KEY\", \"FAL_API_KEY\"));\n set(\"replicate\", pick(\"REPLICATE_API_TOKEN\", \"REPLICATE_API_KEY\"));\n set(\"prodia\", pick(\"PRODIA_API_KEY\", \"PRODIA_TOKEN\"));\n set(\"higgsfield\", pick(\"HIGGSFIELD_API_KEY\"));\n set(\"higgsfieldSecret\", pick(\"HIGGSFIELD_API_SECRET\"));\n set(\"cloudflare\", pick(\"CLOUDFLARE_AI_GATEWAY_TOKEN\", \"CF_AIG_TOKEN\"));\n return keys;\n}\n","import { z } from \"zod\";\nimport { ModelKitError, type ModelKitErrorCode, type ProviderErrorBody } from \"./errors.js\";\nimport { describeThrown } from \"./json.js\";\n\nconst textBody = z.string();\n\n/**\n * One classifier for every adapter. Never retry safety blocks,\n * content_policy_violation, or 4xx other than 429. Retry 429, 5xx, timeouts\n * and network failures. Adapters must not stack their own retry loop on top.\n */\nexport function classifyHttpError(\n status: number | undefined,\n body: ProviderErrorBody,\n provider: string,\n model?: string,\n): ModelKitError {\n const asText = textBody.safeParse(body);\n const text = asText.success ? asText.data : JSON.stringify(body);\n // Match content-block signals that are provider values, not field names:\n // \"safety_settings\" is an invalid-argument field, not a safety block.\n const blocked =\n /content_policy_violation|blockReason|PROHIBITED_CONTENT|moderation_blocked|safety(?![_A-Za-z])/i.test(\n text,\n );\n let code: ModelKitErrorCode = \"provider_rejected\";\n if (blocked) code = \"content_blocked\";\n else if (status === 401 || status === 403) code = \"auth\";\n else if (status === 429) code = \"rate_limited\";\n else if (status === 408 || status === 504) code = \"timeout\";\n else if (status !== undefined && status >= 500) code = \"network\";\n const retryable = code === \"rate_limited\" || code === \"timeout\" || code === \"network\";\n const init: ConstructorParameters<typeof ModelKitError>[0] = {\n code,\n message: `${provider} responded ${status ?? \"?\"}: ${text.slice(0, 500)}`,\n provider,\n body,\n retryable,\n };\n if (status !== undefined) init.status = status;\n if (model !== undefined) init.model = model;\n return new ModelKitError(init);\n}\n\nexport function shouldRetry(err: Error): boolean {\n if (err instanceof ModelKitError) return err.retryable;\n // A caller abort is final, like transportError; a pre-response network failure is not.\n if (err.name === \"AbortError\") return false;\n if (/ECONNRESET|ETIMEDOUT|fetch failed|socket hang up/i.test(err.message)) return true;\n return false;\n}\n\nexport interface RetryOptions {\n attempts?: number;\n baseDelayMs?: number;\n maxDelayMs?: number;\n factor?: number;\n signal?: AbortSignal;\n}\n\nexport async function withRetry<T>(\n fn: (attempt: number) => Promise<T>,\n opts: RetryOptions = {},\n): Promise<T> {\n const attempts = opts.attempts ?? 3;\n const base = opts.baseDelayMs ?? 1000;\n const max = opts.maxDelayMs ?? 10_000;\n const factor = opts.factor ?? 2;\n let last: Error | undefined;\n for (let attempt = 1; attempt <= attempts; attempt++) {\n try {\n return await fn(attempt);\n } catch (cause) {\n last = cause instanceof Error ? cause : new Error(String(cause), { cause });\n if (attempt === attempts || !shouldRetry(last) || opts.signal?.aborted) throw cause;\n await sleep(Math.min(max, base * factor ** (attempt - 1)), opts.signal);\n }\n }\n throw last;\n}\n\nexport function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n const rejectAborted = (): void => {\n reject(new ModelKitError({ code: \"timeout\", message: \"aborted\", retryable: false }));\n };\n if (signal?.aborted) {\n rejectAborted();\n return;\n }\n let timer: ReturnType<typeof setTimeout> | undefined;\n const onAbort = (): void => {\n if (timer !== undefined) clearTimeout(timer);\n rejectAborted();\n };\n timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nfunction throwAborted(): ModelKitError {\n return new ModelKitError({ code: \"timeout\", message: \"aborted\", retryable: false });\n}\n\n/**\n * A rejected fetch (no HTTP status): connection reset, timeout, DNS failure,\n * socket hang up, or a caller abort. Retryable, unlike a provider response.\n */\nexport function transportError(provider: string, cause: unknown, model?: string): ModelKitError {\n const message = cause instanceof Error ? cause.message : String(cause);\n // A caller abort is final; every other pre-response failure is worth another attempt.\n const aborted = cause instanceof Error && cause.name === \"AbortError\";\n const init: ConstructorParameters<typeof ModelKitError>[0] = {\n code: aborted ? \"timeout\" : \"network\",\n message: `${provider} request failed before a response: ${message}`,\n provider,\n retryable: !aborted,\n cause,\n };\n if (model !== undefined) init.model = model;\n return new ModelKitError(init);\n}\n\n/**\n * One classifier for anything an SDK call throws. A ModelKitError passes\n * through; a throw carrying an HTTP status is a provider response; a throw\n * without one (fetch failed, ECONNRESET, DNS, abort) is a transport failure\n * and stays retryable. `status` and `body` override what `describeThrown`\n * reads when the SDK keeps them somewhere else.\n */\nexport function classifyThrown(\n provider: string,\n cause: unknown,\n model?: string,\n override: { status?: number | undefined; body?: ProviderErrorBody } = {},\n): ModelKitError {\n if (cause instanceof ModelKitError) return cause;\n const info = describeThrown(cause);\n const status = override.status ?? info.status;\n if (status === undefined) return transportError(provider, cause, model);\n return classifyHttpError(status, override.body ?? info.body, provider, model);\n}\n\n/** Poll until `check` returns a value. Throws timeout after `timeoutMs`. */\nexport async function pollUntil<T>(\n check: () => Promise<T | undefined>,\n opts: {\n intervalMs: number;\n timeoutMs: number;\n signal?: AbortSignal;\n backoff?: number;\n maxIntervalMs?: number;\n },\n): Promise<T> {\n const start = Date.now();\n let interval = opts.intervalMs;\n for (;;) {\n if (opts.signal?.aborted) throw throwAborted();\n const value = await check();\n if (value !== undefined) return value;\n if (Date.now() - start > opts.timeoutMs)\n throw new ModelKitError({\n code: \"timeout\",\n message: `poll timed out after ${opts.timeoutMs}ms`,\n retryable: false,\n });\n if (opts.signal?.aborted) throw throwAborted();\n await sleep(interval, opts.signal);\n if (opts.backoff)\n interval = Math.min(opts.maxIntervalMs ?? interval * 4, interval * opts.backoff);\n }\n}\n","import { z } from \"zod\";\nimport type { JsonObject, JsonValue } from \"./types.js\";\n\n/** Decodes any provider payload into JsonValue at the I/O boundary. Non-JSON input becomes null. */\nexport const JsonValueSchema: z.ZodType<JsonValue> = z.lazy(() =>\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n z.array(JsonValueSchema),\n z.record(z.string(), JsonValueSchema),\n ]),\n);\n\nexport const JsonObjectSchema: z.ZodType<JsonObject> = z.record(z.string(), JsonValueSchema);\n\n/** Body text of a failed response, decoded to JSON when possible. */\nexport async function readErrorBody(res: Response): Promise<JsonValue> {\n const text = await res.text().catch(() => \"\");\n try {\n return JsonValueSchema.parse(JSON.parse(text));\n } catch {\n return text;\n }\n}\n\n/** Message and status of a thrown SDK error, without typeof probing. */\nconst thrownErrorSchema = z.object({\n message: z.string().optional(),\n status: z.number().optional(),\n statusCode: z.number().optional(),\n responseBody: z.string().optional(),\n});\n\nexport interface ThrownErrorInfo {\n message: string;\n status: number | undefined;\n body: JsonValue;\n}\n\nexport function describeThrown(cause: unknown): ThrownErrorInfo {\n const parsed = thrownErrorSchema.safeParse(cause);\n if (!parsed.success) return { message: String(cause), status: undefined, body: String(cause) };\n const { message, status, statusCode, responseBody } = parsed.data;\n const body: JsonValue = responseBody ?? message ?? String(cause);\n return { message: message ?? String(cause), status: status ?? statusCode, body };\n}\n","import type { LanguageModelV2, LanguageModelV3 } from \"@ai-sdk/provider\";\nimport type {\n FlexibleSchema,\n InferSchema,\n JSONValue,\n LanguageModel,\n LanguageModelUsage,\n Output,\n ToolSet,\n} from \"ai\";\nimport {\n generateObject as aiGenerateObject,\n generateText as aiGenerateText,\n streamObject as aiStreamObject,\n streamText as aiStreamText,\n} from \"ai\";\nimport type { CallContext, CatalogModel, UsageEvent } from \"./types.js\";\n\n/**\n * The AI SDK `LanguageModel` type. A string is a catalog id or alias; a provider\n * instance (`openai(\"gpt-4o\")`) runs through the SDK unchanged, with usage\n * attributed to its own provider and model id.\n */\nexport type CatalogTextModel = LanguageModel;\n\n/** A provider instance the caller built; anything that is not a catalog id string. */\nexport type TextModelInstance = LanguageModelV3 | LanguageModelV2;\n\n// Distribute over Prompt and object-output unions so their required fields survive.\ntype WithCatalogModel<T> = { [K in keyof T]: K extends \"model\" ? CatalogTextModel : T[K] };\ntype DistributiveOmit<T, K extends PropertyKey> = T extends T ? Omit<T, K> : never;\n// Keep schema/output directly inferable; mapping Parameters over the conditional\n// SDK output type would infer its defaults instead of the caller's schema.\ntype ObjectMode<\n SCHEMA extends FlexibleSchema,\n OUTPUT extends ObjectOutput,\n RESULT,\n> = (OUTPUT extends \"enum\"\n ? { enum: Array<RESULT>; output: \"enum\" }\n : OUTPUT extends \"no-schema\"\n ? {}\n : { schema: SCHEMA; schemaName?: string; schemaDescription?: string }) & {\n output?: OUTPUT;\n model: CatalogTextModel;\n};\n\nexport type ObjectOutput = \"object\" | \"array\" | \"enum\" | \"no-schema\";\nexport type DefaultObjectOutput<S extends FlexibleSchema> =\n InferSchema<S> extends string ? \"enum\" : \"object\";\nexport type ObjectResult<S extends FlexibleSchema, O extends ObjectOutput> = O extends \"array\"\n ? Array<InferSchema<S>>\n : InferSchema<S>;\n\nexport type ModelkitGenerateTextOptions<\n TOOLS extends ToolSet,\n OUTPUT extends Output.Output = Output.Output<string, string>,\n> = WithCatalogModel<Parameters<typeof aiGenerateText<TOOLS, OUTPUT>>[0]>;\nexport type ModelkitStreamTextOptions<\n TOOLS extends ToolSet,\n OUTPUT extends Output.Output = Output.Output<string, string, never>,\n> = WithCatalogModel<Parameters<typeof aiStreamText<TOOLS, OUTPUT>>[0]>;\nexport type ModelkitGenerateObjectOptions<\n SCHEMA extends FlexibleSchema = FlexibleSchema<JSONValue>,\n OUTPUT extends ObjectOutput = DefaultObjectOutput<SCHEMA>,\n RESULT = ObjectResult<SCHEMA, OUTPUT>,\n> = DistributiveOmit<\n Parameters<typeof aiGenerateObject<SCHEMA, \"no-schema\", RESULT>>[0],\n \"model\" | \"output\"\n> &\n ObjectMode<SCHEMA, OUTPUT, RESULT>;\nexport type ModelkitStreamObjectOptions<\n SCHEMA extends FlexibleSchema = FlexibleSchema<JSONValue>,\n OUTPUT extends ObjectOutput = DefaultObjectOutput<SCHEMA>,\n RESULT = ObjectResult<SCHEMA, OUTPUT>,\n> = DistributiveOmit<\n Parameters<typeof aiStreamObject<SCHEMA, \"no-schema\", RESULT>>[0],\n \"model\" | \"output\"\n> &\n ObjectMode<SCHEMA, OUTPUT, RESULT>;\n\nexport interface TextMethods {\n generateText<\n TOOLS extends ToolSet,\n OUTPUT extends Output.Output = Output.Output<string, string>,\n >(\n options: ModelkitGenerateTextOptions<TOOLS, OUTPUT>,\n call?: CallContext,\n ): ReturnType<typeof aiGenerateText<TOOLS, OUTPUT>>;\n streamText<\n TOOLS extends ToolSet,\n OUTPUT extends Output.Output = Output.Output<string, string, never>,\n >(\n options: ModelkitStreamTextOptions<TOOLS, OUTPUT>,\n call?: CallContext,\n ): ReturnType<typeof aiStreamText<TOOLS, OUTPUT>>;\n generateObject<\n SCHEMA extends FlexibleSchema = FlexibleSchema<JSONValue>,\n OUTPUT extends ObjectOutput = DefaultObjectOutput<SCHEMA>,\n RESULT = ObjectResult<SCHEMA, OUTPUT>,\n >(\n options: ModelkitGenerateObjectOptions<SCHEMA, OUTPUT, RESULT>,\n call?: CallContext,\n ): ReturnType<typeof aiGenerateObject<SCHEMA, OUTPUT, RESULT>>;\n streamObject<\n SCHEMA extends FlexibleSchema = FlexibleSchema<JSONValue>,\n OUTPUT extends ObjectOutput = DefaultObjectOutput<SCHEMA>,\n RESULT = ObjectResult<SCHEMA, OUTPUT>,\n >(\n options: ModelkitStreamObjectOptions<SCHEMA, OUTPUT, RESULT>,\n call?: CallContext,\n ): ReturnType<typeof aiStreamObject<SCHEMA, OUTPUT, RESULT>>;\n}\n\nexport type AiTextProviderOptions = NonNullable<\n Parameters<typeof aiGenerateText>[0][\"providerOptions\"]\n>;\n\n/**\n * Merge catalog providerOptions under caller providerOptions. The catalog\n * `modelkit` routing hint never reaches the provider. Per-provider objects\n * merge shallowly so a caller can override one key without dropping the rest.\n */\nexport function mergeTextProviderOptions(\n catalog: CatalogModel,\n caller: AiTextProviderOptions | undefined,\n): AiTextProviderOptions {\n const merged: AiTextProviderOptions = {};\n const catalogOptions = catalog.providerOptions ?? {};\n for (const provider of Object.keys(catalogOptions)) {\n if (provider === \"modelkit\") continue;\n const options = catalogOptions[provider];\n if (options) merged[provider] = { ...options };\n }\n if (caller) {\n for (const provider of Object.keys(caller)) {\n if (provider === \"modelkit\") continue;\n const override = caller[provider];\n const base = merged[provider];\n if (base && override) {\n merged[provider] = { ...base, ...override };\n } else if (override) {\n merged[provider] = { ...override };\n }\n }\n }\n return merged;\n}\n\n/**\n * A catalog row standing in for a provider instance the caller passed as `model`.\n * It has no aliases, defaults or providerOptions; usage carries the SDK model id.\n */\nexport function passthroughTextModel(model: TextModelInstance): CatalogModel {\n return {\n id: model.modelId,\n aliases: [],\n label: model.modelId,\n type: \"text\",\n adapter: \"ai-sdk-text\",\n providerModelId: model.modelId,\n lifecycle: \"active\",\n constraints: {},\n defaults: {},\n usage: { unit: \"tokens\", modality: \"TEXT\" },\n pricingKind: \"token\",\n };\n}\n\n/** Canonical token usage for a completed text call. Quantity is total tokens. */\nexport function textUsageEvent(\n model: CatalogModel,\n provider: string,\n usage: LanguageModelUsage,\n): UsageEvent {\n const inputTokens = usage.inputTokens ?? 0;\n const outputTokens = usage.outputTokens ?? 0;\n const total = usage.totalTokens ?? inputTokens + outputTokens;\n return {\n model: model.id,\n provider,\n modality: \"TEXT\",\n unit: \"tokens\",\n quantity: total,\n inputTokens,\n outputTokens,\n };\n}\n","import type { LanguageModel, generateText, StepResult, ToolSet } from \"ai\";\nimport {\n mergeTextProviderOptions,\n textUsageEvent,\n type AiTextProviderOptions,\n type TextModelInstance,\n} from \"./text.js\";\nimport type { CatalogModel, UsageEvent } from \"./types.js\";\n\n/** A text model ready for the SDK: its catalog row (or pass-through stand-in) and billing provider. */\nexport interface ResolvedTextModel {\n entry: CatalogModel;\n languageModel: TextModelInstance;\n provider: string;\n}\n\ntype ResolveTextModel = (model: LanguageModel) => ResolvedTextModel;\ntype PrepareStep<TOOLS extends ToolSet> = NonNullable<\n Parameters<typeof generateText<TOOLS>>[0][\"prepareStep\"]\n>;\ntype StepUsage = Pick<StepResult<ToolSet>, \"usage\">;\n\nexport function createTextSteps(\n initial: ResolvedTextModel,\n resolve: ResolveTextModel,\n callerProviderOptions?: AiTextProviderOptions,\n) {\n const steps = new Map<number, ResolvedTextModel>();\n\n function wrap<TOOLS extends ToolSet>(\n prepareStep: PrepareStep<TOOLS> | undefined,\n ): PrepareStep<TOOLS> {\n return async (options) => {\n const prepared = await prepareStep?.(options);\n const override = prepared?.model;\n const resolved = override === undefined ? undefined : resolve(override);\n // The SDK resets to the initial model for every step without an explicit override.\n const target = resolved ?? initial;\n steps.set(options.stepNumber, target);\n const providerOptions = mergeTextProviderOptions(target.entry, callerProviderOptions);\n for (const [provider, patch] of Object.entries(prepared?.providerOptions ?? {})) {\n if (provider !== \"modelkit\") {\n providerOptions[provider] = { ...providerOptions[provider], ...patch };\n }\n }\n if (resolved) return { ...prepared, model: resolved.languageModel, providerOptions };\n return { ...prepared, providerOptions };\n };\n }\n\n function usage(results: StepUsage[]): UsageEvent[] {\n const grouped = new Map<string, UsageEvent>();\n for (const [index, step] of results.entries()) {\n const target = steps.get(index) ?? initial;\n const event = textUsageEvent(target.entry, target.provider, step.usage);\n const previous = grouped.get(target.entry.id);\n if (previous) {\n previous.quantity += event.quantity;\n previous.inputTokens = (previous.inputTokens ?? 0) + (event.inputTokens ?? 0);\n previous.outputTokens = (previous.outputTokens ?? 0) + (event.outputTokens ?? 0);\n } else {\n grouped.set(target.entry.id, event);\n }\n }\n return [...grouped.values()];\n }\n\n return { wrap, usage };\n}\n","import { createTextSteps, type ResolvedTextModel } from \"./text-steps.js\";\nimport type { CallSettings, DataContent, FlexibleSchema, LanguageModel, ToolSet, Output } from \"ai\";\nimport type { LanguageModelV3 } from \"@ai-sdk/provider\";\nimport {\n generateImage as aiGenerateImage,\n experimental_generateVideo as aiGenerateVideo,\n generateObject as aiGenerateObject,\n generateText as aiGenerateText,\n streamObject as aiStreamObject,\n streamText as aiStreamText,\n} from \"ai\";\nimport { z } from \"zod\";\nimport { toGeneratedImage } from \"./generated-image.js\";\nimport type { Adapter, AdapterContext } from \"./adapters/adapter.js\";\nimport { textKeyName, textProviderOf, textUsesCloudflareGateway } from \"./adapters/ai-sdk-text.js\";\nimport { Catalog } from \"./catalog/registry.js\";\nimport { MODELS } from \"./catalog/models.js\";\nimport { ModelKitError } from \"./errors.js\";\nimport { ADAPTER_KEYS, missingEnterpriseKeys, resolveKeys } from \"./keys.js\";\nimport {\n resolveAudioOptions,\n resolveImageOptions,\n resolveVideoOptions,\n} from \"./resolve-options.js\";\nimport {\n mergeTextProviderOptions,\n passthroughTextModel,\n textUsageEvent,\n type TextMethods,\n type ModelkitGenerateTextOptions,\n type ModelkitStreamTextOptions,\n type ObjectOutput,\n type ModelkitGenerateObjectOptions,\n type ModelkitStreamObjectOptions,\n} from \"./text.js\";\nimport type {\n AdapterId,\n CallContext,\n CatalogModel,\n ImageCallOptions,\n ImageCallResult,\n ImageRequest,\n AudioRequest,\n AudioResult,\n MediaPart,\n MediaRef,\n ModelKitConfig,\n ProviderOptions,\n ProviderKeyName,\n UsageEvent,\n VideoCallJob,\n VideoCallOptions,\n VideoRequest,\n VideoResult,\n Warning,\n} from \"./types.js\";\n\n/** The SDK's streamText option union; `experimental_prepareStep` is a generateText-only alias. */\nexport type StreamTextCallOptions<\n TOOLS extends ToolSet,\n OUTPUT extends Output.Output = Output.Output<string, string, never>,\n> = ModelkitStreamTextOptions<TOOLS, OUTPUT> & {\n /** @deprecated Use `prepareStep`; accepted for parity with `generateText`. */\n experimental_prepareStep?: Parameters<typeof aiStreamText<TOOLS, OUTPUT>>[0][\"prepareStep\"];\n};\n\nexport interface ModelKit extends TextMethods {\n catalog: Catalog;\n /**\n * Generate one or more images. Blocks until the provider returns bytes.\n * `model` is a catalog id or an AI SDK image model instance.\n */\n generateImage(req: ImageCallOptions, call?: CallContext): Promise<ImageCallResult>;\n /**\n * Submit a video job. Await `job.result()` for the final asset.\n * `model` is a catalog id or an AI SDK video model instance.\n */\n generateVideo(req: VideoCallOptions, call?: CallContext): Promise<VideoCallJob>;\n /** AI SDK LanguageModel for chat models. Pair with the catalog's providerOptions. */\n languageModel(modelId: string, call?: CallContext): LanguageModelHandle;\n /** Generate music or a soundtrack. Blocks until the provider returns audio. */\n generateAudio(req: AudioRequest, call?: CallContext): Promise<AudioResult>;\n /**\n * Stream text. Mirrors `TextMethods.streamText` and also accepts the\n * deprecated `experimental_prepareStep` alias that `generateText` takes.\n */\n streamText<\n TOOLS extends ToolSet,\n OUTPUT extends Output.Output = Output.Output<string, string, never>,\n >(\n options: StreamTextCallOptions<TOOLS, OUTPUT>,\n call?: CallContext,\n ): ReturnType<typeof aiStreamText<TOOLS, OUTPUT>>;\n /**\n * Prepare a video or document for a language model call (video understanding).\n * Uses the provider file store when the payload is too large to inline.\n */\n prepareMediaPart(\n modelId: string,\n ref: MediaRef,\n mediaType: string,\n call?: CallContext,\n ): Promise<MediaPart>;\n /** Which options a caller may show for this model. */\n describe(modelId: string): CatalogModel;\n}\n\nexport interface LanguageModelHandle {\n model: LanguageModelV3;\n providerOptions: ProviderOptions;\n catalog: CatalogModel;\n}\n\n/** fal through the Cloudflare passthrough may rely on a key stored on the gateway (BYOK). */\nfunction requiredKeys(model: CatalogModel, config: ModelKitConfig): ProviderKeyName[] {\n if (model.adapter === \"fal\" && config.routing?.fal === \"cloudflare-passthrough\")\n return [\"cloudflare\"];\n if (model.adapter === \"ai-sdk-text\") {\n // The cloudflare route sends both the vendor key and the gateway token, but only\n // for vendors with a gateway slug; the rest fall back to direct and need no token.\n const routing = config.routing ?? {};\n const names: ProviderKeyName[] = [textKeyName(model, routing)];\n if (textUsesCloudflareGateway(model, routing)) names.push(\"cloudflare\");\n return names;\n }\n return ADAPTER_KEYS[model.adapter];\n}\n\n/** Catalog types whose result is an image. */\nconst IMAGE_OUTPUT_TYPES = new Set<CatalogModel[\"type\"]>([\"image\", \"upscale\", \"bg-remove\"]);\n\ninterface DispatchTarget {\n adapter: Adapter;\n ctx: AdapterContext;\n}\n\nexport type AdapterRegistry = Partial<Record<AdapterId, Adapter>>;\n\nfunction combineSignals(\n sdk: AbortSignal | undefined,\n context: AbortSignal | undefined,\n): AbortSignal | undefined {\n return sdk && context ? AbortSignal.any([sdk, context]) : (sdk ?? context);\n}\n\nfunction textAbortOptions(\n sdk: AbortSignal | undefined,\n context: AbortSignal | undefined,\n): Pick<CallSettings, \"abortSignal\"> {\n const abortSignal = combineSignals(sdk, context);\n if (abortSignal) return { abortSignal };\n return {};\n}\n\nconst catalogId = z.string();\nconst exactSize = z.templateLiteral([z.number(), \"x\", z.number()]);\nconst sdkRatio = z.templateLiteral([z.number(), \":\", z.number()]);\nconst sizeTier = z.enum([\"512\", \"1K\", \"2K\", \"4K\"]);\n\n/** A string model is a catalog id or alias; anything else is a provider instance. */\nfunction isCatalogId<M>(model: M | string): model is string {\n return catalogId.safeParse(model).success;\n}\n\n/** An adapter request split from the AI SDK-only extras, with any dropped-option warnings. */\ninterface SplitRequest<R> {\n request: R;\n warnings: Warning[];\n}\n\n/** Split the AI SDK-shaped image options into the adapter request and the SDK-only extras. */\nfunction imageRequestOf(req: ImageCallOptions & { model: string }): SplitRequest<ImageRequest> {\n const { n, size, abortSignal: _signal, providerOptions, ...rest } = req;\n const request: ImageRequest = { ...rest };\n if (n !== undefined && request.count === undefined) request.count = n;\n if (size !== undefined) {\n const exact = exactSize.safeParse(size);\n const tier = sizeTier.safeParse(size);\n if (exact.success) request.exactSize ??= exact.data;\n else if (tier.success) request.size = tier.data;\n }\n const warnings: Warning[] = [];\n if (providerOptions && Object.keys(providerOptions).length > 0) {\n warnings.push({\n code: \"option_ignored\",\n field: \"providerOptions\",\n message: `${req.model} is a catalog model; its provider options come from the catalog row`,\n });\n }\n return { request, warnings };\n}\n\nfunction videoRequestOf(req: VideoCallOptions & { model: string }): SplitRequest<VideoRequest> {\n const { duration, abortSignal: _signal, providerOptions, ...rest } = req;\n const request: VideoRequest = { ...rest };\n if (duration !== undefined && request.durationSeconds === undefined)\n request.durationSeconds = duration;\n const warnings: Warning[] = [];\n if (providerOptions && Object.keys(providerOptions).length > 0) {\n warnings.push({\n code: \"option_ignored\",\n field: \"providerOptions\",\n message: `${req.model} is a catalog model; its provider options come from the catalog row`,\n });\n }\n return { request, warnings };\n}\n\n/** The SDK takes `W:H` only; the kit's \"adaptive\" ratio has no SDK spelling. */\nfunction sdkAspectRatio(ratio: string | undefined): `${number}:${number}` | undefined {\n const parsed = sdkRatio.safeParse(ratio);\n return parsed.success ? parsed.data : undefined;\n}\n\n/** MediaRef as AI SDK data content: url strings stay, bytes pass as a Uint8Array. */\nfunction sdkDataContent(ref: MediaRef): DataContent {\n return \"url\" in ref ? ref.url : ref.bytes;\n}\n\n/** A byte ref keeps its mime type through the SDK's object reference form. */\nfunction sdkReference(ref: MediaRef): DataContent | { data: DataContent; mediaType: string } {\n return \"url\" in ref ? ref.url : { data: ref.bytes, mediaType: ref.mime };\n}\n\n/** An `option_ignored` warning for a field the AI SDK call cannot express. */\nfunction pushIgnored(\n warnings: Warning[],\n field: string,\n from: string | number | undefined,\n modelId: string,\n): void {\n warnings.push({\n code: \"option_ignored\",\n field,\n from,\n message: `${modelId} provider instance does not support ${field}; ignored`,\n });\n}\n\n/** The catalog `modelkit` routing hint is internal; it must never reach the SDK. */\nfunction withoutModelkit(options: ProviderOptions | undefined): ProviderOptions {\n if (!options) return {};\n const { modelkit: _modelkit, ...rest } = options;\n return rest;\n}\n\n/** One log line per call when the resolver or an adapter coerced anything. */\nfunction logCoercions(logger: Pick<Console, \"warn\">, modelId: string, warnings: Warning[]): void {\n if (warnings.length === 0) return;\n logger.warn(`[modelkit] ${modelId} request coerced`, { model: modelId, warnings });\n}\n\nexport function createModelKit(config: ModelKitConfig, adapters: AdapterRegistry): ModelKit {\n const catalog = new Catalog(MODELS).withOverrides(config.catalogOverride ?? []);\n const logger = config.logger ?? console;\n const fetchImpl = config.fetch ?? globalThis.fetch;\n\n function context(model: CatalogModel, call: CallContext, warnings: Warning[]): DispatchTarget {\n const adapter = adapters[model.adapter];\n if (!adapter)\n throw new ModelKitError({\n code: \"unknown_model\",\n message: `No adapter registered for ${model.adapter}`,\n model: model.id,\n });\n const names = requiredKeys(model, config);\n if (call.tier === \"enterprise\") {\n const missing = missingEnterpriseKeys(config, names);\n if (missing.length > 0)\n logger.warn(\n `[modelkit] enterprise keys incomplete for ${model.adapter}; using pro`,\n { missing },\n );\n }\n const keys = resolveKeys(config, names, call.tier);\n const ctx: AdapterContext = {\n model,\n keys,\n routing: config.routing ?? {},\n fetch: fetchImpl,\n logger,\n call,\n warnings,\n };\n if (config.endpoints) ctx.endpoints = config.endpoints;\n if (call.signal) ctx.signal = call.signal;\n return { adapter, ctx };\n }\n\n async function emit(event: UsageEvent): Promise<void> {\n try {\n await config.onUsage?.(event);\n } catch (err) {\n logger.warn(\"[modelkit] usage emit failed\", err);\n }\n }\n\n /** The catalog row's usage unit wins over whatever the adapter declared. */\n function withRowUnit(event: UsageEvent): UsageEvent {\n const row = catalog.get(event.model);\n return row ? { ...event, unit: row.usage.unit } : event;\n }\n\n function textTarget(model: LanguageModel, call: CallContext): ResolvedTextModel {\n if (!isCatalogId(model)) {\n return {\n entry: passthroughTextModel(model),\n languageModel: model,\n provider: model.provider,\n };\n }\n const entry = catalog.require(model);\n if (entry.type !== \"text\")\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${entry.id} is not a text model`,\n model: entry.id,\n });\n const { adapter, ctx } = context(entry, call, []);\n if (!adapter.languageModel)\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${adapter.id} has no language model`,\n model: entry.id,\n });\n return {\n entry,\n languageModel: adapter.languageModel(ctx),\n provider: textProviderOf(entry),\n };\n }\n\n async function passthroughImage(\n req: ImageCallOptions & { model: Exclude<ImageCallOptions[\"model\"], string> },\n call: CallContext,\n ): Promise<ImageCallResult> {\n const {\n model,\n prompt,\n n,\n count,\n size,\n aspectRatio,\n seed,\n providerOptions,\n references,\n exactSize: exactSizeField,\n scaleFactor,\n quality: _quality,\n outputFormat: _outputFormat,\n } = req;\n const options: Parameters<typeof aiGenerateImage>[0] = { model, prompt };\n const warnings: Warning[] = [];\n const quantity = n ?? count;\n if (quantity !== undefined) options.n = quantity;\n // The SDK prompt is string | { images, text }; references ride inside it.\n if (references !== undefined && references.length > 0)\n options.prompt = { images: references.map(sdkDataContent), text: prompt };\n const exact =\n exactSizeField === undefined ? undefined : exactSize.safeParse(exactSizeField);\n if (exact?.success) options.size = exact.data;\n else if (exactSizeField !== undefined)\n pushIgnored(warnings, \"exactSize\", exactSizeField, model.modelId);\n const requested = size === undefined ? undefined : exactSize.safeParse(size);\n if (requested?.success) options.size ??= requested.data;\n else if (size !== undefined) pushIgnored(warnings, \"size\", size, model.modelId);\n const ratio = sdkAspectRatio(aspectRatio);\n if (ratio) options.aspectRatio = ratio;\n else if (aspectRatio !== undefined)\n pushIgnored(warnings, \"aspectRatio\", aspectRatio, model.modelId);\n if (seed !== undefined) options.seed = seed;\n if (providerOptions) options.providerOptions = providerOptions;\n // The SDK image call has no quality or output-format input; the model\n // decides the encoding itself.\n if (_quality !== undefined) pushIgnored(warnings, \"quality\", _quality, model.modelId);\n if (_outputFormat !== undefined)\n pushIgnored(warnings, \"outputFormat\", _outputFormat, model.modelId);\n if (scaleFactor !== undefined)\n pushIgnored(warnings, \"scaleFactor\", scaleFactor, model.modelId);\n logCoercions(logger, model.modelId, warnings);\n const abortSignal = combineSignals(req.abortSignal, call.signal);\n if (abortSignal) options.abortSignal = abortSignal;\n const result = await aiGenerateImage(options);\n const images = result.images.map((file) =>\n toGeneratedImage({ bytes: file.uint8Array, mime: file.mediaType }),\n );\n const usage: UsageEvent = {\n model: model.modelId,\n provider: model.provider,\n modality: \"IMAGE\",\n unit: \"images\",\n quantity: images.length,\n };\n await emit(usage);\n return { image: images[0]!, images, usage, raw: result, warnings };\n }\n\n function passthroughVideo(\n req: VideoCallOptions & { model: Exclude<VideoCallOptions[\"model\"], string> },\n call: CallContext,\n ): VideoCallJob {\n const {\n model,\n prompt,\n aspectRatio,\n duration,\n durationSeconds,\n seed,\n providerOptions,\n firstFrame,\n lastFrame,\n sourceVideo,\n referenceImages,\n referenceVideos,\n referenceAudios,\n resolution,\n generateAudio,\n negativePrompt: _negativePrompt,\n cfgScale: _cfgScale,\n promptExpansion: _promptExpansion,\n mode: _mode,\n } = req;\n const seconds = duration ?? durationSeconds;\n const abortSignal = combineSignals(req.abortSignal, call.signal);\n const options: Parameters<typeof aiGenerateVideo>[0] = { model, prompt };\n const warnings: Warning[] = [];\n const ratio =\n sdkAspectRatio(aspectRatio) ?? (aspectRatio === \"adaptive\" ? \"adaptive\" : undefined);\n if (ratio) options.aspectRatio = ratio;\n else if (aspectRatio !== undefined)\n pushIgnored(warnings, \"aspectRatio\", aspectRatio, model.modelId);\n if (seconds !== undefined) options.duration = seconds;\n if (seed !== undefined) options.seed = seed;\n if (generateAudio !== undefined) options.generateAudio = generateAudio;\n const frames = [\n ...(firstFrame\n ? [{ image: sdkDataContent(firstFrame), frameType: \"first_frame\" as const }]\n : []),\n ...(lastFrame\n ? [{ image: sdkDataContent(lastFrame), frameType: \"last_frame\" as const }]\n : []),\n ];\n if (frames.length > 0) options.frameImages = frames;\n const references = [\n ...(referenceImages ?? []).map(sdkDataContent),\n ...(referenceVideos ?? []).map(sdkReference),\n ];\n if (references.length > 0) {\n if (frames.length > 0) {\n // The SDK drops inputReferences when frameImages are present.\n warnings.push({\n code: \"option_ignored\",\n field: \"inputReferences\",\n from: references.length,\n message: `${model.modelId} provider instance ignores references when frames are set`,\n });\n } else {\n options.inputReferences = references;\n }\n }\n // The SDK video call has no edit or audio-reference input; the tiered\n // resolution labels are provider spellings the SDK cannot express.\n if (sourceVideo) pushIgnored(warnings, \"sourceVideo\", undefined, model.modelId);\n if (referenceAudios?.length)\n pushIgnored(warnings, \"referenceAudios\", referenceAudios.length, model.modelId);\n if (resolution !== undefined)\n pushIgnored(warnings, \"resolution\", resolution, model.modelId);\n if (_negativePrompt !== undefined)\n pushIgnored(warnings, \"negativePrompt\", undefined, model.modelId);\n if (_cfgScale !== undefined) pushIgnored(warnings, \"cfgScale\", _cfgScale, model.modelId);\n if (_promptExpansion !== undefined)\n pushIgnored(warnings, \"promptExpansion\", _promptExpansion, model.modelId);\n if (_mode !== undefined) pushIgnored(warnings, \"mode\", _mode, model.modelId);\n if (providerOptions) options.providerOptions = providerOptions;\n if (abortSignal) options.abortSignal = abortSignal;\n logCoercions(logger, model.modelId, warnings);\n const pending = aiGenerateVideo(options);\n let settled: VideoResult | undefined;\n let failed = false;\n const done = pending.then(async (result) => {\n const usage: UsageEvent = {\n model: model.modelId,\n provider: model.provider,\n modality: \"VIDEO\",\n unit: \"seconds\",\n quantity: seconds ?? 0,\n ...(seconds !== undefined && { durationSeconds: seconds }),\n };\n settled = {\n video: { bytes: result.video.uint8Array, mime: result.video.mediaType },\n usage,\n raw: result,\n };\n await emit(usage);\n return settled;\n });\n // The job may be polled without result() being awaited yet.\n done.catch(() => {\n failed = true;\n });\n return {\n jobId: `ai-sdk:${model.provider}:${model.modelId}`,\n warnings,\n async poll() {\n if (settled) return { status: \"succeeded\", raw: settled.raw };\n if (failed) return { status: \"failed\" };\n return { status: \"running\" };\n },\n result: () => done,\n };\n }\n\n return {\n catalog,\n describe: (id) => catalog.require(id),\n async generateImage(req, call = {}) {\n if (!isCatalogId(req.model)) {\n return passthroughImage({ ...req, model: req.model }, call);\n }\n const model = catalog.require(req.model);\n if (!IMAGE_OUTPUT_TYPES.has(model.type))\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} is not an image model`,\n model: model.id,\n });\n const { request: input, warnings: inputWarnings } = imageRequestOf({\n ...req,\n model: req.model,\n });\n const { request, warnings } = resolveImageOptions(\n model,\n input,\n call.onUnsupported ?? \"error\",\n );\n warnings.push(...inputWarnings);\n logCoercions(logger, model.id, warnings);\n const signal = combineSignals(req.abortSignal, call.signal);\n const { adapter, ctx } = context(model, signal ? { ...call, signal } : call, warnings);\n if (!adapter.generateImage)\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${adapter.id} cannot generate images`,\n model: model.id,\n });\n const result = await adapter.generateImage(request, ctx);\n const usage = { ...result.usage, model: model.id, unit: model.usage.unit };\n await emit(usage);\n const images = result.images.map(toGeneratedImage);\n const first = images[0];\n if (!first)\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: `${model.id} returned no image`,\n model: model.id,\n });\n return { ...result, usage, image: first, images, warnings };\n },\n async generateVideo(req, call = {}) {\n if (!isCatalogId(req.model)) {\n return passthroughVideo({ ...req, model: req.model }, call);\n }\n const model = catalog.require(req.model);\n if (model.type !== \"video\")\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} is not a video model`,\n model: model.id,\n });\n const { request: input, warnings: inputWarnings } = videoRequestOf({\n ...req,\n model: req.model,\n });\n const { request, warnings } = resolveVideoOptions(\n model,\n input,\n call.onUnsupported ?? \"error\",\n );\n warnings.push(...inputWarnings);\n logCoercions(logger, model.id, warnings);\n const signal = combineSignals(req.abortSignal, call.signal);\n const { adapter, ctx } = context(model, signal ? { ...call, signal } : call, warnings);\n if (!adapter.generateVideo)\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${adapter.id} cannot generate video`,\n model: model.id,\n });\n const job = await adapter.generateVideo(request, ctx);\n const result = job.result.bind(job);\n let settled: Promise<VideoResult> | undefined;\n return {\n ...job,\n warnings,\n result(opts) {\n if (settled) return settled;\n // Concurrent and repeated readers share one usage emit; a failed wait\n // clears the cache so the caller can retry the wait.\n const pending = result(opts).then(\n (out) =>\n emit({\n ...out.usage,\n model: model.id,\n unit: model.usage.unit,\n }).then(() => out),\n (cause) => {\n settled = undefined;\n throw cause;\n },\n );\n settled = pending;\n return pending;\n },\n };\n },\n async generateAudio(req, call = {}) {\n const model = catalog.require(req.model);\n if (model.type !== \"audio\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} is not an audio model`,\n model: model.id,\n });\n }\n const { abortSignal: _signal, ...request } = req;\n const { request: resolved, warnings } = resolveAudioOptions(\n model,\n request,\n call.onUnsupported ?? \"error\",\n );\n logCoercions(logger, model.id, warnings);\n const signal = combineSignals(req.abortSignal, call.signal);\n const { adapter, ctx } = context(model, signal ? { ...call, signal } : call, warnings);\n if (!adapter.generateAudio) {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${adapter.id} cannot generate audio`,\n model: model.id,\n });\n }\n const result = await adapter.generateAudio(resolved, ctx);\n await emit({ ...result.usage, model: model.id, unit: model.usage.unit });\n return result;\n },\n async prepareMediaPart(modelId, ref, mediaType, call = {}) {\n const model = catalog.require(modelId);\n const { adapter, ctx } = context(model, call, []);\n // Gemini text models share Google's file store with the google-genai adapter.\n const fileStore =\n model.adapter === \"ai-sdk-text\" &&\n textKeyName(model, config.routing ?? {}) === \"google\"\n ? adapters[\"google-genai\"]\n : adapter;\n if (fileStore?.prepareMediaPart) return fileStore.prepareMediaPart(ref, mediaType, ctx);\n // Providers without a file store take the reference inline.\n return \"url\" in ref\n ? { type: \"file\", data: ref.url, mediaType }\n : { type: \"file\", data: ref.bytes, mediaType };\n },\n languageModel(modelId, call = {}) {\n const { entry, languageModel: model } = textTarget(modelId, call);\n if (model.specificationVersion !== \"v3\")\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${entry.id} did not resolve to a v3 language model`,\n model: entry.id,\n });\n return {\n model,\n providerOptions: withoutModelkit(entry.providerOptions),\n catalog: entry,\n };\n },\n async generateText<TOOLS extends ToolSet, OUTPUT extends Output.Output>(\n options: ModelkitGenerateTextOptions<TOOLS, OUTPUT>,\n call: CallContext = {},\n ) {\n const target = textTarget(options.model, call);\n const steps = createTextSteps(\n target,\n (model) => textTarget(model, call),\n options.providerOptions,\n );\n const result = await aiGenerateText({\n ...options,\n ...textAbortOptions(options.abortSignal, call.signal),\n model: target.languageModel,\n providerOptions: {},\n prepareStep: steps.wrap<TOOLS>(\n options.prepareStep ?? options.experimental_prepareStep,\n ),\n });\n for (const event of steps.usage(result.steps)) await emit(withRowUnit(event));\n return result;\n },\n streamText<TOOLS extends ToolSet, OUTPUT extends Output.Output>(\n options: StreamTextCallOptions<TOOLS, OUTPUT>,\n call: CallContext = {},\n ) {\n const target = textTarget(options.model, call);\n const steps = createTextSteps(\n target,\n (model) => textTarget(model, call),\n options.providerOptions,\n );\n const callerOnFinish = options.onFinish;\n return aiStreamText({\n ...options,\n ...textAbortOptions(options.abortSignal, call.signal),\n model: target.languageModel,\n providerOptions: {},\n prepareStep: steps.wrap<TOOLS>(\n options.prepareStep ?? options.experimental_prepareStep,\n ),\n onFinish: async (event) => {\n for (const usage of steps.usage(event.steps)) await emit(withRowUnit(usage));\n await callerOnFinish?.(event);\n },\n });\n },\n async generateObject<SCHEMA extends FlexibleSchema, OUTPUT extends ObjectOutput, RESULT>(\n options: ModelkitGenerateObjectOptions<SCHEMA, OUTPUT, RESULT>,\n call: CallContext = {},\n ) {\n const { entry, languageModel, provider } = textTarget(options.model, call);\n // SAFETY: The public options change only model. Replacing it restores the exact SDK\n // options; TypeScript cannot reduce the generic conditional output union.\n const sdkOptions = {\n ...options,\n ...textAbortOptions(options.abortSignal, call.signal),\n model: languageModel,\n providerOptions: mergeTextProviderOptions(entry, options.providerOptions),\n } as Parameters<typeof aiGenerateObject<SCHEMA, OUTPUT, RESULT>>[0];\n const result = await aiGenerateObject<SCHEMA, OUTPUT, RESULT>(sdkOptions);\n await emit(withRowUnit(textUsageEvent(entry, provider, result.usage)));\n return result;\n },\n streamObject<SCHEMA extends FlexibleSchema, OUTPUT extends ObjectOutput, RESULT>(\n options: ModelkitStreamObjectOptions<SCHEMA, OUTPUT, RESULT>,\n call: CallContext = {},\n ) {\n const { entry, languageModel, provider } = textTarget(options.model, call);\n const callerOnFinish = options.onFinish;\n // SAFETY: Only the catalog model is replaced; every SDK option retains its\n // original value and generic type, including schema and finish callbacks.\n const sdkOptions = {\n ...options,\n ...textAbortOptions(options.abortSignal, call.signal),\n model: languageModel,\n providerOptions: mergeTextProviderOptions(entry, options.providerOptions),\n onFinish: async (\n event: Parameters<\n NonNullable<\n Parameters<typeof aiStreamObject<SCHEMA, OUTPUT, RESULT>>[0][\"onFinish\"]\n >\n >[0],\n ) => {\n await emit(withRowUnit(textUsageEvent(entry, provider, event.usage)));\n await callerOnFinish?.(event);\n },\n } as Parameters<typeof aiStreamObject<SCHEMA, OUTPUT, RESULT>>[0];\n return aiStreamObject<SCHEMA, OUTPUT, RESULT>(sdkOptions);\n },\n };\n}\n","import { ModelKitError } from \"../errors.js\";\nimport { JsonValueSchema } from \"../json.js\";\nimport { classifyHttpError } from \"../retry.js\";\nimport type { JsonValue, MediaRef } from \"../types.js\";\n\n/** Narrow a MediaRef to its URL variant. */\nexport function isUrlRef(ref: MediaRef): ref is { url: string } {\n return \"url\" in ref;\n}\n\n/** The kit's canonical abort error; a caller abort is final and never retried. */\nexport function abortedError(): ModelKitError {\n return new ModelKitError({ code: \"timeout\", message: \"aborted\", retryable: false });\n}\n\n/** Reject before any provider request when the caller's signal is already aborted. */\nexport function throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) throw abortedError();\n}\n\n/** Base64-encode raw bytes without depending on node Buffer. */\nexport function mediaRefToBase64(bytes: Uint8Array): string {\n let binary = \"\";\n const CHUNK = 0x8000;\n for (let i = 0; i < bytes.length; i += CHUNK) {\n binary += String.fromCharCode(...bytes.subarray(i, i + CHUNK));\n }\n return btoa(binary);\n}\n\n/** Decode a base64 string to bytes without depending on node Buffer. */\nexport function base64ToBytes(b64: string): Uint8Array {\n const binary = atob(b64);\n const out = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) out[i] = binary.charCodeAt(i);\n return out;\n}\n\n/**\n * Encode a ref as a data URL. URL refs pass through unchanged; byte refs are\n * base64-encoded with their mime type.\n */\nexport function mediaRefToDataUrl(ref: MediaRef): string {\n if (isUrlRef(ref)) return ref.url;\n return `data:${ref.mime};base64,${mediaRefToBase64(ref.bytes)}`;\n}\n\n/** A ref as a provider URL; the adapter-facing name for `mediaRefToDataUrl`. */\nexport const refToUrl = mediaRefToDataUrl;\n\n/** Read a response body as JSON, falling back to its text for non-JSON payloads. */\nexport async function readBody(res: Response): Promise<JsonValue> {\n const text = await res.text().catch(() => \"\");\n try {\n const decoded = JsonValueSchema.safeParse(JSON.parse(text));\n return decoded.success ? decoded.data : text;\n } catch {\n return text;\n }\n}\n\nexport interface MediaRefFetchOptions {\n signal?: AbortSignal | undefined;\n provider?: string;\n model?: string;\n}\n\n/**\n * Resolve a ref to bytes. Byte refs pass through; URL refs are fetched with\n * the adapter's fetch so tests can inject vi.fn(). An HTTP failure is\n * classified like any provider response, so a 5xx stays a retryable network\n * error instead of a plain rejected promise.\n */\nexport async function mediaRefToBytes(\n ref: MediaRef,\n fetch: typeof globalThis.fetch,\n options: MediaRefFetchOptions = {},\n): Promise<{ bytes: Uint8Array; mime: string }> {\n if (!isUrlRef(ref)) return { bytes: ref.bytes, mime: ref.mime };\n const init: RequestInit = {};\n if (options.signal !== undefined) init.signal = options.signal;\n const res = await fetch(ref.url, init);\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw classifyHttpError(\n res.status,\n text,\n options.provider ?? \"media-reference\",\n options.model,\n );\n }\n const mime =\n res.headers.get(\"content-type\")?.split(\";\")[0]?.trim().toLowerCase() || \"image/png\";\n return { bytes: new Uint8Array(await res.arrayBuffer()), mime };\n}\n","import { mediaRefToBase64 } from \"./adapters/media-ref.js\";\nimport type { GeneratedImage, ImageBytes } from \"./types.js\";\n\n/** Add the AI SDK `GeneratedFile` accessors to adapter image bytes. base64 is computed on first read. */\nexport function toGeneratedImage(image: ImageBytes): GeneratedImage {\n let base64: string | undefined;\n return {\n bytes: image.bytes,\n mime: image.mime,\n get uint8Array() {\n return image.bytes;\n },\n get mediaType() {\n return image.mime;\n },\n get base64() {\n base64 ??= mediaRefToBase64(image.bytes);\n return base64;\n },\n };\n}\n","import { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createPerplexity } from \"@ai-sdk/perplexity\";\nimport { createXai } from \"@ai-sdk/xai\";\nimport { createDeepSeek } from \"@ai-sdk/deepseek\";\nimport { createMoonshotAI } from \"@ai-sdk/moonshotai\";\nimport type { LanguageModelV3 } from \"@ai-sdk/provider\";\nimport { z } from \"zod\";\nimport { ModelKitError } from \"../errors.js\";\nimport type { CatalogModel, ProviderKeyName, Routing } from \"../types.js\";\nimport type { Adapter, AdapterContext } from \"./adapter.js\";\n\nconst TEXT_PROVIDERS = [\n \"openai\",\n \"anthropic\",\n \"google\",\n \"xai\",\n \"perplexity\",\n \"deepseek\",\n \"moonshot\",\n \"minimax\",\n] as const;\n\nexport type TextProvider = (typeof TEXT_PROVIDERS)[number];\n\nconst textProviderSchema = z.enum(TEXT_PROVIDERS);\n\nfunction isTextProvider(value: unknown): value is TextProvider {\n return textProviderSchema.safeParse(value).success;\n}\n\n/** Providers without a native @ai-sdk package speak the OpenAI chat protocol. */\nconst OPENAI_COMPATIBLE_BASE_URLS: Partial<Record<TextProvider, string>> = {\n minimax: \"https://api.minimax.io/v1\",\n};\n\n/**\n * Cloudflare AI Gateway path per provider. Others cannot go through the gateway.\n * The gateway mirrors each vendor's URL after the host, and the SDK clients only\n * append the resource path (Anthropic \"/messages\", xAI \"/chat/completions\",\n * Google \"/models/...\"), so a vendor whose default base has an API version needs\n * it here: Anthropic and xAI both use \"/v1\", Google uses \"/v1beta\".\n */\nconst GATEWAY_SLUGS: Partial<Record<TextProvider, string>> = {\n openai: \"openai\",\n anthropic: \"anthropic/v1\",\n google: \"google-ai-studio/v1beta\",\n xai: \"grok/v1\",\n perplexity: \"perplexity-ai\",\n deepseek: \"deepseek\",\n};\n\n/**\n * Provider detection: an explicit `providerOptions.modelkit.provider` in the catalog\n * row wins; otherwise the providerModelId prefix decides.\n * Bedrock inference-profile ids (us.anthropic.*) detect as anthropic.\n */\nexport function detectTextProvider(modelId: string): TextProvider {\n const id = modelId.toLowerCase();\n if (id.startsWith(\"claude\") || id.includes(\"anthropic.\")) return \"anthropic\";\n if (id.startsWith(\"gemini\") || id.startsWith(\"gemma\")) return \"google\";\n if (id.startsWith(\"grok\")) return \"xai\";\n if (id.startsWith(\"sonar\")) return \"perplexity\";\n if (id.startsWith(\"deepseek\")) return \"deepseek\";\n if (id.startsWith(\"kimi\") || id.startsWith(\"moonshot\")) return \"moonshot\";\n if (id.startsWith(\"minimax\")) return \"minimax\";\n if (\n id.startsWith(\"gpt-\") ||\n id.startsWith(\"chatgpt\") ||\n /^o[134]/.test(id) ||\n id.startsWith(\"openai/\")\n )\n return \"openai\";\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `ai-sdk-text cannot detect a provider for \"${modelId}\". Set providerOptions.provider to one of ${TEXT_PROVIDERS.join(\", \")}.`,\n });\n}\n\n/** The single key a text call needs, so enterprise-to-pro fallback works per provider. */\nexport function textKeyName(model: CatalogModel, _routing: Routing): ProviderKeyName {\n return textProviderOf(model);\n}\n\n/**\n * Provider for a text catalog row: an explicit `providerOptions.modelkit.provider`\n * wins; otherwise the providerModelId prefix decides.\n */\nexport function textProviderOf(model: CatalogModel): TextProvider {\n const explicit = model.providerOptions?.[\"modelkit\"]?.[\"provider\"];\n return isTextProvider(explicit) ? explicit : detectTextProvider(model.providerModelId);\n}\n\n/**\n * True when the cloudflare route actually sends this row through the gateway.\n * Vendors without a gateway slug fall back to direct, so the gateway token is not required.\n */\nexport function textUsesCloudflareGateway(model: CatalogModel, routing: Routing): boolean {\n if (routing.text !== \"cloudflare\") return false;\n return GATEWAY_SLUGS[textProviderOf(model)] !== undefined;\n}\n\nexport interface TextRoute {\n provider: TextProvider;\n /** Which native client builds the model. \"openai-compatible\" uses createOpenAI with a custom baseURL. */\n client:\n | \"openai\"\n | \"anthropic\"\n | \"google\"\n | \"xai\"\n | \"perplexity\"\n | \"deepseek\"\n | \"moonshot\"\n | \"openai-compatible\";\n modelId: string;\n keyName: ProviderKeyName;\n baseURL?: string;\n headers?: Record<string, string>;\n}\n\nexport interface TextClientSettings {\n apiKey: string;\n fetch: typeof fetch;\n baseURL?: string;\n headers?: Record<string, string>;\n name?: string;\n}\n\nfunction nativeClientFor(provider: TextProvider): TextRoute[\"client\"] {\n switch (provider) {\n case \"openai\":\n return \"openai\";\n case \"anthropic\":\n return \"anthropic\";\n case \"google\":\n return \"google\";\n case \"xai\":\n return \"xai\";\n case \"perplexity\":\n return \"perplexity\";\n case \"deepseek\":\n return \"deepseek\";\n case \"moonshot\":\n return \"moonshot\";\n default:\n return \"openai-compatible\";\n }\n}\n\n/**\n * Pure routing decision, exported as a test seam.\n * direct: native client, provider default baseURL (OpenAI-compatible baseURL for the small vendors).\n * cloudflare: native client pointed at the AI Gateway slug with cf-aig-authorization; vendors\n * without a gateway slug fall back to direct with a warning.\n */\nexport function resolveTextRoute(ctx: AdapterContext): TextRoute {\n const provider = textProviderOf(ctx.model);\n const mode = ctx.routing.text ?? \"direct\";\n\n if (provider === \"anthropic\" && ctx.routing.anthropic === \"bedrock\") {\n // @ai-sdk/amazon-bedrock is not a dependency. Cowork keeps its Bedrock client\n // and passes the model through catalogOverride until the transport lands here.\n throw new ModelKitError({\n code: \"unsupported_option\",\n message:\n \"ai-sdk-text has no Bedrock transport (@ai-sdk/amazon-bedrock is not installed). \" +\n \"Pass the Bedrock model through catalogOverride with providerOptions.bedrockModel and resolve it outside the SDK.\",\n provider: \"ai-sdk-text\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n\n const compatBase = OPENAI_COMPATIBLE_BASE_URLS[provider];\n const route: TextRoute = {\n provider,\n client: compatBase ? \"openai-compatible\" : nativeClientFor(provider),\n modelId: ctx.model.providerModelId,\n keyName: provider,\n };\n if (compatBase) route.baseURL = compatBase;\n\n if (mode === \"cloudflare\") {\n const slug = GATEWAY_SLUGS[provider];\n if (!slug) {\n ctx.logger.warn(\n `[modelkit] ${provider} has no Cloudflare AI Gateway slug; using direct`,\n );\n return route;\n }\n const cf = ctx.routing.cloudflare;\n if (!cf) {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: \"routing.text is cloudflare but routing.cloudflare is not configured\",\n provider: \"ai-sdk-text\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const token = ctx.keys.cloudflare;\n if (!token) throw missingKey(ctx, \"cloudflare\");\n route.baseURL = `https://gateway.ai.cloudflare.com/v1/${cf.accountId}/${cf.gatewayId}/${slug}`;\n route.headers = { \"cf-aig-authorization\": `Bearer ${token}` };\n }\n return route;\n}\n\nfunction missingKey(ctx: AdapterContext, name: ProviderKeyName): ModelKitError {\n return new ModelKitError({\n code: \"auth\",\n message: `Missing API key for ${name}`,\n provider: \"ai-sdk-text\",\n model: ctx.model.id,\n retryable: false,\n });\n}\n\nexport const aiSdkTextAdapter: Adapter = {\n id: \"ai-sdk-text\",\n languageModel(ctx: AdapterContext): LanguageModelV3 {\n const route = resolveTextRoute(ctx);\n const apiKey = ctx.keys[route.keyName];\n if (!apiKey) throw missingKey(ctx, route.keyName);\n // Every create* accepts the same subset; ctx.fetch is threaded through so tests can inject vi.fn().\n const settings: TextClientSettings = { apiKey, fetch: ctx.fetch };\n if (route.baseURL !== undefined) settings.baseURL = route.baseURL;\n if (route.headers !== undefined) settings.headers = route.headers;\n switch (route.client) {\n case \"anthropic\":\n return createAnthropic(settings)(route.modelId);\n case \"google\":\n return createGoogleGenerativeAI(settings)(route.modelId);\n case \"xai\":\n return createXai(settings)(route.modelId);\n case \"perplexity\":\n // Native provider keeps providerMetadata.perplexity.cost for usage records.\n return createPerplexity(settings)(route.modelId);\n case \"deepseek\":\n return createDeepSeek(settings)(route.modelId);\n case \"moonshot\":\n return createMoonshotAI(settings)(route.modelId);\n case \"openai-compatible\":\n return createOpenAI({\n ...settings,\n name: route.provider,\n }).chat(route.modelId);\n case \"openai\":\n return createOpenAI(settings)(route.modelId);\n }\n },\n};\n","import { z } from \"zod\";\nimport { ModelKitError, type ProviderErrorBody } from \"../errors.js\";\nimport {\n classifyHttpError,\n classifyThrown,\n pollUntil,\n withRetry,\n type RetryOptions,\n} from \"../retry.js\";\nimport type {\n AspectRatio,\n ImageRequest,\n ImageSize,\n UsageEvent,\n VideoJob,\n VideoRequest,\n} from \"../types.js\";\nimport type { Adapter, AdapterContext } from \"./adapter.js\";\nimport { refToUrl, throwIfAborted } from \"./media-ref.js\";\n\nconst ARK_BASE_URL = \"https://ark.ap-southeast.bytepluses.com/api/v3\";\nconst SUBMIT_PATH = \"/contents/generations/tasks\";\nconst SEEDANCE_POLL_INTERVAL_MS = 15000;\nconst RESULT_TIMEOUT_MS = 15 * 60 * 1000;\nconst VIDEO_URL_TTL_MS = 24 * 60 * 60 * 1000;\n\n/** config.endpoints.ark override, else the documented BytePlus endpoint. */\nfunction arkBaseUrl(ctx: AdapterContext): string {\n return ctx.endpoints?.ark ?? ARK_BASE_URL;\n}\n\nconst SEEDREAM_SIZES: Record<\"1K\" | \"2K\" | \"4K\", Record<string, string>> = {\n \"1K\": {\n \"1:1\": \"1024x1024\",\n \"4:3\": \"1152x864\",\n \"3:4\": \"864x1152\",\n \"16:9\": \"1424x800\",\n \"9:16\": \"800x1424\",\n \"3:2\": \"1248x832\",\n \"2:3\": \"832x1248\",\n \"21:9\": \"1568x672\",\n \"9:21\": \"672x1568\",\n \"4:5\": \"864x1080\",\n \"5:4\": \"1080x864\",\n },\n \"2K\": {\n \"1:1\": \"2048x2048\",\n \"4:3\": \"2304x1728\",\n \"3:4\": \"1728x2304\",\n \"16:9\": \"2848x1600\",\n \"9:16\": \"1600x2848\",\n \"3:2\": \"2496x1664\",\n \"2:3\": \"1664x2496\",\n \"21:9\": \"3136x1344\",\n \"9:21\": \"1344x3136\",\n \"4:5\": \"1728x2160\",\n \"5:4\": \"2160x1728\",\n },\n // 4K keeps the long edge at Ark's 4096 cap (a doubled 2K entry would exceed\n // it); sides are multiples of 16.\n \"4K\": {\n \"1:1\": \"4096x4096\",\n \"4:3\": \"4096x3072\",\n \"3:4\": \"3072x4096\",\n \"16:9\": \"4096x2304\",\n \"9:16\": \"2304x4096\",\n \"3:2\": \"4096x2736\",\n \"2:3\": \"2736x4096\",\n \"21:9\": \"4096x1760\",\n \"9:21\": \"1760x4096\",\n \"4:5\": \"3280x4096\",\n \"5:4\": \"4096x3280\",\n },\n};\n\nexport const arkAdapter: Adapter = {\n id: \"ark\",\n async generateImage(req: ImageRequest, ctx: AdapterContext) {\n throwIfAborted(ctx.signal);\n return generateSeedreamImage(req, ctx);\n },\n async generateVideo(req: VideoRequest, ctx: AdapterContext): Promise<VideoJob> {\n throwIfAborted(ctx.signal);\n return generateSeedanceVideo(req, ctx);\n },\n};\n\nfunction arkKey(ctx: AdapterContext): string {\n const key = ctx.keys.ark;\n if (!key) {\n throw new ModelKitError({\n code: \"auth\",\n message: \"Missing Ark API key\",\n provider: \"ark\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n return key;\n}\n\nfunction throwArkError(status: number | undefined, body: ProviderErrorBody, model: string): never {\n const parsed = z.string().safeParse(body);\n const text = parsed.success ? parsed.data : JSON.stringify(body ?? \"\");\n if (/sensitive.?content|human.?face/i.test(text)) {\n const init: ConstructorParameters<typeof ModelKitError>[0] = {\n code: \"content_blocked\",\n message: `ark rejected the request: ${text.slice(0, 500)}`,\n provider: \"ark\",\n model,\n body,\n retryable: false,\n };\n if (status !== undefined) init.status = status;\n throw new ModelKitError(init);\n }\n if (status === undefined) {\n // A provider verdict with no HTTP status (task completed but empty): not a transport failure.\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: `ark rejected the request: ${text.slice(0, 500)}`,\n provider: \"ark\",\n model,\n body,\n retryable: false,\n });\n }\n throw classifyHttpError(status, body, \"ark\", model);\n}\n\nfunction seedreamSize(aspect: AspectRatio | undefined, size: ImageSize | undefined): string {\n const tier = size === \"4K\" || size === \"1K\" ? size : \"2K\";\n const table = SEEDREAM_SIZES[tier];\n return table[aspect ?? \"\"] ?? table[\"1:1\"] ?? \"2048x2048\";\n}\n\n// response_format b64_json carries no mime; the encoding is whatever the model\n// produced, so read it off the bytes instead of the requested outputFormat.\nfunction sniffedImageMime(bytes: Uint8Array): string {\n if (\n bytes.length >= 4 &&\n bytes[0] === 0x89 &&\n bytes[1] === 0x50 &&\n bytes[2] === 0x4e &&\n bytes[3] === 0x47\n )\n return \"image/png\";\n if (\n bytes.length >= 12 &&\n bytes[0] === 0x52 &&\n bytes[1] === 0x49 &&\n bytes[2] === 0x46 &&\n bytes[3] === 0x46 &&\n bytes[8] === 0x57 &&\n bytes[9] === 0x45 &&\n bytes[10] === 0x42 &&\n bytes[11] === 0x50\n )\n return \"image/webp\";\n return \"image/jpeg\";\n}\n\nconst SeedreamImageSchema = z.object({\n url: z.string().optional(),\n b64_json: z.string().optional(),\n});\n\nconst SeedreamResponseSchema = z.object({\n data: z.array(SeedreamImageSchema).optional(),\n error: z.object({ message: z.string().optional(), code: z.string().optional() }).optional(),\n});\n\ntype SeedreamResponse = z.infer<typeof SeedreamResponseSchema>;\n\ninterface SeedreamImageBody {\n model: string;\n prompt: string;\n size: string;\n response_format: string;\n watermark: boolean;\n seed?: number;\n image?: string | string[];\n}\n\nfunction retryOptsFor(ctx: AdapterContext, attempts = 3): RetryOptions {\n const opts: RetryOptions = { attempts };\n if (ctx.signal !== undefined) opts.signal = ctx.signal;\n return opts;\n}\n\nfunction fetchInitFor(ctx: AdapterContext, init: RequestInit): RequestInit {\n if (ctx.signal !== undefined) init.signal = ctx.signal;\n return init;\n}\n\n/** A rejected fetch is a transport failure; callers wrap in withRetry to retry it. */\nfunction arkFetch(ctx: AdapterContext, url: string, init: RequestInit): Promise<Response> {\n return ctx.fetch(url, fetchInitFor(ctx, init)).catch((cause: unknown) => {\n throw classifyThrown(\"ark\", cause, ctx.model.id);\n });\n}\n\nasync function generateSeedreamImage(req: ImageRequest, ctx: AdapterContext) {\n const key = arkKey(ctx);\n const modelId = ctx.model.id;\n const size = seedreamSize(req.aspectRatio, req.size);\n const refs = (req.references ?? []).map(refToUrl);\n const body: SeedreamImageBody = {\n model: ctx.model.providerModelId,\n prompt: req.prompt,\n size,\n response_format: \"b64_json\",\n watermark: false,\n };\n if (req.seed !== undefined) body.seed = req.seed;\n const firstRef = refs[0];\n if (refs.length === 1 && firstRef !== undefined) body.image = firstRef;\n else if (refs.length > 1) body.image = refs;\n\n const data = await withRetry(async () => {\n const res = await arkFetch(ctx, `${arkBaseUrl(ctx)}/images/generations`, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${key}`, \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throwArkError(res.status, text, modelId);\n }\n const parsed = SeedreamResponseSchema.safeParse(await res.json());\n const decoded: SeedreamResponse = parsed.success ? parsed.data : {};\n return decoded;\n }, retryOptsFor(ctx));\n const first = data.data?.[0];\n let bytes: Uint8Array;\n if (first?.b64_json) {\n bytes = Buffer.from(first.b64_json, \"base64\");\n } else if (first?.url) {\n const imageUrl = first.url;\n const res = await arkFetch(ctx, imageUrl, {});\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throwArkError(res.status, text, modelId);\n }\n bytes = new Uint8Array(await res.arrayBuffer());\n } else {\n throwArkError(undefined, \"Seedream returned no image URL or base64 data\", modelId);\n }\n const usage: UsageEvent = {\n model: modelId,\n provider: \"ark\",\n modality: \"IMAGE\",\n unit: \"images\",\n quantity: 1,\n };\n if (req.size !== undefined) usage.imageSize = req.size;\n if (req.quality !== undefined) usage.imageQuality = req.quality;\n return { images: [{ bytes, mime: sniffedImageMime(bytes) }], usage, raw: data };\n}\n\nconst SeedanceUsageSchema = z.object({\n total_tokens: z.number().optional(),\n completion_tokens: z.number().optional(),\n});\n\nconst SeedanceResponseSchema = z.object({\n id: z.string().optional(),\n status: z.string().optional(),\n content: z.object({ video_url: z.string().optional() }).optional(),\n usage: SeedanceUsageSchema.optional(),\n duration: z.number().optional(),\n framespersecond: z.number().optional(),\n resolution: z.string().optional(),\n error: z.union([z.string(), z.object({ message: z.string().optional() })]).optional(),\n});\n\ntype SeedanceResponse = z.infer<typeof SeedanceResponseSchema>;\n\nconst SeedanceErrorMessageSchema = z.object({ message: z.string().optional() });\n\ntype SeedanceContentPart =\n | { type: \"text\"; text: string }\n | { type: \"image_url\"; image_url: { url: string }; role: string }\n | { type: \"video_url\"; video_url: { url: string }; role: string }\n | { type: \"audio_url\"; audio_url: { url: string }; role: string };\n\ninterface SeedanceSubmitBody {\n model: string;\n content: SeedanceContentPart[];\n duration: number;\n resolution: string;\n ratio?: string;\n generate_audio?: boolean;\n seed?: number;\n watermark?: boolean;\n}\n\ninterface SeedancePollOpts {\n intervalMs: number;\n timeoutMs: number;\n signal?: AbortSignal;\n}\n\nfunction seedanceUsage(ctx: AdapterContext, req: VideoRequest, duration: number): UsageEvent {\n const usage: UsageEvent = {\n model: ctx.model.id,\n provider: \"ark\",\n modality: \"VIDEO\",\n unit: \"seconds\",\n quantity: duration,\n durationSeconds: duration,\n };\n if (req.resolution !== undefined) usage.resolution = req.resolution;\n return usage;\n}\n\nfunction seedanceErrorMessage(error: SeedanceResponse[\"error\"], status: string): string {\n const asString = z.string().safeParse(error);\n if (asString.success) return asString.data;\n const asObject = SeedanceErrorMessageSchema.safeParse(error);\n if (asObject.success && asObject.data.message !== undefined) return asObject.data.message;\n return `Seedance task ${status}`;\n}\n\nasync function generateSeedanceVideo(req: VideoRequest, ctx: AdapterContext): Promise<VideoJob> {\n const key = arkKey(ctx);\n const modelId = ctx.model.id;\n const duration = req.durationSeconds ?? 5;\n const resolution = req.resolution ?? \"720p\";\n\n const content: SeedanceContentPart[] = [{ type: \"text\", text: req.prompt }];\n if (req.firstFrame) {\n content.push({\n type: \"image_url\",\n image_url: { url: refToUrl(req.firstFrame) },\n role: \"first_frame\",\n });\n }\n if (req.lastFrame) {\n content.push({\n type: \"image_url\",\n image_url: { url: refToUrl(req.lastFrame) },\n role: \"last_frame\",\n });\n }\n for (const ref of req.referenceImages ?? []) {\n content.push({\n type: \"image_url\",\n image_url: { url: refToUrl(ref) },\n role: \"reference_image\",\n });\n }\n if (req.sourceVideo) {\n content.push({\n type: \"video_url\",\n video_url: { url: refToUrl(req.sourceVideo) },\n role: \"reference_video\",\n });\n }\n for (const ref of req.referenceVideos ?? []) {\n content.push({\n type: \"video_url\",\n video_url: { url: refToUrl(ref) },\n role: \"reference_video\",\n });\n }\n for (const ref of req.referenceAudios ?? []) {\n content.push({\n type: \"audio_url\",\n audio_url: { url: refToUrl(ref) },\n role: \"reference_audio\",\n });\n }\n\n // ratio is omitted for frame-anchored runs; resolveOptions already dropped\n // it there, never re-add it here.\n const hasFrameAnchor = Boolean(req.firstFrame ?? req.sourceVideo);\n const body: SeedanceSubmitBody = {\n model: ctx.model.providerModelId,\n content,\n duration,\n resolution,\n };\n if (!hasFrameAnchor && req.aspectRatio !== undefined) body.ratio = req.aspectRatio;\n if (req.generateAudio !== undefined) body.generate_audio = req.generateAudio;\n if (req.seed !== undefined) body.seed = req.seed;\n if (req.watermark !== undefined) body.watermark = req.watermark;\n\n const submit = await withRetry(async () => {\n const res = await arkFetch(ctx, `${arkBaseUrl(ctx)}${SUBMIT_PATH}`, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${key}`, \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throwArkError(res.status, text, modelId);\n }\n const parsed = SeedanceResponseSchema.safeParse(await res.json());\n const decoded: SeedanceResponse = parsed.success ? parsed.data : {};\n return decoded;\n }, retryOptsFor(ctx));\n if (!submit.id) throwArkError(undefined, \"Seedance task create returned no id\", modelId);\n const jobId: string = submit.id;\n const usage = seedanceUsage(ctx, req, duration);\n\n const fetchStatus = async (): Promise<SeedanceResponse | undefined> => {\n const res = await arkFetch(ctx, `${arkBaseUrl(ctx)}${SUBMIT_PATH}/${jobId}`, {\n headers: { Authorization: `Bearer ${key}` },\n });\n if (!res.ok) {\n if (res.status === 429 || res.status >= 500) return undefined;\n const text = await res.text().catch(() => \"\");\n throwArkError(res.status, text, modelId);\n }\n const parsed = SeedanceResponseSchema.safeParse(await res.json());\n if (!parsed.success) return {};\n return parsed.data;\n };\n\n return {\n jobId,\n async poll() {\n const polled = await fetchStatus();\n if (!polled) return { status: \"running\" };\n const status = (polled.status ?? \"queued\").toLowerCase();\n if (status === \"succeeded\") return { status: \"succeeded\", raw: polled };\n if (status === \"failed\" || status === \"expired\" || status === \"cancelled\") {\n return { status: \"failed\", raw: polled };\n }\n if (status === \"queued\" || status === \"pending\")\n return { status: \"pending\", raw: polled };\n return { status: \"running\", raw: polled };\n },\n async result(opts) {\n const optSignal = opts?.signal ?? ctx.signal;\n const pollOpts: SeedancePollOpts = {\n intervalMs: opts?.pollIntervalMs ?? SEEDANCE_POLL_INTERVAL_MS,\n timeoutMs: opts?.timeoutMs ?? RESULT_TIMEOUT_MS,\n };\n if (optSignal !== undefined) pollOpts.signal = optSignal;\n return pollUntil(async () => {\n const polled = await fetchStatus();\n if (!polled) return undefined;\n const status = (polled.status ?? \"queued\").toLowerCase();\n if (status === \"succeeded\") {\n const url = polled.content?.video_url;\n if (!url)\n throwArkError(\n undefined,\n \"Seedance task succeeded but returned no video_url\",\n modelId,\n );\n // Ark splits the bill as completion (output) plus the\n // remainder (input); a bare total is not enough to split.\n const tokens = polled.usage;\n if (\n tokens?.total_tokens !== undefined &&\n tokens.completion_tokens !== undefined\n ) {\n usage.inputTokens = tokens.total_tokens - tokens.completion_tokens;\n usage.outputTokens = tokens.completion_tokens;\n }\n return {\n video: { url, expiresAt: new Date(Date.now() + VIDEO_URL_TTL_MS) },\n usage,\n raw: polled,\n };\n }\n if (status === \"failed\" || status === \"expired\" || status === \"cancelled\") {\n throwArkError(undefined, seedanceErrorMessage(polled.error, status), modelId);\n }\n return undefined;\n }, pollOpts);\n },\n };\n}\n","import { z } from \"zod\";\nimport { createFalClient } from \"@fal-ai/client\";\nimport type { Adapter, AdapterContext } from \"./adapter.js\";\nimport { ModelKitError, isModelKitError } from \"../errors.js\";\nimport type { ProviderErrorBody } from \"../errors.js\";\nimport { classifyHttpError, classifyThrown, pollUntil, sleep, withRetry } from \"../retry.js\";\nimport { JsonValueSchema, describeThrown } from \"../json.js\";\nimport { readBody, refToUrl, throwIfAborted } from \"./media-ref.js\";\nimport type {\n ImageRequest,\n ImageResult,\n JsonObject,\n JsonValue,\n UsageEvent,\n VideoJob,\n VideoRequest,\n} from \"../types.js\";\n\nconst MUSE_T2I_ENDPOINT = \"meta/muse-image/text-to-image\";\nconst MUSE_EDIT_ENDPOINT = \"meta/muse-image/edit\";\nconst KLING_O1_ENDPOINT = \"fal-ai/kling-video/o1/video-to-video/reference\";\n\nconst FAL_QUEUE_HOST = \"https://queue.fal.run\";\nconst PASSTHROUGH_POLL_MS = 2000;\nconst PASSTHROUGH_MAX_WAIT_MS = 180_000;\n\n/** Minimal structural subset of the fal SDK the adapter uses. */\nexport interface FalClientLike {\n subscribe(\n endpoint: string,\n options: { input: JsonObject; abortSignal?: AbortSignal },\n ): Promise<JsonValue>;\n queue: {\n submit(\n endpoint: string,\n options: { input: JsonObject; abortSignal?: AbortSignal },\n ): Promise<{ requestId: string }>;\n status(\n endpoint: string,\n options: { requestId: string; abortSignal?: AbortSignal },\n ): Promise<{ status: string }>;\n result(\n endpoint: string,\n options: { requestId: string; abortSignal?: AbortSignal },\n ): Promise<JsonValue>;\n };\n}\n\nexport interface FalAdapterDeps {\n createFalClient: (opts: { credentials: string; fetch?: typeof fetch }) => FalClientLike;\n}\n\nconst falSubscribePayloadSchema = z.object({ data: JsonValueSchema });\n\nfunction defaultCreateFalClient(opts: {\n credentials: string;\n fetch?: typeof fetch;\n}): FalClientLike {\n const client = createFalClient(opts);\n return {\n async subscribe(endpoint, options) {\n const outcome = await client.subscribe(endpoint, options);\n const unwrapped = falSubscribePayloadSchema.safeParse(outcome);\n if (unwrapped.success) return unwrapped.data.data;\n return JsonValueSchema.parse(outcome);\n },\n queue: {\n async submit(endpoint, options) {\n const submitted = await client.queue.submit(endpoint, {\n input: options.input,\n ...(options.abortSignal !== undefined\n ? { abortSignal: options.abortSignal }\n : {}),\n });\n return { requestId: submitted.request_id };\n },\n async status(endpoint, options) {\n const current = await client.queue.status(endpoint, {\n requestId: options.requestId,\n ...(options.abortSignal !== undefined\n ? { abortSignal: options.abortSignal }\n : {}),\n });\n return { status: current.status };\n },\n async result(endpoint, options) {\n const outcome = await client.queue.result(endpoint, {\n requestId: options.requestId,\n ...(options.abortSignal !== undefined\n ? { abortSignal: options.abortSignal }\n : {}),\n });\n return JsonValueSchema.parse(outcome.data);\n },\n },\n };\n}\n\nconst defaultDeps: FalAdapterDeps = { createFalClient: defaultCreateFalClient };\n\nexport function createFalAdapter(deps: FalAdapterDeps = defaultDeps): Adapter {\n return {\n id: \"fal\",\n generateImage: (req, ctx) => {\n throwIfAborted(ctx.signal);\n return generateMuseImage(req, ctx, deps);\n },\n generateVideo: (req, ctx) => {\n throwIfAborted(ctx.signal);\n return generateFalVideo(req, ctx, deps);\n },\n };\n}\n\nexport const falAdapter: Adapter = createFalAdapter();\n\nconst falDetailSchema = z.object({ detail: JsonValueSchema });\n\n// fal wraps failures as { detail: ... }; surface the detail so the classifier\n// sees content_policy_violation and the message quotes the real reason.\nfunction liftDetail(body: ProviderErrorBody): ProviderErrorBody {\n const parsed = falDetailSchema.safeParse(body);\n const detail = parsed.success ? parsed.data.detail : undefined;\n return detail ?? body;\n}\n\nfunction falError(\n status: number | undefined,\n body: ProviderErrorBody,\n model: string,\n): ModelKitError {\n return classifyHttpError(status, liftDetail(body), \"fal\", model);\n}\n\nconst falSdkThrownSchema = z.object({\n status: z.number().optional(),\n statusCode: z.number().optional(),\n body: JsonValueSchema.optional(),\n message: z.string().optional(),\n});\n\nfunction falSdkError(cause: unknown, model: string): ModelKitError {\n const parsed = falSdkThrownSchema.safeParse(cause);\n if (parsed.success) {\n const status = parsed.data.status ?? parsed.data.statusCode;\n const body: ProviderErrorBody = parsed.data.body ?? parsed.data.message ?? String(cause);\n return classifyThrown(\"fal\", cause, model, { status, body: liftDetail(body) });\n }\n const info = describeThrown(cause);\n return classifyThrown(\"fal\", cause, model, {\n status: info.status,\n body: liftDetail(info.body),\n });\n}\n\ninterface GatewayConfig {\n baseUrl: string;\n falKey?: string;\n cfToken?: string;\n}\n\n/**\n * Passthrough needs the gateway plus at least one credential: the fal key\n * (forwarded as Bearer) or the gateway token alone when the fal key is stored\n * on the gateway (BYOK), which is how Cowork's gateway is set up.\n */\nfunction gatewayConfig(ctx: AdapterContext): GatewayConfig {\n const cf = ctx.routing.cloudflare;\n const falKey = ctx.keys.fal;\n const cfToken = ctx.keys.cloudflare;\n if (!cf?.accountId || !cf?.gatewayId || (!falKey && !cfToken)) {\n throw new ModelKitError({\n code: \"auth\",\n message:\n \"fal passthrough is not configured. Set routing.cloudflare and FAL_KEY or the gateway token (BYOK).\",\n provider: \"fal\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const config: GatewayConfig = {\n baseUrl: `https://gateway.ai.cloudflare.com/v1/${cf.accountId}/${cf.gatewayId}/fal`,\n };\n if (falKey) config.falKey = falKey;\n if (cfToken) config.cfToken = cfToken;\n return config;\n}\n\ntype FalGatewayHeaders = {\n Authorization?: string;\n \"x-fal-target-url\": string;\n \"Content-Type\"?: string;\n \"cf-aig-authorization\"?: string;\n};\n\nasync function gatewayFetch(\n cfg: GatewayConfig,\n fetchImpl: typeof fetch,\n targetUrl: string,\n init: { method: \"GET\" | \"POST\"; body?: string },\n): Promise<Response> {\n const headers: FalGatewayHeaders = { \"x-fal-target-url\": targetUrl };\n if (cfg.falKey) headers.Authorization = `Bearer ${cfg.falKey}`;\n if (init.body) headers[\"Content-Type\"] = \"application/json\";\n if (cfg.cfToken) headers[\"cf-aig-authorization\"] = `Bearer ${cfg.cfToken}`;\n const request: RequestInit = { method: init.method, headers };\n if (init.body !== undefined) request.body = init.body;\n return fetchImpl(cfg.baseUrl, request);\n}\n\nconst falQueueSubmitSchema = z.object({\n request_id: z.string(),\n status_url: z.string(),\n response_url: z.string(),\n});\n\nconst falQueueStatusSchema = z.object({ status: z.string() });\n\ninterface FalPollOptions {\n intervalMs: number;\n timeoutMs: number;\n signal?: AbortSignal;\n}\n\n// Submit → poll → result through the Cloudflare passthrough, exactly as\n// cowork's fal-gateway does. sync_mode forces inline data: URIs for images.\nasync function passthroughRequest(\n ctx: AdapterContext,\n endpoint: string,\n input: JsonObject,\n): Promise<JsonValue> {\n const cfg = gatewayConfig(ctx);\n const submitRes = await gatewayFetch(cfg, ctx.fetch, `${FAL_QUEUE_HOST}/${endpoint}`, {\n method: \"POST\",\n body: JSON.stringify({ ...input, sync_mode: true }),\n });\n if (!submitRes.ok) {\n throw falError(submitRes.status, await readBody(submitRes), ctx.model.id);\n }\n const submitParsed = falQueueSubmitSchema.safeParse(await submitRes.json());\n if (!submitParsed.success) {\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: `fal ${endpoint} submit returned no status URL`,\n provider: \"fal\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const submit = submitParsed.data;\n const deadline = Date.now() + PASSTHROUGH_MAX_WAIT_MS;\n for (;;) {\n if (Date.now() > deadline) {\n throw new ModelKitError({\n code: \"timeout\",\n message: `fal job timed out after ${PASSTHROUGH_MAX_WAIT_MS}ms (${endpoint})`,\n provider: \"fal\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n await sleep(PASSTHROUGH_POLL_MS, ctx.signal);\n const statusRes = await gatewayFetch(cfg, ctx.fetch, submit.status_url, { method: \"GET\" });\n if (!statusRes.ok) {\n throw falError(statusRes.status, await readBody(statusRes), ctx.model.id);\n }\n const statusParsed = falQueueStatusSchema.safeParse(await statusRes.json());\n if (statusParsed.success && statusParsed.data.status === \"COMPLETED\") break;\n }\n const resultRes = await gatewayFetch(cfg, ctx.fetch, submit.response_url, { method: \"GET\" });\n if (!resultRes.ok) {\n throw falError(resultRes.status, await readBody(resultRes), ctx.model.id);\n }\n return JsonValueSchema.parse(await resultRes.json());\n}\n\nfunction falClientOf(ctx: AdapterContext, deps: FalAdapterDeps): FalClientLike {\n const falKey = ctx.keys.fal;\n if (!falKey) {\n throw new ModelKitError({\n code: \"auth\",\n message: \"Missing API key for fal\",\n provider: \"fal\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n return deps.createFalClient({ credentials: falKey, fetch: ctx.fetch });\n}\n\nasync function subscribe(\n ctx: AdapterContext,\n deps: FalAdapterDeps,\n endpoint: string,\n input: JsonObject,\n): Promise<JsonValue> {\n const client = falClientOf(ctx, deps);\n const options = {\n input,\n ...(ctx.signal !== undefined ? { abortSignal: ctx.signal } : {}),\n };\n try {\n return await withRetry(\n async () => {\n try {\n return await client.subscribe(endpoint, options);\n } catch (cause) {\n throw falSdkError(cause, ctx.model.id);\n }\n },\n ctx.signal !== undefined ? { signal: ctx.signal } : {},\n );\n } catch (cause) {\n throw falSdkError(cause, ctx.model.id);\n }\n}\n\nasync function runJob(\n ctx: AdapterContext,\n deps: FalAdapterDeps,\n endpoint: string,\n input: JsonObject,\n): Promise<JsonValue> {\n if (ctx.routing.fal === \"cloudflare-passthrough\") {\n try {\n return await passthroughRequest(ctx, endpoint, input);\n } catch (cause) {\n if (isModelKitError(cause)) throw cause;\n throw falSdkError(cause, ctx.model.id);\n }\n }\n return subscribe(ctx, deps, endpoint, input);\n}\n\nfunction imageUsage(ctx: AdapterContext, req: ImageRequest, quantity: number): UsageEvent {\n const event: UsageEvent = {\n model: ctx.model.id,\n provider: \"fal\",\n modality: \"IMAGE\",\n unit: \"images\",\n quantity,\n };\n if (req.size !== undefined) event.imageSize = req.size;\n if (req.quality !== undefined) event.imageQuality = req.quality;\n return event;\n}\n\nfunction videoUsage(ctx: AdapterContext, req: VideoRequest, duration: number): UsageEvent {\n const event: UsageEvent = {\n model: ctx.model.id,\n provider: \"fal\",\n modality: \"VIDEO\",\n unit: \"seconds\",\n quantity: duration,\n durationSeconds: duration,\n };\n if (req.resolution !== undefined) event.resolution = req.resolution;\n return event;\n}\n\nasync function decodeImage(\n ctx: AdapterContext,\n url: string,\n contentType?: string | null,\n): Promise<{ bytes: Uint8Array; mime: string }> {\n if (url.startsWith(\"data:\")) {\n const comma = url.indexOf(\",\");\n const mime = url.slice(5, comma).split(\";\")[0] || contentType || \"image/png\";\n return { bytes: Uint8Array.from(Buffer.from(url.slice(comma + 1), \"base64\")), mime };\n }\n const res = await ctx.fetch(url);\n if (!res.ok) throw falError(res.status, await readBody(res), ctx.model.id);\n const mime = res.headers.get(\"content-type\") ?? contentType ?? \"image/png\";\n return { bytes: new Uint8Array(await res.arrayBuffer()), mime };\n}\n\ntype MuseImageInput = {\n prompt: string;\n num_images: number;\n output_format: string;\n aspect_ratio?: string;\n image_urls?: string[];\n};\n\nconst museImageResultSchema = z.object({\n images: z\n .array(\n z.object({\n url: z.string().optional(),\n content_type: z.string().nullable().optional(),\n }),\n )\n .optional(),\n});\n\nasync function generateMuseImage(\n req: ImageRequest,\n ctx: AdapterContext,\n deps: FalAdapterDeps,\n): Promise<ImageResult> {\n const refs = (req.references ?? []).map(refToUrl);\n const isEdit = refs.length > 0;\n const input: MuseImageInput = {\n prompt: req.prompt,\n num_images: req.count ?? 1,\n output_format: req.outputFormat ?? \"png\",\n };\n // resolveOptions already snapped the ratio; adaptive has no fal equivalent.\n if (req.aspectRatio !== undefined && req.aspectRatio !== \"adaptive\") {\n input.aspect_ratio = req.aspectRatio;\n }\n if (isEdit) input.image_urls = refs;\n // Reference images over 4096px on either side are rejected by fal\n // (image_too_large). This package has no resizer; callers downscale first.\n // A catalog row may name a full fal endpoint id (\"owner/model/path\") for other\n // fal image models with the same {images:[{url}]} result contract.\n const id = ctx.model.providerModelId;\n const custom = id.includes(\"/\") && !id.startsWith(\"meta/muse-image\") ? id : undefined;\n const endpoint = custom ?? (isEdit ? MUSE_EDIT_ENDPOINT : MUSE_T2I_ENDPOINT);\n const payload = await runJob(ctx, deps, endpoint, input);\n const parsed = museImageResultSchema.safeParse(payload);\n const images = parsed.success ? (parsed.data.images ?? []) : [];\n const firstUrl = images[0]?.url;\n if (images.length === 0 || firstUrl === undefined) {\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: \"fal Meta Muse returned no image\",\n provider: \"fal\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const files = await Promise.all(\n images.flatMap((img) => {\n if (img.url === undefined) return [];\n return [decodeImage(ctx, img.url, img.content_type ?? undefined)];\n }),\n );\n return {\n images: files.map((f) => ({ bytes: f.bytes, mime: f.mime })),\n usage: imageUsage(ctx, req, files.length),\n raw: payload,\n };\n}\n\n// Exact catalog ids, not substrings: the family decides the endpoint path and\n// resolution default, so an unrelated id must not inherit h3-max behavior.\nconst H3_MAX_MODEL_IDS: ReadonlySet<string> = new Set([\n \"minimax/h3-max\",\n \"minimax/h3-max/reference-to-video\",\n]);\n\nfunction minimaxFamily(providerModelId: string): \"h3\" | \"h3-max\" {\n return H3_MAX_MODEL_IDS.has(providerModelId.toLowerCase()) ? \"h3-max\" : \"h3\";\n}\n\ntype MinimaxVideoInput = {\n prompt: string;\n duration: number;\n resolution: string;\n prompt_expansion_mode: string;\n enable_safety_checker?: boolean;\n seed?: number;\n aspect_ratio?: string;\n reference_image_urls?: string[];\n reference_video_urls?: string[];\n reference_audio_urls?: string[];\n image_url?: string;\n end_image_url?: string;\n};\n\nfunction minimaxBase(req: VideoRequest, family: \"h3\" | \"h3-max\"): MinimaxVideoInput {\n const resolution = (\n family === \"h3-max\" ? (req.resolution ?? \"768p\") : (req.resolution ?? \"2k\")\n ).toUpperCase();\n const input: MinimaxVideoInput = {\n prompt: req.prompt.trim(),\n duration: req.durationSeconds ?? 5,\n resolution,\n prompt_expansion_mode: req.promptExpansion ?? \"balanced\",\n };\n // fal defaults enable_safety_checker to true; only override when the caller opts out.\n if (req.safetyChecker !== undefined) input.enable_safety_checker = req.safetyChecker;\n if (req.seed !== undefined) input.seed = req.seed;\n return input;\n}\n\nconst KLING_MODEL_IDS: ReadonlySet<string> = new Set([\n \"fal-ai/kling-video/o1/video-to-video/reference\",\n]);\n\nfunction isKling(providerModelId: string): boolean {\n return KLING_MODEL_IDS.has(providerModelId.toLowerCase());\n}\n\ntype KlingO1VideoInput = {\n prompt: string;\n video_url: string;\n duration: string;\n aspect_ratio?: string;\n image_urls?: string[];\n};\n\nfunction klingO1Input(req: VideoRequest): KlingO1VideoInput {\n const source = req.sourceVideo ? refToUrl(req.sourceVideo) : undefined;\n if (!source) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: \"kling-o1-v2v requires sourceVideo\",\n provider: \"fal\",\n retryable: false,\n });\n }\n const duration = Math.min(10, Math.max(3, Math.round(req.durationSeconds ?? 5)));\n const input: KlingO1VideoInput = {\n prompt: req.prompt,\n video_url: source,\n duration: String(duration),\n };\n // The endpoint has no \"adaptive\" literal: omit the ratio so Kling infers it.\n if (req.aspectRatio !== \"adaptive\") {\n input.aspect_ratio =\n req.aspectRatio === \"16:9\" || req.aspectRatio === \"9:16\" || req.aspectRatio === \"1:1\"\n ? req.aspectRatio\n : \"auto\";\n }\n const refs = (req.referenceImages ?? []).map(refToUrl);\n if (refs.length > 0) input.image_urls = refs;\n return input;\n}\n\nconst falVideoResultSchema = z.object({\n video: z.object({ url: z.string().optional() }).optional(),\n});\n\nfunction extractVideoUrl(result: JsonValue, endpoint: string, model: string): string {\n const parsed = falVideoResultSchema.safeParse(result);\n const url = parsed.success ? parsed.data.video?.url : undefined;\n if (url === undefined) {\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: `fal ${endpoint} returned no video URL`,\n provider: \"fal\",\n model,\n retryable: false,\n });\n }\n return url;\n}\n\nasync function generateFalVideo(\n req: VideoRequest,\n ctx: AdapterContext,\n deps: FalAdapterDeps,\n): Promise<VideoJob> {\n const providerModelId = ctx.model.providerModelId;\n if (isKling(providerModelId)) {\n const input = klingO1Input(req);\n if (ctx.routing.fal === \"cloudflare-passthrough\") {\n return await passthroughVideoJob(ctx, req, KLING_O1_ENDPOINT, input);\n }\n return await submitQueueJob(ctx, req, deps, KLING_O1_ENDPOINT, input);\n }\n const family = minimaxFamily(providerModelId);\n const refs = {\n images: (req.referenceImages ?? []).map(refToUrl),\n videos: (req.referenceVideos ?? []).map(refToUrl),\n audios: (req.referenceAudios ?? []).map(refToUrl),\n };\n const firstFrame = req.firstFrame ? refToUrl(req.firstFrame) : undefined;\n const lastFrame = req.lastFrame ? refToUrl(req.lastFrame) : undefined;\n const base = minimaxBase(req, family);\n let endpoint: string;\n if (refs.images.length + refs.videos.length + refs.audios.length > 0) {\n endpoint = `minimax/${family}/reference-to-video`;\n base.aspect_ratio = req.aspectRatio ?? \"adaptive\";\n if (refs.images.length > 0) base.reference_image_urls = refs.images;\n if (refs.videos.length > 0) base.reference_video_urls = refs.videos;\n if (refs.audios.length > 0) base.reference_audio_urls = refs.audios;\n } else if (firstFrame ?? lastFrame) {\n endpoint = `minimax/${family}/image-to-video`;\n if (firstFrame) base.image_url = firstFrame;\n if (lastFrame) base.end_image_url = lastFrame;\n } else {\n endpoint = `minimax/${family}/text-to-video`;\n // The t2v schema only accepts concrete ratios; \"adaptive\" means \"let the\n // model infer\", which here is the provider's own 16:9 default.\n if (req.aspectRatio !== undefined && req.aspectRatio !== \"adaptive\") {\n base.aspect_ratio = req.aspectRatio;\n }\n }\n if (ctx.routing.fal === \"cloudflare-passthrough\") {\n return await passthroughVideoJob(ctx, req, endpoint, base);\n }\n return await submitQueueJob(ctx, req, deps, endpoint, base);\n}\n\n// Direct video endpoints submit to the queue and poll; result() waits with the\n// caller's timeout and signal. Only the submit is retried, so a late 429 during\n// polling cannot re-run a finished job.\nasync function submitQueueJob(\n ctx: AdapterContext,\n req: VideoRequest,\n deps: FalAdapterDeps,\n endpoint: string,\n input: JsonObject,\n): Promise<VideoJob> {\n const client = falClientOf(ctx, deps);\n let submitted: { requestId: string };\n try {\n submitted = await withRetry(\n async () => {\n try {\n return await client.queue.submit(endpoint, {\n input,\n ...(ctx.signal !== undefined ? { abortSignal: ctx.signal } : {}),\n });\n } catch (cause) {\n throw falSdkError(cause, ctx.model.id);\n }\n },\n ctx.signal !== undefined ? { signal: ctx.signal } : {},\n );\n } catch (cause) {\n throw falSdkError(cause, ctx.model.id);\n }\n return queuedVideoJob(ctx, req, client, endpoint, submitted.requestId);\n}\n\nfunction queuedVideoJob(\n ctx: AdapterContext,\n req: VideoRequest,\n client: FalClientLike,\n endpoint: string,\n requestId: string,\n): VideoJob {\n const readStatus = async (): Promise<string> => {\n try {\n const options = {\n requestId,\n ...(ctx.signal !== undefined ? { abortSignal: ctx.signal } : {}),\n };\n return (await client.queue.status(endpoint, options)).status;\n } catch (cause) {\n throw falSdkError(cause, ctx.model.id);\n }\n };\n const duration = req.durationSeconds ?? 5;\n return {\n jobId: requestId,\n async poll() {\n try {\n const status = await readStatus();\n if (status === \"COMPLETED\") return { status: \"succeeded\" as const };\n if (status === \"IN_QUEUE\") return { status: \"pending\" as const };\n return { status: \"running\" as const };\n } catch (cause) {\n if (isModelKitError(cause) && !cause.retryable)\n return { status: \"failed\" as const };\n return { status: \"pending\" as const };\n }\n },\n async result(opts) {\n const signal = opts?.signal ?? ctx.signal;\n const pollOptions: FalPollOptions = {\n intervalMs: opts?.pollIntervalMs ?? PASSTHROUGH_POLL_MS,\n timeoutMs: opts?.timeoutMs ?? 15 * 60_000,\n };\n if (signal !== undefined) pollOptions.signal = signal;\n const queueOptions = {\n requestId,\n ...(signal !== undefined ? { abortSignal: signal } : {}),\n };\n const payload = await pollUntil<JsonValue>(async () => {\n try {\n const current = await client.queue.status(endpoint, queueOptions);\n if (current.status !== \"COMPLETED\") return undefined;\n return await client.queue.result(endpoint, queueOptions);\n } catch (cause) {\n const err = falSdkError(cause, ctx.model.id);\n if (err.retryable) return undefined;\n throw err;\n }\n }, pollOptions);\n const url = extractVideoUrl(payload, endpoint, ctx.model.id);\n return { video: { url }, usage: videoUsage(ctx, req, duration), raw: payload };\n },\n };\n}\n\n// Passthrough video jobs poll the fal queue status URL; result() waits with\n// the adapter interval and honours the caller's abort signal. The submit is\n// awaited here so a submit failure surfaces to the generateVideo caller\n// instead of sitting on a detached promise until result() runs.\nasync function passthroughVideoJob(\n ctx: AdapterContext,\n req: VideoRequest,\n endpoint: string,\n input: JsonObject,\n): Promise<VideoJob> {\n const cfg = gatewayConfig(ctx);\n const res = await gatewayFetch(cfg, ctx.fetch, `${FAL_QUEUE_HOST}/${endpoint}`, {\n method: \"POST\",\n body: JSON.stringify({ ...input, sync_mode: true }),\n });\n if (!res.ok) throw falError(res.status, await readBody(res), ctx.model.id);\n const parsed = falQueueSubmitSchema.safeParse(await res.json());\n if (!parsed.success) {\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: `fal ${endpoint} submit returned no status URL`,\n provider: \"fal\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const { request_id: jobId, status_url, response_url } = parsed.data;\n const checkStatus = async (): Promise<string | undefined> => {\n const statusRes = await gatewayFetch(cfg, ctx.fetch, status_url, { method: \"GET\" });\n if (!statusRes.ok)\n throw falError(statusRes.status, await readBody(statusRes), ctx.model.id);\n const statusParsed = falQueueStatusSchema.safeParse(await statusRes.json());\n if (!statusParsed.success || statusParsed.data.status !== \"COMPLETED\") return undefined;\n const resultRes = await gatewayFetch(cfg, ctx.fetch, response_url, { method: \"GET\" });\n if (!resultRes.ok) {\n throw falError(resultRes.status, await readBody(resultRes), ctx.model.id);\n }\n const result: JsonValue = JsonValueSchema.parse(await resultRes.json());\n return extractVideoUrl(result, endpoint, ctx.model.id);\n };\n const duration = req.durationSeconds ?? 5;\n return {\n jobId,\n async poll() {\n try {\n const url = await checkStatus();\n return url ? { status: \"succeeded\" as const } : { status: \"pending\" as const };\n } catch (cause) {\n if (isModelKitError(cause) && !cause.retryable)\n return { status: \"failed\" as const };\n return { status: \"pending\" as const };\n }\n },\n async result(opts) {\n const signal = opts?.signal ?? ctx.signal;\n const pollOptions: FalPollOptions = {\n intervalMs: opts?.pollIntervalMs ?? PASSTHROUGH_POLL_MS,\n timeoutMs: opts?.timeoutMs ?? 15 * 60_000,\n };\n if (signal !== undefined) pollOptions.signal = signal;\n const url = await pollUntil(checkStatus, pollOptions);\n return { video: { url }, usage: videoUsage(ctx, req, duration) };\n },\n };\n}\n","import { z } from \"zod\";\nimport {\n GoogleGenAI,\n type GenerateVideosOperation,\n type GenerateVideosParameters,\n type GenerateVideosResponse,\n type OperationGetParameters,\n} from \"@google/genai\";\nimport { ModelKitError } from \"../errors.js\";\nimport { describeThrown } from \"../json.js\";\nimport {\n classifyHttpError,\n classifyThrown,\n pollUntil,\n withRetry,\n type RetryOptions,\n} from \"../retry.js\";\nimport type {\n AudioRequest,\n AudioResult,\n JsonObject,\n MediaPart,\n MediaRef,\n UsageEvent,\n VideoJob,\n VideoRequest,\n} from \"../types.js\";\nimport type { Adapter, AdapterContext } from \"./adapter.js\";\nimport { deleteGoogleFile, uploadGoogleFile, type GoogleFilesOptions } from \"./google-files.js\";\n\nexport interface VeoImagePayload {\n imageBytes: string;\n mimeType: string;\n}\n\nexport interface VeoReferenceImage {\n image: VeoImagePayload;\n referenceType: string;\n}\n\nexport interface VeoGenerationConfig {\n aspectRatio?: string;\n durationSeconds: number;\n resolution?: string;\n personGeneration: string;\n lastFrame?: VeoImagePayload;\n referenceImages?: VeoReferenceImage[];\n}\n\nexport interface VeoGenerateBody {\n model: string;\n prompt: string;\n image?: VeoImagePayload;\n config: VeoGenerationConfig;\n}\n\nexport interface VeoVideoRef {\n uri?: string;\n}\n\nexport interface VeoGeneratedVideo {\n video?: VeoVideoRef;\n}\n\nexport interface VeoOperationResponse {\n generatedVideos?: VeoGeneratedVideo[];\n}\n\nexport interface VeoOperation {\n name?: string;\n done?: boolean;\n error?: JsonObject;\n response?: VeoOperationResponse;\n}\n\nexport interface VeoOperationRef {\n operation: VeoOperation;\n}\n\nexport interface OmniVideoRef {\n data?: string;\n uri?: string;\n mime_type?: string;\n}\n\nexport interface OmniStepContent {\n type?: string;\n data?: string;\n uri?: string;\n mime_type?: string;\n}\n\nexport interface OmniStep {\n type?: string;\n content?: OmniStepContent[];\n}\n\nexport interface OmniInteraction {\n id?: string;\n status?: string;\n output_video?: OmniVideoRef | null;\n steps?: OmniStep[];\n}\n\nexport interface OmniContentPart {\n type: string;\n text?: string;\n data?: string;\n uri?: string;\n mime_type?: string;\n}\n\nexport interface OmniResponseFormat {\n type: string;\n /** Files API delivery; required with store=true to dodge the 4 MB inline cap. */\n delivery?: string;\n aspect_ratio?: string;\n resolution?: string;\n duration?: string;\n}\n\nexport interface OmniVideoConfig {\n task: OmniTask;\n}\n\nexport interface OmniGenerationConfig {\n video_config: OmniVideoConfig;\n}\n\nexport interface OmniCreateArgs {\n model: string;\n input: OmniContentPart[];\n response_format: OmniResponseFormat;\n generation_config: OmniGenerationConfig;\n /** The Interactions API requires this with uri delivery. */\n store?: boolean;\n}\n\nexport interface OmniGetParams {\n stream: boolean;\n}\n\nexport interface OmniUploadedEntry {\n type: string;\n bytes: Uint8Array;\n mime: string;\n}\n\nexport type OmniTask = \"text_to_video\" | \"image_to_video\" | \"reference_to_video\" | \"edit\";\n\nexport interface GeminiInlineData {\n mimeType?: string;\n data?: string;\n}\n\nexport interface GeminiPart {\n text?: string;\n inlineData?: GeminiInlineData;\n}\n\nexport interface GeminiContent {\n parts?: GeminiPart[];\n}\n\nexport interface GeminiGenerateContentBody {\n model: string;\n contents: GeminiContent[];\n}\n\nexport interface GeminiUsageMetadata {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n}\n\nexport interface GeminiCandidate {\n content?: GeminiContent;\n}\n\nexport interface GeminiGenerateContentResponse {\n candidates?: GeminiCandidate[];\n usageMetadata?: GeminiUsageMetadata;\n}\n\nexport interface GoogleGenaiClientOptions {\n apiKey: string;\n}\n\nexport interface GoogleGenaiModelsClient {\n generateVideos: (body: VeoGenerateBody) => Promise<VeoOperation>;\n /** Lyria: music comes back as an inlineData part of a plain generateContent call. */\n generateContent: (body: GeminiGenerateContentBody) => Promise<GeminiGenerateContentResponse>;\n}\n\nexport interface GoogleGenaiOperationsClient {\n getVideosOperation: (args: VeoOperationRef) => Promise<VeoOperation>;\n}\n\nexport interface GoogleGenaiInteractionsClient {\n create: (args: OmniCreateArgs) => Promise<OmniInteraction>;\n get: (jobId: string, params: OmniGetParams) => Promise<OmniInteraction>;\n}\n\nexport interface GoogleGenaiClient {\n models: GoogleGenaiModelsClient;\n operations: GoogleGenaiOperationsClient;\n interactions: GoogleGenaiInteractionsClient;\n}\n\nexport interface GoogleGenaiAdapterDeps {\n createGenAIClient: (opts: GoogleGenaiClientOptions) => GoogleGenaiClient;\n}\n\ntype SdkCreateParams = Parameters<GoogleGenAI[\"interactions\"][\"create\"]>[0];\n\nfunction defaultCreateGenAIClient(opts: GoogleGenaiClientOptions): GoogleGenaiClient {\n // Pin the Gemini API path. Otherwise GOOGLE_GENAI_USE_VERTEXAI in the host env\n // flips the SDK to Vertex, which rejects API keys.\n const sdk = new GoogleGenAI({ ...opts, vertexai: false });\n return {\n models: {\n generateVideos: async (body) => {\n // SAFETY: VeoGenerateBody carries the Veo JSON fields the SDK serializes unchanged; the SDK's wider GenerateVideosParameters only adds options this adapter never sets.\n const params = body as GenerateVideosParameters;\n const operation = await sdk.models.generateVideos(params);\n // SAFETY: the API returns the full operation JSON; VeoOperation lists the polling fields this adapter reads, all optional, so the value always satisfies it.\n return operation as VeoOperation;\n },\n generateContent: (body) => sdk.models.generateContent(body),\n },\n operations: {\n getVideosOperation: async (args) => {\n // SAFETY: VeoOperation is the operation JSON the API returned; the SDK re-sends it unchanged to refresh it, which matches the SDK's operation parameter.\n const inner = args.operation as GenerateVideosOperation;\n const params: OperationGetParameters<\n GenerateVideosResponse,\n GenerateVideosOperation\n > = { operation: inner };\n const operation = await sdk.operations.getVideosOperation(params);\n // SAFETY: the API returns the full operation JSON; VeoOperation lists the polling fields this adapter reads, all optional, so the value always satisfies it.\n return operation as VeoOperation;\n },\n },\n interactions: {\n create: async (args) => {\n // SAFETY: the SDK serializes these preview interaction fields to JSON unchanged; its closed TS union omits this surface but the wire call carries it through.\n const params = args as SdkCreateParams;\n const response = await sdk.interactions.create(params);\n // SAFETY: the API returns the full interaction JSON; OmniInteraction lists the video fields this adapter reads, all optional, so the value always satisfies it.\n return response as OmniInteraction;\n },\n get: async (jobId, params) => {\n const response = await sdk.interactions.get(jobId, params);\n // SAFETY: the API returns the full interaction JSON; OmniInteraction lists the video fields this adapter reads, all optional, so the value always satisfies it.\n return response as OmniInteraction;\n },\n },\n };\n}\n\nconst defaultDeps: GoogleGenaiAdapterDeps = {\n createGenAIClient: (opts) => defaultCreateGenAIClient(opts),\n};\n\nconst VEO_POLL_INTERVAL_MS = 5000;\nconst OMNI_POLL_INTERVAL_MS = 10000;\nconst RESULT_TIMEOUT_MS = 15 * 60 * 1000;\nconst OMNI_INLINE_LIMIT_BYTES = 4 * 1024 * 1024;\n/** Gemini rejects inline request bodies over 20 MB; larger media goes through the Files API. */\nconst MEDIA_PART_INLINE_LIMIT_BYTES = 20 * 1024 * 1024;\n\nconst errorTextSchema = z.string();\n\ninterface PollOptions {\n intervalMs: number;\n timeoutMs: number;\n signal?: AbortSignal;\n}\n\nexport function createGoogleGenaiAdapter(deps: GoogleGenaiAdapterDeps = defaultDeps): Adapter {\n const { createGenAIClient } = deps;\n return {\n id: \"google-genai\",\n async generateVideo(req: VideoRequest, ctx: AdapterContext): Promise<VideoJob> {\n const providerModelId = ctx.model.providerModelId;\n if (providerModelId.startsWith(\"veo-\"))\n return generateVeoVideo(req, ctx, createGenAIClient);\n if (providerModelId.startsWith(\"gemini-omni\"))\n return generateOmniVideo(req, ctx, createGenAIClient);\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `google-genai cannot serve ${providerModelId}`,\n provider: \"google-genai\",\n model: ctx.model.id,\n });\n },\n async generateAudio(req: AudioRequest, ctx: AdapterContext): Promise<AudioResult> {\n const providerModelId = ctx.model.providerModelId;\n if (providerModelId.startsWith(\"lyria-\"))\n return generateLyriaAudio(req, ctx, createGenAIClient);\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `google-genai cannot serve ${providerModelId}`,\n provider: \"google-genai\",\n model: ctx.model.id,\n });\n },\n prepareMediaPart(\n ref: MediaRef,\n mediaType: string,\n ctx: AdapterContext,\n ): Promise<MediaPart> {\n return prepareGoogleMediaPart(ref, mediaType, ctx);\n },\n };\n}\n\nexport const googleGenaiAdapter: Adapter = createGoogleGenaiAdapter();\n\nfunction googleKey(ctx: AdapterContext): string {\n const key = ctx.keys.google;\n if (!key) {\n throw new ModelKitError({\n code: \"auth\",\n message: \"Missing Google API key\",\n provider: \"google-genai\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n return key;\n}\n\nfunction sdkStatus(cause: unknown): number | undefined {\n return describeThrown(cause).status;\n}\n\nfunction throwSdkError(cause: unknown, model: string): never {\n throw classifyThrown(\"google-genai\", cause, model);\n}\n\nfunction toBase64(bytes: Uint8Array): string {\n return Buffer.from(bytes).toString(\"base64\");\n}\n\nasync function resolveMedia(\n ref: MediaRef,\n fetchImpl: typeof fetch,\n signal: AbortSignal | undefined,\n defaultMime: string,\n model: string,\n): Promise<{ bytes: Uint8Array; mime: string }> {\n if (\"bytes\" in ref) return { bytes: ref.bytes, mime: ref.mime };\n const init: RequestInit = {};\n if (signal !== undefined) init.signal = signal;\n const res = await fetchImpl(ref.url, init);\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw classifyHttpError(res.status, text, \"google-genai\", model);\n }\n return {\n bytes: new Uint8Array(await res.arrayBuffer()),\n mime: res.headers.get(\"content-type\")?.split(\";\")[0]?.trim() || defaultMime,\n };\n}\n\nasync function downloadVideo(\n ctx: AdapterContext,\n url: string,\n apiKey: string,\n signal: AbortSignal | undefined,\n): Promise<{ bytes: Uint8Array; mime: string }> {\n const init: RequestInit = { headers: { \"x-goog-api-key\": apiKey } };\n if (signal !== undefined) init.signal = signal;\n const res = await ctx.fetch(url, init);\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw classifyHttpError(res.status, text, \"google-genai\", ctx.model.id);\n }\n return {\n bytes: new Uint8Array(await res.arrayBuffer()),\n mime: res.headers.get(\"content-type\")?.split(\";\")[0]?.trim() || \"video/mp4\",\n };\n}\n\nfunction videoUsage(ctx: AdapterContext, req: VideoRequest, duration: number): UsageEvent {\n const event: UsageEvent = {\n model: ctx.model.id,\n provider: \"google-genai\",\n modality: \"VIDEO\",\n unit: \"seconds\",\n quantity: duration,\n durationSeconds: duration,\n };\n if (req.resolution !== undefined) event.resolution = req.resolution;\n return event;\n}\n\ntype GenAIClientFactory = GoogleGenaiAdapterDeps[\"createGenAIClient\"];\n\nasync function generateVeoVideo(\n req: VideoRequest,\n ctx: AdapterContext,\n createGenAIClient: GenAIClientFactory,\n): Promise<VideoJob> {\n const apiKey = googleKey(ctx);\n const modelId = ctx.model.id;\n const refs = req.referenceImages ?? [];\n if (req.firstFrame && refs.length > 0) {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: \"Veo takes image or referenceImages, never both\",\n provider: \"google-genai\",\n model: modelId,\n });\n }\n // Veo's config.lastFrame is only valid for image-to-video; dropping it silently\n // would generate the wrong clip, so reject the missing first frame instead.\n if (req.lastFrame !== undefined && req.firstFrame === undefined) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${modelId} requires firstFrame when lastFrame is set`,\n provider: \"google-genai\",\n model: modelId,\n });\n }\n const duration = req.durationSeconds ?? 8;\n const personGeneration = (req.firstFrame ?? refs.length > 0) ? \"allow_adult\" : \"allow_all\";\n\n let image: VeoImagePayload | undefined;\n let lastFrame: VeoImagePayload | undefined;\n let referenceImages: VeoReferenceImage[] | undefined;\n if (req.firstFrame) {\n const first = await resolveMedia(\n req.firstFrame,\n ctx.fetch,\n ctx.signal,\n \"image/png\",\n modelId,\n );\n image = { imageBytes: toBase64(first.bytes), mimeType: first.mime };\n if (req.lastFrame) {\n const last = await resolveMedia(\n req.lastFrame,\n ctx.fetch,\n ctx.signal,\n \"image/png\",\n modelId,\n );\n lastFrame = { imageBytes: toBase64(last.bytes), mimeType: last.mime };\n }\n } else if (refs.length > 0) {\n const loaded = await Promise.all(\n refs.map((ref) => resolveMedia(ref, ctx.fetch, ctx.signal, \"image/png\", modelId)),\n );\n referenceImages = loaded.map((img) => ({\n image: { imageBytes: toBase64(img.bytes), mimeType: img.mime },\n referenceType: \"ASSET\",\n }));\n }\n\n const client = createGenAIClient({ apiKey });\n const config: VeoGenerationConfig = { durationSeconds: duration, personGeneration };\n if (req.aspectRatio !== undefined) config.aspectRatio = req.aspectRatio;\n if (req.resolution !== undefined) config.resolution = req.resolution;\n if (lastFrame !== undefined) config.lastFrame = lastFrame;\n if (referenceImages !== undefined) config.referenceImages = referenceImages;\n const requestBody: VeoGenerateBody = {\n model: ctx.model.providerModelId,\n prompt: req.prompt,\n config,\n };\n if (image !== undefined) requestBody.image = image;\n const retryOptions: RetryOptions = { attempts: 3 };\n if (ctx.signal !== undefined) retryOptions.signal = ctx.signal;\n let operation: VeoOperation;\n try {\n operation = await withRetry(async () => {\n try {\n return await client.models.generateVideos(requestBody);\n } catch (cause) {\n throwSdkError(cause, modelId);\n }\n }, retryOptions);\n } catch (cause) {\n throwSdkError(cause, modelId);\n }\n\n const getOperation = async (): Promise<VeoOperation> => {\n try {\n return await client.operations.getVideosOperation({ operation });\n } catch (cause) {\n throwSdkError(cause, modelId);\n }\n };\n const jobId = operation.name ?? crypto.randomUUID();\n const usage = videoUsage(ctx, req, duration);\n\n return {\n jobId,\n async poll() {\n const current = await getOperation();\n if (current.error) return { status: \"failed\", raw: current };\n if (current.done) return { status: \"succeeded\", raw: current };\n return { status: \"running\", raw: current };\n },\n async result(opts) {\n const signal = opts?.signal ?? ctx.signal;\n const pollOptions: PollOptions = {\n intervalMs: opts?.pollIntervalMs ?? VEO_POLL_INTERVAL_MS,\n timeoutMs: opts?.timeoutMs ?? RESULT_TIMEOUT_MS,\n };\n if (signal !== undefined) pollOptions.signal = signal;\n const finished = await pollUntil<VeoOperation>(async () => {\n const current = await getOperation();\n if (current.error) {\n throw classifyHttpError(\n undefined,\n `Veo task failed: ${JSON.stringify(current.error).slice(0, 500)}`,\n \"google-genai\",\n modelId,\n );\n }\n if (!current.done) return undefined;\n return current;\n }, pollOptions);\n const uri = finished.response?.generatedVideos?.[0]?.video?.uri;\n if (!uri) {\n throw classifyHttpError(\n undefined,\n \"No video URI in Veo response\",\n \"google-genai\",\n modelId,\n );\n }\n return { video: await downloadVideo(ctx, uri, apiKey, signal), usage, raw: finished };\n },\n };\n}\n\nfunction toOmniAspect(aspect: VideoRequest[\"aspectRatio\"]): \"16:9\" | \"9:16\" {\n return aspect === \"16:9\" || aspect === \"9:16\" ? aspect : \"16:9\";\n}\n\nfunction toOmniResolution(resolution: VideoRequest[\"resolution\"]): string | undefined {\n if (\n resolution === \"360p\" ||\n resolution === \"720p\" ||\n resolution === \"1080p\" ||\n resolution === \"4k\"\n ) {\n return resolution;\n }\n return undefined;\n}\n\nfunction isFileReferenceRejected(cause: unknown): boolean {\n if (sdkStatus(cause) !== 400) return false;\n const info = describeThrown(cause);\n const body = errorTextSchema.safeParse(info.body);\n const text = `${info.message} ${body.success ? body.data : JSON.stringify(info.body)}`;\n return /file|uri|not\\s*found|failed_precondition/i.test(text);\n}\n\nfunction extractOmniVideo(interaction: OmniInteraction, model: string): OmniVideoRef {\n const direct = interaction.output_video;\n if (direct && (direct.data ?? direct.uri)) return direct;\n for (const step of interaction.steps ?? []) {\n if (step.type !== undefined && step.type !== \"model_output\") continue;\n for (const content of step.content ?? []) {\n if (content.type === \"video\" && (content.data ?? content.uri)) return content;\n }\n }\n throw classifyHttpError(\n undefined,\n \"No video content in Gemini Omni response\",\n \"google-genai\",\n model,\n );\n}\n\nasync function generateOmniVideo(\n req: VideoRequest,\n ctx: AdapterContext,\n createGenAIClient: GenAIClientFactory,\n): Promise<VideoJob> {\n const apiKey = googleKey(ctx);\n const modelId = ctx.model.id;\n const providerModelId = ctx.model.providerModelId;\n const duration = req.durationSeconds ?? 8;\n const images = req.referenceImages ?? [];\n const videos = req.referenceVideos ?? [];\n const task: OmniTask = req.sourceVideo\n ? \"edit\"\n : req.firstFrame\n ? \"image_to_video\"\n : images.length > 0 || videos.length > 0\n ? \"reference_to_video\"\n : \"text_to_video\";\n\n // The Omni rows carry no ratio/duration/resolution defaults, so a field is\n // present here only when the caller asked for it. 1.0 rejects resolution.\n const isOmniV1 = providerModelId === \"gemini-omni-flash-preview\";\n const responseFormat: OmniResponseFormat = { type: \"video\", delivery: \"uri\" };\n if (\n req.sourceVideo === undefined &&\n req.aspectRatio !== undefined &&\n req.aspectRatio !== \"adaptive\"\n ) {\n responseFormat.aspect_ratio = toOmniAspect(req.aspectRatio);\n }\n if (!isOmniV1) {\n const omniResolution = toOmniResolution(req.resolution);\n if (omniResolution !== undefined) responseFormat.resolution = omniResolution;\n }\n if (req.durationSeconds !== undefined) responseFormat.duration = `${req.durationSeconds}s`;\n\n const client = createGenAIClient({ apiKey });\n const uploadedByUri = new Map<string, OmniUploadedEntry>();\n const uploadedNames: string[] = [];\n const uploadOne = async (\n kind: \"image\" | \"video\",\n bytes: Uint8Array,\n mime: string,\n ): Promise<string> => {\n const uploadOptions: GoogleFilesOptions = {\n apiKey,\n fetchImpl: ctx.fetch,\n model: modelId,\n label: \"gemini-omni\",\n };\n if (ctx.signal !== undefined) uploadOptions.signal = ctx.signal;\n const file = await uploadGoogleFile({ bytes, mime }, uploadOptions);\n uploadedByUri.set(file.fileUri, { type: kind, bytes, mime: file.mimeType });\n uploadedNames.push(file.fileName);\n return file.fileUri;\n };\n\n const cleanupUploads = async (): Promise<void> => {\n for (const fileName of uploadedNames) await deleteGoogleFile(fileName, apiKey, ctx.fetch);\n };\n const callCreate = (input: OmniContentPart[]): Promise<OmniInteraction> =>\n client.interactions.create({\n model: providerModelId,\n input,\n response_format: responseFormat,\n generation_config: { video_config: { task } },\n store: true,\n });\n\n const createRetryOptions: RetryOptions = { attempts: 3 };\n if (ctx.signal !== undefined) createRetryOptions.signal = ctx.signal;\n let interaction: OmniInteraction;\n try {\n // Preparation and submission share the cleanup-owning scope: a failure\n // while fetching or uploading a later reference must not leak the\n // uploads that already succeeded.\n const parts: OmniContentPart[] = [];\n if (req.sourceVideo) {\n const media = await resolveMedia(\n req.sourceVideo,\n ctx.fetch,\n ctx.signal,\n \"video/mp4\",\n modelId,\n );\n parts.push({\n type: \"video\",\n uri: await uploadOne(\"video\", media.bytes, media.mime),\n mime_type: media.mime,\n });\n }\n for (const ref of videos) {\n if (ref.label !== undefined) parts.push({ type: \"text\", text: ref.label });\n const media = await resolveMedia(ref, ctx.fetch, ctx.signal, \"video/mp4\", modelId);\n parts.push({\n type: \"video\",\n uri: await uploadOne(\"video\", media.bytes, media.mime),\n mime_type: media.mime,\n });\n }\n if (req.firstFrame) {\n if (req.firstFrame.label !== undefined)\n parts.push({ type: \"text\", text: req.firstFrame.label });\n const media = await resolveMedia(\n req.firstFrame,\n ctx.fetch,\n ctx.signal,\n \"image/png\",\n modelId,\n );\n if (media.bytes.length > OMNI_INLINE_LIMIT_BYTES) {\n parts.push({\n type: \"image\",\n uri: await uploadOne(\"image\", media.bytes, media.mime),\n mime_type: media.mime,\n });\n } else {\n parts.push({ type: \"image\", data: toBase64(media.bytes), mime_type: media.mime });\n }\n }\n for (const ref of images) {\n if (ref.label !== undefined) parts.push({ type: \"text\", text: ref.label });\n const media = await resolveMedia(ref, ctx.fetch, ctx.signal, \"image/png\", modelId);\n if (media.bytes.length > OMNI_INLINE_LIMIT_BYTES) {\n parts.push({\n type: \"image\",\n uri: await uploadOne(\"image\", media.bytes, media.mime),\n mime_type: media.mime,\n });\n } else {\n parts.push({ type: \"image\", data: toBase64(media.bytes), mime_type: media.mime });\n }\n }\n parts.push({ type: \"text\", text: req.prompt });\n\n try {\n interaction = await withRetry(async () => {\n try {\n return await callCreate(parts);\n } catch (cause) {\n throwSdkError(cause, modelId);\n }\n }, createRetryOptions);\n } catch (cause) {\n if (uploadedByUri.size === 0 || !isFileReferenceRejected(cause))\n throwSdkError(cause, modelId);\n const inlineParts = parts.map((part) => {\n if (part.uri === undefined) return part;\n const found = uploadedByUri.get(part.uri);\n if (!found) return part;\n const inline: OmniContentPart = {\n type: found.type,\n data: toBase64(found.bytes),\n mime_type: found.mime,\n };\n return inline;\n });\n // A whole-video inline body is large; never retry it, just try once.\n try {\n interaction = await callCreate(inlineParts);\n } catch (inlineCause) {\n throwSdkError(inlineCause, modelId);\n }\n }\n } finally {\n // Delete the uploads as soon as the create settles so a poll-only\n // consumer does not leak them.\n await cleanupUploads();\n }\n\n const jobId = interaction.id ?? crypto.randomUUID();\n const usage = videoUsage(ctx, req, duration);\n const getInteraction = async (): Promise<OmniInteraction> => {\n try {\n const getParams: OmniGetParams = { stream: false };\n return await client.interactions.get(jobId, getParams);\n } catch (cause) {\n throwSdkError(cause, modelId);\n }\n };\n\n return {\n jobId,\n async poll() {\n const current = await getInteraction();\n const status = (current.status ?? \"\").toUpperCase();\n if (status === \"COMPLETED\") return { status: \"succeeded\", raw: current };\n if (status === \"FAILED\") return { status: \"failed\", raw: current };\n if (status === \"PENDING\") return { status: \"pending\", raw: current };\n return { status: \"running\", raw: current };\n },\n async result(opts) {\n const signal = opts?.signal ?? ctx.signal;\n const pollOptions: PollOptions = {\n intervalMs: opts?.pollIntervalMs ?? OMNI_POLL_INTERVAL_MS,\n timeoutMs: opts?.timeoutMs ?? RESULT_TIMEOUT_MS,\n };\n if (signal !== undefined) pollOptions.signal = signal;\n const done = await pollUntil<OmniInteraction>(async () => {\n const current = await getInteraction();\n const status = (current.status ?? \"\").toUpperCase();\n if (status === \"COMPLETED\") return current;\n if (status === \"FAILED\") {\n throw classifyHttpError(\n undefined,\n `Gemini Omni interaction failed: ${JSON.stringify(current).slice(0, 500)}`,\n \"google-genai\",\n modelId,\n );\n }\n return undefined;\n }, pollOptions);\n const video = extractOmniVideo(done, modelId);\n if (video.data) {\n return {\n video: {\n bytes: Buffer.from(video.data, \"base64\"),\n mime: video.mime_type ?? \"video/mp4\",\n },\n usage,\n raw: done,\n };\n }\n if (video.uri)\n return {\n video: await downloadVideo(ctx, video.uri, apiKey, signal),\n usage,\n raw: done,\n };\n throw classifyHttpError(\n undefined,\n \"No video content in Gemini Omni response\",\n \"google-genai\",\n modelId,\n );\n },\n };\n}\n\n/**\n * Lyria has no duration in its response, so usage is one flat unit per call.\n * Token counts ride along as inputTokens/outputTokens when Gemini reports them.\n */\nfunction lyriaUsage(\n ctx: AdapterContext,\n req: AudioRequest,\n meta: GeminiUsageMetadata | undefined,\n): UsageEvent {\n const event: UsageEvent = {\n model: ctx.model.id,\n provider: \"google-genai\",\n modality: \"AUDIO\",\n unit: \"images\",\n quantity: 1,\n };\n if (req.durationSeconds !== undefined) event.durationSeconds = req.durationSeconds;\n if (meta?.promptTokenCount !== undefined) event.inputTokens = meta.promptTokenCount;\n if (meta?.candidatesTokenCount !== undefined) event.outputTokens = meta.candidatesTokenCount;\n return event;\n}\n\nasync function generateLyriaAudio(\n req: AudioRequest,\n ctx: AdapterContext,\n createGenAIClient: GenAIClientFactory,\n): Promise<AudioResult> {\n const apiKey = googleKey(ctx);\n const modelId = ctx.model.id;\n const parts: GeminiPart[] = [{ text: req.prompt }];\n for (const ref of req.references ?? []) {\n const image = await resolveMedia(ref, ctx.fetch, ctx.signal, \"image/jpeg\", modelId);\n parts.push({ inlineData: { mimeType: image.mime, data: toBase64(image.bytes) } });\n }\n const client = createGenAIClient({ apiKey });\n const retryOptions: RetryOptions = { attempts: 3 };\n if (ctx.signal !== undefined) retryOptions.signal = ctx.signal;\n let response: GeminiGenerateContentResponse;\n try {\n response = await withRetry(async () => {\n try {\n return await client.models.generateContent({\n model: ctx.model.providerModelId,\n contents: [{ parts }],\n });\n } catch (cause) {\n throwSdkError(cause, modelId);\n }\n }, retryOptions);\n } catch (cause) {\n throwSdkError(cause, modelId);\n }\n\n // Part order is not guaranteed, so scan every part.\n const lyrics: string[] = [];\n let audio: { bytes: Uint8Array; mime: string } | undefined;\n for (const part of response.candidates?.[0]?.content?.parts ?? []) {\n if (part.text) lyrics.push(part.text);\n else if (part.inlineData?.data && audio === undefined) {\n audio = {\n bytes: new Uint8Array(Buffer.from(part.inlineData.data, \"base64\")),\n mime: part.inlineData.mimeType ?? \"audio/mp3\",\n };\n }\n }\n if (audio === undefined) {\n throw classifyHttpError(\n undefined,\n \"No audio data in Lyria response\",\n \"google-genai\",\n modelId,\n );\n }\n const meta = response.usageMetadata;\n const rawUsage: JsonObject = {};\n if (meta?.promptTokenCount !== undefined) rawUsage.promptTokenCount = meta.promptTokenCount;\n if (meta?.candidatesTokenCount !== undefined)\n rawUsage.candidatesTokenCount = meta.candidatesTokenCount;\n if (meta?.totalTokenCount !== undefined) rawUsage.totalTokenCount = meta.totalTokenCount;\n const result: AudioResult = {\n audio,\n usage: lyriaUsage(ctx, req, meta),\n raw: { usageMetadata: rawUsage },\n };\n if (lyrics.length > 0) result.text = lyrics.join(\"\\n\");\n return result;\n}\n\nasync function prepareGoogleMediaPart(\n ref: MediaRef,\n mediaType: string,\n ctx: AdapterContext,\n): Promise<MediaPart> {\n if (\"url\" in ref) return { type: \"file\", data: ref.url, mediaType };\n if (ref.bytes.length <= MEDIA_PART_INLINE_LIMIT_BYTES) {\n return { type: \"file\", data: ref.bytes, mediaType };\n }\n const apiKey = googleKey(ctx);\n const uploadOptions: GoogleFilesOptions = {\n apiKey,\n fetchImpl: ctx.fetch,\n model: ctx.model.id,\n label: \"media-part\",\n };\n if (ctx.signal !== undefined) uploadOptions.signal = ctx.signal;\n const file = await uploadGoogleFile({ bytes: ref.bytes, mime: mediaType }, uploadOptions);\n return {\n type: \"file\",\n data: file.fileUri,\n mediaType: file.mimeType,\n cleanup: () => deleteGoogleFile(file.fileName, apiKey, ctx.fetch),\n };\n}\n","import { z } from \"zod\";\nimport { ModelKitError } from \"../errors.js\";\nimport { classifyHttpError, pollUntil, withRetry, type RetryOptions } from \"../retry.js\";\n\nexport const GOOGLE_FILES_BASE = \"https://generativelanguage.googleapis.com\";\nexport const GOOGLE_FILES_POLL_INTERVAL_MS = 2000;\nexport const GOOGLE_FILES_POLL_TIMEOUT_MS = 5 * 60 * 1000;\nexport const GOOGLE_FILES_MAX_BYTES = 2 * 1024 * 1024 * 1024;\n\nconst GENERIC_MEDIA_TYPES = new Set([\n \"application/octet-stream\",\n \"binary/octet-stream\",\n \"application/binary\",\n]);\n\nexport type GoogleFilesSource = { bytes: Uint8Array; mime: string } | { url: string; mime: string };\n\nexport interface GoogleUploadedFile {\n fileUri: string;\n fileName: string;\n mimeType: string;\n}\n\nexport interface GoogleFilesOptions {\n apiKey: string;\n fetchImpl: typeof fetch;\n signal?: AbortSignal;\n model?: string;\n label?: string;\n}\n\ninterface UploadedFileRef {\n fileUri: string;\n fileName: string;\n mimeType: string;\n state?: string;\n}\n\ninterface PollOptions {\n intervalMs: number;\n timeoutMs: number;\n signal?: AbortSignal;\n}\n\nconst uploadedFileSchema = z.object({\n file: z\n .object({\n uri: z.string().optional(),\n name: z.string().optional(),\n state: z.string().optional(),\n mimeType: z.string().optional(),\n })\n .optional(),\n});\n\nconst fileStateSchema = z.object({\n state: z.string().optional(),\n error: z.object({ message: z.string().optional() }).optional(),\n});\n\nfunction resolveMime(declared: string | null, fallback: string): string {\n const clean = declared?.split(\";\")[0]?.trim().toLowerCase();\n if (!clean || GENERIC_MEDIA_TYPES.has(clean)) return fallback;\n if (clean.split(\"/\")[0] !== fallback.split(\"/\")[0]) return fallback;\n return clean;\n}\n\nfunction fileNameFromUri(fileUri: string, model?: string): string {\n const name = fileUri.match(/files\\/[^/?]+/)?.[0];\n if (!name)\n throw classifyHttpError(\n undefined,\n `Files API returned an unparseable file URI`,\n \"google-genai\",\n model,\n );\n return name;\n}\n\nfunction oversizeError(bytes: number, label: string, model?: string): ModelKitError {\n const init: ConstructorParameters<typeof ModelKitError>[0] = {\n code: \"unsupported_option\",\n message: `${label}: source is ${bytes} bytes, over the Files API limit of ${GOOGLE_FILES_MAX_BYTES}`,\n provider: \"google-genai\",\n retryable: false,\n };\n if (model !== undefined) init.model = model;\n return new ModelKitError(init);\n}\n\nasync function resolveSource(\n source: GoogleFilesSource,\n fetchImpl: typeof fetch,\n signal: AbortSignal | undefined,\n label: string,\n model?: string,\n): Promise<{ bytes: Uint8Array; mimeType: string }> {\n if (\"bytes\" in source) return { bytes: source.bytes, mimeType: source.mime };\n const init: RequestInit = {};\n if (signal !== undefined) init.signal = signal;\n const res = await fetchImpl(source.url, init);\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw classifyHttpError(res.status, text, \"google-genai\", model);\n }\n const declared = Number(res.headers.get(\"content-length\"));\n if (Number.isFinite(declared) && declared > GOOGLE_FILES_MAX_BYTES) {\n throw oversizeError(declared, label, model);\n }\n const bytes = new Uint8Array(await res.arrayBuffer());\n return { bytes, mimeType: resolveMime(res.headers.get(\"content-type\"), source.mime) };\n}\n\nasync function startAndUpload(\n bytes: Uint8Array,\n mimeType: string,\n opts: GoogleFilesOptions,\n): Promise<UploadedFileRef> {\n const startInit: RequestInit = {\n method: \"POST\",\n headers: {\n \"x-goog-api-key\": opts.apiKey,\n \"X-Goog-Upload-Protocol\": \"resumable\",\n \"X-Goog-Upload-Command\": \"start\",\n \"X-Goog-Upload-Header-Content-Length\": String(bytes.length),\n \"X-Goog-Upload-Header-Content-Type\": mimeType,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ file: {} }),\n };\n if (opts.signal !== undefined) startInit.signal = opts.signal;\n const startRes = await opts.fetchImpl(`${GOOGLE_FILES_BASE}/upload/v1beta/files`, startInit);\n if (!startRes.ok) {\n const text = await startRes.text().catch(() => \"\");\n throw classifyHttpError(startRes.status, text, \"google-genai\", opts.model);\n }\n const uploadUrl = startRes.headers.get(\"x-goog-upload-url\");\n if (!uploadUrl) {\n throw classifyHttpError(\n undefined,\n \"Files API start response carried no upload URL\",\n \"google-genai\",\n opts.model,\n );\n }\n const uploadInit: RequestInit = {\n method: \"POST\",\n headers: {\n \"X-Goog-Upload-Command\": \"upload, finalize\",\n \"X-Goog-Upload-Offset\": \"0\",\n \"Content-Type\": mimeType,\n \"Content-Length\": String(bytes.length),\n },\n body: bytes,\n };\n if (opts.signal !== undefined) uploadInit.signal = opts.signal;\n const upRes = await opts.fetchImpl(uploadUrl, uploadInit);\n if (!upRes.ok) {\n const text = await upRes.text().catch(() => \"\");\n throw classifyHttpError(upRes.status, text, \"google-genai\", opts.model);\n }\n const uploaded = uploadedFileSchema.parse(await upRes.json());\n const fileUri = uploaded.file?.uri;\n if (!fileUri) {\n throw classifyHttpError(\n undefined,\n \"Files API upload returned no file URI\",\n \"google-genai\",\n opts.model,\n );\n }\n const ref: UploadedFileRef = {\n fileUri,\n fileName: uploaded.file?.name ?? fileNameFromUri(fileUri, opts.model),\n mimeType: uploaded.file?.mimeType ?? mimeType,\n };\n if (uploaded.file?.state !== undefined) ref.state = uploaded.file.state;\n return ref;\n}\n\nasync function waitForActive(fileName: string, opts: GoogleFilesOptions): Promise<void> {\n const pollOptions: PollOptions = {\n intervalMs: GOOGLE_FILES_POLL_INTERVAL_MS,\n timeoutMs: GOOGLE_FILES_POLL_TIMEOUT_MS,\n };\n const retryInit: RequestInit = {\n headers: { \"x-goog-api-key\": opts.apiKey },\n };\n if (opts.signal !== undefined) {\n pollOptions.signal = opts.signal;\n retryInit.signal = opts.signal;\n }\n await pollUntil<true>(async () => {\n const res = await opts.fetchImpl(`${GOOGLE_FILES_BASE}/v1beta/${fileName}`, retryInit);\n if (res.ok) {\n const json = fileStateSchema.parse(await res.json());\n if (json.state === \"ACTIVE\") return true;\n if (json.state === \"FAILED\") {\n throw classifyHttpError(\n undefined,\n `Files API processing failed for ${fileName}: ${json.error?.message ?? \"unknown error\"}`,\n \"google-genai\",\n opts.model,\n );\n }\n return undefined;\n }\n if (res.status === 429 || res.status >= 500) return undefined;\n const text = await res.text().catch(() => \"\");\n throw classifyHttpError(res.status, text, \"google-genai\", opts.model);\n }, pollOptions);\n}\n\nexport async function deleteGoogleFile(\n fileName: string,\n apiKey: string,\n fetchImpl: typeof fetch,\n): Promise<void> {\n try {\n await fetchImpl(`${GOOGLE_FILES_BASE}/v1beta/${fileName}`, {\n method: \"DELETE\",\n headers: { \"x-goog-api-key\": apiKey },\n });\n } catch {\n // Best-effort quota cleanup; never mask the real result.\n }\n}\n\nexport async function uploadGoogleFile(\n source: GoogleFilesSource,\n opts: GoogleFilesOptions,\n): Promise<GoogleUploadedFile> {\n const label = opts.label ?? \"google-files\";\n const { bytes, mimeType } = await resolveSource(\n source,\n opts.fetchImpl,\n opts.signal,\n label,\n opts.model,\n );\n if (bytes.length > GOOGLE_FILES_MAX_BYTES) throw oversizeError(bytes.length, label, opts.model);\n const retryOptions: RetryOptions = { attempts: 3 };\n if (opts.signal !== undefined) retryOptions.signal = opts.signal;\n const uploaded = await withRetry(() => startAndUpload(bytes, mimeType, opts), retryOptions);\n if (uploaded.state !== \"ACTIVE\") {\n try {\n await waitForActive(uploaded.fileName, opts);\n } catch (err) {\n await deleteGoogleFile(uploaded.fileName, opts.apiKey, opts.fetchImpl);\n throw err;\n }\n }\n return { fileUri: uploaded.fileUri, fileName: uploaded.fileName, mimeType: uploaded.mimeType };\n}\n","import { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { generateText } from \"ai\";\nimport type { LanguageModel } from \"ai\";\nimport { z } from \"zod\";\nimport { ModelKitError } from \"../errors.js\";\nimport { describeThrown } from \"../json.js\";\nimport { classifyHttpError, transportError, withRetry } from \"../retry.js\";\nimport type { RetryOptions } from \"../retry.js\";\nimport type { Adapter, AdapterContext } from \"./adapter.js\";\nimport type { ImageRequest, ImageResult, ImageSafetySetting } from \"../types.js\";\n\n/** 4K Gemini payloads are ~22MB JSON and take 40-50s; bound each attempt at 10m. */\nconst GEMINI_IMAGE_TIMEOUT_MS = 600_000;\n\nexport interface GoogleImageClientOptions {\n apiKey: string;\n fetch: typeof fetch;\n}\n\nexport type GeminiImageConfig = {\n aspectRatio?: string;\n imageSize?: string;\n};\n\nexport type GoogleImageProviderConfig = {\n imageConfig: GeminiImageConfig;\n responseModalities: string[];\n safetySettings?: ImageSafetySetting[];\n};\n\nexport type GoogleImageContentPart =\n | { type: \"text\"; text: string }\n | { type: \"image\"; image: string | Uint8Array; mediaType?: string };\n\nexport interface GoogleImageGenOptions {\n model: LanguageModel;\n messages: Array<{ role: \"user\"; content: GoogleImageContentPart[] }>;\n maxRetries: number;\n providerOptions: {\n google: GoogleImageProviderConfig;\n };\n abortSignal: AbortSignal;\n temperature?: number;\n}\n\nexport interface GoogleImageGenFile {\n mediaType: string;\n uint8Array: Uint8Array;\n}\n\nexport interface GoogleImageGenResult {\n files?: GoogleImageGenFile[];\n text?: string;\n finishReason?: string;\n // `| undefined` matches the SDK's LanguageModelUsage under exactOptionalPropertyTypes.\n usage?: { inputTokens?: number | undefined; outputTokens?: number | undefined };\n}\n\nexport interface GoogleImageAdapterDeps {\n createGoogleClient: (opts: GoogleImageClientOptions) => (modelId: string) => LanguageModel;\n runTextGeneration: (opts: GoogleImageGenOptions) => Promise<GoogleImageGenResult>;\n}\n\nconst defaultGoogleImageDeps: GoogleImageAdapterDeps = {\n createGoogleClient: (opts) => createGoogleGenerativeAI(opts),\n runTextGeneration: (opts) => generateText(opts),\n};\n\nconst causeChainNodeSchema = z.object({\n message: z.string().optional(),\n cause: z.unknown().optional(),\n});\n\n/**\n * Gemini's blockReason arrives wrapped as AI_APICallError(\"Invalid JSON\n * response\") -> cause AI_TypeValidationError whose message embeds the raw\n * Gemini JSON. Walk the whole cause chain for it.\n */\nexport function extractBlockReason(cause: unknown): string | null {\n let current: unknown = cause;\n const seen = new Set<unknown>();\n for (;;) {\n if (current === null || current !== Object(current)) return null;\n if (seen.has(current)) return null;\n seen.add(current);\n const parsed = causeChainNodeSchema.safeParse(current);\n if (!parsed.success) return null;\n const message = parsed.data.message;\n if (message !== undefined) {\n const match = message.match(/\"blockReason\"\\s*:\\s*\"([^\"]+)\"/);\n const found = match?.[1];\n if (found !== undefined) return found;\n }\n current = parsed.data.cause ?? null;\n }\n}\n\nfunction toProviderError(cause: unknown, ctx: AdapterContext): ModelKitError {\n const blockReason = extractBlockReason(cause);\n if (blockReason) {\n return new ModelKitError({\n code: \"content_blocked\",\n message:\n `google-image blocked the request (blockReason: ${blockReason}). ` +\n \"Try removing or replacing the reference image.\",\n provider: \"google-image\",\n model: ctx.model.id,\n body: { blockReason },\n cause,\n retryable: false,\n });\n }\n const info = describeThrown(cause);\n // No status means the request never got a response: a dropped connection, not a verdict.\n if (info.status === undefined) return transportError(\"google-image\", cause, ctx.model.id);\n return classifyHttpError(info.status, info.body, \"google-image\", ctx.model.id);\n}\n\nexport function createGoogleImageAdapter(\n deps: GoogleImageAdapterDeps = defaultGoogleImageDeps,\n): Adapter {\n return {\n id: \"google-image\",\n async generateImage(req: ImageRequest, ctx: AdapterContext): Promise<ImageResult> {\n const apiKey = ctx.keys.google;\n if (!apiKey)\n throw new ModelKitError({\n code: \"auth\",\n message: \"Missing API key for google\",\n provider: \"google-image\",\n model: ctx.model.id,\n retryable: false,\n });\n // Never route through Cloudflare: the gateway buffers upstream\n // responses and closes the connection at ~60s, but a 4K Gemini image\n // can take 40-50s to come back from Google.\n const google = deps.createGoogleClient({ apiKey, fetch: ctx.fetch });\n const model = google(ctx.model.providerModelId);\n\n const content: GoogleImageContentPart[] = [];\n for (const ref of req.references ?? []) {\n if (ref.label !== undefined) content.push({ type: \"text\", text: ref.label });\n if (\"url\" in ref) content.push({ type: \"image\", image: ref.url });\n else content.push({ type: \"image\", image: ref.bytes, mediaType: ref.mime });\n }\n content.push({ type: \"text\", text: req.prompt });\n\n const imageConfig: GeminiImageConfig = {};\n if (req.aspectRatio !== undefined && req.aspectRatio !== \"adaptive\")\n imageConfig.aspectRatio = req.aspectRatio;\n if (req.size !== undefined) imageConfig.imageSize = req.size;\n\n const googleOptions: GoogleImageProviderConfig = {\n imageConfig,\n responseModalities: [\"IMAGE\"],\n };\n if (req.safetySettings !== undefined) googleOptions.safetySettings = req.safetySettings;\n\n const retryOptions: RetryOptions = {};\n if (ctx.signal !== undefined) retryOptions.signal = ctx.signal;\n const result = await withRetry(async () => {\n const timeout = AbortSignal.timeout(GEMINI_IMAGE_TIMEOUT_MS);\n const signal =\n ctx.signal !== undefined ? AbortSignal.any([ctx.signal, timeout]) : timeout;\n try {\n const genOptions: GoogleImageGenOptions = {\n model,\n messages: [{ role: \"user\", content }],\n maxRetries: 0,\n providerOptions: {\n google: googleOptions,\n },\n abortSignal: signal,\n };\n // generateText's call setting lands as generationConfig.temperature.\n if (req.temperature !== undefined) genOptions.temperature = req.temperature;\n return await deps.runTextGeneration(genOptions);\n } catch (cause) {\n throw toProviderError(cause, ctx);\n }\n }, retryOptions);\n\n const images = (result.files ?? [])\n .filter((file) => file.mediaType.startsWith(\"image/\"))\n .map((file) => ({ bytes: file.uint8Array, mime: file.mediaType }));\n if (images.length === 0) {\n // Gemini reports a filtered prompt as finishReason \"other\" or \"content-filter\" with no\n // files and often a refusal in `text`, not as an HTTP error.\n const filtered =\n result.finishReason === \"content-filter\" || result.finishReason === \"other\";\n throw new ModelKitError({\n code: filtered ? \"content_blocked\" : \"provider_rejected\",\n message:\n `google-image returned no image (finishReason: ${result.finishReason}). ${result.text}`.trim(),\n provider: \"google-image\",\n model: ctx.model.id,\n body: { finishReason: result.finishReason ?? null, text: result.text ?? \"\" },\n retryable: false,\n });\n }\n\n const usage: ImageResult[\"usage\"] = {\n model: ctx.model.id,\n provider: \"google-image\",\n modality: \"IMAGE\",\n unit: \"images\",\n quantity: images.length,\n imageQuality: \"auto\",\n };\n if (req.size !== undefined) usage.imageSize = req.size;\n if (result.usage?.inputTokens !== undefined)\n usage.inputTokens = result.usage.inputTokens;\n if (result.usage?.outputTokens !== undefined)\n usage.outputTokens = result.usage.outputTokens;\n return { images, usage, raw: result };\n },\n };\n}\n\nexport const googleImageAdapter: Adapter = createGoogleImageAdapter();\n","import { z } from \"zod\";\nimport type { Adapter, AdapterContext } from \"./adapter.js\";\nimport { ModelKitError, isModelKitError, type ModelKitErrorInit } from \"../errors.js\";\nimport { classifyHttpError, classifyThrown, pollUntil, withRetry } from \"../retry.js\";\nimport type { RetryOptions } from \"../retry.js\";\nimport { JsonValueSchema } from \"../json.js\";\nimport type { JsonValue, UsageEvent, VideoJob, VideoRequest, VideoResult } from \"../types.js\";\nimport { DEFAULT_MOTION, resolveMotionId } from \"./higgsfield-motions.js\";\nimport { readBody, refToUrl, throwIfAborted } from \"./media-ref.js\";\n\nconst PLATFORM = \"https://platform.higgsfield.ai\";\nconst DOP_ENDPOINT = `${PLATFORM}/v1/image2video/dop`;\nconst DOP_STATUS = `${PLATFORM}/requests/{set_id}/status`;\n\nconst KLING_INTERVAL_MS = 2000;\nconst KLING_BACKOFF = 1.2;\nconst KLING_MAX_INTERVAL_MS = 10_000;\nconst KLING_TIMEOUT_MS = 15 * 60_000;\nconst DOP_INTERVAL_MS = 5000;\nconst DOP_TIMEOUT_MS = 5 * 60_000;\n/** DOP output length is provider-fixed; bill it when the caller requests no duration. */\nconst DOP_FALLBACK_DURATION_SECONDS = 5;\n\nconst DEFAULT_NEGATIVE_PROMPT =\n \"text, watermark, copyright, blur, low quality, distortion, abstract, weird, deformed\";\n\ninterface HiggsfieldCredentials {\n key: string;\n secret: string;\n}\n\ntype HiggsfieldHeaders = {\n \"Content-Type\": string;\n \"hf-api-key\": string;\n \"hf-secret\": string;\n};\n\ninterface PollSettings {\n intervalMs: number;\n timeoutMs: number;\n signal?: AbortSignal;\n backoff?: number;\n maxIntervalMs?: number;\n}\n\nfunction credentials(ctx: AdapterContext): HiggsfieldCredentials {\n const key = ctx.keys.higgsfield;\n const secret = ctx.keys.higgsfieldSecret;\n if (!key || !secret) {\n throw new ModelKitError({\n code: \"auth\",\n message: \"Missing API key for higgsfield\",\n provider: \"higgsfield\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n return { key, secret };\n}\n\nfunction headers(ctx: AdapterContext): HiggsfieldHeaders {\n const { key, secret } = credentials(ctx);\n return { \"Content-Type\": \"application/json\", \"hf-api-key\": key, \"hf-secret\": secret };\n}\n\n// providerModelId may be a relative model path; prefix the platform host.\nfunction klingEndpoint(providerModelId: string): string {\n if (providerModelId.startsWith(\"http\")) return providerModelId;\n const path = providerModelId.startsWith(\"/\") ? providerModelId.slice(1) : providerModelId;\n return `${PLATFORM}/${path}`;\n}\n\n// DOP is picked by exact providerModelId, never by substring; every other\n// higgsfield row is Kling.\ntype HiggsfieldVideoKind = \"dop\" | \"kling\";\n\nconst DOP_MODEL_IDS: ReadonlySet<string> = new Set([\"dop\", \"dop-preview\"]);\n\nfunction higgsfieldVideoKind(providerModelId: string): HiggsfieldVideoKind {\n return DOP_MODEL_IDS.has(providerModelId.toLowerCase()) ? \"dop\" : \"kling\";\n}\n\nfunction videoUsage(ctx: AdapterContext, req: VideoRequest, duration?: number): UsageEvent {\n const event: UsageEvent = {\n model: ctx.model.id,\n provider: \"higgsfield\",\n modality: \"VIDEO\",\n unit: \"seconds\",\n quantity: duration ?? req.durationSeconds ?? 0,\n };\n if (req.resolution !== undefined) event.resolution = req.resolution;\n if (req.durationSeconds !== undefined) event.durationSeconds = req.durationSeconds;\n return event;\n}\n\ninterface KlingCreate {\n prompt: string;\n image_url: string;\n duration?: number;\n aspect_ratio?: string;\n cfg_scale: number;\n negative_prompt: string;\n last_image_url?: string;\n}\n\nconst klingCreateSchema = z.object({ status_url: z.string() });\n\nconst klingStatusSchema = z.object({\n status: z.string().optional(),\n video: z.object({ url: z.string().optional() }).optional(),\n error: JsonValueSchema.optional(),\n});\n\nconst errorMessageSchema = z.object({ message: z.string().optional() });\nconst textValueSchema = z.string();\n\nfunction klingErrorDetail(error: JsonValue | undefined): string {\n if (error === undefined) return \"unknown_error\";\n const asText = textValueSchema.safeParse(error);\n if (asText.success) return asText.data;\n const asObject = errorMessageSchema.safeParse(error);\n if (asObject.success) return asObject.data.message ?? \"unknown_error\";\n return \"unknown_error\";\n}\n\nfunction requestInit(\n ctx: AdapterContext,\n init: { method: \"GET\" | \"POST\"; body?: string },\n): RequestInit {\n const request: RequestInit = { method: init.method, headers: headers(ctx) };\n if (init.body !== undefined) request.body = init.body;\n if (ctx.signal !== undefined) request.signal = ctx.signal;\n return request;\n}\n\n/**\n * Submit a create request. A rejected fetch is a transport failure (retryable\n * network); an HTTP response is classified by its status. The caller wraps this\n * in `withRetry`, so a retryable failure is retried on the next attempt.\n */\nasync function createRequest(\n ctx: AdapterContext,\n url: string,\n init: { method: \"GET\" | \"POST\"; body?: string },\n): Promise<Response> {\n let res: Response;\n try {\n res = await ctx.fetch(url, requestInit(ctx, init));\n } catch (cause) {\n throw classifyThrown(\"higgsfield\", cause, ctx.model.id);\n }\n if (!res.ok) {\n throw classifyHttpError(res.status, await readBody(res), \"higgsfield\", ctx.model.id);\n }\n return res;\n}\n\nasync function generateKlingVideo(req: VideoRequest, ctx: AdapterContext): Promise<VideoJob> {\n const firstFrame = req.firstFrame ? refToUrl(req.firstFrame) : undefined;\n if (!firstFrame) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${ctx.model.id} requires firstFrame`,\n provider: \"higgsfield\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const body: KlingCreate = {\n prompt: req.prompt.trim(),\n image_url: firstFrame,\n cfg_scale: req.cfgScale ?? 0.5,\n negative_prompt: req.negativePrompt ?? DEFAULT_NEGATIVE_PROMPT,\n };\n if (req.durationSeconds !== undefined) body.duration = req.durationSeconds;\n if (req.aspectRatio !== undefined && req.aspectRatio !== \"adaptive\")\n body.aspect_ratio = req.aspectRatio;\n if (req.lastFrame) body.last_image_url = refToUrl(req.lastFrame);\n\n const endpoint = klingEndpoint(ctx.model.providerModelId);\n const retryOptions: RetryOptions = {};\n if (ctx.signal !== undefined) retryOptions.signal = ctx.signal;\n const createRes = await withRetry(\n () => createRequest(ctx, endpoint, { method: \"POST\", body: JSON.stringify(body) }),\n retryOptions,\n );\n const created = klingCreateSchema.safeParse(await createRes.json());\n if (!created.success) {\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: \"Higgsfield create returned no status_url\",\n provider: \"higgsfield\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const statusUrl = created.data.status_url;\n const check = async (): Promise<string | undefined> => {\n let res: Response;\n try {\n res = await ctx.fetch(statusUrl, requestInit(ctx, { method: \"GET\" }));\n } catch {\n return undefined;\n }\n // A status poll that hits a 429 or 5xx is transient: keep polling until\n // the timeout instead of failing an otherwise healthy job.\n if (res.status === 429 || res.status >= 500) return undefined;\n if (!res.ok) {\n throw classifyHttpError(res.status, await readBody(res), \"higgsfield\", ctx.model.id);\n }\n const payload: JsonValue = JsonValueSchema.parse(await res.json());\n const parsed = klingStatusSchema.safeParse(payload);\n const statusValue = parsed.success ? parsed.data.status : undefined;\n if (statusValue === \"completed\") {\n const videoUrl = parsed.success ? parsed.data.video?.url : undefined;\n if (videoUrl === undefined) {\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: \"Higgsfield completed without a video URL\",\n provider: \"higgsfield\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n return videoUrl;\n }\n if (statusValue === \"failed\") {\n const errorValue = parsed.success ? parsed.data.error : undefined;\n const detail = klingErrorDetail(errorValue);\n const failure: ModelKitErrorInit = {\n code: \"provider_rejected\",\n message: `Higgsfield generation failed: ${detail}`,\n provider: \"higgsfield\",\n model: ctx.model.id,\n retryable: false,\n };\n if (errorValue !== undefined) failure.body = errorValue;\n throw new ModelKitError(failure);\n }\n return undefined;\n };\n return {\n jobId: statusUrl,\n async poll() {\n try {\n const url = await check();\n return url ? { status: \"succeeded\" } : { status: \"pending\" };\n } catch (cause) {\n if (isModelKitError(cause) && !cause.retryable) return { status: \"failed\" };\n throw cause;\n }\n },\n async result(opts) {\n const klingSignal = opts?.signal ?? ctx.signal;\n const pollSettings: PollSettings = {\n intervalMs: opts?.pollIntervalMs ?? KLING_INTERVAL_MS,\n backoff: KLING_BACKOFF,\n maxIntervalMs: KLING_MAX_INTERVAL_MS,\n timeoutMs: opts?.timeoutMs ?? KLING_TIMEOUT_MS,\n };\n if (klingSignal !== undefined) pollSettings.signal = klingSignal;\n const url = await pollUntil(check, pollSettings);\n const result: VideoResult = { video: { url }, usage: videoUsage(ctx, req) };\n return result;\n },\n };\n}\n\nconst dopMotionOptionsSchema = z.object({\n modelkit: z.object({ motion: z.string().optional() }).optional(),\n});\n\n// Motion name comes from the catalog row's providerOptions.modelkit.motion; unknown names\n// fall back to the General motion, mirroring resolveMotionId's null case.\nfunction dopMotionId(ctx: AdapterContext): string {\n const parsed = dopMotionOptionsSchema.safeParse(ctx.model.providerOptions);\n const motion = parsed.success ? parsed.data.modelkit?.motion : undefined;\n const id =\n motion === undefined\n ? resolveMotionId(DEFAULT_MOTION)\n : (resolveMotionId(motion) ?? resolveMotionId(DEFAULT_MOTION));\n if (id === null)\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: \"no DOP motion\",\n provider: \"higgsfield\",\n model: ctx.model.id,\n retryable: false,\n });\n return id;\n}\n\nconst jsonRecordSchema = z.record(z.string(), JsonValueSchema);\n\nconst DOP_URL_KEYS = [\"url\", \"video_url\", \"output_url\", \"result_url\", \"download_url\"];\nconst DOP_NESTED_KEYS = [\"video\", \"result\", \"results\"];\n\nfunction dopUrl(body: JsonValue): string | undefined {\n if (Array.isArray(body)) {\n for (const item of body) {\n const found = dopUrl(item);\n if (found !== undefined) return found;\n }\n return undefined;\n }\n const record = jsonRecordSchema.safeParse(body);\n if (!record.success) return undefined;\n const obj = record.data;\n for (const key of DOP_URL_KEYS) {\n const candidate = obj[key];\n if (candidate === undefined) continue;\n const asUrl = textValueSchema.safeParse(candidate);\n if (asUrl.success && asUrl.data !== \"\") return asUrl.data;\n }\n for (const key of DOP_NESTED_KEYS) {\n const nested = obj[key];\n if (nested === undefined || nested === null) continue;\n const found = dopUrl(nested);\n if (found !== undefined) return found;\n }\n return undefined;\n}\n\ninterface DopMotionEntry {\n id: string;\n strength: number;\n}\n\ninterface DopInputImage {\n type: string;\n image_url: string;\n}\n\ninterface DopSubmitParams {\n model: string;\n prompt: string;\n motions: DopMotionEntry[];\n check_nsfw: boolean;\n input_images: DopInputImage[];\n enhance_prompt: boolean;\n webhook: null;\n input_images_end?: DopInputImage[];\n seed?: number;\n}\n\nconst dopCreateSchema = z.object({ id: z.string() });\n\nconst dopStatusSchema = z.object({ status: z.string().optional() });\n\nasync function generateDopVideo(req: VideoRequest, ctx: AdapterContext): Promise<VideoJob> {\n const firstFrame = req.firstFrame ? refToUrl(req.firstFrame) : undefined;\n if (!firstFrame) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${ctx.model.id} requires firstFrame`,\n provider: \"higgsfield\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const params: DopSubmitParams = {\n model: \"dop-preview\",\n prompt: req.prompt,\n motions: [{ id: dopMotionId(ctx), strength: 1.0 }],\n check_nsfw: true,\n input_images: [{ type: \"image_url\", image_url: firstFrame }],\n enhance_prompt: true,\n webhook: null,\n };\n if (req.lastFrame) {\n params.input_images_end = [{ type: \"image_url\", image_url: refToUrl(req.lastFrame) }];\n }\n if (req.seed !== undefined) params.seed = req.seed;\n\n const retryOptions: RetryOptions = {};\n if (ctx.signal !== undefined) retryOptions.signal = ctx.signal;\n const createRes = await withRetry(\n () =>\n createRequest(ctx, DOP_ENDPOINT, {\n method: \"POST\",\n body: JSON.stringify({ params, webhook: null }),\n }),\n retryOptions,\n );\n const created = dopCreateSchema.safeParse(await createRes.json());\n if (!created.success) {\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: \"Higgsfield DOP submit returned no set id\",\n provider: \"higgsfield\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const setId = created.data.id;\n const statusUrl = DOP_STATUS.replace(\"{set_id}\", setId);\n const check = async (): Promise<string | undefined> => {\n let res: Response;\n try {\n res = await ctx.fetch(statusUrl, requestInit(ctx, { method: \"GET\" }));\n } catch {\n return undefined;\n }\n if (!res.ok) {\n // Unlike Kling, DOP treats poll-time 4xx as transient and keeps waiting.\n return undefined;\n }\n const payload: JsonValue = JsonValueSchema.parse(await res.json());\n const parsed = dopStatusSchema.safeParse(payload);\n const statusValue = parsed.success ? parsed.data.status : undefined;\n if (statusValue === \"completed\") {\n const url = dopUrl(payload);\n if (!url) {\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: \"Higgsfield DOP completed without a video URL\",\n provider: \"higgsfield\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n return url;\n }\n if (statusValue === \"failed\" || statusValue === \"error\" || statusValue === \"cancelled\") {\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: `Higgsfield DOP generation failed: ${statusValue}`,\n provider: \"higgsfield\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n return undefined;\n };\n return {\n jobId: setId,\n async poll() {\n try {\n const url = await check();\n return url ? { status: \"succeeded\" } : { status: \"pending\" };\n } catch (cause) {\n if (isModelKitError(cause) && !cause.retryable) return { status: \"failed\" };\n throw cause;\n }\n },\n async result(opts) {\n const dopSignal = opts?.signal ?? ctx.signal;\n const pollSettings: PollSettings = {\n intervalMs: opts?.pollIntervalMs ?? DOP_INTERVAL_MS,\n timeoutMs: opts?.timeoutMs ?? DOP_TIMEOUT_MS,\n };\n if (dopSignal !== undefined) pollSettings.signal = dopSignal;\n const url = await pollUntil(check, pollSettings);\n const result: VideoResult = {\n video: { url },\n usage: videoUsage(ctx, req, req.durationSeconds ?? DOP_FALLBACK_DURATION_SECONDS),\n };\n return result;\n },\n };\n}\n\nexport const higgsfieldAdapter: Adapter = {\n id: \"higgsfield\",\n generateVideo: (req, ctx) => {\n throwIfAborted(ctx.signal);\n return higgsfieldVideoKind(ctx.model.providerModelId) === \"dop\"\n ? generateDopVideo(req, ctx)\n : generateKlingVideo(req, ctx);\n },\n};\n","/**\n * Motion name → UUID for the Higgsfield DOP API.\n * Copied verbatim from trigger-workflows higgsfield-dop.ts MOTION_MAP.\n * Upstream holds 121 entries; the spec's 131st entries do not exist there,\n * so this file ports the list as-is. Lookup is case-insensitive.\n */\nexport interface MotionTable {\n [motionName: string]: string;\n}\n\nexport const MOTION_MAP: MotionTable = {\n \"360 Orbit\": \"ea035f68-b350-40f1-b7f4-7dff999fdd67\",\n \"3D Rotation\": \"2bae49e6-ffe7-42a8-a73f-d44632c4acaa\",\n Abstract: \"7f8971a6-9e96-45b6-a05a-8f5c99b1e13d\",\n \"Action Run\": \"dc8d7d9c-ae0c-45fc-b780-7d470b171b45\",\n \"Agent Reveal\": \"65b0a5a3-953d-471c-86d5-967ab44d0dab\",\n \"Angel Wings\": \"d21ff628-0d91-40b2-8508-cd5a0ce375d4\",\n \"Arc Left\": \"c5881721-05b1-47d9-94d6-0203863114e1\",\n \"Arc Right\": \"a85cb3f2-f2be-4ee2-b3b9-808fc6a81acc\",\n \"Baseball Kick\": \"ab0fa3d8-fcbe-4a6a-96bb-eae7a0e2c2cb\",\n \"Basketball Dunks\": \"1b4c1b9a-898b-451c-bff8-7288382ccaf2\",\n \"Black Tears\": \"161d2898-f7ed-43f5-8daa-1175bcc69ba9\",\n \"Bloom Mouth\": \"4a79cff8-ef78-42ca-aed9-3fb9acaed4ad\",\n Boxing: \"4ac80533-015b-49c1-a2eb-891603823883\",\n \"Buckle Up\": \"a652ae99-c21b-4bdf-965c-e4a6d07fb262\",\n \"Building Explosion\": \"cb8cfb5a-245d-4d96-92d7-7e0791967d75\",\n \"Bullet Time\": \"22d7c60a-b76f-4082-9928-d2a42357759a\",\n \"Car Chasing\": \"b98810ad-e51d-4680-a800-cd6fc8037bc4\",\n \"Car Explosion\": \"0235b1a9-428a-4df5-aa5a-93b6dba41834\",\n \"Car Grip\": \"b3fd6f79-dd5e-48f7-b5b4-5c2f1655822c\",\n Catwalk: \"0e339850-d8f1-4c9d-be3a-97fc2cdb628e\",\n \"Clone Explosion\": \"fd6272d6-7b7c-4c4e-9afd-c5c98aaa1b5c\",\n \"Crane Down\": \"b26dcbe5-e784-4893-b8a3-2bd4f848e90a\",\n \"Crane Over The Head\": \"0d736605-3a09-4a39-bcfe-b556fba7dd22\",\n \"Crane Up\": \"68af9add-43ea-4261-a706-16b640fdcff9\",\n \"Crash Zoom In\": \"3ec247ed-063d-476d-8266-48829c2eced6\",\n \"Crash Zoom Out\": \"3f7a86be-c78f-4c5d-8dbf-7395a3fbeea1\",\n Datamosh: \"e3112849-0c04-4af2-be93-ccbb0f8f4cd5\",\n Diamond: \"81d6b1c4-dd8a-4130-9c01-fe85bf80babc\",\n \"Dirty Lens\": \"29168a2c-04db-4ad1-8e19-f2a24371d413\",\n Disintegration: \"97ffe32a-ab9a-4067-9cf9-9adc30c2656f\",\n \"Dolly In\": \"81ca2cd2-05db-4222-9ba0-a32e5185adfb\",\n \"Dolly Left\": \"71f0f8bc-0e5d-4d32-b34f-bd74a5e3cba8\",\n \"Dolly Out\": \"12ac8798-5370-4801-91a6-f1acb425fc4a\",\n \"Dolly Right\": \"15ddc007-4723-42c1-8446-2af69af4879f\",\n \"Dolly Zoom In\": \"f0ca4e62-f65d-4a6d-83c1-ecbaa4d492ba\",\n \"Dolly Zoom Out\": \"2df82f5f-064a-4a7e-8b59-24ac446cb1df\",\n \"Double Dolly\": \"bd133fba-ed35-433b-9cb2-87b1f5bb1139\",\n \"Downhill Pov\": \"381fcf9a-ca91-4eac-a3c4-43d4302d6404\",\n Duplicate: \"1d21b411-b706-4233-ad83-7599290ac51f\",\n \"Dutch Angle\": \"915d6b95-6b9c-4a09-a0df-7ecd69c9bf64\",\n \"Earth Zoom Out\": \"46fa79e3-efce-41e8-95bc-1dc5a1a30795\",\n \"Eyes In\": \"0c5d9955-706e-4b21-b499-39f1b5e5ea0e\",\n \"Face Punch\": \"d6772bfc-272d-4396-a972-deecb09b17cb\",\n \"Fire Breathe\": \"eeb51fed-dfdc-4b99-804a-6ae8f550e95d\",\n Fisheye: \"ec365c4d-c130-48b3-923d-4b4359d96095\",\n \"Floating Fish\": \"ca339f47-c2a5-4f3f-a1fb-4f12344cd5da\",\n Flood: \"6597fc71-86dc-4f65-90c2-11330022cd1c\",\n \"Floral Eyes\": \"f0426395-607f-4753-83e3-85ee2151a840\",\n Flying: \"1d5ee550-a8b2-4200-8909-4ca7795911dc\",\n \"Focus Change\": \"797e27b5-2e6e-4b9a-a3c1-d437e9d386fc\",\n \"Fpv Drone\": \"7673d9e0-208c-4cf8-8b72-fce5b0e92ecb\",\n Freezing: \"9390496c-0547-4a70-98a7-31ad27d334cd\",\n \"Garden Bloom\": \"60049b87-68f5-4c34-b833-e2ef3b9d807d\",\n General: \"31177282-bde3-4870-b283-1135ca0a201a\",\n Glam: \"a2046ff7-26fc-4d97-aab7-54bbb55fca97\",\n \"Glowing Fish\": \"cb3d5fee-d874-41cf-b0aa-c1092af79da0\",\n Glowshift: \"f2db4c02-4d29-4401-a26e-0cf8ae14b9b3\",\n Handheld: \"5be9d262-82d7-4a74-babf-ee8fefd5c3c3\",\n \"Head Explosion\": \"92141609-85f7-4c8a-866e-9a542c164fe9\",\n \"Head Off\": \"d57404a2-5d6f-4bce-b9d5-1242666cae02\",\n \"Head Tracking\": \"d38d2084-dde6-4c16-90d2-19603bceb901\",\n Hyperlapse: \"aebcaa0d-525d-4a74-b497-26da8f81957b\",\n Incline: \"cff69c3b-0178-4f72-bae5-e301ccb97f28\",\n Innerlight: \"7c01086d-92a1-43f8-a69b-63ce07d4f19d\",\n Invisible: \"6fdc8fa8-6373-4a5e-aeac-4aa84c8cfd4b\",\n \"Jelly Drift\": \"c5b339cd-9f1c-44fe-91a1-464cf83f3749\",\n \"Jib Down\": \"2ce412eb-2e66-4d73-9c9c-d1fba4c8a494\",\n \"Jib Up\": \"cc5d4b42-f05d-41ef-9f51-c4b28f3fd2d2\",\n Kiss: \"83a8902b-4531-4893-9ee8-044b2d92b758\",\n \"Lazy Susan\": \"ce9dc38e-d6da-4368-9742-f73b559d802e\",\n \"Lens Crack\": \"080dd954-0d90-4346-8fef-83aebfe63ce5\",\n \"Lens Flare\": \"e98b3fee-79e8-4d87-881c-8ddd03ca738e\",\n Levitation: \"0a5a48d7-6716-41a4-9a9f-7ad9229c879b\",\n \"Low Shutter\": \"790ca797-703e-44c1-8d77-53080ea3c6a3\",\n \"Medusa Gorgona\": \"473fd7e0-18f5-467f-a146-3b6cbfddf46a\",\n Melting: \"eb3b0cd9-f924-410c-94c7-9e1850ed04c7\",\n \"Moonwalk Left\": \"70f3014c-ee77-4c33-83b9-7f7e68726aa9\",\n \"Moonwalk Right\": \"cf8c7490-7bc0-433d-860c-d1be982a520a\",\n Morphskin: \"8968b3f5-8d71-432a-a579-2d1aeae21439\",\n \"Mouth In\": \"21bbd0c4-ca4f-4ea3-82a8-607437d63e8e\",\n \"Object Pov\": \"b29cff3b-2494-4f3f-a74c-70ceee7b1ccf\",\n Overhead: \"40245735-2670-4572-b46e-854151281f55\",\n \"Paint Splash\": \"aa8d80db-ca0e-4535-952f-6fa040f2306b\",\n Paparazzi: \"556ab276-23b1-4604-a501-2513a71e2eea\",\n \"Powder Explosion\": \"7aa6fbad-55eb-4930-bf75-cc9a2f0b3b5b\",\n \"Push To Glass\": \"30a02896-cdda-469d-9ed9-52cbba1c04a8\",\n \"Rap Flex\": \"c3dbf04b-2ba5-4986-ab4f-872a9d71826f\",\n \"Robo Arm\": \"153afe86-20f1-45d3-99ea-106c37f94506\",\n \"Roll Transition\": \"c718443d-fc3c-4a79-bccf-6c98b56737ec\",\n \"Sand Storm\": \"ba778a3b-e6ff-4563-9253-a8ae4e04b1a7\",\n \"Set On Fire\": \"3f003f41-dbdc-41d9-94a8-de3942ebeb67\",\n \"Skateboard Glide\": \"26864aa2-010c-458c-bdf5-963babc756d2\",\n \"Skateboard Ollie\": \"023bf31f-23d2-4432-90be-cab4ae332e59\",\n \"Skate Cruise\": \"2bf184fb-47a3-41ba-93ac-846b9307b1bd\",\n \"Ski Carving\": \"9015dd00-4325-4679-b3da-bb25cd948899\",\n \"Skin Surge\": \"8c8f12b1-732f-4faf-8b2b-6029b964afd3\",\n \"Ski Powder\": \"e65a92e6-7a9e-43ce-8d35-6f6a16bfe716\",\n Snorricam: \"984834d9-72a7-4074-97c2-f98d265a49de\",\n \"Snowboard Carving\": \"f933ee1b-329e-41e9-8aad-5a1f60ecd6f5\",\n \"Snowboard Powder\": \"f6fdf448-6309-497b-85ee-79517a9ff097\",\n \"Soul Jump\": \"87d67a56-8d80-42db-8e1c-ebc3d2483cbd\",\n Static: \"fa3ddb7c-53ee-4383-aa17-97ae65f180e5\",\n \"Super 8Mm\": \"b604bd5f-22eb-4920-ad7e-47306805d7c6\",\n \"Super Dolly In\": \"3a24a20d-b494-4e8a-9b5f-4ef05ee5073d\",\n \"Super Dolly Out\": \"679c128d-a109-4267-8007-12f653f6346d\",\n Tentacles: \"20a5fdc3-c92b-4134-900c-4f47bbb0edb7\",\n \"Through Object In\": \"ebf152b3-f794-4d5c-886f-ff61ec6498bc\",\n \"Through Object Out\": \"ea0d11ac-b4e2-4ea7-89c2-a4a44a62dc79\",\n \"Thunder God\": \"27169770-288b-4ee7-b3ab-bb2bcf0e136b\",\n \"Tilt Down\": \"ff67b0eb-a621-45a0-b92d-ce2549250149\",\n \"Tilt Up\": \"2c9af101-fe7a-4299-91f3-e44431a0576f\",\n \"Timelapse Human\": \"9463e9ef-3242-46bf-b1ec-41eec6b2d6bf\",\n \"Timelapse Landscape\": \"130b5a9d-522f-467b-bb22-a9109c1710c1\",\n \"Turning Metal\": \"3e735d99-34f6-469c-83fb-ba608f299424\",\n Vhs: \"2b7c1db3-862a-4373-8435-ae4464ae5892\",\n \"Whip Pan\": \"25c72c28-7857-4aa0-af92-d9acd5e44b81\",\n Wiggle: \"8a660d27-dfe9-4bb1-8ad0-c6603e79fc95\",\n \"Wind To Face\": \"e8027924-b97d-43c3-9676-3c0f16da6c5f\",\n \"Yoyo Zoom\": \"bd639dee-00a3-407b-b539-f4516ce9d214\",\n \"Zoom In\": \"fbcbec5b-30f8-4b17-ba6e-8e8d5b265562\",\n \"Zoom Out\": \"263600e4-45c0-4c13-9579-40a9278af37c\",\n};\n\nconst MOTION_LOWER: MotionTable = Object.fromEntries(\n Object.keys(MOTION_MAP).map((k) => [k.toLowerCase(), k]),\n);\n\nexport const DEFAULT_MOTION = \"General\";\n\nexport function resolveMotionId(motionName: string | null | undefined): string | null {\n if (!motionName?.trim()) return null;\n const canonical = MOTION_LOWER[motionName.trim().toLowerCase()];\n if (!canonical) return null;\n return MOTION_MAP[canonical] ?? null;\n}\n","import OpenAI from \"openai\";\nimport { z } from \"zod\";\nimport { ModelKitError } from \"../errors.js\";\nimport { classifyHttpError, withRetry } from \"../retry.js\";\nimport type { RetryOptions } from \"../retry.js\";\nimport type { Adapter, AdapterContext } from \"./adapter.js\";\nimport type { ImageRequest, ImageResult, ImageSize, UsageEvent } from \"../types.js\";\nimport { base64ToBytes, mediaRefToBytes, throwIfAborted } from \"./media-ref.js\";\n\nexport type OpenAIImageQuality = \"auto\" | \"high\" | \"medium\" | \"low\" | \"xhigh\" | \"max\";\n/** Intersection of the generate and edit quality unions in the installed SDK. */\ntype SdkImageQuality = NonNullable<Parameters<OpenAI[\"images\"][\"edit\"]>[0][\"quality\"]> &\n NonNullable<Parameters<OpenAI[\"images\"][\"generate\"]>[0][\"quality\"]>;\n\nconst MAX_EDIT_REFERENCES = 16;\n\n/**\n * Vibe's aspect_ratio + image_size tier to a WIDTHxHEIGHT string for\n * gpt-image-2. All tiers honor the true aspect ratio; the tier only sets the\n * target long edge (1K->1024, 2K->2048, 4K->3840). gpt-image-2 hard constraints\n * (see OpenAI docs - \"Size and quality options\"):\n * - both edges divisible by 16\n * - max edge <= 3840\n * - long:short ratio <= 3:1 (all mapped ratios already satisfy this)\n * - total pixels between 655,360 and 8,294,400\n * We scale UP to clear the pixel floor (a literal 16:9 @ 1024 long edge is only\n * 589,824 px, below the minimum) and DOWN to clear the ceiling.\n */\nexport function aspectRatioToSize(ratio: string, tier: ImageSize): string {\n // The catalog never resolves \"512\" for an OpenAI row; treat it as the 1K floor.\n const TIER_LONG_EDGE: Partial<Record<ImageSize, number>> = {\n \"1K\": 1024,\n \"2K\": 2048,\n \"4K\": 3840,\n };\n const MIN_PIXELS = 655_360;\n const MAX_PIXELS = 8_294_400;\n const maxLong = TIER_LONG_EDGE[tier] ?? 1024;\n\n const RATIO_MAP = new Map<string, [number, number]>([\n [\"1:1\", [1, 1]],\n [\"16:9\", [16, 9]],\n [\"9:16\", [9, 16]],\n [\"4:3\", [4, 3]],\n [\"3:4\", [3, 4]],\n [\"3:2\", [3, 2]],\n [\"2:3\", [2, 3]],\n [\"21:9\", [21, 9]],\n [\"4:5\", [4, 5]],\n [\"5:4\", [5, 4]],\n ]);\n\n // \"adaptive\" and any unknown ratio fall back to a square at the tier's\n // long edge (clamped to the pixel caps below).\n const dims = RATIO_MAP.get(ratio) ?? [1, 1];\n const [wp, hp] = dims;\n const ar = wp / hp;\n\n let w: number;\n let h: number;\n if (ar >= 1) {\n w = maxLong;\n h = Math.round(maxLong / ar);\n } else {\n h = maxLong;\n w = Math.round(maxLong * ar);\n }\n\n // Snap to multiples of 16 (hard requirement, min one block per edge).\n const snap = (n: number) => Math.max(16, Math.round(n / 16) * 16);\n w = snap(w);\n h = snap(h);\n\n // Enforce the pixel floor (scale up) and ceiling (scale down); both edges\n // stay divisible by 16. Only one branch can apply since MIN < MAX.\n if (w * h < MIN_PIXELS) {\n const scale = Math.sqrt(MIN_PIXELS / (w * h));\n w = Math.ceil((w * scale) / 16) * 16;\n h = Math.ceil((h * scale) / 16) * 16;\n } else if (w * h > MAX_PIXELS) {\n const scale = Math.sqrt(MAX_PIXELS / (w * h));\n w = Math.floor((w * scale) / 16) * 16;\n h = Math.floor((h * scale) / 16) * 16;\n }\n\n return `${w}x${h}`;\n}\n\nfunction toProviderError(cause: unknown, ctx: AdapterContext): ModelKitError {\n if (cause instanceof OpenAI.APIConnectionTimeoutError) {\n return new ModelKitError({\n code: \"timeout\",\n message: `openai-image timed out: ${cause.message}`,\n provider: \"openai-image\",\n model: ctx.model.id,\n cause,\n });\n }\n if (cause instanceof OpenAI.APIConnectionError) {\n return new ModelKitError({\n code: \"network\",\n message: `openai-image connection failed: ${cause.message}`,\n provider: \"openai-image\",\n model: ctx.model.id,\n cause,\n });\n }\n if (cause instanceof OpenAI.APIError) {\n return classifyHttpError(\n cause.status,\n cause.error ?? cause.message,\n \"openai-image\",\n ctx.model.id,\n );\n }\n return classifyHttpError(\n undefined,\n cause instanceof Error ? cause.message : String(cause),\n \"openai-image\",\n ctx.model.id,\n );\n}\n\nconst openaiUsageSchema = z.object({\n input_tokens: z.number().optional(),\n output_tokens: z.number().optional(),\n});\n\nexport const openaiImageAdapter: Adapter = {\n id: \"openai-image\",\n async generateImage(req: ImageRequest, ctx: AdapterContext): Promise<ImageResult> {\n throwIfAborted(ctx.signal);\n const apiKey = ctx.keys.openai;\n if (!apiKey)\n throw new ModelKitError({\n code: \"auth\",\n message: \"Missing API key for openai\",\n provider: \"openai-image\",\n model: ctx.model.id,\n retryable: false,\n });\n // The Images API carries no per-reference caption, so labels are dropped\n // wholesale rather than reordering the multipart parts.\n if ((req.references ?? []).some((ref) => ref.label !== undefined)) {\n ctx.warnings.push({\n code: \"option_ignored\",\n field: \"references.label\",\n message: \"openai-image cannot express reference labels; ignoring them\",\n });\n }\n // maxRetries 0: withRetry below owns the retry budget so a 429 pays\n // one backoff instead of stacking the SDK loop under ours.\n const client = new OpenAI({ apiKey, fetch: ctx.fetch, maxRetries: 0 });\n // exactSize bypasses tier mapping and preserves legacy pixel contracts.\n // Auto (no aspect ratio) omits size so the provider picks.\n const size =\n req.exactSize !== undefined\n ? req.exactSize\n : req.aspectRatio === undefined || req.aspectRatio === \"adaptive\"\n ? undefined\n : aspectRatioToSize(req.aspectRatio, req.size ?? \"1K\");\n const refs = req.references ?? [];\n const isEdit = refs.length > 0;\n // gpt-image-2 fixes input fidelity high on edits itself (it rejects the parameter), so medium output quality is enough.\n const quality: OpenAIImageQuality = req.quality ?? (isEdit ? \"medium\" : \"auto\");\n // SAFETY: gpt-image-2.5 accepts \"xhigh\" and \"max\"; the installed openai SDK (6.x)\n // types predate them (they arrive in 7.12.1). The API validates the value per model.\n const sdkQuality = quality as SdkImageQuality;\n const count = req.count !== undefined && req.count > 1 ? { n: req.count } : {};\n\n const retryOptions: RetryOptions = {};\n if (ctx.signal !== undefined) retryOptions.signal = ctx.signal;\n const response = await withRetry(async () => {\n try {\n if (!isEdit) {\n if (size !== undefined) {\n return await client.images.generate(\n {\n model: ctx.model.providerModelId,\n prompt: req.prompt,\n size,\n quality: sdkQuality,\n ...count,\n },\n { signal: ctx.signal },\n );\n }\n return await client.images.generate(\n {\n model: ctx.model.providerModelId,\n prompt: req.prompt,\n quality: sdkQuality,\n ...count,\n },\n { signal: ctx.signal },\n );\n }\n const files = await Promise.all(\n refs.slice(0, MAX_EDIT_REFERENCES).map(async (ref, i) => {\n const { bytes, mime } = await mediaRefToBytes(ref, ctx.fetch, {\n signal: ctx.signal,\n provider: \"openai-image\",\n model: ctx.model.id,\n });\n const ext = mime.includes(\"jpeg\")\n ? \"jpg\"\n : mime.includes(\"webp\")\n ? \"webp\"\n : \"png\";\n return new File([bytes], `ref-${i}.${ext}`, { type: mime });\n }),\n );\n const single = files.length === 1 ? files[0] : undefined;\n const imageInput = single ?? files;\n if (size !== undefined) {\n return await client.images.edit(\n {\n model: ctx.model.providerModelId,\n image: imageInput,\n prompt: req.prompt,\n size,\n quality: sdkQuality,\n ...count,\n },\n { signal: ctx.signal },\n );\n }\n return await client.images.edit(\n {\n model: ctx.model.providerModelId,\n image: imageInput,\n prompt: req.prompt,\n quality: sdkQuality,\n ...count,\n },\n { signal: ctx.signal },\n );\n } catch (cause) {\n throw toProviderError(cause, ctx);\n }\n }, retryOptions);\n\n const images = (response.data ?? []).flatMap((item) =>\n item.b64_json ? [{ bytes: base64ToBytes(item.b64_json), mime: \"image/png\" }] : [],\n );\n if (images.length === 0)\n throw classifyHttpError(\n undefined,\n \"no image data in OpenAI response\",\n \"openai-image\",\n ctx.model.id,\n );\n\n // Never send response_format: it is DALL-E-only and gpt-image models\n // reject it with 400 Unknown parameter (they return b64_json anyway).\n const usageParsed = openaiUsageSchema.safeParse(response.usage);\n const inputTokens = usageParsed.success ? usageParsed.data.input_tokens : undefined;\n const outputTokens = usageParsed.success ? usageParsed.data.output_tokens : undefined;\n // OpenAI rows are priced per image; token counts ride along for context.\n const usage: UsageEvent = {\n model: ctx.model.id,\n provider: \"openai-image\",\n modality: \"IMAGE\",\n unit: \"images\",\n quantity: images.length,\n imageQuality: quality,\n };\n if (inputTokens !== undefined) usage.inputTokens = inputTokens;\n if (outputTokens !== undefined) usage.outputTokens = outputTokens;\n if (req.size !== undefined) usage.imageSize = req.size;\n return { images, usage, raw: response };\n },\n};\n","import type { Adapter, AdapterContext } from \"./adapter.js\";\nimport { ModelKitError, type ProviderErrorBody } from \"../errors.js\";\nimport { classifyHttpError, classifyThrown, withRetry, type RetryOptions } from \"../retry.js\";\nimport type { AspectRatio, ImageRequest, ImageResult, MediaRef, UsageEvent } from \"../types.js\";\nimport { throwIfAborted } from \"./media-ref.js\";\n\nconst PRODIA_JOB_URL = \"https://inference.prodia.com/v2/job\";\nconst FLUX_2_PRO_JOB = \"inference.flux-2.pro.img2img.v1\";\nconst FLUX_KLEIN_T2I_JOB = \"inference.flux-2.klein.txt2img.v1\";\nconst FLUX_KLEIN_I2I_JOB = \"inference.flux-2.klein.img2img.v1\";\nconst BG_REMOVE_JOB = \"inference.remove-background.v1\";\n\ninterface ProdiaDims {\n width: number;\n height: number;\n}\n\n// vibe-triggers aspectRatioToFluxDimensions. trigger-workflows' Flux Klein\n// table differs (16:9 1344x768, 4:3 1152x864, 3:2 1216x832, 9:16 768x1344,\n// 3:4 864x1152, 2:3 832x1216, 4:5 896x1152, plus explicit 1:1 and 5:4);\n// only 21:9 agrees. This adapter keeps the vibe-triggers table for every job;\n// 5:4 is the transpose of the 4:5 entry.\nconst RATIO_TO_DIMS: Partial<Record<AspectRatio, ProdiaDims>> = {\n \"16:9\": { width: 1360, height: 768 },\n \"4:3\": { width: 1024, height: 768 },\n \"3:2\": { width: 1152, height: 768 },\n \"21:9\": { width: 1536, height: 640 },\n \"9:16\": { width: 768, height: 1360 },\n \"3:4\": { width: 768, height: 1024 },\n \"2:3\": { width: 768, height: 1152 },\n \"4:5\": { width: 896, height: 1120 },\n \"5:4\": { width: 1120, height: 896 },\n};\n\nfunction dimsFor(aspectRatio: ImageRequest[\"aspectRatio\"]): ProdiaDims {\n if (aspectRatio !== undefined) {\n const dims = RATIO_TO_DIMS[aspectRatio];\n if (dims !== undefined) return dims;\n }\n return { width: 1024, height: 1024 };\n}\n\n// aspect_ratio values the Prodia job types accept. Nano Banana (img2img.v2)\n// additionally takes \"auto\" (match the first input) which the kit has no\n// spelling for; its enum otherwise drops 3:2. https://docs.prodia.com/models/nano-banana/\nconst GEMINI_JOB_RATIOS: ReadonlySet<AspectRatio> = new Set([\n \"1:1\",\n \"2:3\",\n \"3:2\",\n \"3:4\",\n \"4:3\",\n \"4:5\",\n \"5:4\",\n \"9:16\",\n \"16:9\",\n \"21:9\",\n]);\nconst NANO_BANANA_RATIOS: ReadonlySet<AspectRatio> = new Set([\n \"1:1\",\n \"2:3\",\n \"3:4\",\n \"4:3\",\n \"9:16\",\n \"16:9\",\n \"21:9\",\n]);\n\n// trigger-workflows downsizes inputs to 1900px via sharp before upload; this\n// package has no image resizer, so bytes go up as-is and oversize inputs are\n// the caller's responsibility.\nasync function refToBytes(\n ctx: AdapterContext,\n ref: MediaRef,\n): Promise<{ bytes: Uint8Array; mime: string }> {\n if (\"bytes\" in ref) return { bytes: ref.bytes, mime: ref.mime };\n let res: Response;\n try {\n res = await ctx.fetch(ref.url, ctx.signal ? { signal: ctx.signal } : {});\n } catch (cause) {\n throw classifyThrown(\"prodia\", cause, ctx.model.id);\n }\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw classifyHttpError(res.status, text, \"prodia\", ctx.model.id);\n }\n const mime = res.headers.get(\"content-type\") ?? \"image/jpeg\";\n return { bytes: new Uint8Array(await res.arrayBuffer()), mime };\n}\n\nfunction prodiaError(status: number, body: ProviderErrorBody, model: string): ModelKitError {\n return classifyHttpError(status, body, \"prodia\", model);\n}\n\n// First image part of a multipart response, else the whole body when Prodia\n// answers with a bare image. Mirrors parseMultipartResponse in the sources.\nfunction parseImageResponse(buffer: Uint8Array, contentType: string | null): Uint8Array {\n if (!contentType?.includes(\"multipart\")) {\n if (buffer.length === 0) throw emptyImage();\n return buffer;\n }\n const match = contentType.match(/boundary=(?:\"([^\"]+)\"|([^;,\\s]+))/);\n const boundary = match?.[1] ?? match?.[2];\n if (!boundary) {\n if (buffer.length === 0) throw emptyImage();\n return buffer;\n }\n const text = Buffer.from(buffer).toString(\"binary\");\n const parts = text.split(`--${boundary}`);\n for (const part of parts) {\n if (!part.includes(\"Content-Type: image/\")) continue;\n const headerEnd = part.indexOf(\"\\r\\n\\r\\n\");\n if (headerEnd < 0) continue;\n let body = part.slice(headerEnd + 4);\n body = body.replace(/\\r\\n--.*$/s, \"\").replace(/\\r\\n$/, \"\");\n if (body.length === 0) continue;\n return Uint8Array.from(Buffer.from(body, \"binary\"));\n }\n throw emptyImage();\n}\n\nfunction emptyImage(): ModelKitError {\n return new ModelKitError({\n code: \"provider_rejected\",\n message: \"No image found in Prodia API response\",\n provider: \"prodia\",\n retryable: false,\n });\n}\n\n/** File extension for the fetched input content type; the input is uploaded verbatim. */\nfunction inputExtension(mime: string): string {\n if (mime.includes(\"jpeg\") || mime.includes(\"jpg\")) return \"jpg\";\n if (mime.includes(\"webp\")) return \"webp\";\n if (mime.includes(\"gif\")) return \"gif\";\n return \"png\";\n}\n\nfunction isBgRemove(providerModelId: string): boolean {\n const id = providerModelId.toLowerCase();\n return id.includes(\"remove-background\") || id.includes(\"bg-remove\");\n}\n\nfunction isKlein(providerModelId: string): boolean {\n return providerModelId.toLowerCase().includes(\"klein\");\n}\n\ninterface ProdiaJobConfig {\n prompt?: string;\n width?: number;\n height?: number;\n // Gemini 3 and Nano Banana jobs take an aspect ratio (and, for Gemini 3, a\n // resolution tier) instead of width/height.\n // https://docs.prodia.com/models/gemini-3/ https://docs.prodia.com/models/nano-banana/\n aspect_ratio?: string;\n resolution?: string;\n safety_tolerance?: number;\n seed?: number;\n}\n\ninterface ProdiaJob {\n type: string;\n config?: ProdiaJobConfig;\n}\n\nasync function generateProdiaImage(req: ImageRequest, ctx: AdapterContext): Promise<ImageResult> {\n throwIfAborted(ctx.signal);\n const key = ctx.keys.prodia;\n if (!key) {\n throw new ModelKitError({\n code: \"auth\",\n message: \"Missing API key for prodia\",\n provider: \"prodia\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const providerModelId = ctx.model.providerModelId;\n const refs = await Promise.all((req.references ?? []).map((r) => refToBytes(ctx, r)));\n\n let job: ProdiaJob;\n let inputs: { bytes: Uint8Array; mime: string }[];\n let accept: string;\n let mime: string;\n if (isBgRemove(providerModelId)) {\n const first = refs[0];\n if (!first) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${ctx.model.id} requires a reference image`,\n provider: \"prodia\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n job = { type: BG_REMOVE_JOB };\n inputs = [first];\n accept = \"multipart/form-data\";\n mime = \"image/png\";\n } else if (isKlein(providerModelId)) {\n const dims = dimsFor(req.aspectRatio);\n const config: ProdiaJobConfig = {\n prompt: req.prompt,\n width: dims.width,\n height: dims.height,\n };\n job = {\n type: refs.length > 0 ? FLUX_KLEIN_I2I_JOB : FLUX_KLEIN_T2I_JOB,\n config,\n };\n const firstRef = refs[0];\n inputs = refs.length > 0 && firstRef !== undefined ? [firstRef] : [];\n accept = req.outputFormat === \"png\" ? \"image/png\" : \"image/jpeg\";\n mime = accept;\n } else if (providerModelId === \"flux-2-pro\" || providerModelId === FLUX_2_PRO_JOB) {\n const dims = dimsFor(req.aspectRatio);\n const config: ProdiaJobConfig = {\n prompt: req.prompt,\n width: dims.width,\n height: dims.height,\n safety_tolerance: 5,\n };\n if (req.seed !== undefined) config.seed = req.seed;\n job = { type: FLUX_2_PRO_JOB, config };\n inputs = refs;\n accept = \"image/png\";\n mime = \"image/png\";\n } else if (\n providerModelId === \"inference.gemini-3-pro.img2img.v1\" ||\n providerModelId === \"inference.nano-banana.img2img.v2\"\n ) {\n // FLUX.2 takes width/height; the Google jobs take aspect_ratio and (for\n // Gemini 3) a 1K/2K/4K resolution tier — the same tiers usage reports.\n const allowed =\n providerModelId === \"inference.nano-banana.img2img.v2\"\n ? NANO_BANANA_RATIOS\n : GEMINI_JOB_RATIOS;\n const config: ProdiaJobConfig = {\n prompt: req.prompt,\n safety_tolerance: 5,\n };\n if (req.aspectRatio !== undefined && req.aspectRatio !== \"adaptive\") {\n if (allowed.has(req.aspectRatio)) config.aspect_ratio = req.aspectRatio;\n else\n ctx.warnings.push({\n code: \"option_ignored\",\n field: \"aspectRatio\",\n from: req.aspectRatio,\n message: `${providerModelId} has no ${req.aspectRatio} aspect_ratio; using the provider default`,\n });\n }\n if (providerModelId === \"inference.gemini-3-pro.img2img.v1\")\n config.resolution = req.size ?? \"1K\";\n if (req.seed !== undefined) config.seed = req.seed;\n job = { type: providerModelId, config };\n inputs = refs;\n accept = \"image/png\";\n mime = \"image/png\";\n } else {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `prodia has no job mapping for \"${providerModelId}\"`,\n provider: \"prodia\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n\n const form = new FormData();\n form.append(\"job\", new File([JSON.stringify(job)], \"job.json\", { type: \"application/json\" }));\n inputs.forEach((input, i) => {\n form.append(\n \"input\",\n // Uint8Array<ArrayBufferLike> is not a valid BlobPart under the\n // strict lib types; copy into a fresh ArrayBuffer-backed view.\n new File([new Uint8Array(input.bytes)], `input-${i}.${inputExtension(input.mime)}`, {\n type: input.mime,\n }),\n );\n });\n\n const retryOpts: RetryOptions = {\n attempts: 3,\n baseDelayMs: 1000,\n factor: 2,\n maxDelayMs: 10_000,\n };\n if (ctx.signal !== undefined) retryOpts.signal = ctx.signal;\n let res: Response;\n try {\n res = await withRetry(async () => {\n let attemptRes: Response;\n try {\n const init: RequestInit = {\n method: \"POST\",\n headers: { Authorization: `Bearer ${key}`, Accept: accept },\n body: form,\n };\n if (ctx.signal !== undefined) init.signal = ctx.signal;\n attemptRes = await ctx.fetch(PRODIA_JOB_URL, init);\n } catch (err) {\n throw classifyThrown(\"prodia\", err, ctx.model.id);\n }\n if (!attemptRes.ok) {\n const text = await attemptRes.text().catch(() => \"\");\n throw prodiaError(attemptRes.status, text || attemptRes.statusText, ctx.model.id);\n }\n return attemptRes;\n }, retryOpts);\n } catch (err) {\n throw classifyThrown(\"prodia\", err, ctx.model.id);\n }\n const bytes = parseImageResponse(\n new Uint8Array(await res.arrayBuffer()),\n res.headers.get(\"content-type\"),\n );\n const usage: UsageEvent = {\n model: ctx.model.id,\n provider: \"prodia\",\n modality: \"IMAGE\",\n unit: \"images\",\n quantity: 1,\n };\n if (req.size !== undefined) usage.imageSize = req.size;\n if (req.quality !== undefined) usage.imageQuality = req.quality;\n return { images: [{ bytes, mime }], usage, raw: undefined };\n}\n\nexport const prodiaAdapter: Adapter = {\n id: \"prodia\",\n generateImage: generateProdiaImage,\n};\n","import Replicate from \"replicate\";\nimport { z } from \"zod\";\nimport type { Adapter, AdapterContext } from \"./adapter.js\";\nimport { ModelKitError, isModelKitError, type ProviderErrorBody } from \"../errors.js\";\nimport { JsonValueSchema, describeThrown } from \"../json.js\";\nimport { classifyHttpError, classifyThrown, pollUntil, withRetry } from \"../retry.js\";\nimport { refToUrl, throwIfAborted } from \"./media-ref.js\";\nimport type {\n AudioRequest,\n AudioResult,\n ImageRequest,\n ImageResult,\n ImageSize,\n JsonObject,\n JsonValue,\n UsageEvent,\n VideoJob,\n VideoRequest,\n VideoResult,\n} from \"../types.js\";\n\nconst POLL_INTERVAL_MS = 1000;\nconst POLL_TIMEOUT_MS = 15 * 60_000;\n\ntype ReplicateUrlFn = () => string | URL | JsonValue;\n\ninterface ReplicateRecordOutput {\n [key: string]: JsonValue | ReplicateUrlFn;\n}\n\ntype ReplicatePredictionOutput = JsonValue | URL | ReplicateRecordOutput;\n\ninterface PredictionLike {\n id: string;\n status: string;\n output?: ReplicatePredictionOutput;\n error?: unknown;\n metrics?: { predict_time?: number };\n}\n\ntype ReplicateCreateOptions =\n | { input: ReplicateModelInput; model: string; version?: string }\n | { input: ReplicateModelInput; version: string; model?: string };\n\nexport interface ReplicatePredictionsClient {\n create(options: ReplicateCreateOptions & { signal?: AbortSignal }): Promise<PredictionLike>;\n get(predictionId: string, options?: { signal?: AbortSignal }): Promise<PredictionLike>;\n}\n\nexport interface ReplicateClientLike {\n predictions: ReplicatePredictionsClient;\n}\n\nexport interface ReplicateAdapterDeps {\n createReplicateClient: (opts: { auth: string; fetch: typeof fetch }) => ReplicateClientLike;\n}\n\nconst defaultReplicateDeps: ReplicateAdapterDeps = {\n createReplicateClient: (opts) => new Replicate(opts),\n};\n\nexport function createReplicateAdapter(deps: ReplicateAdapterDeps = defaultReplicateDeps): Adapter {\n return {\n id: \"replicate\",\n generateImage: (req, ctx) => generateReplicateImage(req, ctx, deps),\n generateVideo: (req, ctx) => generateReplicateVideo(req, ctx, deps),\n generateAudio: (req, ctx) => generateReplicateAudio(req, ctx, deps),\n };\n}\n\nexport const replicateAdapter: Adapter = createReplicateAdapter();\n\nfunction client(ctx: AdapterContext, deps: ReplicateAdapterDeps): ReplicateClientLike {\n const token = ctx.keys.replicate;\n if (!token) {\n throw new ModelKitError({\n code: \"auth\",\n message: \"Missing API key for replicate\",\n provider: \"replicate\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n return deps.createReplicateClient({ auth: token, fetch: ctx.fetch });\n}\n\ntype ReplicateRoute = { model: string; version?: string } | { version: string; model?: string };\n\n// \"owner/name:version\" routes by version, bare hashes route by version,\n// otherwise the unpinned \"owner/name\" slug routes by model.\nfunction route(providerModelId: string): ReplicateRoute {\n if (providerModelId.includes(\":\")) {\n const version = providerModelId.slice(providerModelId.indexOf(\":\") + 1);\n return { version };\n }\n if (!providerModelId.includes(\"/\")) return { version: providerModelId };\n return { model: providerModelId };\n}\n\nconst replicateResponseStatusSchema = z.object({\n response: z.object({ status: z.number() }).partial(),\n});\n\nfunction replicateError(cause: unknown, ctx: AdapterContext): ModelKitError {\n if (isModelKitError(cause)) return cause;\n const info = describeThrown(cause);\n const nested = replicateResponseStatusSchema.safeParse(cause);\n const status = info.status ?? (nested.success ? nested.data.response?.status : undefined);\n return classifyThrown(\"replicate\", cause, ctx.model.id, { status, body: info.body });\n}\n\n/** Drop a \":version\" suffix so a pinned prediction routes by its base model id. */\nfunction baseModelId(providerModelId: string): string {\n const colon = providerModelId.indexOf(\":\");\n return colon === -1 ? providerModelId : providerModelId.slice(0, colon);\n}\n\nfunction predictionErrorBody(cause: unknown): ProviderErrorBody {\n const parsed = JsonValueSchema.safeParse(cause);\n if (parsed.success) return parsed.data;\n return String(cause);\n}\n\nfunction isObjectOutput(value: ReplicatePredictionOutput): value is ReplicateRecordOutput {\n return Object(value) === value && !Array.isArray(value) && !(value instanceof URL);\n}\n\nfunction isUrlFn(value: JsonValue | ReplicateUrlFn): value is ReplicateUrlFn {\n return value instanceof Function;\n}\n\n// First output URL from the output values replicate models return: a string, a\n// single-element array, a FileOutput with .url(), or a { default } wrapper.\nfunction extractOutputUrl(output: ReplicatePredictionOutput): string {\n const root = Array.isArray(output) ? output[0] : output;\n if (root === undefined) throw noOutput();\n const asString = z.string().safeParse(root);\n if (asString.success && asString.data) return asString.data;\n if (root instanceof URL) return root.href;\n if (isObjectOutput(root)) {\n if (\"url\" in root) {\n const urlValue = root.url;\n if (urlValue !== undefined && isUrlFn(urlValue)) {\n const called = urlValue();\n if (called instanceof URL) return called.href;\n const calledString = z.string().safeParse(called);\n if (calledString.success && calledString.data) return calledString.data;\n } else {\n const direct = z.string().safeParse(urlValue);\n if (direct.success && direct.data) return direct.data;\n }\n }\n if (\"default\" in root) {\n const fallback = z.string().safeParse(root.default);\n if (fallback.success && fallback.data) return fallback.data;\n }\n }\n throw noOutput();\n}\n\nfunction noOutput(): ModelKitError {\n return new ModelKitError({\n code: \"provider_rejected\",\n message: \"No output returned by Replicate\",\n provider: \"replicate\",\n retryable: false,\n });\n}\n\ninterface PollOpts {\n intervalMs: number;\n timeoutMs: number;\n signal?: AbortSignal;\n}\n\ninterface PredictionRun {\n url: string;\n predictTime: number;\n raw: PredictionLike;\n}\n\nasync function runPrediction(\n ctx: AdapterContext,\n input: ReplicateModelInput,\n deps: ReplicateAdapterDeps,\n): Promise<PredictionRun> {\n throwIfAborted(ctx.signal);\n const api = client(ctx, deps);\n const createOptions = { ...route(ctx.model.providerModelId), input };\n let prediction: PredictionLike;\n try {\n prediction = await withRetry(\n async () => {\n try {\n // The Replicate SDK has no constructor switch and retries a 429\n // itself up to 5 times, so the kit runs the create once (attempts: 1)\n // instead of stacking its own loop on top (which would be 3x5).\n return await api.predictions.create(\n ctx.signal ? { ...createOptions, signal: ctx.signal } : createOptions,\n );\n } catch (cause) {\n throw replicateError(cause, ctx);\n }\n },\n { attempts: 1 },\n );\n } catch (cause) {\n throw replicateError(cause, ctx);\n }\n const pollOpts: PollOpts = {\n intervalMs: POLL_INTERVAL_MS,\n timeoutMs: POLL_TIMEOUT_MS,\n };\n if (ctx.signal) pollOpts.signal = ctx.signal;\n const done = await pollUntil(async () => {\n let current: PredictionLike;\n try {\n current = await api.predictions.get(\n prediction.id,\n ctx.signal ? { signal: ctx.signal } : undefined,\n );\n } catch (cause) {\n throw replicateError(cause, ctx);\n }\n if (current.status === \"succeeded\") return current;\n if (current.status === \"failed\" || current.status === \"canceled\") {\n throw classifyHttpError(\n undefined,\n predictionErrorBody(current.error),\n \"replicate\",\n ctx.model.id,\n );\n }\n return undefined;\n }, pollOpts);\n const predictTime = z.number().safeParse(done.metrics?.predict_time);\n if (done.output === undefined) throw noOutput();\n return {\n url: extractOutputUrl(done.output),\n predictTime: predictTime.success ? predictTime.data : 0,\n raw: done,\n };\n}\n\nfunction imageUsage(ctx: AdapterContext, req: ImageRequest): UsageEvent {\n const event: UsageEvent = {\n model: ctx.model.id,\n provider: \"replicate\",\n modality: \"IMAGE\",\n unit: \"compute_seconds\",\n quantity: 0,\n };\n if (req.size !== undefined) event.imageSize = req.size;\n if (req.quality !== undefined) event.imageQuality = req.quality;\n return event;\n}\n\nfunction videoUsage(ctx: AdapterContext, req: VideoRequest): UsageEvent {\n const event: UsageEvent = {\n model: ctx.model.id,\n provider: \"replicate\",\n modality: \"VIDEO\",\n unit: \"compute_seconds\",\n quantity: 0,\n };\n if (req.resolution !== undefined) event.resolution = req.resolution;\n if (req.durationSeconds !== undefined) event.durationSeconds = req.durationSeconds;\n return event;\n}\n\nfunction audioUsage(ctx: AdapterContext, req: AudioRequest): UsageEvent {\n const event: UsageEvent = {\n model: ctx.model.id,\n provider: \"replicate\",\n modality: \"AUDIO\",\n unit: ctx.model.usage.unit,\n quantity: 0,\n };\n if (req.durationSeconds !== undefined) event.durationSeconds = req.durationSeconds;\n return event;\n}\n\nasync function download(\n ctx: AdapterContext,\n url: string,\n): Promise<{ bytes: Uint8Array; mime: string }> {\n const res = await ctx.fetch(url);\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw classifyHttpError(res.status, text, \"replicate\", ctx.model.id);\n }\n const mime = res.headers.get(\"content-type\") ?? \"image/png\";\n return { bytes: new Uint8Array(await res.arrayBuffer()), mime };\n}\n\n/**\n * Dispatch by exact catalog providerModelId, never by substring: an unrelated\n * model whose id happens to contain \"qwen\" or \"edit\" must not inherit another\n * model's input schema. Add a row here when the catalog gains a model.\n */\ntype ReplicateImageKind = \"topaz\" | \"upscaler\" | \"wan\" | \"qwen-image\" | \"qwen-edit\" | \"generic\";\n\nconst REPLICATE_IMAGE_KINDS: Readonly<Record<string, Exclude<ReplicateImageKind, \"generic\">>> = {\n \"topazlabs/image-upscale\": \"topaz\",\n \"philz1337x/crystal-upscaler\": \"upscaler\",\n \"wan-video/wan-2.7-image-pro\": \"wan\",\n \"qwen/qwen-image-2-pro\": \"qwen-image\",\n \"qwen-edit-apps/qwen-image-edit-plus-lora-skin\": \"qwen-edit\",\n};\n\nfunction imageKind(providerModelId: string): ReplicateImageKind {\n return REPLICATE_IMAGE_KINDS[baseModelId(providerModelId)] ?? \"generic\";\n}\n\ntype ReplicateVideoKind = \"kling\" | \"kling-omni\" | \"hailuo\" | \"wan\";\n\nconst REPLICATE_VIDEO_KINDS: Readonly<Record<string, Exclude<ReplicateVideoKind, \"wan\">>> = {\n \"kling-video/v2.5-turbo/pro/image-to-video\": \"kling\",\n \"kling-video/v3.0/pro/image-to-video\": \"kling\",\n \"kwaivgi/kling-v3-video\": \"kling\",\n \"kwaivgi/kling-v3-omni-video\": \"kling-omni\",\n \"minimax/hailuo-02\": \"hailuo\",\n};\n\nfunction videoKind(providerModelId: string): ReplicateVideoKind {\n return REPLICATE_VIDEO_KINDS[baseModelId(providerModelId)] ?? \"wan\";\n}\n\ntype ReplicateAudioKind = \"mmaudio\" | \"elevenlabs\" | \"lyria\";\n\nconst REPLICATE_AUDIO_KINDS: Readonly<Record<string, Exclude<ReplicateAudioKind, \"lyria\">>> = {\n \"zsxkib/mmaudio\": \"mmaudio\",\n \"elevenlabs/music\": \"elevenlabs\",\n};\n\nfunction audioKind(providerModelId: string): ReplicateAudioKind {\n return REPLICATE_AUDIO_KINDS[baseModelId(providerModelId)] ?? \"lyria\";\n}\n\n// aspect_ratio enums from the model input schemas:\n// qwen-image-2-pro also accepts 2:1 and 1:2, which the kit's AspectRatio\n// vocabulary has no spelling for.\n// https://api.replicate.com/v1/models/qwen/qwen-image-2-pro\n// https://api.replicate.com/v1/models/qwen-edit-apps/qwen-image-edit-plus-lora-skin\nconst QWEN_IMAGE_RATIOS: ReadonlySet<string> = new Set([\n \"1:1\",\n \"16:9\",\n \"9:16\",\n \"4:3\",\n \"3:4\",\n \"3:2\",\n \"2:3\",\n]);\nconst QWEN_EDIT_RATIOS: ReadonlySet<string> = new Set([\"1:1\", \"16:9\", \"9:16\", \"4:3\", \"3:4\"]);\n\ninterface ReplicateImageInput {\n prompt: string;\n image?: string;\n images?: string[];\n aspect_ratio?: string;\n creativity?: number;\n scale_factor?: number;\n output_format?: string;\n match_input_image?: boolean;\n size?: string;\n}\n\n// topazlabs/image-upscale takes no prompt/creativity/scale_factor input; its\n// factor is the \"2x\"|\"4x\"|\"6x\" upscale_factor enum (api.replicate.com schema).\ninterface TopazImageInput {\n image: string;\n enhance_model: string;\n output_format: string;\n upscale_factor: string;\n face_enhancement: boolean;\n subject_detection?: string;\n face_enhancement_creativity?: number;\n face_enhancement_strength?: number;\n}\n\ninterface KlingVideoInput {\n prompt: string;\n duration: number;\n mode: string;\n generate_audio: boolean;\n start_image?: string;\n end_image?: string;\n aspect_ratio?: string;\n negative_prompt?: string;\n}\n\ninterface HailuoVideoInput {\n prompt: string;\n duration: number;\n resolution: string;\n prompt_optimizer: boolean;\n first_frame_image?: string;\n last_frame_image?: string;\n}\n\ninterface WanVideoInput {\n prompt: string;\n duration: number;\n size: string;\n image?: string;\n}\n\ninterface LyriaAudioInput {\n prompt: string;\n seed?: number;\n negative_prompt?: string;\n}\n\ninterface ElevenLabsMusicInput {\n prompt: string;\n music_length_ms: number;\n force_instrumental: boolean;\n output_format: \"wav_cd_quality\";\n}\n\ninterface MmaudioInput {\n video: string;\n duration: number;\n seed: number;\n prompt?: string;\n negative_prompt?: string;\n}\n\ntype ReplicateModelInput =\n | ReplicateImageInput\n | TopazImageInput\n | KlingVideoInput\n | HailuoVideoInput\n | WanVideoInput\n | LyriaAudioInput\n | MmaudioInput\n | ElevenLabsMusicInput;\n\n// WAN 2.7's `size` enum spells exact W*H per tier (the bare tier names are\n// ambiguous for 1:1, so every ratio resolves to an exact value).\n// https://api.replicate.com/v1/models/wan-video/wan-2.7-image-pro (input schema)\nconst WAN_IMAGE_SIZES: Record<\"1K\" | \"2K\" | \"4K\", Record<string, string>> = {\n \"1K\": {\n \"1:1\": \"1024*1024\",\n \"16:9\": \"1280*720\",\n \"9:16\": \"720*1280\",\n \"4:3\": \"1024*768\",\n \"3:4\": \"768*1024\",\n },\n \"2K\": {\n \"1:1\": \"2048*2048\",\n \"16:9\": \"2048*1152\",\n \"9:16\": \"1152*2048\",\n \"4:3\": \"2048*1536\",\n \"3:4\": \"1536*2048\",\n },\n \"4K\": {\n \"1:1\": \"4096*4096\",\n \"16:9\": \"4096*2304\",\n \"9:16\": \"2304*4096\",\n \"4:3\": \"4096*3072\",\n \"3:4\": \"3072*4096\",\n },\n};\n\nfunction wanImageSize(\n aspectRatio: ImageRequest[\"aspectRatio\"],\n size: ImageSize | undefined,\n): string {\n const tier = size === \"2K\" || size === \"4K\" ? size : \"1K\";\n const table = WAN_IMAGE_SIZES[tier];\n return table[aspectRatio ?? \"\"] ?? table[\"1:1\"] ?? \"1024*1024\";\n}\n\nasync function generateReplicateImage(\n req: ImageRequest,\n ctx: AdapterContext,\n deps: ReplicateAdapterDeps,\n): Promise<ImageResult> {\n const id = ctx.model.providerModelId;\n let input: ReplicateModelInput;\n switch (imageKind(id)) {\n case \"topaz\": {\n const first = (req.references ?? [])[0];\n if (!first) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${ctx.model.id} requires a reference image to upscale`,\n provider: \"replicate\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n let format = req.outputFormat === \"jpeg\" ? \"jpg\" : (req.outputFormat ?? \"png\");\n if (format !== \"png\" && format !== \"jpg\") {\n ctx.warnings.push({\n code: \"option_ignored\",\n field: \"outputFormat\",\n from: format,\n message: \"topazlabs/image-upscale supports only png and jpg; using png\",\n });\n format = \"png\";\n }\n // Standard V2 + face_enhancement false are the model's own defaults.\n const upscale = req.upscale;\n const topaz: TopazImageInput = {\n image: refToUrl(first),\n enhance_model: upscale?.enhanceModel ?? \"Standard V2\",\n output_format: format,\n upscale_factor: `${req.scaleFactor ?? 2}x`,\n face_enhancement: upscale?.faceEnhancement ?? false,\n };\n if (upscale?.subjectDetection !== undefined)\n topaz.subject_detection = upscale.subjectDetection;\n if (upscale?.faceEnhancementCreativity !== undefined)\n topaz.face_enhancement_creativity = upscale.faceEnhancementCreativity;\n if (upscale?.faceEnhancementStrength !== undefined)\n topaz.face_enhancement_strength = upscale.faceEnhancementStrength;\n input = topaz;\n break;\n }\n case \"upscaler\": {\n const first = (req.references ?? [])[0];\n if (!first) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${ctx.model.id} requires a reference image to upscale`,\n provider: \"replicate\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const imageInput: ReplicateImageInput = { prompt: req.prompt };\n imageInput.image = refToUrl(first);\n imageInput.creativity = 0;\n imageInput.scale_factor = 2;\n imageInput.output_format = \"png\";\n input = imageInput;\n break;\n }\n case \"wan\": {\n const refs = (req.references ?? []).map(refToUrl);\n const imageInput: ReplicateImageInput = { prompt: req.prompt };\n if (refs.length > 0) imageInput.images = refs;\n imageInput.size = wanImageSize(req.aspectRatio, req.size);\n input = imageInput;\n break;\n }\n case \"qwen-image\": {\n const refs = (req.references ?? []).map(refToUrl);\n const firstUrl = refs[0];\n const imageInput: ReplicateImageInput = { prompt: req.prompt };\n if (firstUrl !== undefined) {\n // The schema ignores aspect_ratio when match_input_image is set, and\n // this row always has a reference, so the input image owns the ratio.\n imageInput.image = firstUrl;\n imageInput.match_input_image = true;\n } else if (req.aspectRatio !== undefined && QWEN_IMAGE_RATIOS.has(req.aspectRatio)) {\n imageInput.aspect_ratio = req.aspectRatio;\n }\n input = imageInput;\n break;\n }\n case \"qwen-edit\": {\n const refs = (req.references ?? []).map(refToUrl);\n const firstUrl = refs[0];\n const imageInput: ReplicateImageInput = { prompt: req.prompt };\n if (firstUrl !== undefined) imageInput.image = firstUrl;\n if (req.aspectRatio !== undefined) {\n if (QWEN_EDIT_RATIOS.has(req.aspectRatio))\n imageInput.aspect_ratio = req.aspectRatio;\n else\n ctx.warnings.push({\n code: \"option_ignored\",\n field: \"aspectRatio\",\n from: req.aspectRatio,\n message: `${id} has no ${req.aspectRatio} aspect_ratio; using the provider default`,\n });\n }\n if (req.outputFormat !== undefined) {\n // The edit-plus enum spells jpeg as \"jpg\".\n imageInput.output_format = req.outputFormat === \"jpeg\" ? \"jpg\" : req.outputFormat;\n }\n input = imageInput;\n break;\n }\n default: {\n const first = (req.references ?? [])[0];\n const imageInput: ReplicateImageInput = { prompt: req.prompt };\n if (first) imageInput.image = refToUrl(first);\n input = imageInput;\n }\n }\n const { url, predictTime, raw } = await runPrediction(ctx, input, deps);\n const file = await download(ctx, url);\n const usage = imageUsage(ctx, req);\n usage.quantity = predictTime;\n return { images: [{ bytes: file.bytes, mime: file.mime }], usage, raw, outputUrl: url };\n}\n\n// WAN 2.7 size enum, mapped from the canonical ratio the same way\n// trigger-workflows resolveWan27ImageProSize does (ties pick the smaller area).\nfunction wanSize(aspectRatio: VideoRequest[\"aspectRatio\"]): string {\n if (!aspectRatio || aspectRatio === \"adaptive\" || aspectRatio === \"1:1\") return \"2K\";\n const parts = aspectRatio.split(\":\");\n const w = Number(parts[0] ?? \"\");\n const h = Number(parts[1] ?? \"\");\n if (!Number.isFinite(w) || !Number.isFinite(h) || w === h) return \"2K\";\n return w > h ? \"2048*1152\" : \"1536*2048\";\n}\n\nfunction klingInput(req: VideoRequest): KlingVideoInput {\n const images = (req.firstFrame ? [req.firstFrame] : []).map(refToUrl);\n if (req.lastFrame) images.push(refToUrl(req.lastFrame));\n // resolveOptions already dropped the ratio when a start image is wired.\n const input: KlingVideoInput = {\n prompt: req.prompt,\n duration: req.durationSeconds ?? 10,\n mode: req.mode ?? \"standard\",\n generate_audio: req.generateAudio ?? false,\n };\n const startImage = images[0];\n if (startImage !== undefined) {\n input.start_image = startImage;\n const endImage = images[1];\n if (endImage !== undefined) input.end_image = endImage;\n } else if (req.aspectRatio !== \"adaptive\") {\n input.aspect_ratio = req.aspectRatio ?? \"16:9\";\n }\n if (req.negativePrompt !== undefined) input.negative_prompt = req.negativePrompt;\n return input;\n}\n\ninterface KlingOmniVideoInput {\n prompt: string;\n duration: number;\n mode: string;\n generate_audio: boolean;\n start_image?: string;\n end_image?: string;\n aspect_ratio?: string;\n reference_images?: string[];\n}\n\n// kwaivgi/kling-v3-omni-video has no resolution field: its mode enum selects\n// 720p (standard) or 1080p (pro). A resolution wins over an explicit mode.\nfunction klingOmniMode(req: VideoRequest): string {\n if (req.resolution === \"1080p\") return \"pro\";\n if (req.resolution === \"720p\") return \"standard\";\n return req.mode ?? \"standard\";\n}\n\n// kwaivgi/kling-v3-omni-video takes reference_images (max 7 without a\n// reference video) but has no negative_prompt field, so it gets its own\n// serializer instead of sharing klingInput.\nfunction klingOmniInput(req: VideoRequest): KlingOmniVideoInput {\n const images = (req.firstFrame ? [req.firstFrame] : []).map(refToUrl);\n if (req.lastFrame) images.push(refToUrl(req.lastFrame));\n const input: KlingOmniVideoInput = {\n prompt: req.prompt,\n duration: req.durationSeconds ?? 10,\n mode: klingOmniMode(req),\n generate_audio: req.generateAudio ?? false,\n };\n const startImage = images[0];\n if (startImage !== undefined) {\n input.start_image = startImage;\n const endImage = images[1];\n if (endImage !== undefined) input.end_image = endImage;\n } else if (req.aspectRatio !== \"adaptive\") {\n input.aspect_ratio = req.aspectRatio ?? \"16:9\";\n }\n const refs = (req.referenceImages ?? []).map(refToUrl);\n if (refs.length > 0) input.reference_images = refs;\n return input;\n}\n\nfunction hailuoInput(req: VideoRequest): HailuoVideoInput {\n const input: HailuoVideoInput = {\n prompt: req.prompt,\n duration: req.durationSeconds ?? 6,\n resolution: req.resolution ?? \"768p\",\n prompt_optimizer: true,\n };\n if (req.firstFrame) input.first_frame_image = refToUrl(req.firstFrame);\n if (req.lastFrame) input.last_frame_image = refToUrl(req.lastFrame);\n return input;\n}\n\nfunction wanInput(req: VideoRequest): WanVideoInput {\n const input: WanVideoInput = {\n prompt: req.prompt,\n duration: req.durationSeconds ?? 5,\n size: wanSize(req.aspectRatio),\n };\n if (req.firstFrame) input.image = refToUrl(req.firstFrame);\n return input;\n}\n\nasync function generateReplicateVideo(\n req: VideoRequest,\n ctx: AdapterContext,\n deps: ReplicateAdapterDeps,\n): Promise<VideoJob> {\n throwIfAborted(ctx.signal);\n const kind = videoKind(ctx.model.providerModelId);\n const input =\n kind === \"kling\"\n ? klingInput(req)\n : kind === \"kling-omni\"\n ? klingOmniInput(req)\n : kind === \"hailuo\"\n ? hailuoInput(req)\n : wanInput(req);\n const api = client(ctx, deps);\n const createOptions = { ...route(ctx.model.providerModelId), input };\n let prediction: PredictionLike;\n try {\n prediction = await withRetry(\n async () => {\n try {\n // See runPrediction: the Replicate SDK owns the 429 retry, so the\n // kit does not stack its own attempts on the create call.\n return await api.predictions.create(\n ctx.signal ? { ...createOptions, signal: ctx.signal } : createOptions,\n );\n } catch (cause) {\n throw replicateError(cause, ctx);\n }\n },\n { attempts: 1 },\n );\n } catch (cause) {\n throw replicateError(cause, ctx);\n }\n const jobId = prediction.id;\n const check = async (): Promise<PredictionRun | undefined> => {\n let current: PredictionLike;\n try {\n current = await api.predictions.get(\n jobId,\n ctx.signal ? { signal: ctx.signal } : undefined,\n );\n } catch (cause) {\n throw replicateError(cause, ctx);\n }\n if (current.status === \"succeeded\") {\n const predictTime = z.number().safeParse(current.metrics?.predict_time);\n if (current.output === undefined) throw noOutput();\n return {\n url: extractOutputUrl(current.output),\n predictTime: predictTime.success ? predictTime.data : 0,\n raw: current,\n };\n }\n if (current.status === \"failed\" || current.status === \"canceled\") {\n throw classifyHttpError(\n undefined,\n predictionErrorBody(current.error),\n \"replicate\",\n ctx.model.id,\n );\n }\n return undefined;\n };\n const toResult = (done: PredictionRun): VideoResult => {\n const usage = videoUsage(ctx, req);\n usage.quantity = done.predictTime;\n return { video: { url: done.url }, usage, raw: done.raw };\n };\n return {\n jobId,\n async poll() {\n try {\n const done = await check();\n return done ? { status: \"succeeded\", raw: done.raw } : { status: \"pending\" };\n } catch (cause) {\n if (isModelKitError(cause) && !cause.retryable) return { status: \"failed\" };\n throw cause;\n }\n },\n async result(opts) {\n const videoSignal = opts?.signal ?? ctx.signal;\n const resultOpts: PollOpts = {\n intervalMs: opts?.pollIntervalMs ?? POLL_INTERVAL_MS,\n timeoutMs: opts?.timeoutMs ?? POLL_TIMEOUT_MS,\n };\n if (videoSignal) resultOpts.signal = videoSignal;\n const done = await pollUntil(check, resultOpts);\n return toResult(done);\n },\n };\n}\n\nfunction lyriaAudioInput(req: AudioRequest, ctx: AdapterContext): LyriaAudioInput {\n const prompt = req.prompt.trim();\n if (!prompt) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${ctx.model.id} requires a prompt`,\n provider: \"replicate\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const input: LyriaAudioInput = { prompt };\n if (req.seed !== undefined) input.seed = req.seed;\n const negative = req.negativePrompt?.trim();\n if (negative) input.negative_prompt = negative;\n return input;\n}\n\n/** ElevenLabs accepts 5-300s; one resolution feeds the provider input and the usage event. */\nexport function elevenLabsMusicDuration(seconds: number | undefined): number {\n return Math.min(300, Math.max(5, seconds ?? 15));\n}\n\nfunction elevenLabsMusicInput(req: AudioRequest, ctx: AdapterContext): ElevenLabsMusicInput {\n const prompt = req.prompt.trim();\n if (!prompt) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${ctx.model.id} requires a prompt`,\n provider: \"replicate\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n return {\n prompt,\n music_length_ms: elevenLabsMusicDuration(req.durationSeconds) * 1000,\n force_instrumental: req.instrumental ?? true,\n output_format: \"wav_cd_quality\",\n };\n}\n\nfunction mmaudioInput(req: AudioRequest, ctx: AdapterContext): MmaudioInput {\n const video = req.sourceVideo ?? req.references?.[0];\n if (!video) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${ctx.model.id} requires a source video to score`,\n provider: \"replicate\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n const input: MmaudioInput = {\n video: refToUrl(video),\n duration: req.durationSeconds ?? 8,\n seed: req.seed ?? -1,\n };\n const prompt = req.prompt.trim();\n if (prompt) input.prompt = prompt;\n const negative = req.negativePrompt?.trim();\n if (negative) input.negative_prompt = negative;\n return input;\n}\n\n// AudioResult.raw is JsonValue; FileOutput values in `output` carry functions, so keep only what decodes.\nfunction predictionRaw(prediction: PredictionLike): JsonValue {\n const raw: JsonObject = { id: prediction.id, status: prediction.status };\n if (prediction.metrics?.predict_time !== undefined)\n raw.metrics = { predict_time: prediction.metrics.predict_time };\n const output = JsonValueSchema.safeParse(prediction.output);\n if (output.success) raw.output = output.data;\n return raw;\n}\n\nasync function generateReplicateAudio(\n req: AudioRequest,\n ctx: AdapterContext,\n deps: ReplicateAdapterDeps,\n): Promise<AudioResult> {\n const kind = audioKind(ctx.model.providerModelId);\n const input =\n kind === \"mmaudio\"\n ? mmaudioInput(req, ctx)\n : kind === \"elevenlabs\"\n ? elevenLabsMusicInput(req, ctx)\n : lyriaAudioInput(req, ctx);\n const { url, predictTime, raw } = await runPrediction(ctx, input, deps);\n const usage = audioUsage(ctx, req);\n // Models billed by generated length report the clamped seconds in both fields; the rest bill compute time.\n if (ctx.model.usage.unit === \"seconds\") {\n const seconds = elevenLabsMusicDuration(req.durationSeconds);\n usage.quantity = seconds;\n usage.durationSeconds = seconds;\n } else {\n usage.quantity = predictTime;\n }\n return { audio: { url }, usage, raw: predictionRaw(raw) };\n}\n","import { experimental_generateVideo } from \"ai\";\nimport { createXai } from \"@ai-sdk/xai\";\nimport { z } from \"zod\";\nimport type { Adapter, AdapterContext } from \"./adapter.js\";\nimport { ModelKitError } from \"../errors.js\";\nimport { describeThrown, JsonValueSchema } from \"../json.js\";\nimport { classifyHttpError, classifyThrown, pollUntil } from \"../retry.js\";\nimport type { JsonValue, UsageEvent, VideoJob, VideoRequest, VideoResult } from \"../types.js\";\nimport { refToUrl } from \"./media-ref.js\";\n\nconst POLL_INTERVAL_MS = 10_000;\nconst POLL_TIMEOUT_MS = 15 * 60_000;\n\nexport interface XaiVideoMeta {\n videoUrl?: JsonValue | undefined;\n costInUsdTicks?: JsonValue | undefined;\n duration?: JsonValue | undefined;\n}\n\nexport interface XaiVideoClient {\n generateVideo: typeof experimental_generateVideo;\n}\n\nexport interface XaiVideoAdapterDeps {\n createXaiClient: (opts: { apiKey: string }) => XaiVideoClient;\n}\n\nconst defaultXaiDeps: XaiVideoAdapterDeps = {\n createXaiClient: () => ({ generateVideo: experimental_generateVideo }),\n};\n\nexport function createXaiVideoAdapter(deps: XaiVideoAdapterDeps = defaultXaiDeps): Adapter {\n return {\n id: \"xai-video\",\n generateVideo: (req, ctx) => generateXaiVideo(req, ctx, deps),\n };\n}\n\nexport const xaiVideoAdapter: Adapter = createXaiVideoAdapter();\n\nconst xaiResponseStatusSchema = z.object({\n response: z.object({ status: z.number() }).partial(),\n});\n\nfunction xaiError(cause: unknown, ctx: AdapterContext): ModelKitError {\n const info = describeThrown(cause);\n const nested = xaiResponseStatusSchema.safeParse(cause);\n const status = info.status ?? (nested.success ? nested.data.response?.status : undefined);\n return classifyThrown(\"xai-video\", cause, ctx.model.id, { status, body: info.body });\n}\n\nconst xaiMetaSchema = z.object({\n videoUrl: JsonValueSchema.optional(),\n costInUsdTicks: JsonValueSchema.optional(),\n duration: JsonValueSchema.optional(),\n});\n\nconst xaiProviderMetadataSchema = z.object({ xai: xaiMetaSchema });\n\nfunction metaOf(result: { providerMetadata?: unknown }): XaiVideoMeta {\n const parsed = xaiProviderMetadataSchema.partial().safeParse(result.providerMetadata);\n if (!parsed.success) return {};\n return parsed.data.xai ?? {};\n}\n\ntype XaiProviderOptions = {\n resolution?: string;\n pollIntervalMs: number;\n pollTimeoutMs: number;\n mode?: string;\n referenceImageUrls?: string[];\n};\n\ninterface PollOpts {\n intervalMs: number;\n timeoutMs: number;\n signal?: AbortSignal;\n}\n\nasync function generateXaiVideo(\n req: VideoRequest,\n ctx: AdapterContext,\n deps: XaiVideoAdapterDeps,\n): Promise<VideoJob> {\n const apiKey = ctx.keys.xai;\n if (!apiKey) {\n throw new ModelKitError({\n code: \"auth\",\n message: \"Missing API key for xai\",\n provider: \"xai-video\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n // firstFrame is xAI's start image (SDK frameImages); referenceImages are R2V\n // references, capped at the 7 the provider accepts. Bytes refs go up as data URLs.\n const refUrls = (req.referenceImages ?? []).map(refToUrl).slice(0, 7);\n const xaiOptions: XaiProviderOptions = {\n pollIntervalMs: POLL_INTERVAL_MS,\n pollTimeoutMs: POLL_TIMEOUT_MS,\n };\n // xAI accepts only these three; leave the field off so the provider default applies.\n if (req.resolution === \"480p\" || req.resolution === \"720p\" || req.resolution === \"1080p\") {\n xaiOptions.resolution = req.resolution;\n }\n if (refUrls.length > 0) {\n xaiOptions.mode = \"reference-to-video\";\n xaiOptions.referenceImageUrls = refUrls;\n }\n if (req.lastFrame !== undefined) {\n ctx.warnings.push({\n code: \"option_ignored\",\n field: \"lastFrame\",\n message: \"xai-video does not support lastFrame; ignored\",\n });\n }\n const client = deps.createXaiClient({ apiKey });\n const model = createXai({ apiKey, fetch: ctx.fetch }).video(ctx.model.providerModelId);\n\n type GenerateVideoArgs = Parameters<typeof experimental_generateVideo>[0];\n const callBody: GenerateVideoArgs = {\n model,\n prompt: req.prompt,\n providerOptions: { xai: xaiOptions },\n };\n if (req.firstFrame) {\n callBody.frameImages = [{ image: refToUrl(req.firstFrame), frameType: \"first_frame\" }];\n }\n if (req.aspectRatio !== undefined && req.aspectRatio !== \"adaptive\") {\n callBody.aspectRatio = req.aspectRatio;\n }\n if (req.durationSeconds !== undefined) callBody.duration = req.durationSeconds;\n if (ctx.signal) callBody.abortSignal = ctx.signal;\n\n const pending = (async () => {\n try {\n return await client.generateVideo(callBody);\n } catch (cause) {\n throw xaiError(cause, ctx);\n }\n })();\n\n let settled: VideoResult | undefined;\n let failed: unknown;\n pending.then(\n (result) => {\n void mapResult(ctx, req, result).then(\n (mapped) => {\n settled = mapped;\n },\n (cause: unknown) => {\n failed = cause;\n },\n );\n },\n (cause: unknown) => {\n failed = cause;\n },\n );\n\n const check = async (): Promise<VideoResult | undefined> => {\n if (failed !== undefined) throw failed;\n return settled;\n };\n return {\n // xAI exposes no request id on the synchronous handle, so each job gets a fresh one.\n jobId: crypto.randomUUID(),\n async poll() {\n if (failed !== undefined) return { status: \"failed\" };\n return settled ? { status: \"succeeded\" } : { status: \"pending\" };\n },\n async result(opts) {\n const resultSignal = opts?.signal ?? ctx.signal;\n const resultOpts: PollOpts = {\n intervalMs: opts?.pollIntervalMs ?? POLL_INTERVAL_MS,\n timeoutMs: opts?.timeoutMs ?? POLL_TIMEOUT_MS,\n };\n if (resultSignal) resultOpts.signal = resultSignal;\n return pollUntil(check, resultOpts);\n },\n };\n}\n\nasync function mapResult(\n ctx: AdapterContext,\n req: VideoRequest,\n result: Awaited<ReturnType<typeof experimental_generateVideo>>,\n): Promise<VideoResult> {\n const first = result.videos[0];\n if (first) {\n return {\n video: { bytes: Uint8Array.from(first.uint8Array), mime: first.mediaType },\n usage: usage(ctx, req, metaOf(result)),\n raw: result.providerMetadata,\n };\n }\n const meta = metaOf(result);\n const videoUrl = z.string().safeParse(meta.videoUrl);\n if (videoUrl.success && videoUrl.data) {\n const res = await ctx.fetch(videoUrl.data);\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw classifyHttpError(res.status, text, \"xai-video\", ctx.model.id);\n }\n const mime = res.headers.get(\"content-type\") ?? \"video/mp4\";\n return {\n video: { bytes: new Uint8Array(await res.arrayBuffer()), mime },\n usage: usage(ctx, req, meta),\n raw: result.providerMetadata,\n };\n }\n throw new ModelKitError({\n code: \"provider_rejected\",\n message: \"xai-video returned no video\",\n provider: \"xai-video\",\n model: ctx.model.id,\n retryable: false,\n });\n}\n\nfunction usage(ctx: AdapterContext, req: VideoRequest, meta: XaiVideoMeta): UsageEvent {\n // The row bills by reported cost; when xAI omits it the quantity is 0 and the\n // requested duration rides along so a sink can still price the call.\n const costTicks = z.number().safeParse(meta.costInUsdTicks);\n const cost = costTicks.success ? costTicks.data / 1e10 : undefined;\n const event: UsageEvent = {\n model: ctx.model.id,\n provider: \"xai-video\",\n modality: \"VIDEO\",\n unit: \"reported_cost_usd\",\n quantity: cost ?? 0,\n };\n if (cost !== undefined) event.reportedCostUsd = cost;\n if (req.durationSeconds !== undefined) event.durationSeconds = req.durationSeconds;\n if (req.resolution !== undefined) event.resolution = req.resolution;\n return event;\n}\n","import type { AdapterRegistry } from \"../client.js\";\nimport { aiSdkTextAdapter } from \"./ai-sdk-text.js\";\nimport { arkAdapter } from \"./ark.js\";\nimport { falAdapter } from \"./fal.js\";\nimport { googleGenaiAdapter } from \"./google-genai.js\";\nimport { googleImageAdapter } from \"./google-image.js\";\nimport { higgsfieldAdapter } from \"./higgsfield.js\";\nimport { openaiImageAdapter } from \"./openai-image.js\";\nimport { prodiaAdapter } from \"./prodia.js\";\nimport { replicateAdapter } from \"./replicate.js\";\nimport { xaiVideoAdapter } from \"./xai-video.js\";\n\nexport const DEFAULT_ADAPTERS: AdapterRegistry = {\n \"ai-sdk-text\": aiSdkTextAdapter,\n \"google-image\": googleImageAdapter,\n \"openai-image\": openaiImageAdapter,\n \"google-genai\": googleGenaiAdapter,\n ark: arkAdapter,\n fal: falAdapter,\n replicate: replicateAdapter,\n prodia: prodiaAdapter,\n higgsfield: higgsfieldAdapter,\n \"xai-video\": xaiVideoAdapter,\n};\n\nexport {\n aiSdkTextAdapter,\n arkAdapter,\n falAdapter,\n googleGenaiAdapter,\n googleImageAdapter,\n higgsfieldAdapter,\n openaiImageAdapter,\n prodiaAdapter,\n replicateAdapter,\n xaiVideoAdapter,\n};\nexport { aspectRatioToSize } from \"./openai-image.js\";\n","import { DEFAULT_ADAPTERS } from \"./adapters/index.js\";\nimport { createModelKit, type ModelKit } from \"./client.js\";\nimport { keysFromEnv } from \"./keys.js\";\nimport type { ModelKitConfig } from \"./types.js\";\n\n/**\n * All adapters registered. Keys default to process.env (pro = bare names,\n * enterprise = ENTERPRISE_ prefix) when `keys` is omitted.\n */\nexport function createDefaultModelKit(config: Partial<ModelKitConfig> = {}): ModelKit {\n const keys = config.keys ?? {\n pro: keysFromEnv(process.env),\n enterprise: keysFromEnv(process.env, \"ENTERPRISE_\"),\n };\n return createModelKit({ ...config, keys }, DEFAULT_ADAPTERS);\n}\n\n/**\n * Environment-backed calls with the `ai` function names and shapes. Use a configured\n * kit for routing, tier keys, or a usage sink.\n */\nexport const generateText: ModelKit[\"generateText\"] = (options, call) =>\n createDefaultModelKit().generateText(options, call);\nexport const streamText: ModelKit[\"streamText\"] = (options, call) =>\n createDefaultModelKit().streamText(options, call);\nexport const generateObject: ModelKit[\"generateObject\"] = (options, call) =>\n createDefaultModelKit().generateObject(options, call);\nexport const streamObject: ModelKit[\"streamObject\"] = (options, call) =>\n createDefaultModelKit().streamObject(options, call);\nexport const generateImage: ModelKit[\"generateImage\"] = (req, call) =>\n createDefaultModelKit().generateImage(req, call);\nexport const generateVideo: ModelKit[\"generateVideo\"] = (req, call) =>\n createDefaultModelKit().generateVideo(req, call);\nexport const generateAudio: ModelKit[\"generateAudio\"] = (req, call) =>\n createDefaultModelKit().generateAudio(req, call);\nexport const prepareMediaPart: ModelKit[\"prepareMediaPart\"] = (modelId, ref, mediaType, call) =>\n createDefaultModelKit().prepareMediaPart(modelId, ref, mediaType, call);\nexport const languageModel: ModelKit[\"languageModel\"] = (modelId, call) =>\n createDefaultModelKit().languageModel(modelId, call);\nexport const describe: ModelKit[\"describe\"] = (modelId) =>\n createDefaultModelKit().describe(modelId);\n"],"mappings":"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","names":["generateText","import_zod","text","text","usage","usage","import_ai","import_zod","text","import_zod","route","aiGenerateImage","usage","generateAudio","aiGenerateVideo","aiGenerateText","aiStreamText","languageModel","aiGenerateObject","aiStreamObject","import_zod","text","usage","import_zod","client","headers","mime","import_zod","import_zod","text","defaultDeps","RESULT_TIMEOUT_MS","text","videoUsage","client","usage","import_google","import_ai","import_zod","usage","import_zod","videoUsage","import_openai","import_zod","toProviderError","OpenAI","client","usage","text","usage","import_zod","Replicate","imageUsage","videoUsage","text","usage","import_ai","import_xai","import_zod","POLL_INTERVAL_MS","POLL_TIMEOUT_MS","client","text","generateText"]}
|