@shop-os/modelkit 0.1.2 → 0.1.3

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.
@@ -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/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/json.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 { resolveImageOptions, resolveVideoOptions, nearestAspectRatio } 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\nconst GEMINI_RATIOS: AspectRatio[] = [\"1:1\", \"16:9\", \"9:16\", \"4:3\", \"3:4\", \"21:9\", \"4:5\", \"5:4\"];\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: { aspectRatios: [...GEMINI_RATIOS], sizes },\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 [\"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 ],\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 },\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 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 \"97:30\",\n ],\n sizes: [\"1K\", \"2K\"],\n references: { images: 10 },\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 supports: [\"outputFormat\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\", outputFormat: \"png\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n },\n {\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: [\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 \"97:30\",\n ],\n sizes: [\"1K\", \"2K\", \"4K\"],\n requires: [\"references\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n },\n {\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: [\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 \"97:30\",\n ],\n sizes: [\"1K\"],\n requires: [\"references\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n },\n {\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: [\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 \"97:30\",\n ],\n sizes: [\"1K\", \"2K\", \"4K\"],\n references: { images: 9 },\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { unit: \"compute_seconds\", modality: \"IMAGE\" },\n pricingKind: \"image_size\",\n },\n {\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: [\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 \"97:30\",\n ],\n sizes: [\"1K\", \"2K\", \"4K\"],\n references: { images: 1 },\n requires: [\"references\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { unit: \"compute_seconds\", modality: \"IMAGE\" },\n pricingKind: \"image_size\",\n },\n {\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: [\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 \"97:30\",\n ],\n sizes: [\"1K\", \"2K\", \"4K\"],\n references: { images: 1 },\n requires: [\"references\"],\n supports: [\"outputFormat\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\", 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 },\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 },\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 defaults: {},\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 },\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: {},\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\"],\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\"],\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\"];\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 aspectRatios: [...OMNI_RATIOS],\n resolutions: [\"720p\"],\n durations: [3, 4, 5, 6, 7, 8, 9, 10],\n references: { images: 6, videos: 1 },\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-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 },\n defaults: { durationSeconds: 8, resolution: \"720p\", aspectRatio: \"16:9\" },\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\"],\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\"],\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\"],\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 },\n defaults: { durationSeconds: 8, resolution: \"720p\", 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\"],\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\"],\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\"],\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\"],\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 },\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\"],\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 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[] = [\"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 warnings: Warning[],\n): number | undefined {\n if (requested === undefined || !durations) return requested;\n let to = requested;\n if (Array.isArray(durations)) {\n if (durations.includes(requested)) return requested;\n to = durations.reduce(\n (best, d) => (Math.abs(d - requested) < Math.abs(best - requested) ? d : best),\n durations[0] ?? requested,\n );\n } else {\n to = Math.min(Math.max(requested, durations.min), durations.max);\n if (to === requested) return requested;\n }\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\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 if (merged.aspectRatio && c.aspectRatios && !c.aspectRatios.includes(merged.aspectRatio)) {\n const to = nearestAspectRatio(merged.aspectRatio, c.aspectRatios);\n warnings.push({\n code: \"ratio_coerced\",\n field: \"aspectRatio\",\n from: merged.aspectRatio,\n to,\n message: `aspect ratio ${merged.aspectRatio} coerced to ${to} for ${model.id}`,\n });\n merged.aspectRatio = to;\n }\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, [\"seed\", \"quality\", \"count\", \"outputFormat\"]);\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 if (merged.aspectRatio && c.aspectRatios && !c.aspectRatios.includes(merged.aspectRatio)) {\n const to = nearestAspectRatio(merged.aspectRatio, c.aspectRatios);\n warnings.push({\n code: \"ratio_coerced\",\n field: \"aspectRatio\",\n from: merged.aspectRatio,\n to,\n message: `aspect ratio ${merged.aspectRatio} coerced to ${to} for ${model.id}`,\n });\n merged.aspectRatio = to;\n }\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(merged.durationSeconds, c.durations, model, warnings);\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 ]);\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 if (!supports) return;\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/**\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(\"openrouter\", pick(\"OPENROUTER_API_KEY\"));\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\";\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 const blocked = /content_policy|safety|blockReason|PROHIBITED_CONTENT|moderation/i.test(text);\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 if (\n err.name === \"AbortError\" ||\n /ECONNRESET|ETIMEDOUT|fetch failed|socket hang up/i.test(err.message)\n )\n 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/** 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 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, 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 } 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, resolveKeys } from \"./keys.js\";\nimport { resolveImageOptions, resolveVideoOptions } 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\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 * 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\") return [textKeyName(model, config.routing ?? {})];\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([\"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\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 keys = resolveKeys(config, requiredKeys(model, config), 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 (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 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 { model, prompt, n, count, size, aspectRatio, seed, providerOptions } = req;\n const options: Parameters<typeof aiGenerateImage>[0] = { model, prompt };\n const quantity = n ?? count;\n if (quantity !== undefined) options.n = quantity;\n const exact = exactSize.safeParse(size);\n if (exact.success) options.size = exact.data;\n const ratio = sdkAspectRatio(aspectRatio);\n if (ratio) options.aspectRatio = ratio;\n if (seed !== undefined) options.seed = seed;\n if (providerOptions) options.providerOptions = providerOptions;\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 { model, prompt, aspectRatio, duration, durationSeconds, seed, providerOptions } =\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 ratio = sdkAspectRatio(aspectRatio);\n if (ratio) options.aspectRatio = ratio;\n if (seconds !== undefined) options.duration = seconds;\n if (seed !== undefined) options.seed = seed;\n if (providerOptions) options.providerOptions = providerOptions;\n if (abortSignal) options.abortSignal = abortSignal;\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 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 };\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 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) => emit({ ...out.usage, model: model.id }).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 { adapter, ctx } = context(model, call, []);\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(\n { ...model.defaults, ...req, model: model.id },\n ctx,\n );\n await emit({ ...result.usage, model: model.id });\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: 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(event);\n return result;\n },\n streamText<TOOLS extends ToolSet, OUTPUT extends Output.Output>(\n options: ModelkitStreamTextOptions<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>(options.prepareStep),\n onFinish: async (event) => {\n for (const usage of steps.usage(event.steps)) await emit(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(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(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 type { 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/** 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/**\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(). Throws on HTTP errors; the\n * calling adapter maps the failure through classifyHttpError.\n */\nexport async function mediaRefToBytes(\n ref: MediaRef,\n fetch: typeof globalThis.fetch,\n): Promise<{ bytes: Uint8Array; mime: string }> {\n if (!isUrlRef(ref)) return { bytes: ref.bytes, mime: ref.mime };\n const res = await fetch(ref.url);\n if (!res.ok) throw new Error(`reference fetch failed (${res.status}): ${ref.url}`);\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, so a vendor whose default base has an API version\n * (Google's /v1beta) needs it here; the others accept the bare slug.\n */\nconst GATEWAY_SLUGS: Partial<Record<TextProvider, string>> = {\n openai: \"openai\",\n anthropic: \"anthropic\",\n google: \"google-ai-studio/v1beta\",\n xai: \"grok\",\n perplexity: \"perplexity-ai\",\n deepseek: \"deepseek\",\n};\n\n/** OpenRouter model ids are \"<vendor>/<model>\". */\nconst OPENROUTER_VENDORS: Record<TextProvider, string> = {\n openai: \"openai\",\n anthropic: \"anthropic\",\n google: \"google\",\n xai: \"x-ai\",\n perplexity: \"perplexity\",\n deepseek: \"deepseek\",\n moonshot: \"moonshotai\",\n minimax: \"minimax\",\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 if (routing.text === \"openrouter\") return \"openrouter\";\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\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 * openrouter: always the OpenAI-compatible client at openrouter.ai with \"<vendor>/<model>\" ids.\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 if (mode === \"openrouter\") {\n const modelId = ctx.model.providerModelId.includes(\"/\")\n ? ctx.model.providerModelId\n : `${OPENROUTER_VENDORS[provider]}/${ctx.model.providerModelId}`;\n return {\n provider,\n client: \"openai-compatible\",\n modelId,\n keyName: \"openrouter\",\n baseURL: \"https://openrouter.ai/api/v1\",\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:\n route.provider === \"openai\"\n ? \"openai\"\n : ctx.routing.text === \"openrouter\"\n ? \"openrouter\"\n : 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 { classifyHttpError, pollUntil, withRetry, type RetryOptions } from \"../retry.js\";\nimport type {\n AspectRatio,\n ImageRequest,\n ImageSize,\n MediaRef,\n UsageEvent,\n VideoJob,\n VideoRequest,\n} from \"../types.js\";\nimport type { Adapter, AdapterContext } from \"./adapter.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\nconst SEEDREAM_SIZES: Record<\"1K\" | \"2K\", 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 \"4:5\": \"864x1080\",\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 \"4:5\": \"1728x2160\",\n },\n};\n\nexport const arkAdapter: Adapter = {\n id: \"ark\",\n async generateImage(req: ImageRequest, ctx: AdapterContext) {\n return generateSeedreamImage(req, ctx);\n },\n async generateVideo(req: VideoRequest, ctx: AdapterContext): Promise<VideoJob> {\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|inputimage|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 throw classifyHttpError(status, body, \"ark\", model);\n}\n\nfunction seedreamSize(aspect: AspectRatio | undefined, size: ImageSize | undefined): string {\n // 4K never reaches Ark: resolveOptions guarantees it, clamp defensively.\n const tier = size === \"1K\" ? \"1K\" : \"2K\";\n const table = SEEDREAM_SIZES[tier];\n return table[aspect ?? \"\"] ?? table[\"1:1\"] ?? \"2048x2048\";\n}\n\nfunction outputMime(format: ImageRequest[\"outputFormat\"]): string {\n if (format === \"png\") return \"image/png\";\n if (format === \"webp\") return \"image/webp\";\n return \"image/jpeg\";\n}\n\n// Verified asset:// ids from ctx.call.verifiedAssetUrls and every other image\n// url pass through unchanged; the human-face rejection stays the provider's.\nfunction arkUrl(ref: MediaRef): string {\n if (\"url\" in ref) return ref.url;\n return `data:${ref.mime};base64,${Buffer.from(ref.bytes).toString(\"base64\")}`;\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\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(arkUrl);\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 ctx.fetch(\n `${ARK_BASE_URL}/images/generations`,\n fetchInitFor(ctx, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${key}`, \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n }),\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 ctx.fetch(imageUrl, fetchInitFor(ctx, {}));\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: outputMime(req.outputFormat) }], usage, raw: data };\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 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}\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: arkUrl(req.firstFrame) },\n role: \"first_frame\",\n });\n }\n if (req.lastFrame) {\n content.push({\n type: \"image_url\",\n image_url: { url: arkUrl(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: arkUrl(ref) },\n role: \"reference_image\",\n });\n }\n if (req.sourceVideo) {\n content.push({\n type: \"video_url\",\n video_url: { url: arkUrl(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: arkUrl(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: arkUrl(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\n const submit = await withRetry(async () => {\n const res = await ctx.fetch(\n `${ARK_BASE_URL}${SUBMIT_PATH}`,\n fetchInitFor(ctx, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${key}`, \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n }),\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 ctx.fetch(\n `${ARK_BASE_URL}${SUBMIT_PATH}/${jobId}`,\n fetchInitFor(ctx, {\n headers: { Authorization: `Bearer ${key}` },\n }),\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 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, pollUntil, sleep, withRetry } from \"../retry.js\";\nimport { JsonValueSchema, describeThrown } from \"../json.js\";\nimport type {\n ImageRequest,\n ImageResult,\n JsonObject,\n JsonValue,\n MediaRef,\n UsageEvent,\n VideoJob,\n VideoRequest,\n VideoResult,\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(endpoint: string, options: { input: JsonObject }): Promise<JsonValue>;\n}\n\nexport interface FalAdapterDeps {\n createFalClient: (opts: { credentials: string }) => FalClientLike;\n}\n\nconst falSubscribePayloadSchema = z.object({ data: JsonValueSchema });\n\nfunction defaultCreateFalClient(opts: { credentials: string }): FalClientLike {\n const client = createFalClient(opts);\n return {\n async subscribe(endpoint: string, options: { input: JsonObject }): Promise<JsonValue> {\n const outcome = await client.subscribe(endpoint, { input: options.input });\n const unwrapped = falSubscribePayloadSchema.safeParse(outcome);\n if (unwrapped.success) return unwrapped.data.data;\n return JsonValueSchema.parse(outcome);\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) => generateMuseImage(req, ctx, deps),\n generateVideo: (req, ctx) => generateFalVideo(req, ctx, deps),\n };\n}\n\nexport const falAdapter: Adapter = createFalAdapter();\n\nfunction refToUrl(ref: MediaRef): string {\n if (\"url\" in ref) return ref.url;\n return `data:${ref.mime};base64,${Buffer.from(ref.bytes).toString(\"base64\")}`;\n}\n\nasync 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\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 if (isModelKitError(cause)) return cause;\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 falError(status, body, model);\n }\n const info = describeThrown(cause);\n return falError(info.status, info.body, model);\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\nasync function subscribe(\n ctx: AdapterContext,\n deps: FalAdapterDeps,\n endpoint: string,\n input: JsonObject,\n): Promise<JsonValue> {\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 const client = deps.createFalClient({ credentials: falKey });\n try {\n return await withRetry(\n async () => {\n try {\n return await client.subscribe(endpoint, { input });\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\nfunction minimaxFamily(providerModelId: string): \"h3\" | \"h3-max\" {\n return providerModelId.toLowerCase().includes(\"h3-max\") ? \"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 enable_safety_checker: true,\n };\n if (req.seed !== undefined) input.seed = req.seed;\n return input;\n}\n\nfunction isKling(providerModelId: string): boolean {\n return providerModelId.toLowerCase().includes(\"kling\");\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 ratio =\n req.aspectRatio === \"16:9\" || req.aspectRatio === \"9:16\" || req.aspectRatio === \"1:1\"\n ? req.aspectRatio\n : \"auto\";\n const input: KlingO1VideoInput = {\n prompt: req.prompt,\n video_url: source,\n duration: String(duration),\n aspect_ratio: ratio,\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 const result = await runJob(ctx, deps, KLING_O1_ENDPOINT, input);\n return completedVideoJob(\n ctx,\n req,\n extractVideoUrl(result, KLING_O1_ENDPOINT, ctx.model.id),\n result,\n );\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 base.aspect_ratio = req.aspectRatio ?? \"adaptive\";\n }\n if (ctx.routing.fal === \"cloudflare-passthrough\") {\n return await passthroughVideoJob(ctx, req, endpoint, base);\n }\n const result = await runJob(ctx, deps, endpoint, base);\n return completedVideoJob(ctx, req, extractVideoUrl(result, endpoint, ctx.model.id), result);\n}\n\nfunction completedVideoJob(\n ctx: AdapterContext,\n req: VideoRequest,\n url: string,\n raw: JsonValue,\n): VideoJob {\n const duration = req.durationSeconds ?? 5;\n const result: VideoResult = { video: { url }, usage: videoUsage(ctx, req, duration), raw };\n return {\n jobId: url,\n async poll() {\n return { status: \"succeeded\", raw };\n },\n async result() {\n return result;\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 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 { 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 { classifyHttpError, pollUntil, withRetry, type RetryOptions } 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 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}\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 if (cause instanceof ModelKitError) throw cause;\n const info = describeThrown(cause);\n throw classifyHttpError(info.status, info.body, \"google-genai\", 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 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 ?? \"veo-operation\";\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 : videos.length > 0 || images.length > 1\n ? \"reference_to_video\"\n : req.firstFrame || images.length === 1\n ? \"image_to_video\"\n : \"text_to_video\";\n\n const responseFormat: OmniResponseFormat = { type: \"video\" };\n if (req.sourceVideo === undefined) responseFormat.aspect_ratio = toOmniAspect(req.aspectRatio);\n const omniResolution = toOmniResolution(req.resolution);\n if (omniResolution !== undefined) responseFormat.resolution = omniResolution;\n responseFormat.duration = `${duration}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 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 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 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 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 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 });\n\n const createRetryOptions: RetryOptions = { attempts: 3 };\n if (ctx.signal !== undefined) createRetryOptions.signal = ctx.signal;\n let interaction: OmniInteraction;\n try {\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 const inlineRetryOptions: RetryOptions = { attempts: 3 };\n if (ctx.signal !== undefined) inlineRetryOptions.signal = ctx.signal;\n try {\n interaction = await withRetry(async () => {\n try {\n return await callCreate(inlineParts);\n } catch (inlineCause) {\n throwSdkError(inlineCause, modelId);\n }\n }, inlineRetryOptions);\n } catch (inlineCause) {\n throwSdkError(inlineCause, modelId);\n }\n }\n } catch (cause) {\n await cleanupUploads();\n throw cause;\n }\n\n const jobId = interaction.id ?? \"gemini-omni-interaction\";\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 try {\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 } finally {\n await cleanupUploads();\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 } 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: Array<{ category: string; threshold: string }>;\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}\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}\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 (\"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 // TODO: honor ctx.call.postCropToAspect with a center-crop here once an\n // image library is available (sharp is not a dependency of modelkit).\n void ctx.call.postCropToAspect;\n\n const imageConfig: GeminiImageConfig = {};\n if (req.aspectRatio !== undefined) imageConfig.aspectRatio = req.aspectRatio;\n if (req.size !== undefined) imageConfig.imageSize = req.size;\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 return await deps.runTextGeneration({\n model,\n messages: [{ role: \"user\", content }],\n maxRetries: 0,\n providerOptions: {\n google: {\n imageConfig,\n responseModalities: [\"IMAGE\"],\n safetySettings: [\n {\n category: \"HARM_CATEGORY_SEXUALLY_EXPLICIT\",\n threshold: \"OFF\",\n },\n { category: \"HARM_CATEGORY_HATE_SPEECH\", threshold: \"OFF\" },\n {\n category: \"HARM_CATEGORY_DANGEROUS_CONTENT\",\n threshold: \"OFF\",\n },\n { category: \"HARM_CATEGORY_HARASSMENT\", threshold: \"OFF\" },\n ],\n },\n },\n abortSignal: signal,\n });\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 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, pollUntil } from \"../retry.js\";\nimport { JsonValueSchema, describeThrown } from \"../json.js\";\nimport type {\n JsonValue,\n MediaRef,\n UsageEvent,\n VideoJob,\n VideoRequest,\n VideoResult,\n} from \"../types.js\";\nimport { DEFAULT_MOTION, resolveMotionId } from \"./higgsfield-motions.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\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\nfunction refToUrl(ref: MediaRef): string {\n if (\"url\" in ref) return ref.url;\n return `data:${ref.mime};base64,${Buffer.from(ref.bytes).toString(\"base64\")}`;\n}\n\nasync 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\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\nfunction isDop(providerModelId: string): boolean {\n return providerModelId.toLowerCase().includes(\"dop\");\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\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) 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 let createRes: Response;\n try {\n createRes = await ctx.fetch(\n endpoint,\n requestInit(ctx, { method: \"POST\", body: JSON.stringify(body) }),\n );\n } catch (cause) {\n throw networkError(cause, ctx);\n }\n if (!createRes.ok) {\n throw classifyHttpError(\n createRes.status,\n await readBody(createRes),\n \"higgsfield\",\n ctx.model.id,\n );\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 if (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\nfunction networkError(cause: unknown, ctx: AdapterContext): ModelKitError {\n if (isModelKitError(cause)) return cause;\n const info = describeThrown(cause);\n return classifyHttpError(info.status, info.body, \"higgsfield\", ctx.model.id);\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 let createRes: Response;\n try {\n createRes = await ctx.fetch(\n DOP_ENDPOINT,\n requestInit(ctx, {\n method: \"POST\",\n body: JSON.stringify({ params, webhook: null }),\n }),\n );\n } catch (cause) {\n throw networkError(cause, ctx);\n }\n if (!createRes.ok) {\n throw classifyHttpError(\n createRes.status,\n await readBody(createRes),\n \"higgsfield\",\n ctx.model.id,\n );\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 = { video: { url }, usage: videoUsage(ctx, req) };\n return result;\n },\n };\n}\n\nexport const higgsfieldAdapter: Adapter = {\n id: \"higgsfield\",\n generateVideo: (req, ctx) =>\n isDop(ctx.model.providerModelId)\n ? generateDopVideo(req, ctx)\n : generateKlingVideo(req, ctx),\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 } 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 const TIER_LONG_EDGE: 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];\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 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 // 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 model: ctx.model.providerModelId,\n prompt: req.prompt,\n size,\n quality: sdkQuality,\n ...count,\n });\n }\n return await client.images.generate({\n model: ctx.model.providerModelId,\n prompt: req.prompt,\n quality: sdkQuality,\n ...count,\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 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 model: ctx.model.providerModelId,\n image: imageInput,\n prompt: req.prompt,\n size,\n quality: sdkQuality,\n ...count,\n });\n }\n return await client.images.edit({\n model: ctx.model.providerModelId,\n image: imageInput,\n prompt: req.prompt,\n quality: sdkQuality,\n ...count,\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 let usage: UsageEvent;\n if (inputTokens !== undefined || outputTokens !== undefined) {\n usage = {\n model: ctx.model.id,\n provider: \"openai-image\",\n modality: \"IMAGE\",\n unit: \"tokens\",\n quantity: (inputTokens ?? 0) + (outputTokens ?? 0),\n imageQuality: quality,\n };\n if (inputTokens !== undefined) usage.inputTokens = inputTokens;\n if (outputTokens !== undefined) usage.outputTokens = outputTokens;\n } else {\n usage = {\n model: ctx.model.id,\n provider: \"openai-image\",\n modality: \"IMAGE\",\n unit: \"images\",\n quantity: images.length,\n imageQuality: quality,\n };\n }\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, isModelKitError, type ProviderErrorBody } from \"../errors.js\";\nimport { classifyHttpError, transportError, withRetry, type RetryOptions } from \"../retry.js\";\nimport type { AspectRatio, ImageRequest, ImageResult, MediaRef, UsageEvent } from \"../types.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.\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};\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// 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 const res = await ctx.fetch(ref.url);\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(\n status: number | undefined,\n body: ProviderErrorBody,\n model: string,\n): 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\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 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 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 }[];\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 (\n providerModelId === \"flux-2-pro\" ||\n providerModelId === FLUX_2_PRO_JOB ||\n providerModelId === \"inference.gemini-3-pro.img2img.v1\" ||\n providerModelId === \"inference.nano-banana.img2img.v2\"\n ) {\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 const jobType = providerModelId === \"flux-2-pro\" ? FLUX_2_PRO_JOB : providerModelId;\n job = { type: jobType, 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}.jpg`, { type: \"image/jpeg\" }),\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 attemptRes = await ctx.fetch(PRODIA_JOB_URL, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${key}`, Accept: accept },\n body: form,\n });\n } catch (err) {\n if (isModelKitError(err)) throw err;\n throw transportError(\"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 if (isModelKitError(err)) throw err;\n throw transportError(\"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, pollUntil, withRetry } from \"../retry.js\";\nimport type {\n AudioRequest,\n AudioResult,\n ImageRequest,\n ImageResult,\n JsonObject,\n JsonValue,\n MediaRef,\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): Promise<PredictionLike>;\n get(predictionId: string): Promise<PredictionLike>;\n}\n\nexport interface ReplicateClientLike {\n predictions: ReplicatePredictionsClient;\n}\n\nexport interface ReplicateAdapterDeps {\n createReplicateClient: (opts: { auth: string }) => 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 });\n}\n\nfunction refToUrl(ref: MediaRef): string {\n if (\"url\" in ref) return ref.url;\n return `data:${ref.mime};base64,${Buffer.from(ref.bytes).toString(\"base64\")}`;\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 classifyHttpError(status, info.body, \"replicate\", ctx.model.id);\n}\n\nfunction isLower(id: string): string {\n return id.toLowerCase();\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 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 return await api.predictions.create(createOptions);\n } catch (cause) {\n throw replicateError(cause, ctx);\n }\n },\n ctx.signal ? { signal: ctx.signal } : {},\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(prediction.id);\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\nfunction isUpscaler(providerModelId: string): boolean {\n const id = isLower(providerModelId);\n return id.includes(\"upscal\") || id.includes(\"crystal\") || id.includes(\"topaz\");\n}\n\nfunction isQwen(providerModelId: string): boolean {\n return isLower(providerModelId).includes(\"qwen\");\n}\n\ninterface ReplicateImageInput {\n prompt: string;\n image?: string;\n creativity?: number;\n scale_factor?: number;\n output_format?: string;\n match_input_image?: boolean;\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 | KlingVideoInput\n | HailuoVideoInput\n | WanVideoInput\n | LyriaAudioInput\n | MmaudioInput\n | ElevenLabsMusicInput;\n\nasync function generateReplicateImage(\n req: ImageRequest,\n ctx: AdapterContext,\n deps: ReplicateAdapterDeps,\n): Promise<ImageResult> {\n const id = ctx.model.providerModelId;\n const input: ReplicateImageInput = { prompt: req.prompt };\n if (isUpscaler(id)) {\n const refs = req.references ?? [];\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 to upscale`,\n provider: \"replicate\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n input.image = refToUrl(first);\n input.creativity = 0;\n input.scale_factor = 2;\n input.output_format = \"png\";\n } else if (isQwen(id)) {\n const refs = (req.references ?? []).map(refToUrl);\n const firstUrl = refs[0];\n if (firstUrl !== undefined) {\n input.image = firstUrl;\n input.match_input_image = true;\n }\n if (req.outputFormat !== undefined) input.output_format = req.outputFormat;\n } else {\n const refs = req.references ?? [];\n const first = refs[0];\n if (first) input.image = refToUrl(first);\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 };\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 {\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 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: 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 {\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 const id = isLower(ctx.model.providerModelId);\n const input = id.includes(\"kling\")\n ? id.includes(\"omni\")\n ? klingOmniInput(req)\n : klingInput(req)\n : id.includes(\"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 return await api.predictions.create(createOptions);\n } catch (cause) {\n throw replicateError(cause, ctx);\n }\n },\n ctx.signal ? { signal: ctx.signal } : {},\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(jobId);\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 id = isLower(ctx.model.providerModelId);\n const input = id.includes(\"mmaudio\")\n ? mmaudioInput(req, ctx)\n : id.includes(\"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, isModelKitError } from \"../errors.js\";\nimport { describeThrown, JsonValueSchema } from \"../json.js\";\nimport { classifyHttpError, pollUntil } from \"../retry.js\";\nimport type {\n JsonValue,\n MediaRef,\n UsageEvent,\n VideoJob,\n VideoRequest,\n VideoResult,\n} from \"../types.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\nfunction refToUrl(ref: MediaRef): string {\n if (\"url\" in ref) return ref.url;\n return `data:${ref.mime};base64,${Buffer.from(ref.bytes).toString(\"base64\")}`;\n}\n\nconst xaiResponseStatusSchema = z.object({\n response: z.object({ status: z.number() }).partial(),\n});\n\nfunction xaiError(cause: unknown, ctx: AdapterContext): ModelKitError {\n if (isModelKitError(cause)) return cause;\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 classifyHttpError(status, info.body, \"xai-video\", ctx.model.id);\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 // Single start frame plus reference images, capped at five; bytes refs go\n // up as data URLs. Absent refs mean plain text-to-video.\n const frames = [req.firstFrame, req.lastFrame, ...(req.referenceImages ?? [])].filter(\n (r): r is MediaRef => r !== undefined,\n );\n const refUrls = frames.map(refToUrl).slice(0, 5);\n const resolution = req.resolution === \"480p\" ? \"480p\" : \"720p\";\n const xaiOptions: XaiProviderOptions = {\n resolution,\n pollIntervalMs: POLL_INTERVAL_MS,\n pollTimeoutMs: POLL_TIMEOUT_MS,\n };\n if (refUrls.length > 0) {\n xaiOptions.mode = \"reference-to-video\";\n xaiOptions.referenceImageUrls = refUrls;\n }\n const client = deps.createXaiClient({ apiKey });\n const model = createXai({ apiKey }).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.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 jobId: `${ctx.model.id}-grok`,\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 const costTicks = z.number().safeParse(meta.costInUsdTicks);\n const cost = costTicks.success ? costTicks.data / 1e10 : undefined;\n if (cost !== 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,\n reportedCostUsd: cost,\n };\n if (req.durationSeconds !== undefined) event.durationSeconds = req.durationSeconds;\n if (req.resolution !== undefined) event.resolution = req.resolution;\n return event;\n }\n const event: UsageEvent = {\n model: ctx.model.id,\n provider: \"xai-video\",\n modality: \"VIDEO\",\n unit: \"seconds\",\n quantity: req.durationSeconds ?? 0,\n };\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","text","usage","usage","import_ai","import_zod","import_zod","route","aiGenerateImage","usage","aiGenerateVideo","aiGenerateText","aiStreamText","languageModel","aiGenerateObject","aiStreamObject","import_zod","text","usage","import_zod","import_zod","text","client","text","headers","mime","result","import_zod","import_zod","text","defaultDeps","RESULT_TIMEOUT_MS","text","videoUsage","client","usage","import_google","import_ai","import_zod","usage","import_zod","refToUrl","readBody","text","videoUsage","import_openai","import_zod","toProviderError","OpenAI","client","usage","text","usage","import_zod","Replicate","refToUrl","imageUsage","videoUsage","text","usage","import_ai","import_xai","import_zod","POLL_INTERVAL_MS","POLL_TIMEOUT_MS","refToUrl","client","text","event","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/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/json.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 { resolveImageOptions, resolveVideoOptions, nearestAspectRatio } 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\nconst GEMINI_RATIOS: AspectRatio[] = [\"1:1\", \"16:9\", \"9:16\", \"4:3\", \"3:4\", \"21:9\", \"4:5\", \"5:4\"];\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: { aspectRatios: [...GEMINI_RATIOS], sizes },\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 [\"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 ],\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: [\"1:1\", \"2:3\", \"3:2\", \"4:3\", \"3:4\", \"4:5\", \"5:4\", \"9:16\", \"16:9\", \"21:9\"],\n sizes: [\"1K\", \"2K\"],\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 supports: [\"outputFormat\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\", outputFormat: \"png\" },\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 },\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 },\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 },\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 },\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 },\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 },\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 defaults: {},\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 },\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: {},\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\"],\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\"],\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\"];\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 aspectRatios: [...OMNI_RATIOS],\n resolutions: [\"720p\"],\n durations: [3, 4, 5, 6, 7, 8, 9, 10],\n references: { images: 6, videos: 1 },\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-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 },\n defaults: { durationSeconds: 8, resolution: \"720p\", aspectRatio: \"16:9\" },\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\"],\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\"],\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\"],\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 },\n defaults: { durationSeconds: 8, resolution: \"720p\", 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\"],\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\"],\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\"],\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\"],\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 },\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\"],\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 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[] = [\"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 warnings: Warning[],\n): number | undefined {\n if (requested === undefined || !durations) return requested;\n let to = requested;\n if (Array.isArray(durations)) {\n if (durations.includes(requested)) return requested;\n to = durations.reduce(\n (best, d) => (Math.abs(d - requested) < Math.abs(best - requested) ? d : best),\n durations[0] ?? requested,\n );\n } else {\n to = Math.min(Math.max(requested, durations.min), durations.max);\n if (to === requested) return requested;\n }\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\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 if (merged.aspectRatio && c.aspectRatios && !c.aspectRatios.includes(merged.aspectRatio)) {\n const to = nearestAspectRatio(merged.aspectRatio, c.aspectRatios);\n warnings.push({\n code: \"ratio_coerced\",\n field: \"aspectRatio\",\n from: merged.aspectRatio,\n to,\n message: `aspect ratio ${merged.aspectRatio} coerced to ${to} for ${model.id}`,\n });\n merged.aspectRatio = to;\n }\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, [\"seed\", \"quality\", \"count\", \"outputFormat\"]);\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 if (merged.aspectRatio && c.aspectRatios && !c.aspectRatios.includes(merged.aspectRatio)) {\n const to = nearestAspectRatio(merged.aspectRatio, c.aspectRatios);\n warnings.push({\n code: \"ratio_coerced\",\n field: \"aspectRatio\",\n from: merged.aspectRatio,\n to,\n message: `aspect ratio ${merged.aspectRatio} coerced to ${to} for ${model.id}`,\n });\n merged.aspectRatio = to;\n }\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(merged.durationSeconds, c.durations, model, warnings);\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 ]);\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 if (!supports) return;\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/**\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(\"openrouter\", pick(\"OPENROUTER_API_KEY\"));\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\";\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 const blocked = /content_policy|safety|blockReason|PROHIBITED_CONTENT|moderation/i.test(text);\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 if (\n err.name === \"AbortError\" ||\n /ECONNRESET|ETIMEDOUT|fetch failed|socket hang up/i.test(err.message)\n )\n 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/** 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 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 } 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, resolveKeys } from \"./keys.js\";\nimport { resolveImageOptions, resolveVideoOptions } 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\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 * 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, so a\n // tier missing either must lose to a complete tier (the fal rule, mirrored).\n const names: ProviderKeyName[] = [textKeyName(model, config.routing ?? {})];\n if (config.routing?.text === \"cloudflare\") 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([\"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\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 keys = resolveKeys(config, requiredKeys(model, config), 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 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 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 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 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 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 };\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 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) => emit({ ...out.usage, model: model.id }).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 { adapter, ctx } = context(model, call, []);\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(\n { ...model.defaults, ...req, model: model.id },\n ctx,\n );\n await emit({ ...result.usage, model: model.id });\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: 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(event);\n return result;\n },\n streamText<TOOLS extends ToolSet, OUTPUT extends Output.Output>(\n options: ModelkitStreamTextOptions<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>(options.prepareStep),\n onFinish: async (event) => {\n for (const usage of steps.usage(event.steps)) await emit(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(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(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 type { 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/** 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/**\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(). Throws on HTTP errors; the\n * calling adapter maps the failure through classifyHttpError.\n */\nexport async function mediaRefToBytes(\n ref: MediaRef,\n fetch: typeof globalThis.fetch,\n): Promise<{ bytes: Uint8Array; mime: string }> {\n if (!isUrlRef(ref)) return { bytes: ref.bytes, mime: ref.mime };\n const res = await fetch(ref.url);\n if (!res.ok) throw new Error(`reference fetch failed (${res.status}): ${ref.url}`);\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, so a vendor whose default base has an API version\n * (Google's /v1beta) needs it here; the others accept the bare slug.\n */\nconst GATEWAY_SLUGS: Partial<Record<TextProvider, string>> = {\n openai: \"openai\",\n anthropic: \"anthropic\",\n google: \"google-ai-studio/v1beta\",\n xai: \"grok\",\n perplexity: \"perplexity-ai\",\n deepseek: \"deepseek\",\n};\n\n/** OpenRouter model ids are \"<vendor>/<model>\". */\nconst OPENROUTER_VENDORS: Record<TextProvider, string> = {\n openai: \"openai\",\n anthropic: \"anthropic\",\n google: \"google\",\n xai: \"x-ai\",\n perplexity: \"perplexity\",\n deepseek: \"deepseek\",\n moonshot: \"moonshotai\",\n minimax: \"minimax\",\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 if (routing.text === \"openrouter\") return \"openrouter\";\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\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 * openrouter: always the OpenAI-compatible client at openrouter.ai with \"<vendor>/<model>\" ids.\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 if (mode === \"openrouter\") {\n const modelId = ctx.model.providerModelId.includes(\"/\")\n ? ctx.model.providerModelId\n : `${OPENROUTER_VENDORS[provider]}/${ctx.model.providerModelId}`;\n return {\n provider,\n client: \"openai-compatible\",\n modelId,\n keyName: \"openrouter\",\n baseURL: \"https://openrouter.ai/api/v1\",\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:\n route.provider === \"openai\"\n ? \"openai\"\n : ctx.routing.text === \"openrouter\"\n ? \"openrouter\"\n : 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 { classifyHttpError, pollUntil, withRetry, type RetryOptions } from \"../retry.js\";\nimport type {\n AspectRatio,\n ImageRequest,\n ImageSize,\n MediaRef,\n UsageEvent,\n VideoJob,\n VideoRequest,\n} from \"../types.js\";\nimport type { Adapter, AdapterContext } from \"./adapter.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\", 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 \"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 \"4:5\": \"1728x2160\",\n \"5:4\": \"2160x1728\",\n },\n};\n\nexport const arkAdapter: Adapter = {\n id: \"ark\",\n async generateImage(req: ImageRequest, ctx: AdapterContext) {\n return generateSeedreamImage(req, ctx);\n },\n async generateVideo(req: VideoRequest, ctx: AdapterContext): Promise<VideoJob> {\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|inputimage|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 throw classifyHttpError(status, body, \"ark\", model);\n}\n\nfunction seedreamSize(aspect: AspectRatio | undefined, size: ImageSize | undefined): string {\n // 4K never reaches Ark: resolveOptions guarantees it, clamp defensively.\n const tier = size === \"1K\" ? \"1K\" : \"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\n// Verified asset:// ids from ctx.call.verifiedAssetUrls and every other image\n// url pass through unchanged; the human-face rejection stays the provider's.\nfunction arkUrl(ref: MediaRef): string {\n if (\"url\" in ref) return ref.url;\n return `data:${ref.mime};base64,${Buffer.from(ref.bytes).toString(\"base64\")}`;\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\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(arkUrl);\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 ctx.fetch(\n `${arkBaseUrl(ctx)}/images/generations`,\n fetchInitFor(ctx, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${key}`, \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n }),\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 ctx.fetch(imageUrl, fetchInitFor(ctx, {}));\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 SeedanceResponseSchema = z.object({\n id: z.string().optional(),\n status: z.string().optional(),\n content: z.object({ video_url: z.string().optional() }).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}\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: arkUrl(req.firstFrame) },\n role: \"first_frame\",\n });\n }\n if (req.lastFrame) {\n content.push({\n type: \"image_url\",\n image_url: { url: arkUrl(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: arkUrl(ref) },\n role: \"reference_image\",\n });\n }\n if (req.sourceVideo) {\n content.push({\n type: \"video_url\",\n video_url: { url: arkUrl(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: arkUrl(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: arkUrl(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\n const submit = await withRetry(async () => {\n const res = await ctx.fetch(\n `${arkBaseUrl(ctx)}${SUBMIT_PATH}`,\n fetchInitFor(ctx, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${key}`, \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n }),\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 ctx.fetch(\n `${arkBaseUrl(ctx)}${SUBMIT_PATH}/${jobId}`,\n fetchInitFor(ctx, {\n headers: { Authorization: `Bearer ${key}` },\n }),\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 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, pollUntil, sleep, withRetry } from \"../retry.js\";\nimport { JsonValueSchema, describeThrown } from \"../json.js\";\nimport type {\n ImageRequest,\n ImageResult,\n JsonObject,\n JsonValue,\n MediaRef,\n UsageEvent,\n VideoJob,\n VideoRequest,\n VideoResult,\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(endpoint: string, options: { input: JsonObject }): Promise<JsonValue>;\n}\n\nexport interface FalAdapterDeps {\n createFalClient: (opts: { credentials: string }) => FalClientLike;\n}\n\nconst falSubscribePayloadSchema = z.object({ data: JsonValueSchema });\n\nfunction defaultCreateFalClient(opts: { credentials: string }): FalClientLike {\n const client = createFalClient(opts);\n return {\n async subscribe(endpoint: string, options: { input: JsonObject }): Promise<JsonValue> {\n const outcome = await client.subscribe(endpoint, { input: options.input });\n const unwrapped = falSubscribePayloadSchema.safeParse(outcome);\n if (unwrapped.success) return unwrapped.data.data;\n return JsonValueSchema.parse(outcome);\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) => generateMuseImage(req, ctx, deps),\n generateVideo: (req, ctx) => generateFalVideo(req, ctx, deps),\n };\n}\n\nexport const falAdapter: Adapter = createFalAdapter();\n\nfunction refToUrl(ref: MediaRef): string {\n if (\"url\" in ref) return ref.url;\n return `data:${ref.mime};base64,${Buffer.from(ref.bytes).toString(\"base64\")}`;\n}\n\nasync 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\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 if (isModelKitError(cause)) return cause;\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 falError(status, body, model);\n }\n const info = describeThrown(cause);\n return falError(info.status, info.body, model);\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\nasync function subscribe(\n ctx: AdapterContext,\n deps: FalAdapterDeps,\n endpoint: string,\n input: JsonObject,\n): Promise<JsonValue> {\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 const client = deps.createFalClient({ credentials: falKey });\n try {\n return await withRetry(\n async () => {\n try {\n return await client.subscribe(endpoint, { input });\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\nfunction minimaxFamily(providerModelId: string): \"h3\" | \"h3-max\" {\n return providerModelId.toLowerCase().includes(\"h3-max\") ? \"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 enable_safety_checker: true,\n };\n if (req.seed !== undefined) input.seed = req.seed;\n return input;\n}\n\nfunction isKling(providerModelId: string): boolean {\n return providerModelId.toLowerCase().includes(\"kling\");\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 ratio =\n req.aspectRatio === \"16:9\" || req.aspectRatio === \"9:16\" || req.aspectRatio === \"1:1\"\n ? req.aspectRatio\n : \"auto\";\n const input: KlingO1VideoInput = {\n prompt: req.prompt,\n video_url: source,\n duration: String(duration),\n aspect_ratio: ratio,\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 const result = await runJob(ctx, deps, KLING_O1_ENDPOINT, input);\n return completedVideoJob(\n ctx,\n req,\n extractVideoUrl(result, KLING_O1_ENDPOINT, ctx.model.id),\n result,\n );\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 base.aspect_ratio = req.aspectRatio ?? \"adaptive\";\n }\n if (ctx.routing.fal === \"cloudflare-passthrough\") {\n return await passthroughVideoJob(ctx, req, endpoint, base);\n }\n const result = await runJob(ctx, deps, endpoint, base);\n return completedVideoJob(ctx, req, extractVideoUrl(result, endpoint, ctx.model.id), result);\n}\n\nfunction completedVideoJob(\n ctx: AdapterContext,\n req: VideoRequest,\n url: string,\n raw: JsonValue,\n): VideoJob {\n const duration = req.durationSeconds ?? 5;\n const result: VideoResult = { video: { url }, usage: videoUsage(ctx, req, duration), raw };\n return {\n jobId: url,\n async poll() {\n return { status: \"succeeded\", raw };\n },\n async result() {\n return result;\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 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 { 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 { classifyHttpError, pollUntil, withRetry, type RetryOptions } 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 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}\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 if (cause instanceof ModelKitError) throw cause;\n const info = describeThrown(cause);\n throw classifyHttpError(info.status, info.body, \"google-genai\", 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 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 ?? \"veo-operation\";\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 : videos.length > 0 || images.length > 1\n ? \"reference_to_video\"\n : req.firstFrame || images.length === 1\n ? \"image_to_video\"\n : \"text_to_video\";\n\n const responseFormat: OmniResponseFormat = { type: \"video\" };\n if (req.sourceVideo === undefined) responseFormat.aspect_ratio = toOmniAspect(req.aspectRatio);\n const omniResolution = toOmniResolution(req.resolution);\n if (omniResolution !== undefined) responseFormat.resolution = omniResolution;\n responseFormat.duration = `${duration}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 });\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 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 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 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 const inlineRetryOptions: RetryOptions = { attempts: 3 };\n if (ctx.signal !== undefined) inlineRetryOptions.signal = ctx.signal;\n try {\n interaction = await withRetry(async () => {\n try {\n return await callCreate(inlineParts);\n } catch (inlineCause) {\n throwSdkError(inlineCause, modelId);\n }\n }, inlineRetryOptions);\n } catch (inlineCause) {\n throwSdkError(inlineCause, modelId);\n }\n }\n } catch (cause) {\n await cleanupUploads();\n throw cause;\n }\n\n const jobId = interaction.id ?? \"gemini-omni-interaction\";\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 try {\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 } finally {\n await cleanupUploads();\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 } 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: Array<{ category: string; threshold: string }>;\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}\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}\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 (\"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 // TODO: honor ctx.call.postCropToAspect with a center-crop here once an\n // image library is available (sharp is not a dependency of modelkit).\n void ctx.call.postCropToAspect;\n\n const imageConfig: GeminiImageConfig = {};\n if (req.aspectRatio !== undefined) imageConfig.aspectRatio = req.aspectRatio;\n if (req.size !== undefined) imageConfig.imageSize = req.size;\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 return await deps.runTextGeneration({\n model,\n messages: [{ role: \"user\", content }],\n maxRetries: 0,\n providerOptions: {\n google: {\n imageConfig,\n responseModalities: [\"IMAGE\"],\n safetySettings: [\n {\n category: \"HARM_CATEGORY_SEXUALLY_EXPLICIT\",\n threshold: \"OFF\",\n },\n { category: \"HARM_CATEGORY_HATE_SPEECH\", threshold: \"OFF\" },\n {\n category: \"HARM_CATEGORY_DANGEROUS_CONTENT\",\n threshold: \"OFF\",\n },\n { category: \"HARM_CATEGORY_HARASSMENT\", threshold: \"OFF\" },\n ],\n },\n },\n abortSignal: signal,\n });\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 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, pollUntil } from \"../retry.js\";\nimport { JsonValueSchema, describeThrown } from \"../json.js\";\nimport type {\n JsonValue,\n MediaRef,\n UsageEvent,\n VideoJob,\n VideoRequest,\n VideoResult,\n} from \"../types.js\";\nimport { DEFAULT_MOTION, resolveMotionId } from \"./higgsfield-motions.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\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\nfunction refToUrl(ref: MediaRef): string {\n if (\"url\" in ref) return ref.url;\n return `data:${ref.mime};base64,${Buffer.from(ref.bytes).toString(\"base64\")}`;\n}\n\nasync 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\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\nfunction isDop(providerModelId: string): boolean {\n return providerModelId.toLowerCase().includes(\"dop\");\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\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) 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 let createRes: Response;\n try {\n createRes = await ctx.fetch(\n endpoint,\n requestInit(ctx, { method: \"POST\", body: JSON.stringify(body) }),\n );\n } catch (cause) {\n throw networkError(cause, ctx);\n }\n if (!createRes.ok) {\n throw classifyHttpError(\n createRes.status,\n await readBody(createRes),\n \"higgsfield\",\n ctx.model.id,\n );\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 if (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\nfunction networkError(cause: unknown, ctx: AdapterContext): ModelKitError {\n if (isModelKitError(cause)) return cause;\n const info = describeThrown(cause);\n return classifyHttpError(info.status, info.body, \"higgsfield\", ctx.model.id);\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 let createRes: Response;\n try {\n createRes = await ctx.fetch(\n DOP_ENDPOINT,\n requestInit(ctx, {\n method: \"POST\",\n body: JSON.stringify({ params, webhook: null }),\n }),\n );\n } catch (cause) {\n throw networkError(cause, ctx);\n }\n if (!createRes.ok) {\n throw classifyHttpError(\n createRes.status,\n await readBody(createRes),\n \"higgsfield\",\n ctx.model.id,\n );\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 = { video: { url }, usage: videoUsage(ctx, req) };\n return result;\n },\n };\n}\n\nexport const higgsfieldAdapter: Adapter = {\n id: \"higgsfield\",\n generateVideo: (req, ctx) =>\n isDop(ctx.model.providerModelId)\n ? generateDopVideo(req, ctx)\n : generateKlingVideo(req, ctx),\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 } 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 const TIER_LONG_EDGE: 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];\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 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 // 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 model: ctx.model.providerModelId,\n prompt: req.prompt,\n size,\n quality: sdkQuality,\n ...count,\n });\n }\n return await client.images.generate({\n model: ctx.model.providerModelId,\n prompt: req.prompt,\n quality: sdkQuality,\n ...count,\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 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 model: ctx.model.providerModelId,\n image: imageInput,\n prompt: req.prompt,\n size,\n quality: sdkQuality,\n ...count,\n });\n }\n return await client.images.edit({\n model: ctx.model.providerModelId,\n image: imageInput,\n prompt: req.prompt,\n quality: sdkQuality,\n ...count,\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 let usage: UsageEvent;\n if (inputTokens !== undefined || outputTokens !== undefined) {\n usage = {\n model: ctx.model.id,\n provider: \"openai-image\",\n modality: \"IMAGE\",\n unit: \"tokens\",\n quantity: (inputTokens ?? 0) + (outputTokens ?? 0),\n imageQuality: quality,\n };\n if (inputTokens !== undefined) usage.inputTokens = inputTokens;\n if (outputTokens !== undefined) usage.outputTokens = outputTokens;\n } else {\n usage = {\n model: ctx.model.id,\n provider: \"openai-image\",\n modality: \"IMAGE\",\n unit: \"images\",\n quantity: images.length,\n imageQuality: quality,\n };\n }\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, isModelKitError, type ProviderErrorBody } from \"../errors.js\";\nimport { classifyHttpError, transportError, withRetry, type RetryOptions } from \"../retry.js\";\nimport type { AspectRatio, ImageRequest, ImageResult, MediaRef, UsageEvent } from \"../types.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 const res = await ctx.fetch(ref.url);\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(\n status: number | undefined,\n body: ProviderErrorBody,\n model: string,\n): 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\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 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 }[];\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}.jpg`, { type: \"image/jpeg\" }),\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 attemptRes = await ctx.fetch(PRODIA_JOB_URL, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${key}`, Accept: accept },\n body: form,\n });\n } catch (err) {\n if (isModelKitError(err)) throw err;\n throw transportError(\"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 if (isModelKitError(err)) throw err;\n throw transportError(\"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, pollUntil, withRetry } from \"../retry.js\";\nimport type {\n AudioRequest,\n AudioResult,\n ImageRequest,\n ImageResult,\n ImageSize,\n JsonObject,\n JsonValue,\n MediaRef,\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): Promise<PredictionLike>;\n get(predictionId: string): Promise<PredictionLike>;\n}\n\nexport interface ReplicateClientLike {\n predictions: ReplicatePredictionsClient;\n}\n\nexport interface ReplicateAdapterDeps {\n createReplicateClient: (opts: { auth: string }) => 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 });\n}\n\nfunction refToUrl(ref: MediaRef): string {\n if (\"url\" in ref) return ref.url;\n return `data:${ref.mime};base64,${Buffer.from(ref.bytes).toString(\"base64\")}`;\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 classifyHttpError(status, info.body, \"replicate\", ctx.model.id);\n}\n\nfunction isLower(id: string): string {\n return id.toLowerCase();\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 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 return await api.predictions.create(createOptions);\n } catch (cause) {\n throw replicateError(cause, ctx);\n }\n },\n ctx.signal ? { signal: ctx.signal } : {},\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(prediction.id);\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\nfunction isUpscaler(providerModelId: string): boolean {\n const id = isLower(providerModelId);\n return id.includes(\"upscal\") || id.includes(\"crystal\") || id.includes(\"topaz\");\n}\n\nfunction isQwen(providerModelId: string): boolean {\n return isLower(providerModelId).includes(\"qwen\");\n}\n\nfunction isWanImage(providerModelId: string): boolean {\n return isLower(providerModelId).includes(\"wan-2.7\");\n}\n\nfunction isQwenEditPlus(providerModelId: string): boolean {\n return isLower(providerModelId).includes(\"edit\");\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\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 | 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<ImageSize, 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 const input: ReplicateImageInput = { prompt: req.prompt };\n if (isUpscaler(id)) {\n const refs = req.references ?? [];\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 to upscale`,\n provider: \"replicate\",\n model: ctx.model.id,\n retryable: false,\n });\n }\n input.image = refToUrl(first);\n input.creativity = 0;\n input.scale_factor = 2;\n input.output_format = \"png\";\n } else if (isWanImage(id)) {\n const refs = (req.references ?? []).map(refToUrl);\n if (refs.length > 0) input.images = refs;\n input.size = wanImageSize(req.aspectRatio, req.size);\n } else if (isQwen(id)) {\n const refs = (req.references ?? []).map(refToUrl);\n const firstUrl = refs[0];\n if (firstUrl !== undefined) {\n input.image = firstUrl;\n if (!isQwenEditPlus(id)) input.match_input_image = true;\n }\n const ratios = isQwenEditPlus(id) ? QWEN_EDIT_RATIOS : QWEN_IMAGE_RATIOS;\n if (req.aspectRatio !== undefined) {\n if (ratios.has(req.aspectRatio)) input.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 (isQwenEditPlus(id) && req.outputFormat !== undefined) {\n // The edit-plus enum spells jpeg as \"jpg\".\n input.output_format = req.outputFormat === \"jpeg\" ? \"jpg\" : req.outputFormat;\n }\n } else {\n const refs = req.references ?? [];\n const first = refs[0];\n if (first) input.image = refToUrl(first);\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 };\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 {\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 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: 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 {\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 const id = isLower(ctx.model.providerModelId);\n const input = id.includes(\"kling\")\n ? id.includes(\"omni\")\n ? klingOmniInput(req)\n : klingInput(req)\n : id.includes(\"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 return await api.predictions.create(createOptions);\n } catch (cause) {\n throw replicateError(cause, ctx);\n }\n },\n ctx.signal ? { signal: ctx.signal } : {},\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(jobId);\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 id = isLower(ctx.model.providerModelId);\n const input = id.includes(\"mmaudio\")\n ? mmaudioInput(req, ctx)\n : id.includes(\"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, isModelKitError } from \"../errors.js\";\nimport { describeThrown, JsonValueSchema } from \"../json.js\";\nimport { classifyHttpError, pollUntil } from \"../retry.js\";\nimport type {\n JsonValue,\n MediaRef,\n UsageEvent,\n VideoJob,\n VideoRequest,\n VideoResult,\n} from \"../types.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\nfunction refToUrl(ref: MediaRef): string {\n if (\"url\" in ref) return ref.url;\n return `data:${ref.mime};base64,${Buffer.from(ref.bytes).toString(\"base64\")}`;\n}\n\nconst xaiResponseStatusSchema = z.object({\n response: z.object({ status: z.number() }).partial(),\n});\n\nfunction xaiError(cause: unknown, ctx: AdapterContext): ModelKitError {\n if (isModelKitError(cause)) return cause;\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 classifyHttpError(status, info.body, \"xai-video\", ctx.model.id);\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 // Single start frame plus reference images, capped at five; bytes refs go\n // up as data URLs. Absent refs mean plain text-to-video.\n const frames = [req.firstFrame, req.lastFrame, ...(req.referenceImages ?? [])].filter(\n (r): r is MediaRef => r !== undefined,\n );\n const refUrls = frames.map(refToUrl).slice(0, 5);\n const resolution = req.resolution === \"480p\" ? \"480p\" : \"720p\";\n const xaiOptions: XaiProviderOptions = {\n resolution,\n pollIntervalMs: POLL_INTERVAL_MS,\n pollTimeoutMs: POLL_TIMEOUT_MS,\n };\n if (refUrls.length > 0) {\n xaiOptions.mode = \"reference-to-video\";\n xaiOptions.referenceImageUrls = refUrls;\n }\n const client = deps.createXaiClient({ apiKey });\n const model = createXai({ apiKey }).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.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 jobId: `${ctx.model.id}-grok`,\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 const costTicks = z.number().safeParse(meta.costInUsdTicks);\n const cost = costTicks.success ? costTicks.data / 1e10 : undefined;\n if (cost !== 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,\n reportedCostUsd: cost,\n };\n if (req.durationSeconds !== undefined) event.durationSeconds = req.durationSeconds;\n if (req.resolution !== undefined) event.resolution = req.resolution;\n return event;\n }\n const event: UsageEvent = {\n model: ctx.model.id,\n provider: \"xai-video\",\n modality: \"VIDEO\",\n unit: \"seconds\",\n quantity: req.durationSeconds ?? 0,\n };\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","text","usage","usage","import_ai","import_zod","import_zod","route","aiGenerateImage","usage","generateAudio","aiGenerateVideo","aiGenerateText","aiStreamText","languageModel","aiGenerateObject","aiStreamObject","import_zod","text","usage","import_zod","import_zod","text","client","text","headers","mime","result","import_zod","import_zod","text","defaultDeps","RESULT_TIMEOUT_MS","text","videoUsage","client","usage","import_google","import_ai","import_zod","usage","import_zod","refToUrl","readBody","text","videoUsage","import_openai","import_zod","toProviderError","OpenAI","client","usage","text","usage","import_zod","Replicate","refToUrl","imageUsage","videoUsage","text","usage","import_ai","import_xai","import_zod","POLL_INTERVAL_MS","POLL_TIMEOUT_MS","refToUrl","client","text","event","generateText"]}