@shop-os/modelkit 0.8.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +35 -0
- package/README.md +8 -1
- package/dist/catalog.cjs +526 -21
- package/dist/catalog.cjs.map +1 -1
- package/dist/catalog.d.cts +113 -5
- package/dist/catalog.d.ts +113 -5
- package/dist/catalog.js +526 -21
- package/dist/catalog.js.map +1 -1
- package/dist/index.cjs +1312 -190
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +115 -4
- package/dist/index.d.ts +115 -4
- package/dist/index.js +1308 -190
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/catalog.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/catalog-entry.ts","../src/errors.ts","../src/catalog/order.ts","../src/catalog/registry.ts","../src/catalog/exposure.ts","../src/catalog/image-fal.ts","../src/catalog/image-luma.ts","../src/catalog/image.ts","../src/catalog/audio-formats.ts","../src/catalog/veed-subtitle-languages.ts","../src/catalog/canvas-tools.ts","../src/catalog/languages-audio.ts","../src/catalog/voices-elevenlabs.ts","../src/catalog/voices-gemini.ts","../src/catalog/voices-minimax.ts","../src/catalog/media-nodes.ts","../src/catalog/model3d.ts","../src/catalog/other.ts","../src/catalog/text.ts","../src/catalog/video-families.ts","../src/catalog/video-luma.ts","../src/catalog/video.ts","../src/catalog/video-tools.ts","../src/catalog/models.ts","../src/catalog/schema.ts","../src/resolve-provider-rules.ts","../src/catalog/collisions.ts","../src/catalog/conventions.ts","../src/catalog/model3d-spec.ts","../src/catalog/input-spec.ts","../src/catalog/option-lists.ts","../src/catalog/live.ts","../src/json.ts","../src/catalog/load.ts","../src/catalog/video-tools-spec.ts","../src/video-length.ts","../src/catalog/subtitles-spec.ts","../src/resolve-lists.ts","../src/resolve-image-rules.ts","../src/replicate-video-kinds.ts","../src/resolve-video-rules.ts","../src/resolve-options.ts","../src/resolve-media.ts","../src/resolve-call.ts"],"sourcesContent":["/**\n * Browser-safe catalog subpath (`@shop-os/modelkit/catalog`).\n *\n * Catalog rows, the option resolver and error types only. No adapters, no\n * client, no key handling, no text helpers and no provider SDKs, so the\n * bundle is safe to ship to browsers (Space Builder pickers, vibe-shared).\n */\nexport { Catalog } from \"./catalog/registry.js\";\nexport { compareCatalogOrder, sortCatalogRows } from \"./catalog/order.js\";\nexport { isListedOn, isListed, normalizeExposure } from \"./catalog/exposure.js\";\nexport type { Surface } from \"./types.js\";\nexport { MODELS } from \"./catalog/models.js\";\nexport * from \"./catalog/schema.js\";\nexport * from \"./catalog/live.js\";\nexport * from \"./catalog/load.js\";\nexport { IMAGE_MODELS } from \"./catalog/image.js\";\nexport { VIDEO_MODELS } from \"./catalog/video.js\";\nexport { VIDEO_TOOL_MODELS } from \"./catalog/video-tools.js\";\nexport { planVideoTool, resolutionTier, videoToolConstraints } from \"./catalog/video-tools-spec.js\";\nexport type { VideoToolPlan } from \"./catalog/video-tools-spec.js\";\nexport { MODEL3D_MODELS } from \"./catalog/model3d.js\";\nexport {\n MODEL3D_IMAGE_SLOTS,\n model3dConstraints,\n model3dInputRefusal,\n model3dSeedFits,\n model3dPricingSku,\n model3dResolution,\n model3dSkus,\n model3dTexture,\n} from \"./catalog/model3d-spec.js\";\nexport type {\n Model3dInputRefusal,\n Model3dPricedInputs,\n Model3dPricedOptions,\n Model3dWired,\n} from \"./catalog/model3d-spec.js\";\nexport { TEXT_MODELS } from \"./catalog/text.js\";\nexport { OTHER_MODELS } from \"./catalog/other.js\";\nexport {\n resolveAudioOptions,\n resolveImageOptions,\n resolveVideoOptions,\n nearestAspectRatio,\n videoLengthViolation,\n} from \"./resolve-options.js\";\nexport type { OnUnsupported, ResolveResult } from \"./resolve-options.js\";\nexport { lumaReframeTooTall, takesTargetAspectRatio } from \"./resolve-provider-rules.js\";\nexport {\n resolveDubbingOptions,\n resolveLipsyncOptions,\n resolveSpeechOptions,\n resolveTranscriptionOptions,\n resolveVoiceChangeOptions,\n} from \"./resolve-media.js\";\nexport { MEDIA_METHODS, resolveOptions } from \"./resolve-call.js\";\nexport type { MediaMethod, ResolveCall, ResolvedCall } from \"./resolve-call.js\";\nexport { MEDIA_NODE_MODELS } from \"./catalog/media-nodes.js\";\nexport type { VideoSecondsLimits } from \"./types.js\";\nexport {\n outputAudio,\n billedAudio,\n promptConventions,\n AUDIO_OUTPUTS,\n REFERENCE_SYNTAXES,\n} from \"./catalog/conventions.js\";\nexport { ModelKitError, isModelKitError } from \"./errors.js\";\nexport type { ModelKitErrorCode, ModelKitErrorInit, ProviderErrorBody } from \"./errors.js\";\nexport type * from \"./types.js\";\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 /** The provider account is out of credit or quota (HTTP 402 and its body spellings). Never retried. */\n | \"provider_billing\"\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 type { CatalogModel } from \"../types.js\";\n\n/**\n * Picker order for every surface: `display.sortOrder` descending (a higher\n * number shows first), rows without one after the ordered ones, then `label`\n * ascending (case-insensitive), then `id` so the order is total.\n *\n * pro-backend applies the same rule in SQL (`ORDER BY sortOrder DESC NULLS\n * LAST, lower(label), id`); this comparator covers the snapshot and cache\n * fallbacks and any consumer that sorts a subset.\n */\nexport function compareCatalogOrder(a: CatalogModel, b: CatalogModel): number {\n const sa = a.display?.sortOrder;\n const sb = b.display?.sortOrder;\n if (sa !== undefined && sb !== undefined && sa !== sb) return sb - sa;\n if (sa !== undefined && sb === undefined) return -1;\n if (sa === undefined && sb !== undefined) return 1;\n return compareText(a.label.toLowerCase(), b.label.toLowerCase()) || compareText(a.id, b.id);\n}\n\nfunction compareText(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nexport function sortCatalogRows<T extends CatalogModel>(rows: readonly T[]): T[] {\n return [...rows].sort(compareCatalogOrder);\n}\n","import { ModelKitError } from \"../errors.js\";\nimport type { CatalogModel, Lifecycle, ModelType } from \"../types.js\";\nimport { compareCatalogOrder } from \"./order.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 if (this.byId.has(model.id)) {\n throw new Error(`Duplicate model id \"${model.id}\"`);\n }\n if (this.byAlias.has(model.id)) {\n throw new Error(\n `Model id \"${model.id}\" collides with an alias of \"${this.byAlias.get(model.id)}\"`,\n );\n }\n for (const alias of model.aliases) {\n if (alias === model.id) {\n throw new Error(`Alias \"${alias}\" collides with its own model id \"${model.id}\"`);\n }\n const existing = this.byAlias.get(alias);\n if (existing !== undefined) {\n throw new Error(`Duplicate alias \"${alias}\" (already maps to \"${existing}\")`);\n }\n }\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 /** Rows in picker order: `display.sortOrder` descending, then label. See `compareCatalogOrder`. */\n list(filter: { type?: ModelType; lifecycle?: Lifecycle[] } = {}): CatalogModel[] {\n const lifecycles = filter.lifecycle ?? [\"active\"];\n return [...this.byId.values()]\n .filter(\n (m) =>\n (filter.type ? m.type === filter.type : true) &&\n lifecycles.includes(m.lifecycle),\n )\n .sort(compareCatalogOrder);\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 /** Atomically swap every row. Builds the maps first so a bad batch throws before anything changes. */\n replace(rows: CatalogModel[]): void {\n const next = new Catalog(rows);\n this.byId.clear();\n this.byAlias.clear();\n for (const [id, model] of next.byId) this.byId.set(id, model);\n for (const [alias, id] of next.byAlias) this.byAlias.set(alias, id);\n }\n}\n","import type { CatalogModel, Surface } from \"../types.js\";\n\nexport const SURFACES: readonly Surface[] = [\"cowork\", \"space_builder\"];\n\nexport function normalizeExposure(value: unknown): unknown {\n if (value === \"catalog\") return [\"cowork\", \"space_builder\"];\n if (value === \"internal\") return [];\n if (Array.isArray(value)) {\n if (\n value.every((entry): entry is Surface =>\n (SURFACES as readonly unknown[]).includes(entry),\n )\n ) {\n const present = new Set<unknown>(value);\n return SURFACES.filter((surface) => present.has(surface));\n }\n return value;\n }\n return value;\n}\n\n/** True when an active row is listed on `surface`. */\nexport function isListedOn(row: CatalogModel, surface: Surface): boolean {\n return row.lifecycle === \"active\" && row.exposure.includes(surface);\n}\n\n/** True when an active row is listed on at least one surface. */\nexport function isListed(row: CatalogModel): boolean {\n return row.lifecycle === \"active\" && row.exposure.length > 0;\n}\n","import type { AspectRatio, CatalogModel } from \"../types.js\";\n\n// fal image rows whose request bodies adapters/fal-image.ts builds. Every constraint below is\n// read from the endpoint's queue OpenAPI schema (https://fal.ai/api/openapi/queue/openapi.json\n// ?endpoint_id=<id>, saved under src/adapters/__fixtures__/fal); prices from the fal model pages.\n\nconst IMAGE_USAGE = { unit: \"images\" } as const;\nconst EXPOSURE: CatalogModel[\"exposure\"] = [\"cowork\", \"space_builder\"];\nconst LOBE = \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light\";\n\n// Custom pixel sizes (Krea, Qwen) take any ratio; these are the canonical ones they get.\nconst SIZED_RATIOS: AspectRatio[] = [\n \"1:1\",\n \"16:9\",\n \"9:16\",\n \"4:3\",\n \"3:4\",\n \"3:2\",\n \"2:3\",\n \"4:5\",\n \"5:4\",\n \"21:9\",\n \"9:21\",\n];\n\nconst KLING_RATIOS: AspectRatio[] = [\"16:9\", \"9:16\", \"1:1\", \"4:3\", \"3:4\", \"3:2\", \"2:3\", \"21:9\"];\n\nconst RECRAFT_RATIOS: AspectRatio[] = [\n \"1:1\",\n \"4:3\",\n \"3:4\",\n \"16:9\",\n \"9:16\",\n \"3:2\",\n \"2:3\",\n \"5:4\",\n \"4:5\",\n];\n\nexport const FAL_IMAGE_MODELS: CatalogModel[] = [\n {\n // krea/v3/text-to-image; references switch to krea/v3/edit (1-8 images). Billed per\n // output megapixel ($0.025/MP) plus each reference image's megapixels.\n id: \"krea-3\",\n aliases: [],\n label: \"Krea 3\",\n type: \"image\",\n adapter: \"fal\",\n providerModelId: \"krea/v3/text-to-image\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n aspectRatios: [...SIZED_RATIOS],\n sizes: [\"1K\", \"2K\"],\n references: { images: 8 },\n supports: [\"seed\", \"outputFormat\"],\n prompt: { referenceSyntax: \"numbered\", maxChars: 5000 },\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\", outputFormat: \"png\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"krea\",\n description:\n \"Krea 3 photoreal image generation and multi-image editing; takes a prompt and up to 8 reference images and outputs up to 4 megapixels.\",\n logo: `${LOBE}/krea.png`,\n },\n },\n {\n // xai/grok-imagine-image/v2.0/text-to-image; references switch to .../edit (up to 5).\n // $0.04 low / $0.06 medium at 1K, $0.06 / $0.08 at 2K; edits add $0.01 per input image.\n id: \"grok-imagine-image-2.0\",\n aliases: [],\n label: \"Grok Imagine Image 2.0\",\n type: \"image\",\n adapter: \"fal\",\n providerModelId: \"xai/grok-imagine-image/v2.0/text-to-image\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n aspectRatios: [\"1:1\", \"16:9\", \"9:16\", \"4:3\", \"3:4\", \"3:2\", \"2:3\", \"adaptive\"],\n sizes: [\"1K\", \"2K\"],\n qualityOptions: [\"low\", \"medium\"],\n references: { images: 5 },\n supports: [\"quality\", \"count\", \"outputFormat\"],\n prompt: { referenceSyntax: \"numbered\", maxChars: 8000 },\n },\n defaults: { size: \"1K\", aspectRatio: \"adaptive\", quality: \"medium\", count: 1 },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"xai\",\n description:\n \"xAI Grok Imagine Image 2.0 text-to-image and editing; takes a prompt and up to 5 images and outputs 1K or 2K in low or medium quality.\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/858b7fcc-9bd5-411d-aea1-a7b35ecfffab_compressed.png\",\n },\n },\n {\n // alibaba/qwen-image-3/text-to-image; references switch to .../edit (1-3 images, addressed\n // as \"image 1\"..\"image 3\"). $0.04 per image at 1K, $0.075 at 2K.\n id: \"qwen-image-3\",\n aliases: [],\n label: \"Qwen Image 3\",\n type: \"image\",\n adapter: \"fal\",\n providerModelId: \"alibaba/qwen-image-3/text-to-image\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n aspectRatios: [...SIZED_RATIOS],\n sizes: [\"1K\", \"2K\"],\n references: { images: 3 },\n supports: [\"seed\", \"count\", \"outputFormat\"],\n prompt: { referenceSyntax: \"numbered\", maxChars: 5000 },\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\", count: 1 },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"alibaba\",\n description:\n \"Alibaba Qwen Image 3 text-to-image and multi-image editing with strong text rendering; takes a prompt and up to 3 reference images and outputs 1K or 2K.\",\n logo: `${LOBE}/qwen-color.png`,\n },\n },\n {\n // fal-ai/kling-image/o3/text-to-image; references switch to .../o3/image-to-image (up to\n // 10, \"@Image1\"..\"@Image10\"). $0.028 per image at 1K and 2K, double at 4K.\n id: \"kling-image-o3\",\n aliases: [],\n label: \"Kling Image O3\",\n type: \"image\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/kling-image/o3/text-to-image\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n aspectRatios: [...KLING_RATIOS, \"adaptive\"],\n sizes: [\"1K\", \"2K\", \"4K\"],\n references: { images: 10 },\n supports: [\"count\", \"outputFormat\"],\n prompt: { referenceSyntax: \"numbered\", maxChars: 2500 },\n },\n defaults: { size: \"1K\", aspectRatio: \"adaptive\", count: 1 },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"kuaishou\",\n description:\n \"Kling Image O3 text-to-image and multi-reference image editing; takes a prompt and up to 10 reference images and outputs 1K, 2K or 4K.\",\n logo: `${LOBE}/kling-color.png`,\n },\n },\n {\n // fal-ai/kling-image/v3/text-to-image; a reference switches to .../v3/image-to-image, which\n // takes exactly one image_url and no \"auto\" ratio. $0.028 per image.\n id: \"kling-image-3.0\",\n aliases: [],\n label: \"Kling Image 3.0\",\n type: \"image\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/kling-image/v3/text-to-image\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n aspectRatios: [...KLING_RATIOS],\n sizes: [\"1K\", \"2K\"],\n references: { images: 1 },\n supports: [\"count\", \"outputFormat\"],\n prompt: { referenceSyntax: \"numbered\", maxChars: 2500 },\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\", count: 1 },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"kuaishou\",\n description:\n \"Kling Image 3.0 text-to-image and single-image restyling; takes a prompt and an optional reference image and outputs 1K or 2K.\",\n logo: `${LOBE}/kling-color.png`,\n },\n },\n {\n // $0.007 per image. Generation only: Recraft V4.1 has no edit endpoint on fal. Size is\n // not sent (the ratio picks Recraft's canvas); the one tier is the pricing key.\n id: \"recraft-v4.1-flash\",\n aliases: [],\n label: \"Recraft V4.1 Flash\",\n type: \"image\",\n adapter: \"fal\",\n providerModelId: \"recraft/v4.1/flash/text-to-image\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n references: { images: 0 },\n aspectRatios: [...RECRAFT_RATIOS],\n sizes: [\"1K\"],\n supports: [],\n prompt: { referenceSyntax: \"numbered\", maxChars: 10000 },\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"recraft\",\n description:\n \"Recraft V4.1 Flash fast design-first text-to-image for brand, editorial and layout work; takes a prompt and outputs a raster image.\",\n logo: `${LOBE}/recraft.png`,\n },\n },\n {\n // Generation only. $0.05 per image (thinking mode, not sent, would be 1.2x). No size\n // field; the one tier is the pricing key.\n id: \"sensenova-u1-infographic\",\n aliases: [],\n label: \"SenseNova U1 Infographic\",\n type: \"image\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/sensenova-u1-infographic\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n references: { images: 0 },\n aspectRatios: [\"1:1\", \"16:9\", \"9:16\", \"3:2\", \"2:3\", \"4:3\", \"3:4\"],\n sizes: [\"1K\"],\n supports: [\"seed\", \"outputFormat\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"16:9\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"sensetime\",\n description:\n \"SenseNova U1 Infographic turns a detailed prompt into a laid-out infographic with charts, sections and legible text.\",\n logo: `${LOBE}/sensenova-color.png`,\n },\n },\n];\n","import type { AspectRatio, CatalogModel } from \"../types.js\";\n\n// Luma image rows (Agents API uni models). Every limit below is from the\n// verified request shapes in the ENG-3272 work order (docs.agents.lumalabs.ai):\n// one image per call, the first reference is the source to edit, aspect_ratio\n// is omitted on edits and when adaptive, output_format is png or jpeg.\n\nconst IMAGE_USAGE = { unit: \"images\" } as const;\nconst EXPOSURE: CatalogModel[\"exposure\"] = [\"cowork\", \"space_builder\"];\nconst LOBE = \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light\";\nconst LUMA_LOGO = `${LOBE}/luma-color.png`;\n\nconst UNI_RATIOS: AspectRatio[] = [\"adaptive\", \"16:9\", \"3:2\", \"1:1\", \"2:3\", \"9:16\"];\n\nfunction uniImage(\n id: string,\n label: string,\n providerModelId: string,\n description: string,\n): CatalogModel {\n return {\n // https://docs.agents.lumalabs.ai: type \"image\" without references, else\n // \"image_edit\" with the first reference as source and up to 8 more as\n // image_ref. The output is always 2048 px on the long side.\n id,\n aliases: [],\n label,\n type: \"image\",\n adapter: \"luma\",\n providerModelId,\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n aspectRatios: [...UNI_RATIOS],\n sizes: [\"2K\"],\n references: { images: 9 },\n supports: [\"outputFormat\"],\n prompt: { referenceSyntax: \"numbered\", maxChars: 6000 },\n },\n defaults: { size: \"2K\", aspectRatio: \"adaptive\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"luma\",\n description,\n logo: LUMA_LOGO,\n },\n };\n}\n\nexport const LUMA_IMAGE_MODELS: CatalogModel[] = [\n uniImage(\n \"uni-1\",\n \"Uni-1\",\n \"uni-1\",\n \"Luma Uni-1 fast image generation and editing; takes a prompt and up to 9 reference images and outputs 2K.\",\n ),\n uniImage(\n \"uni-1-max\",\n \"Uni-1 Max\",\n \"uni-1-max\",\n \"Luma Uni-1 Max higher-quality image generation and editing; takes a prompt and up to 9 reference images and outputs 2K.\",\n ),\n];\n","import type {\n AspectRatio,\n CatalogDisplay,\n CatalogModel,\n ImageSize,\n PromptConventions,\n ReferenceLimits,\n Surface,\n} from \"../types.js\";\nimport { FAL_IMAGE_MODELS } from \"./image-fal.js\";\nimport { LUMA_IMAGE_MODELS } from \"./image-luma.js\";\n\nconst IMAGE_USAGE = { unit: \"images\" } as const;\n\n// Every image row generates from a prompt and conditions on references, so the\n// two flags travel together; vendor rows still declare them per row below.\n\n// https://ai.google.dev/gemini-api/docs/image-generation#aspect_ratios\nconst GEMINI_RATIOS: AspectRatio[] = [\n \"1:1\",\n \"2:3\",\n \"3:2\",\n \"16:9\",\n \"9:16\",\n \"4:3\",\n \"3:4\",\n \"21:9\",\n \"4:5\",\n \"5:4\",\n \"adaptive\",\n];\n\n// Nano Banana 2.1 adds the tall and wide strips and fixes their tiling at 2K and 4K.\n// https://ai.google.dev/gemini-api/docs/models/gemini-nano-banana-2.1\nconst NANO_BANANA_2_1_RATIOS: AspectRatio[] = [\n ...GEMINI_RATIOS.filter((r) => r !== \"adaptive\"),\n \"1:4\",\n \"4:1\",\n \"1:8\",\n \"8:1\",\n \"adaptive\",\n];\n\n// Gemini image token budgets are far above this; 50,000 matches cowork's global prompt ceiling.\nconst GEMINI_PROMPT_MAX_CHARS = 50000;\n// OpenAI's images API caps a GPT image model prompt at 32,000 characters.\nconst GPT_IMAGE_PROMPT = { referenceSyntax: \"numbered\", maxChars: 32000 } as const;\n\nfunction geminiImage(\n id: string,\n label: string,\n aliases: string[],\n sizes: ImageSize[],\n display: CatalogDisplay,\n exposure: Surface[],\n references?: ReferenceLimits,\n promptMaxChars?: number,\n aspectRatios: AspectRatio[] = GEMINI_RATIOS,\n): CatalogModel {\n // google-image sends MediaRef.label as a text part beside each reference.\n const prompt: PromptConventions = { referenceSyntax: \"caption\" };\n if (promptMaxChars !== undefined) prompt.maxChars = promptMaxChars;\n const constraints: CatalogModel[\"constraints\"] = {\n aspectRatios: [...aspectRatios],\n sizes,\n supports: [\"safetySettings\", \"temperature\"],\n prompt,\n };\n if (references !== undefined) constraints.references = references;\n const model: CatalogModel = {\n id,\n aliases,\n label,\n type: \"image\",\n adapter: \"google-image\",\n providerModelId: id,\n lifecycle: \"active\",\n exposure,\n constraints,\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE, slug: \"gemini\" },\n pricingKind: \"image_size\",\n display,\n };\n return model;\n}\n\nexport const IMAGE_MODELS: CatalogModel[] = [\n geminiImage(\n \"gemini-nano-banana-2.1\",\n \"Nano Banana 2.1\",\n [\"nb-2.1\"],\n [\"1K\", \"2K\", \"4K\"],\n {\n provider: \"google\",\n description:\n \"Latest high-efficiency Nano Banana. Better realism, prompt adherence, text rendering and character consistency at Flash speed. Great for campaigns, infographics, and iterative edits.\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png\",\n },\n [\"cowork\", \"space_builder\"],\n { images: 14 },\n GEMINI_PROMPT_MAX_CHARS,\n NANO_BANANA_2_1_RATIOS,\n ),\n // Google retired the -preview endpoints for the GA ids; the catalog ids stay because they\n // are pricing keys and stored model ids.\n {\n ...geminiImage(\n \"gemini-3-pro-image-preview\",\n \"Nano Banana Pro\",\n [\"nb-pro\"],\n [\"1K\", \"2K\", \"4K\"],\n {\n provider: \"google\",\n description:\n \"Create stunning, production-quality visuals with exceptional realism, detail, and typography. Best for campaigns, e-commerce, product photography, and hero creatives.\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png\",\n },\n [\"cowork\", \"space_builder\"],\n { images: 14 },\n GEMINI_PROMPT_MAX_CHARS,\n ),\n providerModelId: \"gemini-3-pro-image\",\n },\n {\n ...geminiImage(\n \"gemini-3.1-flash-image-preview\",\n \"Nano Banana 2\",\n [\"nb-2\"],\n // Flash 3.1 is the only Gemini image model with the 512 tier.\n [\"512\", \"1K\", \"2K\", \"4K\"],\n {\n provider: \"google\",\n description:\n \"Generate high-quality images at speed. Perfect for brainstorming, concept boards, concept testing, creative exploration, and large batch workflows.\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png\",\n },\n [\"cowork\", \"space_builder\"],\n { images: 14 },\n GEMINI_PROMPT_MAX_CHARS,\n ),\n providerModelId: \"gemini-3.1-flash-image\",\n },\n geminiImage(\n \"gemini-3.1-flash-lite-image\",\n \"Nano Banana Lite\",\n [\"nb-lite\"],\n [\"1K\"],\n {\n provider: \"google\",\n description:\n \"The fastest and most affordable image model. Ideal for rapid drafts, bulk exploration, and iterative concept testing at 1K resolution.\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png\",\n },\n [\"cowork\", \"space_builder\"],\n { images: 14 },\n GEMINI_PROMPT_MAX_CHARS,\n ),\n // trigger-workflows validates 1K only; pricing seeds 2K/4K rows so allow all three.\n geminiImage(\n \"gemini-2.5-flash-image\",\n \"Gemini 2.5 Flash Image\",\n [],\n [\"1K\"],\n {\n provider: \"google\",\n description:\n \"Nano Banana (legacy Gemini 2.5 Flash Image) native image generation and editing model for high-volume, low-latency creative workflows.\",\n },\n [],\n ),\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 exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n exactSizes: {\n \"1:1\": \"1024x1024\",\n \"3:2\": \"1536x1024\",\n \"2:3\": \"1024x1536\",\n \"16:9\": \"2048x1152\",\n \"9:16\": \"1152x2048\",\n \"4:5\": \"1024x1280\",\n \"5:4\": \"1280x1024\",\n },\n aspectRatios: [\"1:1\", \"3:2\", \"2:3\", \"16:9\", \"9:16\", \"4:5\", \"5:4\", \"adaptive\"],\n sizes: [\"1K\", \"2K\", \"4K\"],\n qualityOptions: [\"auto\", \"low\", \"medium\", \"high\"],\n references: { images: 16 },\n supports: [\"quality\", \"count\", \"outputFormat\"],\n prompt: GPT_IMAGE_PROMPT,\n },\n defaults: { size: \"1K\", aspectRatio: \"adaptive\", quality: \"auto\" },\n usage: { ...IMAGE_USAGE, slug: \"gpt\" },\n pricingKind: \"image_size\",\n display: {\n provider: \"openai\",\n description:\n \"The most capable model for image editing and complex creative instructions. Excels at text rendering, visual consistency, design generation, and iterative refinement.\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/1204b494-8962-4f7f-af5e-699a8bdc98e3_compressed.png\",\n },\n },\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 exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n exactSizes: {\n \"1:1\": \"1024x1024\",\n \"3:2\": \"1536x1024\",\n \"2:3\": \"1024x1536\",\n \"16:9\": \"2048x1152\",\n \"9:16\": \"1152x2048\",\n \"4:5\": \"1024x1280\",\n \"5:4\": \"1280x1024\",\n },\n aspectRatios: [\"1:1\", \"3:2\", \"2:3\", \"16:9\", \"9:16\", \"4:5\", \"5:4\", \"adaptive\"],\n sizes: [\"1K\", \"2K\", \"4K\"],\n qualityOptions: [\"auto\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"],\n references: { images: 16 },\n supports: [\"quality\", \"count\", \"outputFormat\"],\n prompt: GPT_IMAGE_PROMPT,\n },\n defaults: { size: \"1K\", aspectRatio: \"adaptive\", quality: \"auto\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"openai\",\n description:\n \"OpenAI's most capable GPT Image 2.5 tier, built for editing precision; takes text and image input and outputs images in low, medium, high, xhigh, or max quality.\",\n },\n },\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 exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n exactSizes: {\n \"1:1\": \"1024x1024\",\n \"3:2\": \"1536x1024\",\n \"2:3\": \"1024x1536\",\n \"16:9\": \"2048x1152\",\n \"9:16\": \"1152x2048\",\n \"4:5\": \"1024x1280\",\n \"5:4\": \"1280x1024\",\n },\n aspectRatios: [\"1:1\", \"3:2\", \"2:3\", \"16:9\", \"9:16\", \"4:5\", \"5:4\", \"adaptive\"],\n sizes: [\"1K\", \"2K\", \"4K\"],\n qualityOptions: [\"auto\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"],\n references: { images: 16 },\n supports: [\"quality\", \"count\", \"outputFormat\"],\n prompt: GPT_IMAGE_PROMPT,\n },\n defaults: { size: \"1K\", aspectRatio: \"adaptive\", quality: \"auto\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"openai\",\n description:\n \"OpenAI's fastest GPT Image 2.5 tier for high-quality everyday image generation and editing; takes text and image input and outputs images.\",\n },\n },\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: [\"meta-muse\"],\n label: \"Meta Muse\",\n type: \"image\",\n adapter: \"fal\",\n providerModelId: \"muse-image-1.0\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\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 \"9:21\",\n \"adaptive\",\n ],\n sizes: [\"1K\"],\n references: { images: 10 },\n supports: [\"count\", \"outputFormat\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\", outputFormat: \"png\", count: 1 },\n usage: { ...IMAGE_USAGE, slug: \"muse\" },\n pricingKind: \"image_size\",\n display: {\n provider: \"meta\",\n description:\n \"Meta's image model with built-in world knowledge and strong prompt adherence. Great for concept-rich scenes, realistic compositions, and reference-guided edits.\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/characters/1787909065794-k9a7zz.png\",\n },\n },\n {\n // References switch to the edit endpoint: the first is the image to edit,\n // the rest (up to 4) guide it.\n id: \"ideogram-4.5\",\n aliases: [],\n label: \"Ideogram 4.5\",\n type: \"image\",\n adapter: \"fal\",\n providerModelId: \"ideogram/v4.5\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [\"1:1\", \"16:9\", \"9:16\", \"4:3\", \"3:4\", \"3:2\", \"2:3\", \"5:4\", \"4:5\"],\n sizes: [\"1K\", \"2K\"],\n qualityOptions: [\"auto\", \"low\", \"medium\", \"high\"],\n references: { images: 5 },\n supports: [\"quality\", \"count\", \"seed\"],\n },\n defaults: { size: \"2K\", aspectRatio: \"1:1\", quality: \"medium\", count: 1 },\n usage: { ...IMAGE_USAGE, slug: \"ideogram\" },\n pricingKind: \"image_size\",\n display: {\n provider: \"ideogram\",\n description:\n \"Ideogram's precise edit model: repeated edits keep the untouched pixels and colours intact, at the source's native resolution. Also generates from text.\",\n },\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 exposure: [\"cowork\", \"space_builder\"],\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\", \"outputFormat\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"bytedance\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/3bba5d81-4e57-4e71-911b-cdfa05acca2c_compressed.png\",\n description:\n \"ByteDance Seedream 5.0 Pro text-to-image and multi-reference image-to-image (up to 10 inputs) with region editing; outputs 1K, 1.5K, or 2K.\",\n },\n },\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 exposure: [],\n constraints: {\n // 97:30 has no Ark size spelling; the A+ flow pads inputs to 97:30 and\n // omits the ratio instead. Advertise only sizes the adapter can send.\n aspectRatios: [\n \"1:1\",\n \"2:3\",\n \"3:2\",\n \"4:3\",\n \"3:4\",\n \"4:5\",\n \"5:4\",\n \"9:16\",\n \"16:9\",\n \"21:9\",\n \"9:21\",\n ],\n sizes: [\"2K\", \"4K\"],\n references: { images: 10 },\n supports: [\"seed\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"bytedance\",\n description:\n \"ByteDance Seedream 4.5 text-to-image and image-to-image with up to 14 reference images and batch image-set generation; outputs 2K or 4K.\",\n },\n },\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 exposure: [\"cowork\", \"space_builder\"],\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 references: { images: 8 },\n // flux-2-pro's job type always returns image/png; only the seed is forwarded.\n supports: [\"seed\"],\n // Prodia's flux-2-pro schema gives the prompt a maxLength of 32,768.\n prompt: { referenceSyntax: \"numbered\", maxChars: 32768 },\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"black-forest-labs\",\n logo: \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/flux.png\",\n description:\n \"Black Forest Labs FLUX.2 [pro] text-to-image and multi-reference editing model served via Prodia; takes a prompt and up to 8 input images and outputs up to 4096x4096.\",\n },\n },\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 exposure: [],\n constraints: {\n aspectRatios: [\"1:1\", \"2:3\", \"3:2\", \"4:3\", \"3:4\", \"4:5\", \"5:4\", \"9:16\", \"16:9\", \"21:9\"],\n sizes: [\"1K\", \"2K\", \"4K\"],\n requires: [\"references\"],\n supports: [],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"google\",\n description:\n \"Google Gemini 3 Pro image generation and editing served via Prodia; takes a prompt plus up to 3 reference images and outputs 1K, 2K, or 4K.\",\n },\n },\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 exposure: [],\n constraints: {\n aspectRatios: [\"1:1\", \"2:3\", \"3:4\", \"4:3\", \"9:16\", \"16:9\", \"21:9\"],\n sizes: [\"1K\"],\n requires: [\"references\"],\n supports: [],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"google\",\n description:\n \"Google Nano Banana image generation and editing served via Prodia; takes a prompt plus 1-3 input images and matches the first input's aspect ratio in roughly 8 seconds.\",\n },\n },\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 exposure: [],\n constraints: {\n aspectRatios: [\"1:1\", \"16:9\", \"9:16\", \"4:3\", \"3:4\"],\n sizes: [\"1K\", \"2K\", \"4K\"],\n references: { images: 9 },\n supports: [],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { unit: \"compute_seconds\" },\n pricingKind: \"image_size\",\n display: {\n provider: \"alibaba\",\n description:\n \"Alibaba Wan 2.7 Image Pro text-to-image and image-editing model; takes a prompt plus up to 9 reference images and generates up to 4K (4096x4096).\",\n },\n },\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 exposure: [],\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 supports: [],\n },\n defaults: { aspectRatio: \"1:1\" },\n usage: { unit: \"compute_seconds\" },\n pricingKind: \"image_size\",\n display: {\n provider: \"alibaba\",\n description:\n \"Alibaba Qwen Image 2 Pro unified text-to-image and editing model; takes a prompt plus an optional single reference image and generates native 2K output.\",\n },\n },\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 exposure: [],\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\" },\n pricingKind: \"image_size\",\n display: {\n provider: \"alibaba\",\n description:\n \"Alibaba Qwen Image Edit Plus with Lightning and a skin-retouching LoRA; takes one or more reference images plus an edit prompt and outputs webp, jpg, or png.\",\n },\n },\n ...FAL_IMAGE_MODELS,\n ...LUMA_IMAGE_MODELS,\n];\n","// Output formats an audio row offers, as the provider spells them. Only MP3 and WAV: the\n// raw PCM, mu-law and A-law outputs have no container, and the canvas stores the result\n// as .mp3 unless its MIME says WAV.\n\n/** ElevenLabs TTS, voice changer and sound effects `output_format` (fal's default first). */\nexport const ELEVENLABS_MP3_FORMATS = [\n \"mp3_44100_128\",\n \"mp3_22050_32\",\n \"mp3_44100_32\",\n \"mp3_44100_64\",\n \"mp3_44100_96\",\n \"mp3_44100_192\",\n];\n\n/** ElevenLabs Music v2.5 `output_format` (fal's default first). */\nexport const ELEVENLABS_MUSIC_FORMATS = [\n \"mp3_48000_192\",\n \"mp3_22050_32\",\n \"mp3_24000_48\",\n \"mp3_44100_32\",\n \"mp3_44100_64\",\n \"mp3_44100_96\",\n \"mp3_44100_128\",\n \"mp3_44100_192\",\n \"mp3_48000_128\",\n \"mp3_48000_240\",\n \"mp3_48000_320\",\n];\n\n/** Mirelo SFX 2.0 `upload_audio_format` (fal's default first). */\nexport const MIRELO_FORMATS = [\"wav\", \"mp3\"];\n","// fal's `veed/subtitles` queue OpenAPI (`SubtitlesInput`), saved under adapters/__fixtures__/fal.\n\n/** The spoken-language codes VEED transcribes (`language`). */\nexport const VEED_SUBTITLE_LANGUAGES = [\n \"af-ZA\",\n \"am-ET\",\n \"ar-AE\",\n \"ar-BH\",\n \"ar-DZ\",\n \"ar-EG\",\n \"ar-IL\",\n \"ar-IQ\",\n \"ar-JO\",\n \"ar-KW\",\n \"ar-LB\",\n \"ar-MA\",\n \"ar-OM\",\n \"ar-PS\",\n \"ar-QA\",\n \"ar-SA\",\n \"ar-TN\",\n \"ast-ES\",\n \"az-AZ\",\n \"ba\",\n \"bas\",\n \"be-BY\",\n \"bg-BG\",\n \"br\",\n \"bs-BA\",\n \"ca-ES\",\n \"ceb-PH\",\n \"ckb-IQ\",\n \"cs-CZ\",\n \"cy-GB\",\n \"da-DK\",\n \"de-DE\",\n \"dyu\",\n \"el-GR\",\n \"en-AU\",\n \"en-GB\",\n \"en-IN\",\n \"en-NZ\",\n \"en-US\",\n \"eo\",\n \"es-AR\",\n \"es-BO\",\n \"es-CL\",\n \"es-CO\",\n \"es-CR\",\n \"es-DO\",\n \"es-EC\",\n \"es-ES\",\n \"es-GT\",\n \"es-HN\",\n \"es-MX\",\n \"es-NI\",\n \"es-PA\",\n \"es-PE\",\n \"es-PR\",\n \"es-PY\",\n \"es-SV\",\n \"es-US\",\n \"es-UY\",\n \"es-VE\",\n \"et-EE\",\n \"eu-ES\",\n \"fa-IR\",\n \"ff\",\n \"fi-FI\",\n \"fil-PH\",\n \"fo\",\n \"fr-CA\",\n \"fr-FR\",\n \"fy\",\n \"ga\",\n \"gd\",\n \"gl-ES\",\n \"ha-NG\",\n \"haw\",\n \"he-IL\",\n \"hr-HR\",\n \"hsb\",\n \"ht\",\n \"hu-HU\",\n \"hy-AM\",\n \"id-ID\",\n \"ig\",\n \"is-IS\",\n \"it-IT\",\n \"ja-JP\",\n \"ja-Latn-JP\",\n \"jv-ID\",\n \"ka-GE\",\n \"kab\",\n \"kam-KE\",\n \"kea-CV\",\n \"kk-KZ\",\n \"ko-KR\",\n \"ku\",\n \"ky-KG\",\n \"la\",\n \"lb-LU\",\n \"lg\",\n \"lij\",\n \"ln-CD\",\n \"lo-LA\",\n \"lt-LT\",\n \"luo-KE\",\n \"lv-LV\",\n \"mg\",\n \"mi-NZ\",\n \"mk-MK\",\n \"mn-MN\",\n \"ms-MY\",\n \"mt-MT\",\n \"nb-NO\",\n \"nl-NL\",\n \"nso-ZA\",\n \"ny-MW\",\n \"oc-FR\",\n \"pl-PL\",\n \"ps-AF\",\n \"pt-BR\",\n \"pt-PT\",\n \"ro-RO\",\n \"roh\",\n \"ru-RU\",\n \"rw-RW\",\n \"sah\",\n \"sk-SK\",\n \"sl-SI\",\n \"sm\",\n \"sn-ZW\",\n \"so-SO\",\n \"sq-AL\",\n \"sr-Latn-RS\",\n \"sr-RS\",\n \"srd\",\n \"ss\",\n \"su-ID\",\n \"sv-SE\",\n \"sw-KE\",\n \"sw-TZ\",\n \"tg-TJ\",\n \"th-TH\",\n \"tk\",\n \"tn\",\n \"tok\",\n \"ton\",\n \"tr-TR\",\n \"ts-ZA\",\n \"tt\",\n \"uk-UA\",\n \"umb-AO\",\n \"ur-IN\",\n \"ur-PK\",\n \"uz-UZ\",\n \"vi-VN\",\n \"vro\",\n \"wo-SN\",\n \"xh-ZA\",\n \"yi\",\n \"yo-NG\",\n \"yue-Hant-HK\",\n \"zh\",\n \"zh-HK\",\n \"zh-TW\",\n \"zu-ZA\",\n];\n\n/** The codes VEED translates captions into (`translation_language`). */\nexport const VEED_SUBTITLE_TRANSLATION_LANGUAGES = [\n \"ab\",\n \"ace\",\n \"ach\",\n \"af-ZA\",\n \"ak\",\n \"alz\",\n \"am-ET\",\n \"ar-AE\",\n \"ar-BH\",\n \"ar-DZ\",\n \"ar-EG\",\n \"ar-IL\",\n \"ar-IQ\",\n \"ar-JO\",\n \"ar-KW\",\n \"ar-LB\",\n \"ar-MA\",\n \"ar-OM\",\n \"ar-PS\",\n \"ar-QA\",\n \"ar-SA\",\n \"ar-TN\",\n \"awa\",\n \"ay\",\n \"az-AZ\",\n \"ban\",\n \"bbc\",\n \"be-BY\",\n \"bem\",\n \"bew\",\n \"bg-BG\",\n \"bho\",\n \"bik\",\n \"bm\",\n \"bs-BA\",\n \"bts\",\n \"btx\",\n \"bua\",\n \"ca-ES\",\n \"ceb-PH\",\n \"cgg\",\n \"chm\",\n \"ckb-IQ\",\n \"cnh\",\n \"co\",\n \"crh\",\n \"crs\",\n \"cs-CZ\",\n \"cv\",\n \"cy-GB\",\n \"da-DK\",\n \"de-DE\",\n \"din\",\n \"doi\",\n \"dov\",\n \"dv\",\n \"dz\",\n \"ee\",\n \"el-GR\",\n \"en-AU\",\n \"en-GB\",\n \"en-IN\",\n \"en-NZ\",\n \"en-US\",\n \"eo\",\n \"es-AR\",\n \"es-BO\",\n \"es-CL\",\n \"es-CO\",\n \"es-CR\",\n \"es-DO\",\n \"es-EC\",\n \"es-ES\",\n \"es-GT\",\n \"es-HN\",\n \"es-MX\",\n \"es-NI\",\n \"es-PA\",\n \"es-PE\",\n \"es-PR\",\n \"es-PY\",\n \"es-SV\",\n \"es-US\",\n \"es-UY\",\n \"es-VE\",\n \"et-EE\",\n \"eu-ES\",\n \"fa-IR\",\n \"ff\",\n \"fi-FI\",\n \"fil-PH\",\n \"fj\",\n \"fr-CA\",\n \"fr-FR\",\n \"fy\",\n \"ga\",\n \"gaa\",\n \"gd\",\n \"gl-ES\",\n \"gn\",\n \"gom\",\n \"ha-NG\",\n \"haw\",\n \"he-IL\",\n \"hil\",\n \"hmn\",\n \"hr-HR\",\n \"hrx\",\n \"ht\",\n \"hu-HU\",\n \"hy-AM\",\n \"id-ID\",\n \"ig\",\n \"ilo\",\n \"is-IS\",\n \"it-IT\",\n \"ja-JP\",\n \"ja-Latn-JP\",\n \"jv-ID\",\n \"ka-GE\",\n \"kk-KZ\",\n \"ko-KR\",\n \"kri\",\n \"ktu\",\n \"ku\",\n \"ky-KG\",\n \"la\",\n \"lb-LU\",\n \"lg\",\n \"li\",\n \"lij\",\n \"lmo\",\n \"ln-CD\",\n \"lo-LA\",\n \"lt-LT\",\n \"ltg\",\n \"luo-KE\",\n \"lus\",\n \"lv-LV\",\n \"mai\",\n \"mak\",\n \"mg\",\n \"mi-NZ\",\n \"min\",\n \"mk-MK\",\n \"mn-MN\",\n \"mni-Mtei\",\n \"ms-Arab\",\n \"ms-MY\",\n \"mt-MT\",\n \"nb-NO\",\n \"new\",\n \"nl-NL\",\n \"nr\",\n \"nso-ZA\",\n \"nus\",\n \"ny-MW\",\n \"oc-FR\",\n \"om\",\n \"pag\",\n \"pam\",\n \"pap\",\n \"pl-PL\",\n \"ps-AF\",\n \"pt-BR\",\n \"pt-PT\",\n \"qu\",\n \"rn\",\n \"ro-RO\",\n \"rom\",\n \"ru-RU\",\n \"rw-RW\",\n \"scn\",\n \"sg\",\n \"shn\",\n \"sk-SK\",\n \"sl-SI\",\n \"sm\",\n \"sn-ZW\",\n \"so-SO\",\n \"sq-AL\",\n \"sr-Latn-RS\",\n \"sr-RS\",\n \"ss\",\n \"st\",\n \"su-ID\",\n \"sv-SE\",\n \"sw-KE\",\n \"sw-TZ\",\n \"szl\",\n \"tet\",\n \"tg-TJ\",\n \"th-TH\",\n \"ti\",\n \"tk\",\n \"tn\",\n \"tr-TR\",\n \"ts-ZA\",\n \"tt\",\n \"ug\",\n \"uk-UA\",\n \"ur-IN\",\n \"ur-PK\",\n \"uz-UZ\",\n \"vi-VN\",\n \"xh-ZA\",\n \"yi\",\n \"yo-NG\",\n \"yua\",\n \"yue-Hant-HK\",\n \"zh\",\n \"zh-HK\",\n \"zh-TW\",\n \"zu-ZA\",\n];\n","import type { CatalogModel } from \"../types.js\";\nimport { VEED_SUBTITLE_LANGUAGES } from \"./veed-subtitle-languages.js\";\n\n// Rows for the Auto Mask and Subtitles canvas nodes, which called fal directly before 0.5.0.\n// Schemas: fal's queue OpenAPI per endpoint id (saved under adapters/__fixtures__/fal).\n\nconst EXPOSURE: CatalogModel[\"exposure\"] = [\"cowork\", \"space_builder\"];\nconst META_LOGO =\n \"https://d31vvfpk2ppdyq.cloudfront.net/assets/characters/1787909065794-k9a7zz.png\";\n\n/**\n * VEED's `preset` enum, \"simple\" first because it is the default (the Subtitles node's).\n * fal bills the dynamic ones (glass to backdrop2) at twice the basic rate.\n */\nexport const VEED_SUBTITLE_PRESETS = [\n \"simple\",\n \"glass\",\n \"whisper\",\n \"glide2\",\n \"fusion\",\n \"glide\",\n \"terminal\",\n \"handwritten\",\n \"backdrop\",\n \"backdrop2\",\n \"plain\",\n \"beans\",\n \"corpo\",\n \"boo\",\n \"shadeplay\",\n \"casper\",\n \"capri\",\n \"lowkey\",\n \"vinta\",\n \"diego\",\n \"ali\",\n \"slay\",\n \"kitty\",\n \"hustle\",\n \"karl\",\n \"sprout\",\n \"flex\",\n \"mint\",\n \"rizz\",\n \"vegas\",\n];\n\nexport const SAM_3_IMAGE: CatalogModel = {\n id: \"sam-3-image\",\n aliases: [\"fal-ai/sam-3/image\"],\n label: \"SAM 3 Segmentation\",\n type: \"mask\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/sam-3/image\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n references: { images: 1 },\n requires: [\"references\"],\n supports: [\"points\", \"boxes\"],\n },\n defaults: {},\n usage: { unit: \"images\" },\n pricingKind: \"flat\",\n display: {\n provider: \"meta\",\n logo: META_LOGO,\n description:\n \"Meta SAM 3 on fal; finds every object a prompt names in one image and returns a black-and-white mask for each.\",\n },\n};\n\nexport const VEED_SUBTITLES: CatalogModel = {\n id: \"veed-subtitles\",\n aliases: [\"veed/subtitles\"],\n label: \"VEED Subtitles\",\n type: \"video-tool\",\n adapter: \"fal\",\n providerModelId: \"veed/subtitles\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n supports: [],\n // fal: up to 2 hours at 1080p or below, 1 hour above.\n sourceVideoSeconds: { max: 7200 },\n tool: {\n kind: \"subtitles\",\n presets: VEED_SUBTITLE_PRESETS,\n languages: VEED_SUBTITLE_LANGUAGES,\n maxSecondsAbove1080p: 3600,\n },\n },\n defaults: {},\n usage: { unit: \"seconds\" },\n // Billed per source second like the other video tools ($0.10 per minute at every tier).\n pricingKind: \"video_per_second\",\n display: {\n provider: \"veed\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/d540d2bb-0022-4371-8889-48aefaf46bbe.png\",\n description:\n \"VEED subtitles; transcribes a clip's speech and burns in styled, word-timed captions.\",\n },\n};\n","import type { LanguageOption } from \"../types.js\";\n\n// Data only. `code` is the value sent to the provider. Sources: ElevenLabs model, dubbing and\n// speech-to-text docs (2026-10-20) and the `language_boost` enum of fal's MiniMax Speech schema.\n\n/** Eleven v4 and v4 Turbo `language_code`: ISO 639-1, or 639-3 where 639-1 has none. */\nexport const ELEVENLABS_V4_LANGUAGES: LanguageOption[] = [\n { code: \"af\", name: \"Afrikaans\" },\n { code: \"ar\", name: \"Arabic\" },\n { code: \"hy\", name: \"Armenian\" },\n { code: \"as\", name: \"Assamese\" },\n { code: \"ast\", name: \"Asturian\" },\n { code: \"az\", name: \"Azerbaijani\" },\n { code: \"be\", name: \"Belarusian\" },\n { code: \"bn\", name: \"Bengali\" },\n { code: \"bs\", name: \"Bosnian\" },\n { code: \"bg\", name: \"Bulgarian\" },\n { code: \"my\", name: \"Burmese\" },\n { code: \"yue\", name: \"Cantonese\" },\n { code: \"ca\", name: \"Catalan\" },\n { code: \"ceb\", name: \"Cebuano\" },\n { code: \"hr\", name: \"Croatian\" },\n { code: \"cs\", name: \"Czech\" },\n { code: \"da\", name: \"Danish\" },\n { code: \"nl\", name: \"Dutch\" },\n { code: \"en\", name: \"English\" },\n { code: \"et\", name: \"Estonian\" },\n { code: \"fil\", name: \"Filipino\" },\n { code: \"fi\", name: \"Finnish\" },\n { code: \"fr\", name: \"French\" },\n { code: \"gl\", name: \"Galician\" },\n { code: \"ka\", name: \"Georgian\" },\n { code: \"de\", name: \"German\" },\n { code: \"el\", name: \"Greek\" },\n { code: \"gu\", name: \"Gujarati\" },\n { code: \"ha\", name: \"Hausa\" },\n { code: \"he\", name: \"Hebrew\" },\n { code: \"hi\", name: \"Hindi\" },\n { code: \"hu\", name: \"Hungarian\" },\n { code: \"is\", name: \"Icelandic\" },\n { code: \"id\", name: \"Indonesian\" },\n { code: \"ga\", name: \"Irish\" },\n { code: \"it\", name: \"Italian\" },\n { code: \"ja\", name: \"Japanese\" },\n { code: \"jv\", name: \"Javanese\" },\n { code: \"kn\", name: \"Kannada\" },\n { code: \"kk\", name: \"Kazakh\" },\n { code: \"ko\", name: \"Korean\" },\n { code: \"ky\", name: \"Kyrgyz\" },\n { code: \"lv\", name: \"Latvian\" },\n { code: \"ln\", name: \"Lingala\" },\n { code: \"lt\", name: \"Lithuanian\" },\n { code: \"lb\", name: \"Luxembourgish\" },\n { code: \"mk\", name: \"Macedonian\" },\n { code: \"ms\", name: \"Malay\" },\n { code: \"ml\", name: \"Malayalam\" },\n { code: \"mt\", name: \"Maltese\" },\n { code: \"zh\", name: \"Mandarin Chinese\" },\n { code: \"mi\", name: \"Māori\" },\n { code: \"mr\", name: \"Marathi\" },\n { code: \"mn\", name: \"Mongolian\" },\n { code: \"ne\", name: \"Nepali\" },\n { code: \"no\", name: \"Norwegian\" },\n { code: \"oc\", name: \"Occitan\" },\n { code: \"or\", name: \"Odia\" },\n { code: \"ps\", name: \"Pashto\" },\n { code: \"fa\", name: \"Persian\" },\n { code: \"pl\", name: \"Polish\" },\n { code: \"pt\", name: \"Portuguese\" },\n { code: \"pa\", name: \"Punjabi\" },\n { code: \"ro\", name: \"Romanian\" },\n { code: \"ru\", name: \"Russian\" },\n { code: \"sr\", name: \"Serbian\" },\n { code: \"sd\", name: \"Sindhi\" },\n { code: \"sk\", name: \"Slovak\" },\n { code: \"sl\", name: \"Slovenian\" },\n { code: \"so\", name: \"Somali\" },\n { code: \"es\", name: \"Spanish\" },\n { code: \"sw\", name: \"Swahili\" },\n { code: \"sv\", name: \"Swedish\" },\n { code: \"tg\", name: \"Tajik\" },\n { code: \"ta\", name: \"Tamil\" },\n { code: \"te\", name: \"Telugu\" },\n { code: \"th\", name: \"Thai\" },\n { code: \"tr\", name: \"Turkish\" },\n { code: \"uk\", name: \"Ukrainian\" },\n { code: \"ur\", name: \"Urdu\" },\n { code: \"uz\", name: \"Uzbek\" },\n { code: \"vi\", name: \"Vietnamese\" },\n { code: \"cy\", name: \"Welsh\" },\n { code: \"yo\", name: \"Yoruba\" },\n];\n\n/** Multilingual v2's 29 languages. */\nexport const ELEVENLABS_MULTILINGUAL_V2_LANGUAGES: LanguageOption[] = [\n { code: \"en\", name: \"English\" },\n { code: \"ja\", name: \"Japanese\" },\n { code: \"zh\", name: \"Chinese\" },\n { code: \"de\", name: \"German\" },\n { code: \"hi\", name: \"Hindi\" },\n { code: \"fr\", name: \"French\" },\n { code: \"ko\", name: \"Korean\" },\n { code: \"pt\", name: \"Portuguese\" },\n { code: \"it\", name: \"Italian\" },\n { code: \"es\", name: \"Spanish\" },\n { code: \"id\", name: \"Indonesian\" },\n { code: \"nl\", name: \"Dutch\" },\n { code: \"tr\", name: \"Turkish\" },\n { code: \"fil\", name: \"Filipino\" },\n { code: \"pl\", name: \"Polish\" },\n { code: \"sv\", name: \"Swedish\" },\n { code: \"bg\", name: \"Bulgarian\" },\n { code: \"ro\", name: \"Romanian\" },\n { code: \"ar\", name: \"Arabic\" },\n { code: \"cs\", name: \"Czech\" },\n { code: \"el\", name: \"Greek\" },\n { code: \"fi\", name: \"Finnish\" },\n { code: \"hr\", name: \"Croatian\" },\n { code: \"ms\", name: \"Malay\" },\n { code: \"sk\", name: \"Slovak\" },\n { code: \"da\", name: \"Danish\" },\n { code: \"ta\", name: \"Tamil\" },\n { code: \"uk\", name: \"Ukrainian\" },\n { code: \"ru\", name: \"Russian\" },\n];\n\n/** Dubbing `target_lang`: languages both ElevenLabs Dubbing v1 and v2 take, as fal does not say which runs. */\nexport const ELEVENLABS_DUBBING_LANGUAGES: LanguageOption[] = [\n { code: \"af\", name: \"Afrikaans\" },\n { code: \"ar\", name: \"Arabic\" },\n { code: \"hy\", name: \"Armenian\" },\n { code: \"as\", name: \"Assamese\" },\n { code: \"az\", name: \"Azerbaijani\" },\n { code: \"be\", name: \"Belarusian\" },\n { code: \"bs\", name: \"Bosnian\" },\n { code: \"bg\", name: \"Bulgarian\" },\n { code: \"my\", name: \"Burmese\" },\n { code: \"yue\", name: \"Cantonese\" },\n { code: \"ca\", name: \"Catalan\" },\n { code: \"ceb\", name: \"Cebuano\" },\n { code: \"zh\", name: \"Chinese\" },\n { code: \"hr\", name: \"Croatian\" },\n { code: \"cs\", name: \"Czech\" },\n { code: \"da\", name: \"Danish\" },\n { code: \"nl\", name: \"Dutch\" },\n { code: \"en\", name: \"English\" },\n { code: \"et\", name: \"Estonian\" },\n { code: \"fil\", name: \"Filipino (Tagalog)\" },\n { code: \"fi\", name: \"Finnish\" },\n { code: \"fr\", name: \"French\" },\n { code: \"gl\", name: \"Galician\" },\n { code: \"ka\", name: \"Georgian\" },\n { code: \"de\", name: \"German\" },\n { code: \"el\", name: \"Greek\" },\n { code: \"gu\", name: \"Gujarati\" },\n { code: \"ha\", name: \"Hausa\" },\n { code: \"he\", name: \"Hebrew\" },\n { code: \"hi\", name: \"Hindi\" },\n { code: \"hu\", name: \"Hungarian\" },\n { code: \"is\", name: \"Icelandic\" },\n { code: \"id\", name: \"Indonesian\" },\n { code: \"it\", name: \"Italian\" },\n { code: \"ja\", name: \"Japanese\" },\n { code: \"jv\", name: \"Javanese\" },\n { code: \"kn\", name: \"Kannada\" },\n { code: \"kk\", name: \"Kazakh\" },\n { code: \"ko\", name: \"Korean\" },\n { code: \"ky\", name: \"Kyrgyz\" },\n { code: \"lv\", name: \"Latvian\" },\n { code: \"lt\", name: \"Lithuanian\" },\n { code: \"mk\", name: \"Macedonian\" },\n { code: \"ms\", name: \"Malay\" },\n { code: \"ml\", name: \"Malayalam\" },\n { code: \"mr\", name: \"Marathi\" },\n { code: \"mn\", name: \"Mongolian\" },\n { code: \"ne\", name: \"Nepali\" },\n { code: \"no\", name: \"Norwegian\" },\n { code: \"fa\", name: \"Persian\" },\n { code: \"pl\", name: \"Polish\" },\n { code: \"pt\", name: \"Portuguese\" },\n { code: \"pa\", name: \"Punjabi\" },\n { code: \"ro\", name: \"Romanian\" },\n { code: \"ru\", name: \"Russian\" },\n { code: \"sd\", name: \"Sindhi\" },\n { code: \"sk\", name: \"Slovak\" },\n { code: \"sl\", name: \"Slovenian\" },\n { code: \"es\", name: \"Spanish\" },\n { code: \"sw\", name: \"Swahili\" },\n { code: \"sv\", name: \"Swedish\" },\n { code: \"tg\", name: \"Tajik\" },\n { code: \"ta\", name: \"Tamil\" },\n { code: \"te\", name: \"Telugu\" },\n { code: \"th\", name: \"Thai\" },\n { code: \"tr\", name: \"Turkish\" },\n { code: \"uk\", name: \"Ukrainian\" },\n { code: \"ur\", name: \"Urdu\" },\n { code: \"uz\", name: \"Uzbek\" },\n { code: \"vi\", name: \"Vietnamese\" },\n { code: \"cy\", name: \"Welsh\" },\n { code: \"yo\", name: \"Yoruba\" },\n];\n\n/** Scribe v2 `language_code`, ISO 639-3 as fal's schema examples are. */\nexport const SCRIBE_V2_LANGUAGES: LanguageOption[] = [\n { code: \"afr\", name: \"Afrikaans\" },\n { code: \"amh\", name: \"Amharic\" },\n { code: \"ara\", name: \"Arabic\" },\n { code: \"hye\", name: \"Armenian\" },\n { code: \"asm\", name: \"Assamese\" },\n { code: \"ast\", name: \"Asturian\" },\n { code: \"aze\", name: \"Azerbaijani\" },\n { code: \"bel\", name: \"Belarusian\" },\n { code: \"ben\", name: \"Bengali\" },\n { code: \"bos\", name: \"Bosnian\" },\n { code: \"bul\", name: \"Bulgarian\" },\n { code: \"mya\", name: \"Burmese\" },\n { code: \"yue\", name: \"Cantonese\" },\n { code: \"cat\", name: \"Catalan\" },\n { code: \"ceb\", name: \"Cebuano\" },\n { code: \"nya\", name: \"Chichewa\" },\n { code: \"hrv\", name: \"Croatian\" },\n { code: \"ces\", name: \"Czech\" },\n { code: \"dan\", name: \"Danish\" },\n { code: \"nld\", name: \"Dutch\" },\n { code: \"eng\", name: \"English\" },\n { code: \"est\", name: \"Estonian\" },\n { code: \"fil\", name: \"Filipino\" },\n { code: \"fin\", name: \"Finnish\" },\n { code: \"fra\", name: \"French\" },\n { code: \"ful\", name: \"Fulah\" },\n { code: \"glg\", name: \"Galician\" },\n { code: \"lug\", name: \"Ganda\" },\n { code: \"kat\", name: \"Georgian\" },\n { code: \"deu\", name: \"German\" },\n { code: \"ell\", name: \"Greek\" },\n { code: \"guj\", name: \"Gujarati\" },\n { code: \"hau\", name: \"Hausa\" },\n { code: \"heb\", name: \"Hebrew\" },\n { code: \"hin\", name: \"Hindi\" },\n { code: \"hun\", name: \"Hungarian\" },\n { code: \"isl\", name: \"Icelandic\" },\n { code: \"ibo\", name: \"Igbo\" },\n { code: \"ind\", name: \"Indonesian\" },\n { code: \"gle\", name: \"Irish\" },\n { code: \"ita\", name: \"Italian\" },\n { code: \"jpn\", name: \"Japanese\" },\n { code: \"jav\", name: \"Javanese\" },\n { code: \"kea\", name: \"Kabuverdianu\" },\n { code: \"kan\", name: \"Kannada\" },\n { code: \"kaz\", name: \"Kazakh\" },\n { code: \"khm\", name: \"Khmer\" },\n { code: \"kor\", name: \"Korean\" },\n { code: \"kur\", name: \"Kurdish\" },\n { code: \"kir\", name: \"Kyrgyz\" },\n { code: \"lao\", name: \"Lao\" },\n { code: \"lav\", name: \"Latvian\" },\n { code: \"lin\", name: \"Lingala\" },\n { code: \"lit\", name: \"Lithuanian\" },\n { code: \"luo\", name: \"Luo\" },\n { code: \"ltz\", name: \"Luxembourgish\" },\n { code: \"mkd\", name: \"Macedonian\" },\n { code: \"msa\", name: \"Malay\" },\n { code: \"mal\", name: \"Malayalam\" },\n { code: \"mlt\", name: \"Maltese\" },\n { code: \"zho\", name: \"Mandarin Chinese\" },\n { code: \"mri\", name: \"Māori\" },\n { code: \"mar\", name: \"Marathi\" },\n { code: \"mon\", name: \"Mongolian\" },\n { code: \"nep\", name: \"Nepali\" },\n { code: \"nso\", name: \"Northern Sotho\" },\n { code: \"nor\", name: \"Norwegian\" },\n { code: \"oci\", name: \"Occitan\" },\n { code: \"ori\", name: \"Odia\" },\n { code: \"pus\", name: \"Pashto\" },\n { code: \"fas\", name: \"Persian\" },\n { code: \"pol\", name: \"Polish\" },\n { code: \"por\", name: \"Portuguese\" },\n { code: \"pan\", name: \"Punjabi\" },\n { code: \"ron\", name: \"Romanian\" },\n { code: \"rus\", name: \"Russian\" },\n { code: \"srp\", name: \"Serbian\" },\n { code: \"sna\", name: \"Shona\" },\n { code: \"snd\", name: \"Sindhi\" },\n { code: \"sin\", name: \"Sinhala\" },\n { code: \"slk\", name: \"Slovak\" },\n { code: \"slv\", name: \"Slovenian\" },\n { code: \"som\", name: \"Somali\" },\n { code: \"spa\", name: \"Spanish\" },\n { code: \"swa\", name: \"Swahili\" },\n { code: \"swe\", name: \"Swedish\" },\n { code: \"tam\", name: \"Tamil\" },\n { code: \"tgk\", name: \"Tajik\" },\n { code: \"tel\", name: \"Telugu\" },\n { code: \"tha\", name: \"Thai\" },\n { code: \"tur\", name: \"Turkish\" },\n { code: \"ukr\", name: \"Ukrainian\" },\n { code: \"umb\", name: \"Umbundu\" },\n { code: \"urd\", name: \"Urdu\" },\n { code: \"uzb\", name: \"Uzbek\" },\n { code: \"vie\", name: \"Vietnamese\" },\n { code: \"cym\", name: \"Welsh\" },\n { code: \"wol\", name: \"Wolof\" },\n { code: \"xho\", name: \"Xhosa\" },\n { code: \"zul\", name: \"Zulu\" },\n];\n\n/** MiniMax `language_boost` values that fit the canvas option format (\"auto\" is the unset default). */\nexport const MINIMAX_SPEECH_LANGUAGES: LanguageOption[] = [\n { code: \"Chinese\", name: \"Chinese\" },\n { code: \"English\", name: \"English\" },\n { code: \"Arabic\", name: \"Arabic\" },\n { code: \"Russian\", name: \"Russian\" },\n { code: \"Spanish\", name: \"Spanish\" },\n { code: \"French\", name: \"French\" },\n { code: \"Portuguese\", name: \"Portuguese\" },\n { code: \"German\", name: \"German\" },\n { code: \"Turkish\", name: \"Turkish\" },\n { code: \"Dutch\", name: \"Dutch\" },\n { code: \"Ukrainian\", name: \"Ukrainian\" },\n { code: \"Vietnamese\", name: \"Vietnamese\" },\n { code: \"Indonesian\", name: \"Indonesian\" },\n { code: \"Japanese\", name: \"Japanese\" },\n { code: \"Italian\", name: \"Italian\" },\n { code: \"Korean\", name: \"Korean\" },\n { code: \"Thai\", name: \"Thai\" },\n { code: \"Polish\", name: \"Polish\" },\n { code: \"Romanian\", name: \"Romanian\" },\n { code: \"Greek\", name: \"Greek\" },\n { code: \"Czech\", name: \"Czech\" },\n { code: \"Finnish\", name: \"Finnish\" },\n { code: \"Hindi\", name: \"Hindi\" },\n { code: \"Bulgarian\", name: \"Bulgarian\" },\n { code: \"Danish\", name: \"Danish\" },\n { code: \"Hebrew\", name: \"Hebrew\" },\n { code: \"Malay\", name: \"Malay\" },\n { code: \"Slovak\", name: \"Slovak\" },\n { code: \"Swedish\", name: \"Swedish\" },\n { code: \"Croatian\", name: \"Croatian\" },\n { code: \"Hungarian\", name: \"Hungarian\" },\n { code: \"Norwegian\", name: \"Norwegian\" },\n { code: \"Slovenian\", name: \"Slovenian\" },\n { code: \"Catalan\", name: \"Catalan\" },\n { code: \"Nynorsk\", name: \"Nynorsk\" },\n { code: \"Afrikaans\", name: \"Afrikaans\" },\n];\n","import type { VoiceOption } from \"../types.js\";\n\n// Data only. `id` is the name fal sends to ElevenLabs: the default and examples of the `voice`\n// field in fal's saved ElevenLabs schemas. Labels and previews are joined by name from\n// ElevenLabs' premade voice list (GET /v1/voices, 2026-10-20); a name it lacks has none.\nexport const ELEVENLABS_VOICES: VoiceOption[] = [\n { id: \"Rachel\", name: \"Rachel\" },\n { id: \"Aria\", name: \"Aria\" },\n {\n id: \"Roger\",\n name: \"Roger\",\n gender: \"male\",\n accent: \"american\",\n languages: [\"en\", \"fr\", \"de\", \"nl\", \"es\"],\n description: \"Easy going and perfect for casual conversations.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/CwhRBWXzGAHq8TQ4Fs17/58ee3ff5-f6f2-4628-93b8-e38eb31806b0.mp3\",\n },\n {\n id: \"Sarah\",\n name: \"Sarah\",\n gender: \"female\",\n accent: \"american\",\n languages: [\"en\", \"fr\", \"ar\", \"zh\", \"es\", \"hi\"],\n description:\n \"Young adult woman with a confident and warm, mature quality and a reassuring, professional tone.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/EXAVITQu4vr4xnSDxMaL/01a3e33c-6e99-4ee7-8543-ff2216a32186.mp3\",\n },\n {\n id: \"Laura\",\n name: \"Laura\",\n gender: \"female\",\n accent: \"american\",\n languages: [\"en\", \"fr\", \"ar\", \"zh\", \"de\"],\n description:\n \"This young adult female voice delivers sunny enthusiasm with a quirky attitude.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/FGY2WhTYpPnrIDTdsKH5/67341759-ad08-41a5-be6e-de12fe448618.mp3\",\n },\n {\n id: \"Charlie\",\n name: \"Charlie\",\n gender: \"male\",\n accent: \"australian\",\n languages: [\"en\", \"zh\", \"pt\", \"fil\", \"es\"],\n description: \"A young Australian male with a confident and energetic voice.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/IKne3meq5aSn9XLyUdCD/102de6f2-22ed-43e0-a1f1-111fa75c5481.mp3\",\n },\n {\n id: \"George\",\n name: \"George\",\n gender: \"male\",\n accent: \"british\",\n languages: [\"en\", \"fr\", \"ar\", \"ja\", \"cs\", \"fil\", \"es\", \"hi\"],\n description: \"Warm resonance that instantly captivates listeners.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/JBFqnCBsd6RMkjVDRZzb/e6206d1a-0721-4787-aafb-06a6e705cac5.mp3\",\n },\n {\n id: \"Callum\",\n name: \"Callum\",\n gender: \"male\",\n accent: \"american\",\n languages: [\"en\", \"fr\", \"hi\"],\n description: \"Deceptively gravelly, yet unsettling edge.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/N2lVS1w4EtoT3dr4eOWO/ac833bd8-ffda-4938-9ebc-b0f99ca25481.mp3\",\n },\n {\n id: \"River\",\n name: \"River\",\n gender: \"neutral\",\n accent: \"american\",\n languages: [\"en\", \"it\", \"fr\", \"pt\", \"zh\"],\n description: \"A relaxed, neutral voice ready for narrations or conversational projects.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/SAz9YHcvj6GT2YYXdXww/e6c95f0b-2227-491a-b3d7-2249240decb7.mp3\",\n },\n {\n id: \"Liam\",\n name: \"Liam\",\n gender: \"male\",\n accent: \"american\",\n languages: [\"en\", \"de\", \"pt\", \"cs\", \"pl\", \"tr\", \"hi\"],\n description: \"A young adult with energy and warmth - suitable for reels and shorts.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/TX3LPaxmHKxFdv7VOQHJ/63148076-6363-42db-aea8-31424308b92c.mp3\",\n },\n { id: \"Charlotte\", name: \"Charlotte\" },\n {\n id: \"Alice\",\n name: \"Alice\",\n gender: \"female\",\n accent: \"british\",\n languages: [\"en\", \"it\", \"fr\", \"ar\", \"ja\", \"pl\", \"hi\"],\n description:\n \"Clear and engaging, friendly woman with a British accent suitable for e-learning.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/Xb7hH8MSUJpSbSDYk0k2/d10f7534-11f6-41fe-a012-2de1e482d336.mp3\",\n },\n {\n id: \"Matilda\",\n name: \"Matilda\",\n gender: \"female\",\n accent: \"american\",\n languages: [\"en\", \"it\", \"fr\", \"de\", \"ar\", \"es\"],\n description:\n \"A professional woman with a pleasing alto pitch. Suitable for many use cases.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/XrExE9yKIg1WjnnlVkGX/b930e18d-6b4d-466e-bab2-0ae97c6d8535.mp3\",\n },\n {\n id: \"Will\",\n name: \"Will\",\n gender: \"male\",\n accent: \"american\",\n languages: [\"en\", \"fr\", \"de\", \"pt\", \"zh\", \"cs\", \"fil\", \"sk\", \"es\", \"sv\"],\n description: \"Conversational and laid back.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/bIHbv24MWmeRgasZH58o/8caf8f3d-ad29-4980-af41-53f20c72d7a4.mp3\",\n },\n {\n id: \"Jessica\",\n name: \"Jessica\",\n gender: \"female\",\n accent: \"american\",\n languages: [\"en\", \"fr\", \"ar\", \"ja\", \"zh\", \"de\", \"cs\", \"hi\"],\n description:\n \"Young and popular, this playful American female voice is perfect for trendy content.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/cgSgspJ2msm6clMCkdW9/56a97bf8-b69b-448f-846c-c3a11683d45a.mp3\",\n },\n {\n id: \"Eric\",\n name: \"Eric\",\n gender: \"male\",\n accent: \"american\",\n languages: [\"en\", \"fr\", \"pt\", \"de\", \"sk\", \"es\"],\n description: \"A smooth tenor pitch from a man in his 40s - perfect for agentic use cases.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/cjVigY5qzO86Huf0OWal/d098fda0-6456-4030-b3d8-63aa048c9070.mp3\",\n },\n {\n id: \"Chris\",\n name: \"Chris\",\n gender: \"male\",\n accent: \"american\",\n languages: [\"en\", \"fr\", \"ar\", \"pt\", \"sv\", \"hi\"],\n description: \"Natural and real, this down-to-earth voice is great across many use-cases.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/iP95p4xoKVk53GoZ742B/3f4bde72-cc48-40dd-829f-57fbf906f4d7.mp3\",\n },\n {\n id: \"Brian\",\n name: \"Brian\",\n gender: \"male\",\n accent: \"american\",\n languages: [\"en\", \"ar\", \"zh\", \"pt\", \"de\", \"nl\", \"sk\", \"ro\", \"hi\"],\n description:\n \"Middle-aged man with a resonant and comforting tone. Great for narrations and advertisements.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/nPczCjzI2devNBz1zQrb/2dd3e72c-4fd3-42f1-93ea-abc5d4e5aa1d.mp3\",\n },\n {\n id: \"Daniel\",\n name: \"Daniel\",\n gender: \"male\",\n accent: \"british\",\n languages: [\"en\", \"de\", \"tr\"],\n description:\n \"A strong voice perfect for delivering a professional broadcast or news story.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/onwK4e9ZLuTAKqWW03F9/7eee0236-1a72-4b86-b303-5dcadc007ba9.mp3\",\n },\n {\n id: \"Lily\",\n name: \"Lily\",\n gender: \"female\",\n accent: \"british\",\n languages: [\"en\", \"it\", \"de\", \"zh\", \"cs\", \"nl\", \"pl\"],\n description:\n \"Velvety British female voice delivers news and narrations with warmth and clarity.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/pFZP5JQG7iQjIQuC4Bku/89b68b35-b3dd-4348-a84a-a3c13a3c2b30.mp3\",\n },\n {\n id: \"Bill\",\n name: \"Bill\",\n gender: \"male\",\n accent: \"american\",\n languages: [\"en\", \"fr\", \"ar\", \"zh\", \"de\", \"cs\"],\n description: \"Friendly and comforting voice ready to narrate your stories.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/pqHfZKP75CvOlQylNhV4/d782b3ff-84ba-4029-848c-acf01285524d.mp3\",\n },\n];\n","import type { VoiceOption } from \"../types.js\";\n\n// Data only. `id` is a value of the `voice` enum in fal's Gemini 3.8 TTS schemas. Labels are\n// joined by name from Google's voices list (2026-10-20), which covers only part of the enum.\nexport const GEMINI_TTS_VOICES: VoiceOption[] = [\n {\n id: \"Achernar\",\n name: \"Achernar\",\n gender: \"female\",\n accent: \"General American\",\n languages: [\"en-US\"],\n description:\n \"Soft, calm, and soothing voice with a higher pitch. Recommended for quiet or personal storytelling.\",\n },\n {\n id: \"Achird\",\n name: \"Achird\",\n gender: \"male\",\n accent: \"General American\",\n languages: [\"en-US\"],\n description:\n \"Friendly, approachable, and warm voice with a lower-middle pitch. Recommended for casual walkthroughs or vlogs.\",\n },\n {\n id: \"Algenib\",\n name: \"Algenib\",\n gender: \"male\",\n accent: \"General American\",\n languages: [\"en-US\"],\n description:\n \"Gravelly, grounded, and hard-hitting voice with a low pitch. Recommended for dramatic narration or intense stories.\",\n },\n {\n id: \"Algieba\",\n name: \"Algieba\",\n gender: \"male\",\n accent: \"General American\",\n languages: [\"en-US\"],\n description:\n \"Smooth, relaxed, and polished voice with a low pitch. Recommended for corporate videos or polished explainers.\",\n },\n {\n id: \"Alnilam\",\n name: \"Alnilam\",\n gender: \"male\",\n accent: \"General American\",\n languages: [\"en-US\"],\n description:\n \"Firm, direct, and commanding voice with a lower-middle pitch. Recommended for authoritative instructions or announcements.\",\n },\n {\n id: \"Aoede\",\n name: \"Aoede\",\n gender: \"female\",\n accent: \"General American\",\n languages: [\"en-US\"],\n description:\n \"Breezy, light, and relaxed voice with a medium pitch. Recommended for lifestyle or travel vlogs.\",\n },\n { id: \"Autonoe\", name: \"Autonoe\" },\n { id: \"Callirrhoe\", name: \"Callirrhoe\" },\n { id: \"Charon\", name: \"Charon\" },\n { id: \"Despina\", name: \"Despina\" },\n { id: \"Enceladus\", name: \"Enceladus\" },\n { id: \"Erinome\", name: \"Erinome\" },\n { id: \"Fenrir\", name: \"Fenrir\" },\n { id: \"Gacrux\", name: \"Gacrux\" },\n { id: \"Iapetus\", name: \"Iapetus\" },\n { id: \"Kore\", name: \"Kore\" },\n { id: \"Laomedeia\", name: \"Laomedeia\" },\n { id: \"Leda\", name: \"Leda\" },\n { id: \"Orus\", name: \"Orus\" },\n { id: \"Pulcherrima\", name: \"Pulcherrima\" },\n { id: \"Puck\", name: \"Puck\" },\n { id: \"Rasalgethi\", name: \"Rasalgethi\" },\n { id: \"Sadachbia\", name: \"Sadachbia\" },\n { id: \"Sadaltager\", name: \"Sadaltager\" },\n { id: \"Schedar\", name: \"Schedar\" },\n { id: \"Sulafat\", name: \"Sulafat\" },\n { id: \"Umbriel\", name: \"Umbriel\" },\n { id: \"Vindemiatrix\", name: \"Vindemiatrix\" },\n { id: \"Zephyr\", name: \"Zephyr\" },\n { id: \"Zubenelgenubi\", name: \"Zubenelgenubi\" },\n];\n","import type { VoiceOption } from \"../types.js\";\n\n// Data only. fal's MiniMax Speech `voice_id` takes any string. These are the default\n// (Wise_Woman) and examples of that field in fal's saved schema, then MiniMax's system voices\n// (get_voice, 2026-10-20) whose ids fit the canvas option format `^[A-Za-z0-9_.:-]{1,64}$`;\n// the rest (spaces, brackets) are left out.\nexport const MINIMAX_VOICES: VoiceOption[] = [\n { id: \"Wise_Woman\", name: \"Wise Woman\" },\n { id: \"Friendly_Person\", name: \"Friendly Person\" },\n { id: \"Inspirational_girl\", name: \"Inspirational girl\" },\n { id: \"Deep_Voice_Man\", name: \"Deep Voice Man\" },\n { id: \"Calm_Woman\", name: \"Calm Woman\" },\n { id: \"Casual_Guy\", name: \"Casual Guy\" },\n { id: \"Lively_Girl\", name: \"Lively Girl\" },\n { id: \"Patient_Man\", name: \"Patient Man\" },\n { id: \"Young_Knight\", name: \"Young Knight\" },\n { id: \"Determined_Man\", name: \"Determined Man\" },\n { id: \"Lovely_Girl\", name: \"Lovely Girl\" },\n { id: \"Decent_Boy\", name: \"Decent Boy\" },\n { id: \"Imposing_Manner\", name: \"Imposing Manner\" },\n { id: \"Elegant_Man\", name: \"Elegant Man\" },\n { id: \"Abbess\", name: \"Abbess\" },\n { id: \"Sweet_Girl_2\", name: \"Sweet Girl 2\" },\n { id: \"Exuberant_Girl\", name: \"Exuberant Girl\" },\n {\n id: \"English_expressive_narrator\",\n name: \"Expressive Narrator\",\n description:\n \"An expressive adult male voice with a British accent, perfect for engaging audiobook narration.\",\n },\n {\n id: \"English_radiant_girl\",\n name: \"Radiant Girl\",\n description:\n \"A radiant and lively young adult female voice with a general American accent, full of energy and brightness.\",\n },\n {\n id: \"English_magnetic_voiced_man\",\n name: \"Magnetic-voiced Male\",\n description:\n \"A magnetic and persuasive adult male voice with a general American accent, ideal for advertisements and promotions.\",\n },\n {\n id: \"English_compelling_lady1\",\n name: \"Compelling Lady\",\n description:\n \"A compelling adult female voice with a British accent, suitable for broadcast and formal announcements. Clear and authoritative.\",\n },\n {\n id: \"English_Aussie_Bloke\",\n name: \"Aussie Bloke\",\n description:\n \"A friendly, bright adult male voice with a distinct Australian accent, conveying a cheerful and approachable tone.\",\n },\n {\n id: \"English_captivating_female1\",\n name: \"Captivating Female\",\n description:\n \"A captivating adult female voice with a general American accent, ideal for news reporting and documentary narration.\",\n },\n {\n id: \"English_Upbeat_Woman\",\n name: \"Upbeat Woman\",\n description:\n \"An upbeat and bright adult female voice with a general American accent, perfect for energetic and positive messaging.\",\n },\n {\n id: \"English_Trustworth_Man\",\n name: \"Trustworthy Man\",\n description:\n \"A trustworthy and resonant adult male voice with a general American accent, conveying sincerity and reliability.\",\n },\n {\n id: \"English_CalmWoman\",\n name: \"Calm Woman\",\n description:\n \"A calm and soothing adult female voice with a general American accent, excellent for audiobooks and meditation guides.\",\n },\n {\n id: \"English_UpsetGirl\",\n name: \"Upset Girl\",\n description:\n \"A young adult female voice with a British accent, effectively conveying sadness and distress.\",\n },\n {\n id: \"English_Gentle-voiced_man\",\n name: \"Gentle-voiced Man\",\n description:\n \"A gentle and resonant adult male voice with a general American accent, warm and reassuring.\",\n },\n { id: \"English_Whispering_girl\", name: \"Whispering girl\" },\n {\n id: \"English_Diligent_Man\",\n name: \"Diligent Man\",\n description:\n \"A diligent and sincere adult male voice with an Indian accent, conveying honesty and hard work.\",\n },\n {\n id: \"English_Graceful_Lady\",\n name: \"Graceful Lady\",\n description:\n \"A graceful and elegant middle-aged female voice with a classic British accent, exuding sophistication.\",\n },\n {\n id: \"English_ReservedYoungMan\",\n name: \"Reserved Young Man\",\n description:\n \"A reserved and cold adult male voice with a general American accent, conveying distance and introspection.\",\n },\n {\n id: \"English_PlayfulGirl\",\n name: \"Playful Girl\",\n description:\n \"A playful female youth voice with a general American accent, ideal for cartoons and children's entertainment.\",\n },\n {\n id: \"English_ManWithDeepVoice\",\n name: \"Man With Deep Voice\",\n description:\n \"An adult male with a deep, commanding voice and a general American accent, projecting authority and strength.\",\n },\n {\n id: \"English_MaturePartner\",\n name: \"Mature Partner\",\n description:\n \"A mature, gentle middle-aged male voice with a British accent, suitable for a caring and supportive partner role.\",\n },\n {\n id: \"English_FriendlyPerson\",\n name: \"Friendly Guy\",\n description:\n \"A friendly and natural-sounding adult male voice with a general American accent, like an approachable guy-next-door.\",\n },\n {\n id: \"English_MatureBoss\",\n name: \"Bossy Lady\",\n description:\n \"A mature, middle-aged female voice with a general American accent, conveying authority and a commanding presence.\",\n },\n {\n id: \"English_Debator\",\n name: \"Male Debater\",\n description:\n \"A tough, middle-aged male voice with a general American accent, perfect for debates and assertive arguments.\",\n },\n {\n id: \"English_LovelyGirl\",\n name: \"Lovely Girl\",\n description:\n \"A lovely and sweet female youth voice with a British accent, full of charm and innocence.\",\n },\n {\n id: \"English_Steadymentor\",\n name: \"Reliable Man\",\n description:\n \"A young adult male voice with a general American accent, projecting an air of arrogant reliability.\",\n },\n {\n id: \"English_Deep-VoicedGentleman\",\n name: \"Deep-voiced Gentleman\",\n description:\n \"A deep-voiced and wise adult male gentleman with a classic British accent, sounding experienced and thoughtful.\",\n },\n {\n id: \"English_Wiselady\",\n name: \"Wise Lady\",\n description:\n \"A wise and genial middle-aged female voice with a British accent, offering kind and insightful words.\",\n },\n {\n id: \"English_CaptivatingStoryteller\",\n name: \"Captivating Storyteller\",\n description:\n \"A captivating senior male storyteller with a cold, detached tone and a general American accent.\",\n },\n {\n id: \"English_DecentYoungMan\",\n name: \"Decent Young Man\",\n description:\n \"A decent and respectable adult male voice with a British accent, sounding polite and well-mannered.\",\n },\n {\n id: \"English_SentimentalLady\",\n name: \"Sentimental Lady\",\n description:\n \"A sentimental and elegant middle-aged female voice with a British accent, perfect for nostalgic or emotional readings.\",\n },\n {\n id: \"English_ImposingManner\",\n name: \"Imposing Queen\",\n description:\n \"The imposing voice of an adult queen with a powerful British accent, commanding respect and authority.\",\n },\n {\n id: \"English_SadTeen\",\n name: \"Teen Boy\",\n description:\n \"A frustrated young adult male voice with a British accent, perfect for a teen character expressing annoyance.\",\n },\n {\n id: \"English_PassionateWarrior\",\n name: \"Passionate Warrior\",\n description:\n \"An energetic and passionate young adult male warrior voice with a general American accent, ready for battle.\",\n },\n {\n id: \"English_WiseScholar\",\n name: \"Wise Scholar\",\n description:\n \"A wise, conversational young adult scholar with a British accent, making complex topics accessible and engaging.\",\n },\n {\n id: \"English_Soft-spokenGirl\",\n name: \"Soft-Spoken Girl\",\n description:\n \"An adorable, soft-spoken female youth voice with a general American accent, gentle and sweet.\",\n },\n {\n id: \"English_SereneWoman\",\n name: \"Serene Woman\",\n description:\n \"A serene and friendly young adult female voice with a general American accent, calm and welcoming.\",\n },\n {\n id: \"English_ConfidentWoman\",\n name: \"Confident Woman\",\n description:\n \"A confident and firm young adult female voice with a general American accent, assertive and clear.\",\n },\n {\n id: \"English_PatientMan\",\n name: \"Patient Man\",\n description:\n \"A patient adult male voice with a British accent, speaking in a calm and understanding manner.\",\n },\n {\n id: \"English_Comedian\",\n name: \"Comedian\",\n description:\n \"A breezy young adult male comedian with a British accent, delivering lines with a light and humorous touch.\",\n },\n {\n id: \"English_BossyLeader\",\n name: \"Bossy Leader\",\n description:\n \"A bossy adult male leader with a general American accent, speaking unconcernedly with an air of command.\",\n },\n {\n id: \"English_Strong-WilledBoy\",\n name: \"Strong-Willed Boy\",\n description:\n \"A mature-sounding and strong-willed young adult male with a British accent, showing determination beyond his years.\",\n },\n {\n id: \"English_StressedLady\",\n name: \"Stressed Lady\",\n description:\n \"An unsure, stressed middle-aged female voice with a general American accent, conveying anxiety and uncertainty.\",\n },\n {\n id: \"English_AssertiveQueen\",\n name: \"Assertive Queen\",\n description:\n \"An assertive yet guarded young adult queen with a general American accent, projecting authority while remaining cautious.\",\n },\n {\n id: \"English_AnimeCharacter\",\n name: \"Female Narrator\",\n description:\n \"A sincere middle-aged female narrator with a British accent, perfect for trustworthy and heartfelt storytelling.\",\n },\n {\n id: \"English_Jovialman\",\n name: \"Jovial Man\",\n description:\n \"A jovial and mature middle-aged male voice with a general American accent, cheerful and good-natured.\",\n },\n {\n id: \"English_WhimsicalGirl\",\n name: \"Whimsical Girl\",\n description:\n \"A whimsical yet wary young adult female voice with a general American accent, combining playfulness with caution.\",\n },\n {\n id: \"English_Kind-heartedGirl\",\n name: \"Kind-Hearted Girl\",\n description:\n \"A kind-hearted and calm young adult female with a general American accent, speaking with gentle warmth.\",\n },\n {\n id: \"Arrogant_Miss\",\n name: \"Arrogant Miss\",\n description:\n \"An arrogant adult female voice in Standard Mandarin, projecting confidence and superiority.\",\n },\n {\n id: \"Robot_Armor\",\n name: \"Robot Armor\",\n description:\n \"An electronic, robotic adult male voice, suitable for sci-fi or futuristic content in Standard Mandarin.\",\n },\n {\n id: \"Japanese_IntellectualSenior\",\n name: \"Intellectual Senior\",\n description:\n \"A mature and intellectual young adult male voice in Japanese, sounding older than his age.\",\n },\n {\n id: \"Japanese_DecisivePrincess\",\n name: \"Decisive Princess\",\n description: \"A firm and decisive adult princess's voice in Japanese.\",\n },\n {\n id: \"Japanese_LoyalKnight\",\n name: \"Loyal Knight\",\n description: \"A youthful and loyal adult male knight's voice in Japanese.\",\n },\n {\n id: \"Japanese_DominantMan\",\n name: \"Dominant Man\",\n description: \"A mature and dominant middle-aged male voice in Japanese.\",\n },\n {\n id: \"Japanese_SeriousCommander\",\n name: \"Serious Commander\",\n description: \"A serious and reliable adult male commander's voice in Japanese.\",\n },\n {\n id: \"Japanese_ColdQueen\",\n name: \"Cold Queen\",\n description: \"A distant and cold adult queen's voice in Japanese.\",\n },\n {\n id: \"Japanese_DependableWoman\",\n name: \"Dependable Woman\",\n description: \"A steady and dependable adult female voice in Japanese.\",\n },\n {\n id: \"Japanese_GentleButler\",\n name: \"Gentle Butler\",\n description: \"A charming and gentle adult male butler's voice in Japanese.\",\n },\n {\n id: \"Japanese_KindLady\",\n name: \"Kind Lady\",\n description: \"A charming and kind adult female voice in Japanese.\",\n },\n {\n id: \"Japanese_CalmLady\",\n name: \"Calm Lady\",\n description: \"A calm and charming adult female voice in Japanese.\",\n },\n {\n id: \"Japanese_OptimisticYouth\",\n name: \"Optimistic Youth\",\n description: \"A cheerful and optimistic adult male youth's voice in Japanese.\",\n },\n {\n id: \"Japanese_GenerousIzakayaOwner\",\n name: \"Generous Izakaya Owner\",\n description:\n \"A playful and generous middle-aged male izakaya owner's voice in Standard Japanese.\",\n },\n {\n id: \"Japanese_SportyStudent\",\n name: \"Sporty Student\",\n description: \"An inviting and sporty adult male student's voice in Standard Japanese.\",\n },\n {\n id: \"Japanese_InnocentBoy\",\n name: \"Innocent Boy\",\n description: \"An inviting and innocent adult male voice in Standard Japanese.\",\n },\n {\n id: \"Japanese_GracefulMaiden\",\n name: \"Graceful Maiden\",\n description: \"A sweet and graceful adult maiden's voice in Standard Japanese.\",\n },\n {\n id: \"Cantonese_GentleLady\",\n name: \"Gentle Lady\",\n description: \"A calm and gentle adult female voice in Cantonese.\",\n },\n {\n id: \"Cantonese_PlayfulMan\",\n name: \"Playful Man\",\n description: \"A soulful and playful adult male voice in Cantonese.\",\n },\n {\n id: \"Cantonese_CuteGirl\",\n name: \"Cute Girl\",\n description: \"A soothing and cute young adult female voice in Cantonese.\",\n },\n {\n id: \"Cantonese_KindWoman\",\n name: \"Kind Woman\",\n description: \"A friendly and kind adult female voice in Cantonese.\",\n },\n {\n id: \"Korean_AirheadedGirl\",\n name: \"Airheaded Girl\",\n description:\n 'A cool and composed adult female voice, suitable for an \"airheaded\" character in Standard Korean.',\n },\n {\n id: \"Korean_AthleticGirl\",\n name: \"Athletic Girl\",\n description: \"A robust and athletic female youth's voice in Standard Korean.\",\n },\n {\n id: \"Korean_AthleticStudent\",\n name: \"Athletic Student\",\n description: \"An energetic young adult male athletic student's voice in Standard Korean.\",\n },\n {\n id: \"Korean_BraveAdventurer\",\n name: \"Brave Adventurer\",\n description:\n \"A playful and adventurous adult female brave adventurer's voice in Standard Korean.\",\n },\n {\n id: \"Korean_BraveFemaleWarrior\",\n name: \"Brave Female Warrior\",\n description: \"A resolute young adult brave female warrior's voice in Standard Korean.\",\n },\n {\n id: \"Korean_BraveYouth\",\n name: \"Brave Youth\",\n description: \"A powerful young adult brave male youth's voice in Standard Korean.\",\n },\n {\n id: \"Korean_CalmGentleman\",\n name: \"Calm Gentleman\",\n description: \"A composed and calm middle-aged gentleman's voice in Standard Korean.\",\n },\n {\n id: \"Korean_CalmLady\",\n name: \"Calm Lady\",\n description: \"A resilient and determined young adult female voice in Standard Korean.\",\n },\n {\n id: \"Korean_CaringWoman\",\n name: \"Caring Woman\",\n description: \"A lively and vibrant young adult caring woman's voice in Standard Korean.\",\n },\n {\n id: \"Korean_CharmingElderSister\",\n name: \"Charming Elder Sister\",\n description:\n 'A playful and mischievous middle-aged \"charming elder sister\" voice in Standard Korean.',\n },\n {\n id: \"Korean_CharmingSister\",\n name: \"Charming Sister\",\n description: 'A seductive middle-aged \"charming sister\" voice in Standard Korean.',\n },\n {\n id: \"Korean_CheerfulBoyfriend\",\n name: \"Cheerful Boyfriend\",\n description: \"A sharp and intense middle-aged male voice in Standard Korean.\",\n },\n {\n id: \"Korean_CheerfulCoolJunior\",\n name: \"Cheerful Cool Junior\",\n description:\n 'An energetic and spirited adult male \"cheerful cool junior\" voice in Standard Korean.',\n },\n {\n id: \"Korean_CheerfulLittleSister\",\n name: \"Cheerful Little Sister\",\n description:\n 'An energetic and lively adult female \"cheerful little sister\" voice in Standard Korean.',\n },\n {\n id: \"Korean_ChildhoodFriendGirl\",\n name: \"Childhood Friend Girl\",\n description:\n 'A polite and reserved young adult female \"childhood friend\" voice in Standard Korean.',\n },\n {\n id: \"Korean_CockyGuy\",\n name: \"Cocky Guy\",\n description: \"A playful and mischievous young adult cocky guy's voice in Standard Korean.\",\n },\n {\n id: \"Korean_ColdGirl\",\n name: \"Cold Girl\",\n description: \"An aloof and cold adult female voice in Standard Korean.\",\n },\n {\n id: \"Korean_ColdYoungMan\",\n name: \"Cold Young Man\",\n description: \"A cold and composed adult male voice in Standard Korean.\",\n },\n {\n id: \"Korean_ConfidentBoss\",\n name: \"Confident Boss\",\n description: \"A deep and commanding middle-aged confident boss's voice in Standard Korean.\",\n },\n {\n id: \"Korean_ConsiderateSenior\",\n name: \"Considerate Senior\",\n description:\n 'A gentle and mature young adult male \"considerate senior\" voice in Standard Korean.',\n },\n {\n id: \"Korean_DecisiveQueen\",\n name: \"Decisive Queen\",\n description: \"A sweet yet resolute young adult decisive queen's voice in Standard Korean.\",\n },\n {\n id: \"Korean_DominantMan\",\n name: \"Dominant Man\",\n description: \"A mature and authoritative dominant adult male voice in Standard Korean.\",\n },\n {\n id: \"Korean_ElegantPrincess\",\n name: \"Elegant Princess\",\n description: \"A graceful and refined adult princess voice in Standard Korean.\",\n },\n {\n id: \"Korean_EnchantingSister\",\n name: \"Enchanting Sister\",\n description:\n 'A desirable and charming young adult \"enchanting sister\" voice in Standard Korean.',\n },\n {\n id: \"Korean_EnthusiasticTeen\",\n name: \"Enthusiastic Teen\",\n description: \"A passionate and lively young adult male teen's voice in Standard Korean.\",\n },\n {\n id: \"Korean_FriendlyBigSister\",\n name: \"Friendly Big Sister\",\n description:\n 'A charismatic and alluring middle-aged \"friendly big sister\" voice in Standard Korean.',\n },\n {\n id: \"Korean_GentleBoss\",\n name: \"Gentle Boss\",\n description: 'A regal and refined middle-aged male \"gentle boss\" voice in Standard Korean.',\n },\n {\n id: \"Korean_GentleWoman\",\n name: \"Gentle Woman\",\n description: \"A strong-willed yet gentle young adult female voice in Standard Korean.\",\n },\n {\n id: \"Korean_HaughtyLady\",\n name: \"Haughty Lady\",\n description: \"A cold and distant young adult haughty lady's voice in Standard Korean.\",\n },\n {\n id: \"Korean_InnocentBoy\",\n name: \"Innocent Boy\",\n description: 'A naive and pure young adult male \"innocent boy\" voice in Standard Korean.',\n },\n {\n id: \"Korean_IntellectualMan\",\n name: \"Intellectual Man\",\n description: \"A combative middle-aged intellectual male voice in Standard Korean.\",\n },\n {\n id: \"Korean_IntellectualSenior\",\n name: \"Intellectual Senior\",\n description:\n \"A magnetic and intellectual young adult male voice with a senior quality in Standard Korean.\",\n },\n {\n id: \"Korean_LonelyWarrior\",\n name: \"Lonely Warrior\",\n description: 'A youthful and daring adult male \"lonely warrior\" voice in Standard Korean.',\n },\n {\n id: \"Korean_MatureLady\",\n name: \"Mature Lady\",\n description: \"A refined and elegant mature middle-aged lady's voice in Standard Korean.\",\n },\n {\n id: \"Korean_MysteriousGirl\",\n name: \"Mysterious Girl\",\n description:\n \"An energetic and lively female youth voice for a mysterious character in Standard Korean.\",\n },\n {\n id: \"Korean_OptimisticYouth\",\n name: \"Optimistic Youth\",\n description: \"A cheerful and optimistic young adult male youth's voice in Standard Korean.\",\n },\n {\n id: \"Korean_PlayboyCharmer\",\n name: \"Playboy Charmer\",\n description: 'A seductive young adult male \"playboy charmer\" voice in Standard Korean.',\n },\n {\n id: \"Korean_PossessiveMan\",\n name: \"Possessive Man\",\n description:\n \"A powerful and authoritative middle-aged possessive man's voice in Standard Korean.\",\n },\n {\n id: \"Korean_QuirkyGirl\",\n name: \"Quirky Girl\",\n description: \"An adorable and quirky female youth voice in Standard Korean.\",\n },\n {\n id: \"Korean_ReliableSister\",\n name: \"Reliable Sister\",\n description:\n 'A powerful and authoritative middle-aged \"reliable sister\" voice in Standard Korean.',\n },\n {\n id: \"Korean_ReliableYouth\",\n name: \"Reliable Youth\",\n description:\n \"A gentle and considerate young adult reliable male youth's voice in Standard Korean.\",\n },\n {\n id: \"Korean_SassyGirl\",\n name: \"Sassy Girl\",\n description: \"A Sassy female youth voice in Standard Korean.\",\n },\n {\n id: \"Korean_ShyGirl\",\n name: \"Shy Girl\",\n description: \"A timid and introverted young adult female voice in Standard Korean.\",\n },\n {\n id: \"Korean_SoothingLady\",\n name: \"Soothing Lady\",\n description: \"An alluring and soothing middle-aged female voice in Standard Korean.\",\n },\n {\n id: \"Korean_StrictBoss\",\n name: \"Strict Boss\",\n description: \"A stern middle-aged male boss's voice in Standard Korean.\",\n },\n {\n id: \"Korean_SweetGirl\",\n name: \"Sweet Girl\",\n description:\n \"A soothing and gentle middle-aged female voice in Standard Korean, sweet and calming.\",\n },\n {\n id: \"Korean_ThoughtfulWoman\",\n name: \"Thoughtful Woman\",\n description:\n \"A mature and contemplative young adult thoughtful woman's voice in Standard Korean.\",\n },\n {\n id: \"Korean_WiseElf\",\n name: \"Wise Elf\",\n description: 'A sweet and ethereal young adult female \"wise elf\" voice in Standard Korean.',\n },\n {\n id: \"Korean_WiseTeacher\",\n name: \"Wise Teacher\",\n description: \"A sagacious and wise middle-aged male teacher's voice in Standard Korean.\",\n },\n {\n id: \"Spanish_SereneWoman\",\n name: \"Serene Woman\",\n description: \"A soothing and serene young adult female voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_MaturePartner\",\n name: \"Mature Partner\",\n description: \"A warm and mature middle-aged male partner's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_CaptivatingStoryteller\",\n name: \"Captivating Storyteller\",\n description:\n \"A captivating middle-aged male narrator's voice in Standard Spanish, perfect for storytelling.\",\n },\n {\n id: \"Spanish_Narrator\",\n name: \"Narrator\",\n description:\n \"A middle-aged female narrator's voice in Standard Spanish, ideal for storytelling.\",\n },\n {\n id: \"Spanish_WiseScholar\",\n name: \"Wise Scholar\",\n description: \"A conversational young adult male wise scholar's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_Kind-heartedGirl\",\n name: \"Kind-hearted Girl\",\n description: \"A bright and kind-hearted young adult female voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_DeterminedManager\",\n name: \"Determined Manager\",\n description:\n \"A businesslike and determined middle-aged female manager's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_BossyLeader\",\n name: \"Bossy Leader\",\n description: \"A businesslike and bossy adult male leader's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_ReservedYoungMan\",\n name: \"Reserved Young Man\",\n description: \"A tranquil and reserved young adult male voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_ConfidentWoman\",\n name: \"Confident Woman\",\n description: \"A clear and firm young adult confident woman's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_ThoughtfulMan\",\n name: \"Thoughtful Man\",\n description: \"A sober and thoughtful young adult male voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_Strong-WilledBoy\",\n name: \"Strong-willed Boy\",\n description: \"A mature and strong-willed adult male voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_SophisticatedLady\",\n name: \"Sophisticated Lady\",\n description: \"A refined and sophisticated adult lady's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_RationalMan\",\n name: \"Rational Man\",\n description: \"A thoughtful and rational adult male voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_AnimeCharacter\",\n name: \"Anime Character\",\n description:\n \"An animated middle-aged female voice in Standard Spanish, suitable for anime characters.\",\n },\n {\n id: \"Spanish_Deep-tonedMan\",\n name: \"Deep-toned Man\",\n description: \"A charismatic, deep-toned middle-aged male voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_Fussyhostess\",\n name: \"Fussy hostess\",\n description: \"An intense and fussy middle-aged female hostess's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_SincereTeen\",\n name: \"Sincere Teen\",\n description: \"A heartfelt and sincere male teen's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_FrankLady\",\n name: \"Frank Lady\",\n description: \"An agitated and frank adult lady's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_Comedian\",\n name: \"Comedian\",\n description: \"A humorous young adult male comedian's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_Debator\",\n name: \"Debator\",\n description: \"A tough middle-aged male debater's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_ToughBoss\",\n name: \"Tough Boss\",\n description: \"A mature and tough middle-aged female boss's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_Wiselady\",\n name: \"Wise Lady\",\n description: \"A neutral and wise middle-aged lady's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_Steadymentor\",\n name: \"Steady Mentor\",\n description: \"An arrogant yet steady young adult male mentor's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_Jovialman\",\n name: \"Jovial Man\",\n description: \"A gravelly and jovial senior male voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_SantaClaus\",\n name: \"Santa Claus\",\n description: \"A joyful senior male Santa Claus voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_Rudolph\",\n name: \"Rudolph\",\n description: \"A naive young adult male voice in the style of Rudolph in Standard Spanish.\",\n },\n {\n id: \"Spanish_Intonategirl\",\n name: \"Intonate Girl\",\n description: \"A versatile young adult female voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_Arnold\",\n name: \"Arnold\",\n description: \"A steady adult male voice in the style of Arnold in Standard Spanish.\",\n },\n {\n id: \"Spanish_Ghost\",\n name: \"Ghost\",\n description: \"A raspy adult male ghost's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_HumorousElder\",\n name: \"Humorous Elder\",\n description: \"An eccentric and humorous senior male elder's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_EnergeticBoy\",\n name: \"Energetic Boy\",\n description: \"A cheerful and energetic young adult male voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_WhimsicalGirl\",\n name: \"Whimsical Girl\",\n description: \"A witty and whimsical young adult female voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_StrictBoss\",\n name: \"Strict Boss\",\n description: \"A commanding and strict young adult female boss's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_ReliableMan\",\n name: \"Reliable Man\",\n description: \"A steady and reliable adult male voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_SereneElder\",\n name: \"Serene Elder\",\n description: \"A reflective and serene senior male elder's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_AngryMan\",\n name: \"Angry Man\",\n description: \"An intense young adult male voice in Standard Spanish, conveying anger.\",\n },\n {\n id: \"Spanish_AssertiveQueen\",\n name: \"Assertive Queen\",\n description: \"A firm and assertive young adult queen's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_CaringGirlfriend\",\n name: \"Caring Girlfriend\",\n description: \"A dreamy adult female caring girlfriend's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_PowerfulSoldier\",\n name: \"Powerful Soldier\",\n description:\n \"A youthful and bold young adult male powerful soldier's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_PassionateWarrior\",\n name: \"Passionate Warrior\",\n description:\n \"An energetic and passionate young adult male warrior's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_ChattyGirl\",\n name: \"Chatty Girl\",\n description: \"A conversational and chatty young adult female voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_RomanticHusband\",\n name: \"Romantic Husband\",\n description: \"An emotional middle-aged male romantic husband's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_CompellingGirl\",\n name: \"Compelling Girl\",\n description: \"A persuasive and compelling young adult female voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_PowerfulVeteran\",\n name: \"Powerful Veteran\",\n description: \"A strong and powerful middle-aged male veteran's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_SensibleManager\",\n name: \"Sensible Manager\",\n description: \"A charismatic and sensible adult male manager's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_ThoughtfulLady\",\n name: \"Thoughtful Lady\",\n description: \"A worried and thoughtful adult lady's voice in Standard Spanish.\",\n },\n {\n id: \"Portuguese_SentimentalLady\",\n name: \"Sentimental Lady\",\n description: \"An elegant and sentimental young adult female voice in Portuguese.\",\n },\n {\n id: \"Portuguese_BossyLeader\",\n name: \"Bossy Leader\",\n description: \"A calm and formal adult male bossy leader's voice in Portuguese.\",\n },\n {\n id: \"Portuguese_Wiselady\",\n name: \"Wise lady\",\n description: \"A smooth and wise middle-aged lady's voice in Portuguese.\",\n },\n {\n id: \"Portuguese_Strong-WilledBoy\",\n name: \"Strong-willed Boy\",\n description: \"A mature and strong-willed young adult male voice in Portuguese.\",\n },\n {\n id: \"Portuguese_Deep-VoicedGentleman\",\n name: \"Deep-voiced Gentleman\",\n description: \"A deep-voiced adult gentleman in Portuguese.\",\n },\n {\n id: \"Portuguese_UpsetGirl\",\n name: \"Upset Girl\",\n description: \"A sad young adult female voice in Portuguese, conveying upset emotions.\",\n },\n {\n id: \"Portuguese_PassionateWarrior\",\n name: \"Passionate Warrior\",\n description: \"An energetic and passionate young adult male warrior's voice in Portuguese.\",\n },\n {\n id: \"Portuguese_AnimeCharacter\",\n name: \"Anime Character\",\n description:\n \"An animated middle-aged female voice in Portuguese, suitable for anime characters.\",\n },\n {\n id: \"Portuguese_ConfidentWoman\",\n name: \"Confident Woman\",\n description: \"A clear and firm young adult confident woman's voice in Portuguese.\",\n },\n {\n id: \"Portuguese_AngryMan\",\n name: \"Angry Man\",\n description: \"A serious young adult male voice in Portuguese, conveying anger.\",\n },\n {\n id: \"Portuguese_CaptivatingStoryteller\",\n name: \"Captivating Storyteller\",\n description:\n \"A captivating middle-aged male narrator's voice in Portuguese, ideal for storytelling.\",\n },\n {\n id: \"Portuguese_Godfather\",\n name: \"Godfather\",\n description:\n \"A serious middle-aged male godfather voice in Standard Portuguese, conveying authority.\",\n },\n {\n id: \"Portuguese_ReservedYoungMan\",\n name: \"Reserved Young Man\",\n description: \"A cold and calm reserved young adult male voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_SmartYoungGirl\",\n name: \"Smart Young Girl\",\n description:\n \"An intelligent young female girl's voice in Standard Portuguese, sharp and clear.\",\n },\n {\n id: \"Portuguese_Kind-heartedGirl\",\n name: \"Kind-hearted Girl\",\n description: \"A calm and kind-hearted young adult female voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_Pompouslady\",\n name: \"Pompous lady\",\n description:\n \"A pompous young adult female cartoon-style voice in Standard Portuguese, full of personality.\",\n },\n {\n id: \"Portuguese_Grinch\",\n name: \"Grinch\",\n description:\n \"A cunning adult male Grinch-like voice in Standard Portuguese, mischievous and sly.\",\n },\n {\n id: \"Portuguese_Debator\",\n name: \"Debator\",\n description:\n \"A tough middle-aged male debater's voice in Standard Portuguese, strong and assertive.\",\n },\n {\n id: \"Portuguese_SweetGirl\",\n name: \"Sweet Girl\",\n description: \"An adorable and sweet young adult female voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_AttractiveGirl\",\n name: \"Attractive Girl\",\n description: \"An alluring and attractive adult female voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_ThoughtfulMan\",\n name: \"Thoughtful Man\",\n description: \"A gentle and thoughtful young adult male voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_PlayfulGirl\",\n name: \"Playful Girl\",\n description: \"A cutesy and playful female youth voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_GorgeousLady\",\n name: \"Gorgeous Lady\",\n description:\n \"A playful and gorgeous adult female voice in Standard Portuguese, exuding confidence.\",\n },\n {\n id: \"Portuguese_LovelyLady\",\n name: \"Lovely Lady\",\n description: \"A charismatic and lovely adult female voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_SereneWoman\",\n name: \"Serene Woman\",\n description:\n \"A calm and serene young adult female voice in Standard Portuguese, peaceful and composed.\",\n },\n {\n id: \"Portuguese_SadTeen\",\n name: \"Sad Teen\",\n description: \"A frustrated and sad male teen's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_MaturePartner\",\n name: \"Mature Partner\",\n description:\n \"A mature middle-aged male partner's voice in Standard Portuguese, dependable and warm.\",\n },\n {\n id: \"Portuguese_Comedian\",\n name: \"Comedian\",\n description: \"A humorous young adult male comedian's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_NaughtySchoolgirl\",\n name: \"Naughty Schoolgirl\",\n description:\n \"An inviting and naughty young adult female schoolgirl's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_Narrator\",\n name: \"Narrator\",\n description:\n \"A middle-aged female narrator's voice in Standard Portuguese, perfect for storytelling.\",\n },\n {\n id: \"Portuguese_ToughBoss\",\n name: \"Tough Boss\",\n description: \"A mature and tough middle-aged female boss's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_Fussyhostess\",\n name: \"Fussy hostess\",\n description:\n \"An intense and fussy middle-aged female hostess's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_Dramatist\",\n name: \"Dramatist\",\n description: \"A quirky middle-aged male dramatist's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_Steadymentor\",\n name: \"Steady Mentor\",\n description:\n \"An arrogant yet steady young adult male mentor's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_Jovialman\",\n name: \"Jovial Man\",\n description: \"A jovial and laughing middle-aged male voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_CharmingQueen\",\n name: \"Charming Queen\",\n description: \"A bewitching and charming adult queen's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_SantaClaus\",\n name: \"Santa Claus\",\n description:\n \"A joyful middle-aged male Santa Claus voice in Standard Portuguese, full of holiday cheer.\",\n },\n {\n id: \"Portuguese_Rudolph\",\n name: \"Rudolph\",\n description:\n \"A naive young adult female voice in the style of Rudolph in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_Arnold\",\n name: \"Arnold\",\n description:\n \"A steady adult male voice in the style of Arnold in Standard Portuguese, strong and firm.\",\n },\n {\n id: \"Portuguese_CharmingSanta\",\n name: \"Charming Santa\",\n description:\n \"An attractive and charming middle-aged male Santa voice in Standard Portuguese.\",\n },\n { id: \"Portuguese_CharmingLady\", name: \"Charming Lady\" },\n {\n id: \"Portuguese_Ghost\",\n name: \"Ghost\",\n description:\n \"A sensual adult male ghost's voice in Standard Portuguese, mysterious and alluring.\",\n },\n {\n id: \"Portuguese_HumorousElder\",\n name: \"Humorous Elder\",\n description: \"A wacky and humorous middle-aged male elder's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_CalmLeader\",\n name: \"Calm Leader\",\n description: \"A composed and calm middle-aged male leader's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_GentleTeacher\",\n name: \"Gentle Teacher\",\n description: \"A mild and gentle adult male teacher's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_EnergeticBoy\",\n name: \"Energetic Boy\",\n description: \"A cheerful and energetic young adult male voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_ReliableMan\",\n name: \"Reliable Man\",\n description: \"A steady and reliable adult male voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_SereneElder\",\n name: \"Serene Elder\",\n description:\n \"A reflective and serene middle-aged male elder's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_GrimReaper\",\n name: \"Grim Reaper\",\n description:\n \"A sinister adult male Grim Reaper's voice in Standard Portuguese, dark and ominous.\",\n },\n {\n id: \"Portuguese_AssertiveQueen\",\n name: \"Assertive Queen\",\n description: \"A firm and assertive young adult queen's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_WhimsicalGirl\",\n name: \"Whimsical Girl\",\n description: \"A lovely and whimsical young adult female voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_StressedLady\",\n name: \"Stressed Lady\",\n description: \"An unsure and stressed middle-aged lady's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_FriendlyNeighbor\",\n name: \"Friendly Neighbor\",\n description:\n \"An energetic and friendly young adult female neighbor's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_CaringGirlfriend\",\n name: \"Caring Girlfriend\",\n description:\n \"A dreamy middle-aged female caring girlfriend's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_PowerfulSoldier\",\n name: \"Powerful Soldier\",\n description:\n \"A youthful and bold young adult male powerful soldier's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_FascinatingBoy\",\n name: \"Fascinating Boy\",\n description:\n \"An approachable and fascinating young adult male voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_RomanticHusband\",\n name: \"Romantic Husband\",\n description:\n \"An emotional middle-aged male romantic husband's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_StrictBoss\",\n name: \"Strict Boss\",\n description: \"A robotic and strict young adult female boss's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_InspiringLady\",\n name: \"Inspiring Lady\",\n description: \"A commanding and inspiring young adult female voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_PlayfulSpirit\",\n name: \"Playful Spirit\",\n description:\n \"An animated and playful young adult female spirit's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_ElegantGirl\",\n name: \"Elegant Girl\",\n description: \"A dramatic and elegant young adult female voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_CompellingGirl\",\n name: \"Compelling Girl\",\n description: \"A persuasive and compelling young adult female voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_PowerfulVeteran\",\n name: \"Powerful Veteran\",\n description:\n \"A strong and powerful middle-aged male veteran's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_SensibleManager\",\n name: \"Sensible Manager\",\n description:\n \"A charismatic and sensible middle-aged male manager's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_ThoughtfulLady\",\n name: \"Thoughtful Lady\",\n description: \"A worried and thoughtful middle-aged lady's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_TheatricalActor\",\n name: \"Theatrical Actor\",\n description:\n \"An animated middle-aged male theatrical actor's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_FragileBoy\",\n name: \"Fragile Boy\",\n description: \"A gentle and fragile young adult male voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_ChattyGirl\",\n name: \"Chatty Girl\",\n description: \"A conversational and chatty young adult female voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_Conscientiousinstructor\",\n name: \"Conscientious Instructor\",\n description:\n \"A youthful and conscientious young adult female instructor's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_RationalMan\",\n name: \"Rational Man\",\n description: \"A thoughtful and rational adult male voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_WiseScholar\",\n name: \"Wise Scholar\",\n description:\n \"A conversational young adult male wise scholar's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_FrankLady\",\n name: \"Frank Lady\",\n description: \"An agitated and frank middle-aged lady's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_DeterminedManager\",\n name: \"Determined Manager\",\n description:\n \"A middle-aged female manager's voice with attitude and determination in Standard Portuguese.\",\n },\n {\n id: \"French_Male_Speech_New\",\n name: \"Level-Headed Man\",\n description: \"A level-headed and composed adult male voice in French.\",\n },\n {\n id: \"French_CasualMan\",\n name: \"Casual Man\",\n description: \"A casual and relaxed middle-aged male voice in French.\",\n },\n {\n id: \"French_MovieLeadFemale\",\n name: \"Movie Lead Female\",\n description: \"A cinematic young adult female lead voice in French, perfect for film.\",\n },\n {\n id: \"French_FemaleAnchor\",\n name: \"Female Anchor\",\n description: \"A professional adult female anchor voice in French, authoritative and clear.\",\n },\n {\n id: \"French_MaleNarrator\",\n name: \"Male Narrator\",\n description: \"A classic adult male narrator voice in French, ideal for storytelling.\",\n },\n {\n id: \"Indonesian_SweetGirl\",\n name: \"Sweet Girl\",\n description: \"A cute and sweet young adult female voice in Indonesian.\",\n },\n {\n id: \"Indonesian_ReservedYoungMan\",\n name: \"Reserved Young Man\",\n description: \"A cold and reserved young adult male voice in Indonesian.\",\n },\n {\n id: \"Indonesian_CharmingGirl\",\n name: \"Charming Girl\",\n description: \"An alluring and charming adult female voice in Indonesian.\",\n },\n {\n id: \"Indonesian_CalmWoman\",\n name: \"Calm Woman\",\n description: \"A serene and calm young adult female voice in Indonesian.\",\n },\n {\n id: \"Indonesian_ConfidentWoman\",\n name: \"Confident Woman\",\n description: \"An assertive and confident young adult female voice in Indonesian.\",\n },\n {\n id: \"Indonesian_CaringMan\",\n name: \"Caring Man\",\n description: \"A compassionate and caring young adult male voice in Indonesian.\",\n },\n {\n id: \"Indonesian_BossyLeader\",\n name: \"Bossy Leader\",\n description: \"A calm, authoritative, and bossy adult male leader's voice in Indonesian.\",\n },\n {\n id: \"Indonesian_DeterminedBoy\",\n name: \"Determined Boy\",\n description:\n \"A mature and resolute young adult male voice in Indonesian, conveying determination.\",\n },\n {\n id: \"Indonesian_GentleGirl\",\n name: \"Gentle Girl\",\n description: \"A soft-spoken and gentle young adult female voice in Indonesian.\",\n },\n {\n id: \"German_FriendlyMan\",\n name: \"Friendly Man\",\n description: \"A sincere and friendly middle-aged male voice in German.\",\n },\n {\n id: \"German_SweetLady\",\n name: \"Sweet Lady\",\n description: \"An animated and sweet adult female voice in German.\",\n },\n {\n id: \"German_PlayfulMan\",\n name: \"Playful Man\",\n description: \"A lively and spirited adult male voice in German, full of energy.\",\n },\n {\n id: \"Russian_HandsomeChildhoodFriend\",\n name: \"Handsome Childhood Friend\",\n description:\n \"An aggressive female youth's voice for a handsome childhood friend character in Standard Russian.\",\n },\n {\n id: \"Russian_BrightHeroine\",\n name: \"Bright Queen\",\n description: \"An arrogant and bright adult queen's voice in Standard Russian.\",\n },\n {\n id: \"Russian_AmbitiousWoman\",\n name: \"Ambitious Woman\",\n description: \"A demanding and ambitious adult woman's voice in Standard Russian.\",\n },\n {\n id: \"Russian_ReliableMan\",\n name: \"Reliable Man\",\n description: \"A steady and reliable middle-aged man's voice in Standard Russian.\",\n },\n {\n id: \"Russian_CrazyQueen\",\n name: \"Crazy Girl\",\n description:\n 'An energetic adult female \"crazy girl\" voice in Standard Russian, wild and unpredictable.',\n },\n {\n id: \"Russian_PessimisticGirl\",\n name: \"Pessimistic Girl\",\n description: 'A compassionate adult female \"pessimistic girl\" voice in Standard Russian.',\n },\n {\n id: \"Russian_AttractiveGuy\",\n name: \"Attractive Guy\",\n description: \"A deep-voiced and attractive adult guy's voice in Standard Russian.\",\n },\n {\n id: \"Russian_Bad-temperedBoy\",\n name: \"Bad-tempered Boy\",\n description: 'A charming adult male \"bad-tempered boy\" voice in Standard Russian.',\n },\n {\n id: \"Italian_BraveHeroine\",\n name: \"Brave Heroine\",\n description: \"A calm and brave middle-aged female heroine's voice in Italian.\",\n },\n {\n id: \"Italian_Narrator\",\n name: \"Narrator\",\n description: \"A classic middle-aged male narrator voice in Italian.\",\n },\n {\n id: \"Italian_WanderingSorcerer\",\n name: \"Wandering Sorcerer\",\n description: \"A ruthless adult female wandering sorcerer's voice in Italian.\",\n },\n {\n id: \"Italian_DiligentLeader\",\n name: \"Diligent Leader\",\n description: \"A calm and diligent adult female leader's voice in Italian.\",\n },\n {\n id: \"Dutch_kindhearted_girl\",\n name: \"Kind-hearted girl\",\n description: \"A warm and kind-hearted young adult female voice in Dutch.\",\n },\n {\n id: \"Dutch_bossy_leader\",\n name: \"Bossy leader\",\n description: \"A serious and bossy adult male leader's voice in Dutch.\",\n },\n {\n id: \"Vietnamese_kindhearted_girl\",\n name: \"Kind-hearted girl\",\n description: \"A warm and kind-hearted young adult female voice in Vietnamese.\",\n },\n {\n id: \"Arabic_CalmWoman\",\n name: \"Calm Woman\",\n description: \"A calm adult female Arabic voice, ideal for audiobooks and serene narration.\",\n },\n {\n id: \"Arabic_FriendlyGuy\",\n name: \"Friendly Guy\",\n description: \"A natural and friendly adult male Arabic voice.\",\n },\n {\n id: \"Turkish_CalmWoman\",\n name: \"Calm Woman\",\n description: \"A calm adult female Turkish voice, ideal for audiobooks.\",\n },\n {\n id: \"Turkish_Trustworthyman\",\n name: \"Trustworthy man\",\n description: \"A resonant and trustworthy adult male Turkish voice.\",\n },\n {\n id: \"Ukrainian_CalmWoman\",\n name: \"Calm Woman\",\n description: \"A calm adult female Ukrainian voice, ideal for audiobooks.\",\n },\n {\n id: \"Ukrainian_WiseScholar\",\n name: \"Wise Scholar\",\n description: \"A conversational young adult male wise scholar's voice in Ukrainian.\",\n },\n {\n id: \"Thai_male_1_sample8\",\n name: \"Serene Man\",\n description: \"A magnetic and serene adult male voice in Thai.\",\n },\n {\n id: \"Thai_male_2_sample2\",\n name: \"Friendly Man\",\n description: \"A lively and friendly adult male voice in Thai.\",\n },\n {\n id: \"Thai_female_1_sample1\",\n name: \"Confident Woman\",\n description: \"A neutral and confident adult female voice in Thai.\",\n },\n {\n id: \"Thai_female_2_sample2\",\n name: \"Energetic Woman\",\n description: \"An energetic adult female voice in Thai.\",\n },\n {\n id: \"Polish_male_1_sample4\",\n name: \"Male Narrator\",\n description: \"A mature adult male narrator's voice in Polish.\",\n },\n {\n id: \"Polish_male_2_sample3\",\n name: \"Male Anchor\",\n description: \"An adult male broadcast anchor's voice in Polish.\",\n },\n {\n id: \"Polish_female_1_sample1\",\n name: \"Calm Woman\",\n description: \"A calm adult female voice in Polish.\",\n },\n {\n id: \"Polish_female_2_sample3\",\n name: \"Casual Woman\",\n description: \"A neutral and casual adult female voice in Polish.\",\n },\n {\n id: \"Romanian_male_1_sample2\",\n name: \"Reliable Man\",\n description: \"A neutral and reliable adult male voice in Romanian.\",\n },\n {\n id: \"Romanian_male_2_sample1\",\n name: \"Energetic Youth\",\n description: \"An energetic adult male youth's voice in Romanian.\",\n },\n {\n id: \"Romanian_female_1_sample4\",\n name: \"Optimistic Youth\",\n description: \"A cheerful and optimistic adult female youth's voice in Romanian.\",\n },\n {\n id: \"Romanian_female_2_sample1\",\n name: \"Gentle Woman\",\n description: \"A gentle adult female voice in Romanian.\",\n },\n {\n id: \"greek_male_1a_v1\",\n name: \"Thoughtful Mentor\",\n description: \"An intellectual and thoughtful adult male mentor's voice in Greek.\",\n },\n {\n id: \"Greek_female_1_sample1\",\n name: \"Gentle Lady\",\n description: \"A gentle adult lady's voice in Greek.\",\n },\n {\n id: \"Greek_female_2_sample3\",\n name: \"Girl Next Door\",\n description: 'A cheerful young adult \"girl next door\" voice in Greek.',\n },\n {\n id: \"czech_male_1_v1\",\n name: \"Assured Presenter\",\n description: \"A serious and assured young adult male presenter's voice in Czech.\",\n },\n {\n id: \"czech_female_5_v7\",\n name: \"Steadfast Narrator\",\n description: \"A steadfast adult female broadcast narrator's voice in Czech.\",\n },\n {\n id: \"czech_female_2_v2\",\n name: \"Elegant Lady\",\n description: \"A graceful and elegant adult lady's voice in Czech.\",\n },\n {\n id: \"finnish_male_3_v1\",\n name: \"Upbeat Man\",\n description: \"An energetic and upbeat young adult female voice in Finnish.\",\n },\n {\n id: \"finnish_male_1_v2\",\n name: \"Friendly Boy\",\n description: \"A deep and friendly young adult male voice in Finnish.\",\n },\n {\n id: \"finnish_female_4_v1\",\n name: \"Assetive Woman\",\n description: \"A determined and assertive adult female voice in Finnish.\",\n },\n {\n id: \"hindi_male_1_v2\",\n name: \"Trustworthy Advisor\",\n description: \"A magnetic and trustworthy adult male advisor's voice in Hindi.\",\n },\n {\n id: \"hindi_female_2_v1\",\n name: \"Tranquil Woman\",\n description: \"A gentle and tranquil adult female voice in Hindi.\",\n },\n {\n id: \"hindi_female_1_v2\",\n name: \"News Anchor\",\n description: \"A calm adult female news anchor's voice in Hindi.\",\n },\n];\n","import type { CatalogModel, LanguageOption } from \"../types.js\";\nimport { ELEVENLABS_MP3_FORMATS } from \"./audio-formats.js\";\nimport { SAM_3_IMAGE } from \"./canvas-tools.js\";\nimport {\n ELEVENLABS_DUBBING_LANGUAGES,\n ELEVENLABS_MULTILINGUAL_V2_LANGUAGES,\n ELEVENLABS_V4_LANGUAGES,\n MINIMAX_SPEECH_LANGUAGES,\n SCRIBE_V2_LANGUAGES,\n} from \"./languages-audio.js\";\nimport { ELEVENLABS_VOICES } from \"./voices-elevenlabs.js\";\nimport { GEMINI_TTS_VOICES } from \"./voices-gemini.js\";\nimport { MINIMAX_VOICES } from \"./voices-minimax.js\";\n\n// Rows for the single-purpose canvas nodes: text to speech, voice changer, dubbing, lipsync,\n// speech to text and auto mask (VEED background removal is a video tool, in video-tools.ts).\n// Schemas: fal's queue OpenAPI per endpoint id (saved under adapters/__fixtures__/fal). The\n// flat rows are priced at a capped input; `references.audioSeconds.max` is that cap where the\n// node reads it (lipsync, voice changer), so the flat price covers the provider bill.\n\nconst ELEVENLABS_LOGO =\n \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/elevenlabs.png\";\nconst GOOGLE_LOGO =\n \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png\";\nconst MINIMAX_LOGO =\n \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/f4c2e906-28b7-4a4a-b491-df8fef7808ed.png\";\nconst SYNC_LOGO = \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/sync.png\";\n\nconst PER_CALL = { unit: \"images\" } as const;\nconst EXPOSURE: CatalogModel[\"exposure\"] = [\"cowork\", \"space_builder\"];\n/** The flat lipsync prices assume at most 30 s of speech (LIPSYNC_MAX_AUDIO_SECONDS). */\nconst LIPSYNC_AUDIO = { audioSeconds: { max: 30 } };\n\ninterface ElevenLabsTts {\n id: string;\n label: string;\n providerModelId: string;\n languages: LanguageOption[];\n /** multilingual-v2's schema has no `output_format`. */\n formats: boolean;\n maxChars: number;\n description: string;\n}\n\nfunction elevenLabsTts(tts: ElevenLabsTts): CatalogModel {\n return {\n id: tts.id,\n aliases: [tts.providerModelId],\n label: tts.label,\n type: \"speech\",\n adapter: \"fal\",\n providerModelId: tts.providerModelId,\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n voices: ELEVENLABS_VOICES,\n languages: tts.languages,\n ...(tts.formats && { outputFormats: ELEVENLABS_MP3_FORMATS }),\n supports: [],\n prompt: { referenceSyntax: \"numbered\", maxChars: tts.maxChars },\n },\n defaults: { voice: \"Rachel\", ...(tts.formats && { outputFormat: \"mp3_44100_128\" }) },\n usage: PER_CALL,\n pricingKind: \"flat\",\n display: { provider: \"elevenlabs\", logo: ELEVENLABS_LOGO, description: tts.description },\n capabilities: {},\n };\n}\n\nfunction geminiTts(id: string, label: string, description: string): CatalogModel {\n const providerModelId = `google/${id}`;\n return {\n id,\n aliases: [providerModelId],\n label,\n type: \"speech\",\n adapter: \"fal\",\n providerModelId,\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n voices: GEMINI_TTS_VOICES,\n supports: [\"style\"],\n // fal: the whole input is limited to 8,192 tokens; a token is at least one character.\n prompt: { referenceSyntax: \"numbered\", maxChars: 8192 },\n },\n defaults: { voice: \"Kore\" },\n usage: PER_CALL,\n pricingKind: \"flat\",\n display: { provider: \"google\", logo: GOOGLE_LOGO, description },\n capabilities: {},\n };\n}\n\nfunction syncLipsync(\n id: string,\n label: string,\n providerModelId: string,\n syncModel: string | undefined,\n description: string,\n): CatalogModel {\n return {\n id,\n aliases: [],\n label,\n type: \"lipsync\",\n adapter: \"fal\",\n providerModelId,\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n requires: [\"sourceVideo\", \"sourceAudio\"],\n references: LIPSYNC_AUDIO,\n supports: [],\n },\n defaults: {},\n ...(syncModel !== undefined && { providerOptions: { fal: { model: syncModel } } }),\n usage: PER_CALL,\n pricingKind: \"flat\",\n display: { provider: \"sync\", logo: SYNC_LOGO, description },\n capabilities: { acceptsSourceVideo: true },\n };\n}\n\nexport const MEDIA_NODE_MODELS: CatalogModel[] = [\n elevenLabsTts({\n id: \"elevenlabs-v4\",\n label: \"ElevenLabs v4\",\n providerModelId: \"elevenlabs/tts/eleven-v4\",\n languages: ELEVENLABS_V4_LANGUAGES,\n formats: true,\n maxChars: 5000,\n description:\n \"ElevenLabs v4 text to speech; expressive narration with audio tags, up to 5,000 characters.\",\n }),\n elevenLabsTts({\n id: \"elevenlabs-v4-turbo\",\n label: \"ElevenLabs v4 Turbo\",\n providerModelId: \"elevenlabs/tts/eleven-v4-turbo\",\n languages: ELEVENLABS_V4_LANGUAGES,\n formats: true,\n maxChars: 5000,\n description:\n \"ElevenLabs v4 Turbo text to speech; faster and cheaper v4 voices, up to 5,000 characters.\",\n }),\n elevenLabsTts({\n id: \"elevenlabs-multilingual-v2\",\n label: \"ElevenLabs Multilingual v2\",\n providerModelId: \"fal-ai/elevenlabs/tts/multilingual-v2\",\n languages: ELEVENLABS_MULTILINGUAL_V2_LANGUAGES,\n formats: false,\n // fal's schema states no limit; ElevenLabs documents 10,000 characters per request.\n maxChars: 10_000,\n description:\n \"ElevenLabs Multilingual v2 text to speech in 29 languages; the voice the canvas TTS node has always used.\",\n }),\n geminiTts(\n \"gemini-3.8-flash-tts\",\n \"Gemini 3.8 Flash TTS\",\n \"Google Gemini 3.8 Flash text to speech with 30 prebuilt voices and separate style instructions.\",\n ),\n geminiTts(\n \"gemini-3.8-flash-lite-tts\",\n \"Gemini 3.8 Flash Lite TTS\",\n \"Google Gemini 3.8 Flash Lite text to speech; the low-cost tier with the same 30 voices.\",\n ),\n {\n id: \"minimax-speech-2.8-hd\",\n aliases: [\"fal-ai/minimax/speech-2.8-hd\"],\n label: \"MiniMax Speech 2.8 HD\",\n type: \"speech\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/minimax/speech-2.8-hd\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n voices: MINIMAX_VOICES,\n languages: MINIMAX_SPEECH_LANGUAGES,\n supports: [],\n prompt: { referenceSyntax: \"numbered\", maxChars: 10_000 },\n },\n defaults: { voice: \"Wise_Woman\" },\n usage: PER_CALL,\n pricingKind: \"flat\",\n display: {\n provider: \"minimax\",\n logo: MINIMAX_LOGO,\n description:\n \"MiniMax Speech 2.8 HD text to speech; studio-quality narration in over 300 voices, with pause and interjection tags.\",\n },\n capabilities: {},\n },\n {\n id: \"elevenlabs-voice-changer\",\n aliases: [\"fal-ai/elevenlabs/voice-changer\"],\n label: \"ElevenLabs Voice Changer\",\n type: \"voice-change\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/elevenlabs/voice-changer\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n requires: [\"sourceAudio\"],\n // The flat price assumes at most a minute of speech.\n references: { audioSeconds: { max: 60 } },\n voices: ELEVENLABS_VOICES,\n outputFormats: ELEVENLABS_MP3_FORMATS,\n supports: [],\n },\n defaults: { voice: \"Rachel\", outputFormat: \"mp3_44100_128\" },\n usage: PER_CALL,\n pricingKind: \"flat\",\n display: {\n provider: \"elevenlabs\",\n logo: ELEVENLABS_LOGO,\n description:\n \"ElevenLabs speech to speech; re-voices a recording in another voice and keeps its timing and delivery.\",\n },\n capabilities: {},\n },\n {\n id: \"elevenlabs-dubbing\",\n aliases: [\"fal-ai/elevenlabs/dubbing\"],\n label: \"ElevenLabs Dubbing\",\n type: \"dubbing\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/elevenlabs/dubbing\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n requiresOneOf: [\"sourceVideo\", \"sourceAudio\"],\n // The flat price covers 60 s of source.\n sourceVideoSeconds: { max: 60 },\n references: { audioSeconds: { max: 60 } },\n languages: ELEVENLABS_DUBBING_LANGUAGES,\n supports: [],\n },\n defaults: {},\n usage: PER_CALL,\n pricingKind: \"flat\",\n display: {\n provider: \"elevenlabs\",\n logo: ELEVENLABS_LOGO,\n description:\n \"ElevenLabs dubbing; translates the speech in a video or audio file into another language in the original voices.\",\n },\n capabilities: { acceptsSourceVideo: true },\n },\n syncLipsync(\n \"lipsync-2\",\n \"Sync Lipsync 2\",\n \"fal-ai/sync-lipsync/v2\",\n \"lipsync-2\",\n \"Sync Lipsync 2 re-times the mouth in a video to new speech; the canvas Lipsync node's original model.\",\n ),\n syncLipsync(\n \"lipsync-2-pro\",\n \"Sync Lipsync 2 Pro\",\n \"fal-ai/sync-lipsync/v2\",\n \"lipsync-2-pro\",\n \"Sync Lipsync 2 Pro; higher-fidelity mouth detail and teeth than Lipsync 2.\",\n ),\n syncLipsync(\n \"lipsync-3\",\n \"Sync Lipsync 3\",\n \"fal-ai/sync-lipsync/v3\",\n undefined,\n \"Sync Lipsync 3 (sync-3) re-times a video's lips, face and head to new speech.\",\n ),\n {\n id: \"veed-lipsync-v2\",\n aliases: [\"veed/lipsync/v2\"],\n label: \"VEED Lipsync v2\",\n type: \"lipsync\",\n adapter: \"fal\",\n providerModelId: \"veed/lipsync/v2\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n requires: [\"sourceVideo\", \"sourceAudio\"],\n references: LIPSYNC_AUDIO,\n // VEED bills per output second; the flat price covers 30 s.\n sourceVideoSeconds: { max: 30 },\n supports: [],\n },\n defaults: {},\n usage: PER_CALL,\n pricingKind: \"flat\",\n display: {\n provider: \"veed\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/d540d2bb-0022-4371-8889-48aefaf46bbe.png\",\n description:\n \"VEED Lipsync v2 re-times the mouth in a video to a new audio track; billed per second of output.\",\n },\n capabilities: { acceptsSourceVideo: true },\n },\n {\n id: \"minimax-h3-max-lipsync\",\n aliases: [\"minimax/h3-max/lip-sync/image-to-video\"],\n label: \"MiniMax H3 Max Lip Sync\",\n type: \"lipsync\",\n adapter: \"fal\",\n providerModelId: \"minimax/h3-max/lip-sync/image-to-video\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n requires: [\"firstFrame\", \"sourceAudio\"],\n resolutions: [\"480p\", \"768p\", \"1080p\", \"2k\"],\n // fal: the audio must be at least 5 s and at most 15 minutes; priced per second.\n references: { audioSeconds: { min: 5, max: 900 } },\n supports: [],\n },\n defaults: { resolution: \"768p\" },\n usage: { unit: \"seconds\" },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n logo: MINIMAX_LOGO,\n description:\n \"MiniMax H3 Max lip sync; animates a portrait image into a talking video as long as the speech, up to 2K.\",\n },\n capabilities: {},\n },\n {\n id: \"elevenlabs-scribe-v2\",\n aliases: [\"fal-ai/elevenlabs/speech-to-text/scribe-v2\"],\n label: \"ElevenLabs Scribe v2\",\n type: \"transcription\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/elevenlabs/speech-to-text/scribe-v2\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n requires: [\"sourceAudio\"],\n // The flat price covers 10 minutes of audio.\n references: { audioSeconds: { max: 600 } },\n languages: SCRIBE_V2_LANGUAGES,\n supports: [],\n },\n defaults: {},\n usage: PER_CALL,\n pricingKind: \"flat\",\n display: {\n provider: \"elevenlabs\",\n logo: ELEVENLABS_LOGO,\n description:\n \"ElevenLabs Scribe v2 speech to text with word timings, speaker labels and audio-event tags.\",\n },\n capabilities: {},\n },\n SAM_3_IMAGE,\n];\n","import type { CatalogModel, Model3dConstraints } from \"../types.js\";\n\n// One flat-priced job per request (its SKU), whatever the output.\nconst REQUEST_USAGE = { unit: \"requests\" } as const;\n\nfunction row(\n id: string,\n label: string,\n spec: Model3dConstraints,\n display: { provider: string; description: string; sortOrder: number },\n): CatalogModel {\n return {\n id,\n aliases: [],\n label,\n type: \"model3d\",\n adapter: \"fal\",\n // The single-image endpoint; the adapter picks the endpoint a request needs.\n providerModelId: spec.endpoints.image ?? id,\n lifecycle: \"active\",\n exposure: [\"space_builder\"],\n constraints: { supports: [], model3d: spec },\n defaults: {},\n usage: REQUEST_USAGE,\n pricingKind: \"flat\",\n display,\n };\n}\n\n/**\n * 3D generation on fal: the newest model of each 3D family. A request's price depends on\n * its options (texture, PBR, views, resolution), so each row bills one flat price per\n * option combination: `model3dSkus(row)` lists them and pro-backend keeps a\n * credit_pricing_flat row for each.\n */\nexport const MODEL3D_MODELS: CatalogModel[] = [\n row(\n \"trellis-2\",\n \"Trellis 2\",\n {\n family: \"trellis\",\n endpoints: { image: \"fal-ai/trellis-2\" },\n text: false,\n imageRequired: true,\n views: \"none\",\n maxImages: 1,\n texture: [],\n pbr: false,\n textureRef: false,\n seed: true,\n resolutions: { label: \"Resolution\", options: [\"512\", \"1024\", \"1536\"], default: \"1024\" },\n },\n {\n provider: \"microsoft\",\n description: \"One photo to a detailed textured model. Fast and the best value.\",\n sortOrder: 70,\n },\n ),\n row(\n \"hunyuan3d-3.1-pro\",\n \"Hunyuan3D 3.1 Pro\",\n {\n family: \"hunyuan\",\n endpoints: {\n text: \"fal-ai/hunyuan-3d/v3.1/pro/text-to-3d\",\n image: \"fal-ai/hunyuan-3d/v3.1/pro/image-to-3d\",\n },\n text: true,\n imageRequired: false,\n views: \"named\",\n maxImages: 4,\n texture: [\"none\", \"standard\"],\n pbr: true,\n textureRef: false,\n seed: false,\n },\n {\n provider: \"tencent\",\n description:\n \"Photo-faithful models from a prompt, a photo, or a photo with back and side views.\",\n sortOrder: 60,\n },\n ),\n row(\n \"tripo-h3.1\",\n \"Tripo H3.1\",\n {\n family: \"tripo\",\n endpoints: {\n text: \"tripo3d/h3.1/text-to-3d\",\n image: \"tripo3d/h3.1/image-to-3d\",\n multiImage: \"tripo3d/h3.1/multiview-to-3d\",\n },\n text: true,\n imageRequired: false,\n views: \"ordered\",\n maxImages: 4,\n texture: [\"none\", \"standard\", \"detailed\"],\n pbr: true,\n textureRef: false,\n seed: true,\n },\n {\n provider: \"tripo\",\n description: \"Clean, game-ready models from a prompt, a photo or four views.\",\n sortOrder: 50,\n },\n ),\n row(\n \"rodin-gen-2.5\",\n \"Rodin Gen-2.5\",\n {\n family: \"rodin\",\n endpoints: {\n text: \"fal-ai/hyper3d/rodin/v2.5/text-to-3d\",\n image: \"fal-ai/hyper3d/rodin/v2.5\",\n },\n text: true,\n imageRequired: false,\n views: \"unordered\",\n maxImages: 5,\n texture: [],\n pbr: false,\n textureRef: false,\n seed: true,\n seedMax: 65535,\n },\n {\n provider: \"hyper3d\",\n description: \"Detailed PBR models from a prompt or up to five photos.\",\n sortOrder: 40,\n },\n ),\n row(\n \"meshy-7.1\",\n \"Meshy 7.1\",\n {\n family: \"meshy\",\n endpoints: {\n text: \"meshy/v7.1/text-to-3d\",\n image: \"meshy/v7.1/image-to-3d\",\n multiImage: \"meshy/v7.1/multi-image-to-3d\",\n },\n text: true,\n imageRequired: false,\n views: \"unordered\",\n maxImages: 4,\n texture: [\"none\", \"standard\"],\n pbr: true,\n textureRef: true,\n seed: true,\n },\n {\n provider: \"meshy\",\n description:\n \"Models from a prompt or photos, with a texture prompt or texture image to restyle.\",\n sortOrder: 30,\n },\n ),\n row(\n \"hi3d-3.0\",\n \"Hi3D 3.0\",\n {\n family: \"hi3d\",\n endpoints: {\n image: \"hitem3d/hi3d/v3.0/image-to-3d\",\n multiImage: \"hitem3d/hi3d/v3.0/multi-view-to-3d\",\n },\n text: false,\n imageRequired: true,\n views: \"named\",\n maxImages: 4,\n texture: [\"none\", \"standard\"],\n pbr: true,\n textureRef: false,\n seed: false,\n resolutions: { label: \"Quality\", options: [\"quality\", \"master\"], default: \"quality\" },\n },\n {\n provider: \"hitem3d\",\n description: \"Highest-fidelity product models from a photo or four views. Slowest.\",\n sortOrder: 20,\n },\n ),\n row(\n \"sam-3d-objects\",\n \"SAM 3D Objects\",\n {\n family: \"sam\",\n endpoints: { image: \"fal-ai/sam-3/3d-objects\" },\n text: true,\n imageRequired: true,\n promptRequired: true,\n views: \"none\",\n maxImages: 1,\n texture: [],\n pbr: false,\n textureRef: false,\n seed: true,\n },\n {\n provider: \"meta\",\n description: \"Lifts one named object out of a real photo into a 3D model.\",\n sortOrder: 10,\n },\n ),\n];\n","import type { CatalogModel } from \"../types.js\";\nimport {\n ELEVENLABS_MP3_FORMATS,\n ELEVENLABS_MUSIC_FORMATS,\n MIRELO_FORMATS,\n} from \"./audio-formats.js\";\n\nconst GOOGLE_LOGO =\n \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png\";\nconst ELEVENLABS_LOGO =\n \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/elevenlabs.png\";\nconst MINIMAX_LOGO =\n \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/f4c2e906-28b7-4a4a-b491-df8fef7808ed.png\";\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 exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n durations: [30],\n references: { images: 10 },\n supports: [],\n },\n defaults: {},\n usage: { unit: \"images\" },\n pricingKind: \"flat\",\n display: {\n provider: \"google\",\n logo: GOOGLE_LOGO,\n description:\n \"Google Lyria 3 Clip short music clips, loops, and previews; takes text and up to 10 image prompts and returns a fixed 30-second MP3 plus lyrics.\",\n },\n capabilities: {},\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 exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n references: { images: 10 },\n supports: [],\n },\n defaults: {},\n usage: { unit: \"images\" },\n pricingKind: \"flat\",\n display: {\n provider: \"google\",\n logo: GOOGLE_LOGO,\n description:\n \"Google Lyria 3 Pro flagship music model for full-length songs with verses, choruses, and bridges; takes text and up to 10 image prompts and returns MP3 plus lyrics.\",\n },\n capabilities: {},\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 exposure: [],\n constraints: {\n durations: [30],\n supports: [\"seed\", \"negativePrompt\"],\n },\n defaults: {},\n usage: { unit: \"compute_seconds\" },\n pricingKind: \"flat\",\n display: {\n provider: \"google\",\n description:\n \"Lyria 2 music generation on Replicate; produces 30 seconds of 48 kHz stereo audio from a text prompt.\",\n },\n capabilities: {},\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 exposure: [\"cowork\", \"space_builder\"],\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\" },\n pricingKind: \"flat\",\n display: {\n provider: \"mmaudio\",\n description:\n \"MMAudio V2 video-to-audio model on Replicate; takes a source video and prompt and synthesizes synchronized environmental, action, and speech-like audio.\",\n },\n capabilities: {},\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 exposure: [],\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\" },\n pricingKind: \"flat\",\n display: {\n provider: \"elevenlabs\",\n description:\n \"ElevenLabs Music text-to-music on Replicate; generates full songs, instrumental or with vocals, up to 5 minutes long at up to 44.1 kHz.\",\n },\n capabilities: {},\n },\n {\n // https://ai.google.dev/gemini-api/docs/music-generation (Interactions API)\n id: \"lyria-3.5\",\n aliases: [],\n label: \"Lyria 3.5\",\n type: \"audio\",\n adapter: \"google-genai\",\n providerModelId: \"lyria-3.5\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n references: { images: 10 },\n supports: [],\n },\n defaults: {},\n usage: { unit: \"images\" },\n pricingKind: \"flat\",\n display: {\n provider: \"google\",\n logo: GOOGLE_LOGO,\n description:\n \"Google Lyria 3.5 full-length songs with verses, choruses and bridges; takes text and up to 10 image prompts and returns 44.1 kHz stereo MP3 plus lyrics.\",\n },\n capabilities: {},\n },\n {\n // https://fal.ai/models/elevenlabs/music/v2.5/api\n id: \"elevenlabs-music-v2.5\",\n aliases: [\"elevenlabs/music/v2.5\"],\n label: \"ElevenLabs Music v2.5\",\n type: \"audio\",\n adapter: \"fal\",\n providerModelId: \"elevenlabs/music/v2.5\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n // fal allows 3-600 s; capped at the 60 s the flat price covers.\n durations: { min: 3, max: 60 },\n durationPresets: [15, 30, 60],\n supports: [\"instrumental\", \"seed\"],\n outputFormats: ELEVENLABS_MUSIC_FORMATS,\n prompt: { referenceSyntax: \"numbered\", maxChars: 4100 },\n },\n defaults: { durationSeconds: 30, outputFormat: \"mp3_48000_192\" },\n usage: { unit: \"seconds\" },\n pricingKind: \"flat\",\n display: {\n provider: \"elevenlabs\",\n logo: ELEVENLABS_LOGO,\n description:\n \"ElevenLabs Music v2.5 text-to-music; full songs or instrumentals from 3 seconds to 1 minute.\",\n },\n capabilities: {},\n },\n {\n // https://fal.ai/models/minimax/music-3/api\n id: \"minimax-music-3\",\n aliases: [\"minimax/music-3\"],\n label: \"MiniMax Music 3\",\n type: \"audio\",\n adapter: \"fal\",\n providerModelId: \"minimax/music-3\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n durations: { min: 1, max: 300 },\n durationPresets: [30, 60, 120],\n supports: [\"lyrics\", \"instrumental\", \"seed\"],\n },\n defaults: { durationSeconds: 60 },\n usage: { unit: \"seconds\" },\n pricingKind: \"flat\",\n display: {\n provider: \"minimax\",\n logo: MINIMAX_LOGO,\n description:\n \"MiniMax Music 3 songs from a style prompt and your lyrics (or instrumental), up to 5 minutes.\",\n },\n capabilities: {},\n },\n {\n // https://fal.ai/models/fal-ai/elevenlabs/sound-effects/v2/api\n id: \"elevenlabs-sound-effects-v2\",\n aliases: [\"fal-ai/elevenlabs/sound-effects/v2\"],\n label: \"ElevenLabs Sound Effects v2\",\n type: \"sound-effect\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/elevenlabs/sound-effects/v2\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n durations: { min: 0.5, max: 22 },\n durationPresets: [2, 5, 10, 22],\n supports: [],\n outputFormats: ELEVENLABS_MP3_FORMATS,\n prompt: { referenceSyntax: \"numbered\", maxChars: 450 },\n },\n defaults: { durationSeconds: 5, outputFormat: \"mp3_44100_128\" },\n usage: { unit: \"seconds\" },\n pricingKind: \"flat\",\n display: {\n provider: \"elevenlabs\",\n logo: ELEVENLABS_LOGO,\n description:\n \"ElevenLabs Sound Effects v2; a sound effect from a text description, up to 22 seconds.\",\n },\n capabilities: {},\n },\n {\n // https://fal.ai/models/mirelo-ai/sfx2.0/text-to-audio/api\n id: \"mirelo-sfx-2.0\",\n aliases: [\"mirelo-ai/sfx2.0/text-to-audio\"],\n label: \"Mirelo SFX 2.0\",\n type: \"sound-effect\",\n adapter: \"fal\",\n providerModelId: \"mirelo-ai/sfx2.0/text-to-audio\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n // fal allows 1-600 s; capped at the 30 s the flat price covers.\n durations: { min: 1, max: 30 },\n durationPresets: [5, 10, 30],\n supports: [\"seed\", \"negativePrompt\"],\n outputFormats: MIRELO_FORMATS,\n prompt: { referenceSyntax: \"numbered\", maxChars: 2000 },\n },\n defaults: { durationSeconds: 10, outputFormat: \"wav\" },\n usage: { unit: \"seconds\" },\n pricingKind: \"flat\",\n display: {\n provider: \"mirelo\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/c9d92a87-3029-433e-bd94-c7d2bde165fa.png\",\n description: \"Mirelo SFX 2.0 sound effects from a text description.\",\n },\n capabilities: {},\n },\n {\n // https://fal.ai/models/mirelo-ai/sfx2.0/video-to-audio/api. Its own row so the\n // video-to-sound picker lists it by `requires`; the text mode is mirelo-sfx-2.0.\n id: \"mirelo-sfx-2.0-video\",\n aliases: [\"mirelo-ai/sfx2.0/video-to-audio\"],\n label: \"Mirelo SFX 2.0 (video)\",\n type: \"sound-effect\",\n adapter: \"fal\",\n providerModelId: \"mirelo-ai/sfx2.0/video-to-audio\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n // fal allows 1-600 s; capped at the 30 s the flat price covers.\n durations: { min: 1, max: 30 },\n durationPresets: [5, 10, 30],\n requires: [\"sourceVideo\"],\n supports: [\"seed\", \"negativePrompt\"],\n outputFormats: MIRELO_FORMATS,\n sourceVideoSeconds: { min: 1 },\n prompt: { referenceSyntax: \"numbered\", maxChars: 2000 },\n },\n defaults: { durationSeconds: 10, outputFormat: \"wav\" },\n usage: { unit: \"seconds\" },\n pricingKind: \"flat\",\n display: {\n provider: \"mirelo\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/c9d92a87-3029-433e-bd94-c7d2bde165fa.png\",\n description:\n \"Mirelo SFX 2.0 scores a video: sound effects synced to the picture, keeping its speech.\",\n },\n capabilities: { acceptsSourceVideo: true },\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 exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n references: { images: 1 },\n requires: [\"references\"],\n supports: [\"scaleFactor\", \"outputFormat\", \"upscale\"],\n },\n defaults: { scaleFactor: 2, outputFormat: \"png\" },\n usage: { unit: \"compute_seconds\" },\n pricingKind: \"flat\",\n display: {\n provider: \"topaz\",\n logo: \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/topazlabs.png\",\n description:\n \"Topaz Labs AI image upscaling on Replicate; takes one input image and upscales up to 6x with selectable enhancement models and optional face enhancement.\",\n },\n },\n {\n // fal-ai/seedvr/upscale/image in factor mode. fal takes 1-10x and bills $0.001 per\n // output megapixel; the row offers 2x and 4x, priced flat at $0.067 per image.\n id: \"seedvr2-upscale\",\n aliases: [],\n label: \"SeedVR2 Upscale\",\n type: \"upscale\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/seedvr/upscale/image\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n references: { images: 1 },\n requires: [\"references\"],\n supports: [\"scaleFactor\", \"outputFormat\", \"seed\"],\n scaleFactors: [2, 4],\n },\n defaults: { scaleFactor: 2, outputFormat: \"png\" },\n usage: { unit: \"images\" },\n pricingKind: \"flat\",\n display: {\n provider: \"bytedance\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/3bba5d81-4e57-4e71-911b-cdfa05acca2c_compressed.png\",\n description:\n \"ByteDance SeedVR2 one-step image upscaling and restoration on fal; takes one input image and upscales it 2x or 4x with sharp, faithful detail.\",\n },\n },\n {\n id: \"bg-remove\",\n // Task ids the two emitters report on usage events (trigger-workflows,\n // vibe-triggers); the usage price lookup resolves them to this row.\n aliases: [\"prodia-background-remover\", \"prodia-remove-background\"],\n label: \"Background Remover\",\n type: \"bg-remove\",\n adapter: \"prodia\",\n providerModelId: \"inference.remove-background.v1\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n references: { images: 1 },\n requires: [\"references\"],\n supports: [],\n },\n defaults: {},\n usage: { unit: \"images\" },\n pricingKind: \"flat\",\n display: {\n provider: \"prodia\",\n description:\n \"Prodia background removal; takes one input image and returns a PNG cut-out of the subject plus an optional black-and-white mask.\",\n },\n },\n];\n","import type { CatalogModel } from \"../types.js\";\n\nconst TEXT_USAGE = { unit: \"tokens\" } as const;\n\nconst CDN = \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image\";\n/** One vendor mark per text provider; the chat pickers group rows by provider. */\nconst PROVIDER_LOGOS: Record<string, string> = {\n anthropic: `${CDN}/25fad392-188c-4829-a3d0-c4fa02d1c8cd.png`,\n openai: `${CDN}/1204b494-8962-4f7f-af5e-699a8bdc98e3.png`,\n google: `${CDN}/192485d2-a76a-4657-9c06-930b2c70badd.png`,\n deepseek: `${CDN}/9b7406d2-a696-4558-ab79-90a37e3f4574.png`,\n xai: `${CDN}/858b7fcc-9bd5-411d-aea1-a7b35ecfffab.png`,\n moonshot: `${CDN}/5a1e2eae-3474-4fac-9c74-a93f41ee6f67.png`,\n minimax: `${CDN}/f4c2e906-28b7-4a4a-b491-df8fef7808ed.png`,\n};\n\nfunction text(\n id: string,\n label: string,\n providerModelId: string,\n extra?: Partial<CatalogModel>,\n): CatalogModel {\n const display = extra?.display;\n const logo = display && !display.logo ? PROVIDER_LOGOS[display.provider] : undefined;\n return {\n id,\n aliases: [],\n label,\n type: \"text\",\n adapter: \"ai-sdk-text\",\n providerModelId,\n lifecycle: \"active\",\n exposure: [],\n constraints: { supports: [] },\n defaults: {},\n usage: { ...TEXT_USAGE },\n pricingKind: \"token\",\n ...extra,\n ...(display && logo ? { display: { ...display, logo } } : {}),\n };\n}\n\n// Chat-surface stream tuning per row (AI SDK provider-option shape), carried as\n// display data so the kit never merges it into a call.\n// Haiku 4.5 still takes a thinking budget; every 4.6+ Anthropic row uses adaptive\n// summarised thinking (budget_tokens is deprecated on 4.6 and rejected on 4.7+).\n// GPT-5.6 asks for reasoning summaries; DeepSeek enables thinking. Kimi rows\n// sample at temperature 1 (K3 reasons by default).\nconst ANTHROPIC_THINKING = {\n anthropic: { thinking: { type: \"enabled\", budgetTokens: 4000 }, sendReasoning: true },\n};\nconst ANTHROPIC_ADAPTIVE = {\n anthropic: { thinking: { type: \"adaptive\", display: \"summarized\" }, sendReasoning: true },\n};\nconst OPENAI_REASONING = { openai: { reasoningEffort: \"medium\", reasoningSummary: \"auto\" } };\nconst DEEPSEEK_THINKING = { deepseek: { thinking: { type: \"enabled\" } } };\n\nexport const TEXT_MODELS: CatalogModel[] = [\n text(\"gpt-4o\", \"GPT-4o\", \"gpt-4o\", {\n exposure: [],\n display: {\n provider: \"openai\",\n costTier: 2,\n description:\n \"OpenAI GPT-4o flagship multimodal model; text and image input, 128K-token context.\",\n },\n capabilities: { vision: true, contextWindow: 128_000 },\n }),\n text(\"gpt-4o-mini\", \"GPT-4o mini\", \"gpt-4o-mini\", {\n exposure: [],\n display: {\n provider: \"openai\",\n costTier: 1,\n description:\n \"OpenAI GPT-4o mini fast, low-cost multimodal model; text and image input, 128K-token context.\",\n },\n capabilities: { vision: true, contextWindow: 128_000 },\n }),\n text(\"gpt-5.1\", \"GPT-5.1\", \"gpt-5.1\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n provider: \"openai\",\n costTier: 3,\n description:\n \"OpenAI GPT-5.1 reasoning model for coding and agentic tasks; text and image input, 400K-token context.\",\n },\n capabilities: { vision: true, contextWindow: 400_000 },\n }),\n text(\"gpt-5.2\", \"GPT-5.2\", \"gpt-5.2\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n provider: \"openai\",\n costTier: 3,\n description:\n \"OpenAI GPT-5.2 reasoning model for complex professional work; text and image input, 400K-token context.\",\n },\n capabilities: { vision: true, contextWindow: 400_000 },\n }),\n // 1.05M-token context: https://platform.openai.com/docs/models/gpt-5.4\n text(\"gpt-5.4\", \"GPT-5.4\", \"gpt-5.4\", {\n exposure: [],\n display: {\n provider: \"openai\",\n costTier: 3,\n description:\n \"OpenAI GPT-5.4 flagship reasoning model; text and image input, 1.05M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_050_000,\n },\n }),\n // OpenAI never shipped gpt-5.1-mini or gpt-5.2-mini; callers that still send them get 5.4 mini.\n text(\"gpt-5.4-mini\", \"GPT-5.4 mini\", \"gpt-5.4-mini\", {\n exposure: [\"cowork\", \"space_builder\"],\n aliases: [\"gpt-5.1-mini\", \"gpt-5.2-mini\"],\n display: {\n provider: \"openai\",\n costTier: 1,\n description:\n \"OpenAI GPT-5.4 mini efficient reasoning model for high-volume workloads; text and image input, 400K-token context.\",\n },\n capabilities: { vision: true, contextWindow: 400_000 },\n }),\n text(\"gpt-5.5\", \"GPT-5.5\", \"gpt-5.5\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n provider: \"openai\",\n costTier: 3,\n description:\n \"OpenAI GPT-5.5 flagship reasoning model for the most complex professional and coding work; text and image input, 1.05M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_050_000,\n },\n }),\n text(\"gpt-5.6-luna\", \"GPT-5.6 Luna\", \"gpt-5.6-luna\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n chat: { providerOptions: OPENAI_REASONING },\n provider: \"openai\",\n costTier: 1,\n description:\n \"OpenAI GPT-5.6 Luna cost-optimized tier of the GPT-5.6 reasoning family; text and image input, 1.05M-token context.\",\n },\n capabilities: {\n reasoning: true,\n vision: true,\n\n contextWindow: 1_050_000,\n },\n }),\n text(\"gpt-5.6-terra\", \"GPT-5.6 Terra\", \"gpt-5.6-terra\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n chat: { providerOptions: OPENAI_REASONING },\n provider: \"openai\",\n costTier: 2,\n description:\n \"OpenAI GPT-5.6 Terra balanced tier of the GPT-5.6 reasoning family; text and image input, 1.05M-token context.\",\n },\n capabilities: {\n reasoning: true,\n vision: true,\n\n contextWindow: 1_050_000,\n },\n }),\n text(\"gpt-5.6-sol\", \"GPT-5.6 Sol\", \"gpt-5.6-sol\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n chat: { providerOptions: OPENAI_REASONING },\n provider: \"openai\",\n costTier: 3,\n description:\n \"OpenAI GPT-5.6 Sol flagship tier of the GPT-5.6 reasoning family; text and image input, 1.05M-token context.\",\n },\n capabilities: {\n reasoning: true,\n vision: true,\n\n contextWindow: 1_050_000,\n },\n }),\n // Library key \"claude-sonnet-4.5\" maps to the SDK id \"claude-sonnet-4-5\".\n text(\"claude-sonnet-4-5\", \"Claude Sonnet 4.5\", \"claude-sonnet-4-5\", {\n exposure: [],\n aliases: [\"claude-sonnet-4.5\", \"claude-sonnet-4-5-20250929\"],\n display: {\n provider: \"anthropic\",\n costTier: 2,\n description:\n \"Anthropic Claude Sonnet 4.5 (legacy) balanced model; text and image input, 200K-token context.\",\n },\n capabilities: { vision: true, contextWindow: 200_000 },\n }),\n // Anthropic retired the dated 4.0 ids; callers that still send them get 4.6.\n text(\"claude-sonnet-4-6\", \"Claude Sonnet 4.6\", \"claude-sonnet-4-6\", {\n exposure: [\"cowork\", \"space_builder\"],\n aliases: [\n \"claude-sonnet-4.6\",\n \"claude-sonnet-4\",\n \"claude-sonnet-4.0\",\n \"claude-sonnet-4-20250514\",\n ],\n display: {\n chat: { providerOptions: ANTHROPIC_ADAPTIVE },\n provider: \"anthropic\",\n costTier: 2,\n description:\n \"Anthropic Claude Sonnet 4.6 (legacy) balanced model; text and image input, 1M-token context.\",\n },\n capabilities: {\n reasoning: true,\n vision: true,\n\n contextWindow: 1_000_000,\n },\n }),\n text(\"claude-sonnet-5\", \"Claude Sonnet 5\", \"claude-sonnet-5\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n chat: { providerOptions: ANTHROPIC_ADAPTIVE },\n provider: \"anthropic\",\n costTier: 3,\n description:\n \"Anthropic Claude Sonnet 5 current balanced model; text and image input, 1M-token context.\",\n },\n capabilities: {\n reasoning: true,\n vision: true,\n\n contextWindow: 1_000_000,\n },\n }),\n text(\"claude-opus-4-8\", \"Claude Opus 4.8\", \"claude-opus-4-8\", {\n exposure: [\"cowork\", \"space_builder\"],\n aliases: [\"claude-opus-4.8\", \"claude-opus-4\", \"claude-opus-4.0\", \"claude-opus-4-20250514\"],\n display: {\n chat: { providerOptions: ANTHROPIC_ADAPTIVE },\n provider: \"anthropic\",\n costTier: 3,\n description:\n \"Anthropic Claude Opus 4.8 (legacy) frontier model; text and image input, 1M-token context.\",\n },\n capabilities: {\n reasoning: true,\n vision: true,\n\n contextWindow: 1_000_000,\n },\n }),\n text(\"claude-haiku-4-5\", \"Claude Haiku 4.5\", \"claude-haiku-4-5\", {\n exposure: [\"cowork\", \"space_builder\"],\n aliases: [\"claude-haiku-4.5\", \"claude-haiku-4-5-20251001\", \"claude-haiku-4\"],\n display: {\n chat: { providerOptions: ANTHROPIC_THINKING },\n provider: \"anthropic\",\n costTier: 1,\n description:\n \"Anthropic Claude Haiku 4.5 fast model with near-frontier intelligence; text and image input, 200K-token context.\",\n },\n capabilities: {\n reasoning: true,\n vision: true,\n\n contextWindow: 200_000,\n },\n }),\n text(\"claude-opus-5\", \"Claude Opus 5\", \"claude-opus-5\", {\n exposure: [],\n aliases: [\"claude-opus-5.0\"],\n display: {\n provider: \"anthropic\",\n costTier: 3,\n description:\n \"Anthropic Claude Opus 5 current frontier model for agentic coding and enterprise work; text and image input, 1M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_000_000,\n },\n }),\n text(\"claude-fable-5\", \"Claude Fable 5\", \"claude-fable-5\", {\n exposure: [],\n display: {\n provider: \"anthropic\",\n costTier: 3,\n description:\n \"Anthropic Claude Fable 5 (legacy) model for demanding reasoning and long-horizon agentic work; text and image input, 1M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_000_000,\n },\n }),\n text(\"gemini-2.5-flash\", \"Gemini 2.5 Flash\", \"gemini-2.5-flash\", {\n exposure: [],\n display: {\n provider: \"google\",\n costTier: 1,\n description:\n \"Google Gemini 2.5 Flash low-latency multimodal model for high-volume reasoning over text, images, video, and audio; 1M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_048_576,\n },\n }),\n text(\"gemini-2.5-pro\", \"Gemini 2.5 Pro\", \"gemini-2.5-pro\", {\n exposure: [],\n display: {\n provider: \"google\",\n costTier: 2,\n description:\n \"Google Gemini 2.5 Pro thinking model for complex reasoning over code, math, and documents; text, image, video, audio, and PDF input, 1M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_048_576,\n },\n }),\n text(\"gemini-3.1-pro-preview\", \"Gemini 3.1 Pro (preview)\", \"gemini-3.1-pro-preview\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n provider: \"google\",\n costTier: 2,\n description:\n \"Google Gemini 3.1 Pro preview reasoning model for software engineering, tool use, and reliable agentic workflows; 1M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_048_576,\n },\n }),\n text(\"gemini-3.5-flash\", \"Gemini 3.5 Flash\", \"gemini-3.5-flash\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n provider: \"google\",\n costTier: 1,\n description:\n \"Google Gemini 3.5 Flash high-throughput model for frontier-level agentic tasks; text, image, video, audio, and PDF input, 1M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_048_576,\n },\n }),\n text(\"gemini-3.6-flash\", \"Gemini 3.6 Flash\", \"gemini-3.6-flash\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n provider: \"google\",\n costTier: 1,\n description:\n \"Google Gemini 3.6 Flash general-purpose multimodal agentic model balancing speed and capability; 1M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_048_576,\n },\n }),\n text(\"gemini-3.7-flash\", \"Gemini 3.7 Flash\", \"gemini-3.7-flash\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n provider: \"google\",\n costTier: 1,\n recommended: true,\n description:\n \"Google Gemini 3.7 Flash natively multimodal reasoning model for coding, agentic workflows, and multi-step execution; 1M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_048_576,\n },\n }),\n text(\"gemini-3.8-flash\", \"Gemini 3.8 Flash\", \"gemini-3.8-flash\", {\n exposure: [],\n display: {\n provider: \"google\",\n costTier: 1,\n description:\n \"Google Gemini 3.8 Flash frontier model for long-horizon software engineering, autonomous agents, and enterprise workflows; 1M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_048_576,\n },\n }),\n // Renamed to gemini-3.6-flash in vibe-shared model-migration.ts.\n text(\"gemini-3-flash-preview\", \"Gemini 3 Flash (preview)\", \"gemini-3-flash-preview\", {\n exposure: [],\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 exposure: [],\n display: {\n provider: \"google\",\n costTier: 1,\n description:\n \"Google Gemini 3.1 Flash-Lite low-latency multimodal model for high-volume agentic, translation, and data-extraction tasks; 1M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_048_576,\n },\n }),\n // Perplexity stopped serving Sonar Chat Completions on 2026-09-27; @ai-sdk/perplexity 3.1\n // speaks the Agent API, which rejects the bare `sonar*` ids. Its migration guide maps Sonar\n // and Sonar Pro to the `fast` preset and Sonar Reasoning Pro to `low`\n // (docs.perplexity.ai/docs/agent-api/migrate-from-sonar/overview).\n text(\"sonar\", \"Sonar\", \"sonar\", {\n lifecycle: \"deprecated\",\n replacedBy: \"perplexity/sonar\",\n exposure: [],\n display: {\n provider: \"perplexity\",\n costTier: 1,\n description:\n \"Perplexity Sonar on Chat Completions, which Perplexity stopped serving on 2026-09-27; calls now fail.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 128_000,\n },\n }),\n text(\"sonar-pro\", \"Sonar Pro\", \"sonar-pro\", {\n lifecycle: \"deprecated\",\n replacedBy: \"perplexity/fast\",\n exposure: [],\n display: {\n provider: \"perplexity\",\n costTier: 2,\n description:\n \"Perplexity Sonar Pro on Chat Completions, which Perplexity stopped serving on 2026-09-27; calls now fail.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 200_000,\n },\n }),\n text(\"sonar-reasoning-pro\", \"Sonar Reasoning Pro\", \"sonar-reasoning-pro\", {\n lifecycle: \"deprecated\",\n replacedBy: \"perplexity/fast\",\n exposure: [],\n display: {\n provider: \"perplexity\",\n costTier: 2,\n description:\n \"Perplexity Sonar Reasoning Pro on Chat Completions, which Perplexity stopped serving on 2026-09-27; calls now fail.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 128_000,\n },\n }),\n // Sonar as an Agent API model. A bare model searches only when given the web_search\n // tool, so the row sends it on every call; the answer's sources come from its results.\n text(\"perplexity/sonar\", \"Perplexity Sonar\", \"perplexity/sonar\", {\n exposure: [],\n providerOptions: {\n modelkit: { provider: \"perplexity\" },\n perplexity: { tools: [{ type: \"web_search\" }] },\n },\n display: {\n provider: \"perplexity\",\n costTier: 1,\n description:\n \"Perplexity Sonar on the Agent API with web search, returning answers grounded in cited sources.\",\n },\n // Perplexity publishes no Agent API context window; Sonar's own is 128K.\n capabilities: {\n vision: true,\n contextWindow: 128_000,\n },\n }),\n // The Agent API `fast` preset: openai/gpt-5.6-luna with one web search, Perplexity's\n // recommended replacement for Sonar and Sonar Pro.\n text(\"perplexity/fast\", \"Perplexity Fast\", \"fast\", {\n exposure: [],\n providerOptions: { modelkit: { provider: \"perplexity\" } },\n display: {\n provider: \"perplexity\",\n costTier: 1,\n description:\n \"Perplexity Agent API fast preset: a quick web-grounded answer from one search.\",\n },\n // No published preset window; Sonar's 128K, the size the preset replaces.\n capabilities: {\n vision: true,\n contextWindow: 128_000,\n },\n }),\n // DeepSeek retired V4 Flash upstream and routes the old id to V4.1 Flash at\n // Flash rates (https://api-docs.deepseek.com/news/news260910/); the old id\n // stays an alias so stored selections keep resolving.\n text(\"deepseek-flash\", \"DeepSeek V4.1 Flash\", \"deepseek-flash\", {\n aliases: [\"deepseek-v4-flash\"],\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n chat: { providerOptions: DEEPSEEK_THINKING },\n provider: \"deepseek\",\n costTier: 1,\n recommended: true,\n description:\n \"DeepSeek V4.1 Flash thinking/non-thinking model with vision, tool calls, and JSON output; 1M-token context and up to 384K output tokens.\",\n },\n capabilities: {\n reasoning: true,\n vision: true,\n\n contextWindow: 1_000_000,\n },\n }),\n text(\"deepseek-v4-pro\", \"DeepSeek V4 Pro\", \"deepseek-v4-pro\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n chat: { providerOptions: DEEPSEEK_THINKING },\n provider: \"deepseek\",\n costTier: 2,\n description:\n \"DeepSeek V4 Pro thinking/non-thinking text model with tool calls and JSON output (no vision); 1M-token context and up to 384K output tokens.\",\n },\n capabilities: {\n reasoning: true,\n vision: false,\n\n contextWindow: 1_000_000,\n },\n }),\n // 1M-token context: https://docs.x.ai/docs/models/grok-4.3\n text(\"grok-4.3\", \"Grok 4.3\", \"grok-4.3\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n provider: \"xai\",\n costTier: 2,\n description:\n \"xAI Grok 4.3 reasoning model with tool calling and structured outputs; text and image input, 1M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_000_000,\n },\n }),\n // Moonshot retired kimi-k2.5 on 2026-08-31 and no longer publishes its specs.\n text(\"kimi-k2.5\", \"Kimi K2.5\", \"kimi-k2.5\", {\n lifecycle: \"deprecated\",\n replacedBy: \"kimi-k3\",\n exposure: [],\n display: {\n chat: { temperature: 1 },\n provider: \"moonshot\",\n costTier: 2,\n description:\n \"Moonshot Kimi K2.5; the provider retired the model on 2026-08-31 and calls now return a model-not-found error.\",\n },\n capabilities: {},\n }),\n text(\"kimi-k3\", \"Kimi K3\", \"kimi-k3\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n chat: { temperature: 1 },\n provider: \"moonshot\",\n costTier: 2,\n description:\n \"Moonshot Kimi K3 flagship model with native visual understanding and always-on thinking; text, image, and video input, 1M-token context.\",\n },\n capabilities: {\n reasoning: true,\n vision: true,\n\n contextWindow: 1_000_000,\n },\n }),\n // Cowork calls the provider \"MiniMax-M3\"; the pricing key is lowercase.\n // 1M-token context: https://platform.minimax.io/docs/api-reference/text-openai-api\n text(\"minimax-m3\", \"MiniMax M3\", \"MiniMax-M3\", {\n exposure: [\"cowork\", \"space_builder\"],\n aliases: [\"MiniMax-M3\"],\n display: {\n provider: \"minimax\",\n costTier: 2,\n description:\n \"MiniMax M3 frontier multimodal model for agentic reasoning, tool use, and coding; text, image, and video input, 1M-token context.\",\n },\n capabilities: { vision: true, contextWindow: 1_000_000 },\n }),\n];\n","import type { AspectRatio, CatalogModel, PromptConventions, ReferenceLimits } from \"../types.js\";\n\n// ENG-3271 video rows. Every limit below comes from the endpoint's published schema (fal\n// queue OpenAPI, docs.x.ai), saved as test fixtures next to the adapters.\n\nconst VIDEO_USAGE = { unit: \"seconds\" } as const;\nconst MB = 1024 * 1024;\n\nconst KLING_LOGO =\n \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/kling-color.png\";\nconst MINIMAX_LOGO =\n \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/f4c2e906-28b7-4a4a-b491-df8fef7808ed.png\";\nconst BYTEDANCE_LOGO =\n \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/3bba5d81-4e57-4e71-911b-cdfa05acca2c_compressed.png\";\nconst XAI_LOGO =\n \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/858b7fcc-9bd5-411d-aea1-a7b35ecfffab_compressed.png\";\n\nconst H3_RATIOS: AspectRatio[] = [\"21:9\", \"16:9\", \"4:3\", \"1:1\", \"3:4\", \"9:16\"];\nconst HAPPY_HORSE_RATIOS: AspectRatio[] = [\n \"16:9\",\n \"9:16\",\n \"1:1\",\n \"4:3\",\n \"3:4\",\n \"21:9\",\n \"9:21\",\n \"5:4\",\n \"4:5\",\n];\n// xAI also takes 5:2, which the kit has no spelling for.\nconst GROK_15_RATIOS: AspectRatio[] = [\"1:1\", \"16:9\", \"9:16\", \"4:3\", \"3:4\", \"3:2\", \"2:3\", \"21:9\"];\n\nfunction range(min: number, max: number): number[] {\n return Array.from({ length: max - min + 1 }, (_, i) => min + i);\n}\n\nconst KLING_PROMPT: PromptConventions = { referenceSyntax: \"numbered\", maxChars: 2500 };\nconst H3_PROMPT: PromptConventions = { referenceSyntax: \"numbered\", maxChars: 50000 };\n// Kling 4.0 prompts name inputs by kind and position with no space: @Image1, @Image2 for the\n// reference images in order, @Video1, @Video2 for the reference videos (on an edit, @Video1\n// is the source). The kit sends no elements, so @Element1 never applies.\nconst KLING_V4_PROMPT: PromptConventions = { referenceSyntax: \"numbered\", maxChars: 2500 };\n// fal's Kling 4.0 endpoints have no sound field.\nconst KLING_V4_AUDIO = \"always\" as const;\n\n// Explicit zeros: the resolver trims a reference kind the endpoint has no field for,\n// instead of letting it reach the adapter.\nconst NO_REFERENCES: ReferenceLimits = { images: 0, videos: 0, audios: 0 };\n\n// Motion control: one character image plus one motion clip (fal: 3-30.05 s with \"video\"\n// orientation, which the adapter sends). The output runs as long as the motion clip.\nfunction klingMotionControl(tier: \"pro\" | \"standard\"): CatalogModel {\n const label = tier === \"pro\" ? \"Pro\" : \"Standard\";\n return {\n // https://fal.ai/models/fal-ai/kling-video/v3/pro/motion-control/api\n id: `kling-3.0-motion-control-${tier}`,\n aliases: [],\n label: `Kling 3.0 Motion Control ${label}`,\n type: \"video\",\n adapter: \"fal\",\n providerModelId: `fal-ai/kling-video/v3/${tier}/motion-control`,\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n references: {\n images: 1,\n videos: 1,\n audios: 0,\n videoSeconds: { min: 3, max: 30.05 },\n min: { images: 1, videos: 1 },\n },\n requires: [\"references\"],\n // generateAudio keeps (true) or drops (false) the motion clip's soundtrack.\n supports: [\"generateAudio\"],\n prompt: { referenceSyntax: \"descriptive\", maxChars: 2500 },\n audio: \"optional\",\n },\n defaults: { generateAudio: true },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"kuaishou\",\n logo: KLING_LOGO,\n description: `Kuaishou Kling 3.0 Motion Control (${label}): a character image performs the motion of a 3-30 second reference video, keeping its timing and sound.`,\n },\n capabilities: {},\n };\n}\n\nexport const VIDEO_FAMILY_MODELS: CatalogModel[] = [\n klingMotionControl(\"pro\"),\n klingMotionControl(\"standard\"),\n {\n // https://fal.ai/models/fal-ai/kling-video/o3/pro/reference-to-video/api\n // Text, start/end frames and up to 7 reference images (frames count toward the 7).\n id: \"kling-o3\",\n aliases: [\"kling-o3-pro\", \"kling-o3-reference\"],\n label: \"Kling O3\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/kling-video/o3/pro/reference-to-video\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [\"16:9\", \"9:16\", \"1:1\"],\n durations: range(3, 15),\n references: { ...NO_REFERENCES, images: 7 },\n supports: [\"generateAudio\", \"lastFrame\"],\n prompt: KLING_PROMPT,\n audio: \"optional\",\n },\n defaults: { durationSeconds: 5, aspectRatio: \"16:9\", generateAudio: true },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"kuaishou\",\n logo: KLING_LOGO,\n description:\n \"Kuaishou Kling O3 Pro: text, start/end frames and up to 7 reference images in one 3-15 second clip with consistent characters and optional native audio.\",\n },\n capabilities: { lastFrameRequiresFirstFrame: true },\n },\n {\n // https://fal.ai/models/fal-ai/kling-video/o3/pro/video-to-video/edit/api\n // Source: mp4/mov, 3-15.05 s, 720-3840 px; reference images up to 4 with a video.\n id: \"kling-o3-edit\",\n aliases: [\"kling-o3-pro-edit\"],\n label: \"Kling O3 Edit\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/kling-video/o3/pro/video-to-video/edit\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n references: { ...NO_REFERENCES, images: 4 },\n requires: [\"sourceVideo\"],\n sourceVideoSeconds: { min: 3, max: 15.05 },\n // generateAudio keeps (true) or drops (false) the source soundtrack.\n supports: [\"generateAudio\"],\n prompt: KLING_PROMPT,\n audio: \"optional\",\n },\n defaults: { generateAudio: true },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"kuaishou\",\n logo: KLING_LOGO,\n description:\n \"Kuaishou Kling O3 Pro video edit: change a 3-15 second clip with a prompt and up to 4 reference images while keeping its motion and timing.\",\n },\n capabilities: { acceptsSourceVideo: true, videoEdit: true },\n },\n {\n // https://fal.ai/models/kling/v4/reference-to-video/api (+ /text-to-video,\n // /image-to-video): one row; references (images or videos) go to reference-to-video,\n // else a start frame to image-to-video, else text-to-video. Reference images: 10, the\n // start frame included (fal: \"counts toward the image reference limit\"), 300 px min.\n // Reference videos: 5, 3-30.05 s each and 30 s combined, 700 px min, 23.9-60.05 fps.\n // The prompt names references as @Image1, @Video1 (no space; @Element1 for elements,\n // which the kit does not send). No sound switch on any endpoint.\n id: \"kling-4.0\",\n aliases: [\"kling-4\", \"kling-v4\"],\n label: \"Kling 4.0\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"kling/v4\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [\"adaptive\", \"16:9\", \"9:16\", \"1:1\", \"21:9\"],\n resolutions: [\"720p\", \"1080p\"],\n durations: { min: 3, max: 30 },\n durationPresets: [5, 10, 15, 30],\n references: {\n ...NO_REFERENCES,\n images: 10,\n videos: 5,\n videoSeconds: { min: 3, max: 30.05, total: 30 },\n },\n supports: [\"lastFrame\"],\n prompt: KLING_V4_PROMPT,\n audio: KLING_V4_AUDIO,\n },\n defaults: { durationSeconds: 5, resolution: \"1080p\", aspectRatio: \"16:9\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"kuaishou\",\n logo: KLING_LOGO,\n description:\n \"Kuaishou Kling 4.0: text-to-video, start/end frames, or reference-to-video from up to 10 images and 5 videos (30 seconds combined), 3-30 seconds at 720p or 1080p. Prompts name references @Image1, @Video1.\",\n },\n capabilities: { lastFrameRequiresFirstFrame: true },\n },\n {\n // https://fal.ai/models/kling/v4/video-to-video/edit/api: source 3-30.05 s (700 px\n // min, 23.9-60.05 fps), up to 10 reference images. duration 3-30, or left out for the\n // source's length. The prompt names the source @Video1 and images @Image1, @Image2.\n id: \"kling-4.0-edit\",\n aliases: [\"kling-4-edit\", \"kling-v4-edit\"],\n label: \"Kling 4.0 Edit\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"kling/v4/video-to-video/edit\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n resolutions: [\"720p\", \"1080p\"],\n durations: { min: 3, max: 30 },\n references: { ...NO_REFERENCES, images: 10 },\n requires: [\"sourceVideo\"],\n sourceVideoSeconds: { min: 3, max: 30.05 },\n supports: [],\n prompt: KLING_V4_PROMPT,\n audio: KLING_V4_AUDIO,\n },\n defaults: { resolution: \"1080p\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"kuaishou\",\n logo: KLING_LOGO,\n description:\n \"Kuaishou Kling 4.0 video edit: change a 3-30 second clip with a prompt and up to 10 reference images, at 720p or 1080p, as long as the source or a set 3-30 seconds. Prompts name the source @Video1 and images @Image1.\",\n },\n capabilities: { acceptsSourceVideo: true, videoEdit: true },\n },\n {\n // https://fal.ai/models/minimax/h3-max-turbo/text-to-video/api (+ /image-to-video).\n // image-to-video takes a start frame, an end frame, or both, and no aspect_ratio.\n id: \"minimax-h3-max-turbo\",\n aliases: [],\n label: \"MiniMax H3 Max Turbo\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"minimax/h3-max-turbo\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...H3_RATIOS],\n resolutions: [\"480p\", \"768p\", \"1080p\"],\n durations: { min: 1, max: 15 },\n durationPresets: [5, 10, 15],\n ratioIgnoredWith: [\"firstFrame\"],\n // One soundtrack clip (target_audio_url): at least 2 s, at most 15 MB.\n references: {\n ...NO_REFERENCES,\n audios: 1,\n audioSeconds: { min: 2 },\n audioMaxBytes: 15 * MB,\n },\n supports: [\"seed\", \"promptExpansion\", \"lastFrame\", \"safetyChecker\"],\n prompt: H3_PROMPT,\n audio: \"always\",\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"768p\",\n aspectRatio: \"16:9\",\n promptExpansion: \"balanced\",\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n logo: MINIMAX_LOGO,\n description:\n \"The fast tier of MiniMax H3 Max: text-to-video and start/end-frame image-to-video with native audio and an optional soundtrack clip, up to 15 seconds at 1080p.\",\n },\n capabilities: {},\n },\n {\n // https://fal.ai/models/minimax/h3-max/insert-video/api: a 5-13 s scene between\n // start_time (1.625-60 s) and resume_time (over 1.625, up to 60 s); only the scene is billed.\n id: \"minimax-h3-max-insert\",\n aliases: [],\n label: \"MiniMax H3 Max Insert\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"minimax/h3-max/insert-video\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n resolutions: [\"480p\", \"768p\"],\n durations: { min: 5, max: 13 },\n references: { images: 9, videos: 3, audios: 0 },\n requires: [\"sourceVideo\"],\n supports: [\"seed\", \"insertWindow\"],\n prompt: H3_PROMPT,\n audio: \"always\",\n },\n defaults: { durationSeconds: 5, resolution: \"768p\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n logo: MINIMAX_LOGO,\n description:\n \"MiniMax H3 Max Insert: generates a new 5-13 second scene inside an existing video from a prompt, reference images or videos, then returns to the original footage.\",\n },\n capabilities: { acceptsSourceVideo: true, videoEdit: true },\n },\n {\n // https://fal.ai/models/minimax/h3-max/recast/api: source 5-30 s, 1-4 people photos.\n id: \"minimax-h3-max-recast\",\n aliases: [],\n label: \"MiniMax H3 Max Recast\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"minimax/h3-max/recast\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n resolutions: [\"768p\", \"1080p\"],\n references: { ...NO_REFERENCES, images: 4, min: { images: 1 } },\n requires: [\"sourceVideo\", \"references\"],\n sourceVideoSeconds: { min: 5, max: 30 },\n supports: [\"seed\", \"safetyChecker\"],\n prompt: { referenceSyntax: \"descriptive\", maxChars: 2000 },\n audio: \"always\",\n },\n defaults: { resolution: \"1080p\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n logo: MINIMAX_LOGO,\n description:\n \"MiniMax H3 Max Recast: replaces the people in a 5-30 second video with up to 4 reference photos, keeping the motion, camera, cuts and soundtrack.\",\n },\n capabilities: { acceptsSourceVideo: true, videoEdit: true },\n },\n {\n // https://fal.ai/models/minimax/h3-max/relight/api: source up to 15 s and at least\n // 56 frames at 24 fps; one sphere render sets the light; no prompt field.\n id: \"minimax-h3-max-relight\",\n aliases: [],\n label: \"MiniMax H3 Max Relight\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"minimax/h3-max/relight\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [\"adaptive\", ...H3_RATIOS],\n resolutions: [\"480p\", \"768p\", \"1080p\", \"2k\"],\n references: { ...NO_REFERENCES, images: 1, min: { images: 1 } },\n noPrompt: true,\n requires: [\"sourceVideo\", \"references\"],\n sourceVideoSeconds: { min: 2.34, max: 15 },\n supports: [\"seed\", \"safetyChecker\"],\n audio: \"always\",\n },\n defaults: { resolution: \"768p\", aspectRatio: \"adaptive\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n logo: MINIMAX_LOGO,\n description:\n \"MiniMax H3 Max Relight: relights a video of up to 15 seconds from a lighting sphere image, keeping the subjects, motion, camera and audio.\",\n },\n capabilities: { acceptsSourceVideo: true, videoEdit: true },\n },\n {\n // https://fal.ai/models/alibaba/happy-horse/v1.1/text-to-video/api (+ /image-to-video,\n // /reference-to-video): one row; references, else a start frame, else text.\n id: \"happy-horse-1.1\",\n aliases: [\"happy-horse\"],\n label: \"Happy Horse 1.1\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"alibaba/happy-horse/v1.1\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...HAPPY_HORSE_RATIOS],\n resolutions: [\"720p\", \"1080p\"],\n durations: range(3, 15),\n ratioIgnoredWith: [\"firstFrame\"],\n references: { ...NO_REFERENCES, images: 9 },\n supports: [\"seed\", \"safetyChecker\"],\n prompt: { referenceSyntax: \"numbered\", maxChars: 2500 },\n audio: \"always\",\n },\n defaults: { durationSeconds: 5, resolution: \"1080p\", aspectRatio: \"16:9\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"alibaba\",\n logo: \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/happyhorse.png\",\n description:\n \"Alibaba Happy Horse 1.1: text-to-video, image-to-video and reference-to-video from up to 9 images, with native audio and lip-sync, 3-15 seconds at up to 1080p.\",\n },\n capabilities: { framesExcludeReferences: true },\n },\n {\n // https://fal.ai/models/alibaba/happy-horse/video-edit/api: up to 5 reference images;\n // the output keeps the source aspect ratio. fal takes a 3-60 s source but cuts the\n // output (and the edit) to the first 15 s, so a longer source is refused, not trimmed.\n id: \"happy-horse-video-edit\",\n aliases: [],\n label: \"Happy Horse Video Edit\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"alibaba/happy-horse/video-edit\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n resolutions: [\"720p\", \"1080p\"],\n references: { ...NO_REFERENCES, images: 5 },\n requires: [\"sourceVideo\"],\n sourceVideoSeconds: { min: 3, max: 15 },\n supports: [\"seed\", \"safetyChecker\"],\n prompt: { referenceSyntax: \"numbered\", maxChars: 2500 },\n audio: \"always\",\n },\n defaults: { resolution: \"1080p\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"alibaba\",\n logo: \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/happyhorse.png\",\n description:\n \"Alibaba Happy Horse video edit: changes a 3-15 second clip from a prompt and up to 5 reference images, keeping its framing.\",\n },\n capabilities: { acceptsSourceVideo: true, videoEdit: true },\n },\n {\n // https://fal.ai/models/fal-ai/vidu/q4/reference-to-video/api (+ /image-to-video).\n // There is no Q4 text-to-video endpoint. 540p exists too; the kit has no spelling for it.\n id: \"vidu-q4\",\n aliases: [],\n label: \"Vidu Q4\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/vidu/q4\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [\"16:9\", \"9:16\", \"4:3\", \"3:4\", \"1:1\"],\n resolutions: [\"720p\", \"1080p\", \"2k\", \"4k\"],\n durations: range(3, 16),\n ratioIgnoredWith: [\"firstFrame\"],\n requiresOneOf: [\"firstFrame\", \"references\"],\n references: {\n images: 12,\n videos: 0,\n audios: 3,\n audioOnly: false,\n audioSeconds: { min: 3, max: 12 },\n audioFormats: [\"mp3\"],\n audioMaxBytes: 50 * MB,\n },\n // Sound (dialogue and effects) is a reference-to-video option; image-to-video is silent.\n supports: [\"seed\", \"generateAudio\", \"safetyChecker\"],\n prompt: { referenceSyntax: \"numbered\", maxChars: 5000 },\n audio: \"optional\",\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"720p\",\n aspectRatio: \"16:9\",\n generateAudio: true,\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"shengshu\",\n logo: \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/vidu-color.png\",\n description:\n \"Vidu Q4: animates a start image or builds a 3-16 second clip from up to 12 reference images and 3 voice clips, at up to 4K.\",\n },\n capabilities: { framesExcludeReferences: true },\n },\n {\n // https://fal.ai/models/bytedance/omnihuman/v2/api: one image plus one wav/mp3 clip\n // of 4-300 s (15 MB); the output is as long as the audio.\n id: \"omnihuman-2\",\n aliases: [\"omnihuman-v2\"],\n label: \"OmniHuman 2\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"bytedance/omnihuman/v2\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n references: {\n images: 1,\n videos: 0,\n audios: 1,\n audioOnly: false,\n audioSeconds: { min: 4, max: 300 },\n audioFormats: [\"wav\", \"mp3\"],\n audioMaxBytes: 15 * MB,\n min: { images: 1, audios: 1 },\n },\n requires: [\"references\"],\n supports: [],\n prompt: { referenceSyntax: \"descriptive\" },\n audio: \"always\",\n },\n defaults: {},\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"bytedance\",\n logo: BYTEDANCE_LOGO,\n description:\n \"ByteDance OmniHuman 2: turns one portrait image and a 4-300 second audio clip into a talking, gesturing video as long as the audio.\",\n },\n capabilities: {},\n },\n {\n // https://docs.x.ai/developers/model-capabilities/video/overview: 1-15 s, 480p-1080p\n // (720p at most with references or a last frame), up to 14 reference images, and a\n // pinned last frame that combines with a start frame and references.\n id: \"grok-imagine-1.5\",\n aliases: [\"grok-imagine-video-1.5\"],\n label: \"Grok Imagine 1.5\",\n type: \"video\",\n adapter: \"xai-video\",\n providerModelId: \"grok-imagine-video-1.5\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...GROK_15_RATIOS],\n resolutions: [\"480p\", \"720p\", \"1080p\"],\n durations: { min: 1, max: 15 },\n durationPresets: [4, 6, 8, 10, 15],\n // xAI: image-to-video \"always matches the still's aspect ratio\".\n ratioIgnoredWith: [\"firstFrame\"],\n references: { ...NO_REFERENCES, images: 14 },\n supports: [\"lastFrame\"],\n prompt: { referenceSyntax: \"numbered\" },\n audio: \"always\",\n },\n defaults: { durationSeconds: 8, aspectRatio: \"16:9\" },\n usage: { unit: \"reported_cost_usd\" },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"xai\",\n logo: XAI_LOGO,\n description:\n \"xAI Grok Imagine 1.5: text- and image-to-video at native 1080p with lip-synced audio, or up to 14 reference images and pinned first and last frames at 720p, 1-15 seconds.\",\n },\n capabilities: {},\n },\n];\n","import type { AspectRatio, CatalogModel, VideoResolution } from \"../types.js\";\n\n// Luma video rows (Agents API ray-3.2). Every limit below is from the verified\n// request shapes in the ENG-3272 work order (docs.agents.lumalabs.ai). All\n// three rows share providerModelId \"ray-3.2\"; the adapter routes by catalog id.\n\nconst VIDEO_USAGE = { unit: \"seconds\" } as const;\nconst EXPOSURE: CatalogModel[\"exposure\"] = [\"cowork\", \"space_builder\"];\nconst LUMA_LOGO =\n \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/luma-color.png\";\n\nconst RAY_RATIOS: AspectRatio[] = [\"9:16\", \"3:4\", \"1:1\", \"4:3\", \"16:9\", \"21:9\"];\n// Ray also renders 540p, which the kit has no spelling for (vidu-q4 precedent); it is omitted.\nconst RAY_RESOLUTIONS: VideoResolution[] = [\"360p\", \"720p\", \"1080p\"];\nconst RAY_PROMPT = { referenceSyntax: \"numbered\", maxChars: 6000 } as const;\n\nexport const LUMA_VIDEO_MODELS: CatalogModel[] = [\n {\n // https://docs.agents.lumalabs.ai: type \"video\" with a 5 s or 10 s duration;\n // firstFrame and lastFrame ride as start_frame and end_frame. Luma bills a\n // 10 s clip at 3x the 5 s price; pro-backend prices it that way, so this row\n // must not offer 10 s before that pricing is deployed (ENG-3324).\n id: \"ray-3.2\",\n aliases: [],\n label: \"Ray 3.2\",\n type: \"video\",\n adapter: \"luma\",\n providerModelId: \"ray-3.2\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n aspectRatios: [\"adaptive\", ...RAY_RATIOS],\n resolutions: [...RAY_RESOLUTIONS],\n durations: [5, 10],\n supports: [\"lastFrame\"],\n prompt: { ...RAY_PROMPT },\n audio: \"never\",\n },\n defaults: { durationSeconds: 5, resolution: \"720p\", aspectRatio: \"adaptive\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"luma\",\n description:\n \"Luma Ray 3.2 text- and image-to-video with optional first and last frames, 5- or 10-second clips at up to 1080p.\",\n logo: LUMA_LOGO,\n },\n capabilities: {},\n },\n {\n // https://docs.agents.lumalabs.ai: type \"video_edit\" with a source video of\n // up to 18 s; the output keeps the source length, so there is no durations\n // knob, no aspect_ratio and no end frame. Luma bills its 5 s price for any\n // source (live, 2026-10-21) and the row is priced per source second, so a\n // source under 5 s is refused: it would be billed below Luma's charge.\n id: \"ray-3.2-edit\",\n aliases: [],\n label: \"Ray 3.2 Edit\",\n type: \"video\",\n adapter: \"luma\",\n providerModelId: \"ray-3.2\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n resolutions: [...RAY_RESOLUTIONS],\n requires: [\"sourceVideo\"],\n sourceVideoSeconds: { min: 5, max: 18 },\n supports: [],\n prompt: { ...RAY_PROMPT },\n audio: \"never\",\n },\n defaults: { resolution: \"720p\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"luma\",\n description:\n \"Luma Ray 3.2 video edit: changes a 5-18 second clip from a prompt, keeping its length.\",\n logo: LUMA_LOGO,\n },\n capabilities: { acceptsSourceVideo: true, videoEdit: true },\n },\n {\n // https://docs.agents.lumalabs.ai: type \"video_reframe\" with a required\n // target aspect_ratio; the source is up to 10 s and the output keeps its\n // length whatever video.duration says, while Luma bills that duration\n // (live, 2026-10-21). So there is no durations knob, and a source under\n // 5 s is refused, as on ray-3.2-edit. 1080p is not offered for the\n // vertical targets 9:16 and 3:4.\n id: \"ray-3.2-reframe\",\n aliases: [],\n label: \"Ray 3.2 Reframe\",\n type: \"video\",\n adapter: \"luma\",\n providerModelId: \"ray-3.2\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n aspectRatios: [...RAY_RATIOS],\n resolutions: [...RAY_RESOLUTIONS],\n requires: [\"sourceVideo\"],\n sourceVideoSeconds: { min: 5, max: 10 },\n supports: [],\n prompt: { ...RAY_PROMPT },\n audio: \"never\",\n },\n defaults: { resolution: \"720p\", aspectRatio: \"16:9\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"luma\",\n description:\n \"Luma Ray 3.2 Reframe: changes a 5-10 second clip to a new aspect ratio and fills the new area from the prompt.\",\n logo: LUMA_LOGO,\n },\n capabilities: { acceptsSourceVideo: true, videoEdit: true },\n },\n];\n","import type { AspectRatio, CatalogModel } from \"../types.js\";\nimport { VIDEO_FAMILY_MODELS } from \"./video-families.js\";\nimport { LUMA_VIDEO_MODELS } from \"./video-luma.js\";\n\nconst VIDEO_USAGE = { unit: \"seconds\" } as const;\n\nconst SEEDANCE_RATIOS: AspectRatio[] = [\"21:9\", \"16:9\", \"4:3\", \"1:1\", \"3:4\", \"9:16\", \"adaptive\"];\nconst KLING_RATIOS: AspectRatio[] = [\"16:9\", \"9:16\", \"1:1\", \"adaptive\"];\n// fal's Kling O3 aspect_ratio enum has no adaptive.\nconst KLING_OMNI_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];\nconst WAN_RATIOS: AspectRatio[] = [\"adaptive\", \"16:9\", \"4:3\", \"1:1\", \"3:4\", \"9:16\"];\n\nconst NEGATIVE_PROMPT = \"blur, distort, and low quality\";\n\n// Seedance, Grok, Veo and the frame-driven MiniMax rows route first/last frames\n// and reference images to different inputs; the Omni, reference-only MiniMax,\n// Kling Omni and Kling video-to-video rows can combine them.\nconst FRAMES_EXCLUDE_REFERENCES = { framesExcludeReferences: true } as const;\n\n// Kling's prompt limit: Higgsfield 3.0 and Replicate's Omni document 2,500 characters;\n// Higgsfield 2.5 documents none, but the same model on fal and Kling's own API caps it at 2,500.\nconst KLING_PROMPT = { referenceSyntax: \"numbered\", maxChars: 2500 } as const;\n// BytePlus caps a Seedance 2.x prompt at 10,000 tokens; 30,000 characters assumes English text.\nconst SEEDANCE_PROMPT = { referenceSyntax: \"numbered\", maxChars: 30000 } as const;\n\n// BytePlus (Seedance 2.0 and 2.0 Fast): 2-15 s per audio clip, 15 s in all, wav/mp3, 15 MB each.\nconst SEEDANCE_2_AUDIO = {\n audioSeconds: { min: 2, max: 15, total: 15 },\n audioFormats: [\"wav\", \"mp3\"],\n audioMaxBytes: 15 * 1024 * 1024,\n};\n// fal's MiniMax H3 schemas give the prompt a maxLength of 50,000.\nconst H3_PROMPT = { referenceSyntax: \"numbered\", maxChars: 50000 } as const;\n// fal's Wan 3.0 image- and reference-to-video schemas give the prompt a maxLength of 20,000; its\n// guide addresses references by position (\"the subject in Image 1 walks past Video 1\").\nconst WAN_PROMPT = { referenceSyntax: \"numbered\", maxChars: 20000 } as const;\n// generateOmniVideo sends MediaRef.label as a text part beside each image. The token budget is far\n// above this; 50,000 matches cowork's global prompt ceiling.\nconst OMNI_PROMPT = { referenceSyntax: \"caption\", maxChars: 50000 } as const;\n\nconst BYTEDANCE_LOGO =\n \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/3bba5d81-4e57-4e71-911b-cdfa05acca2c_compressed.png\";\nconst GOOGLE_LOGO =\n \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png\";\n\nexport const VIDEO_MODELS: CatalogModel[] = [\n // Google shuts down the Veo 3.1 previews and Omni Flash 1.0 on 2026-10-22.\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: \"deprecated\",\n replacedBy: \"gemini-omni-1.1-flash\",\n exposure: [],\n constraints: {\n aspectRatios: [...OMNI_RATIOS],\n resolutions: [\"720p\", \"1080p\", \"4k\"],\n // Veo also takes 4 and 6, but must be 8 at 1080p/4k or with reference images;\n // [8] until the kit has a rule that forces it there (CHANGELOG 0.2.21).\n durations: [8],\n references: { images: 3 },\n supports: [\"lastFrame\", \"seed\"],\n // 1,024 text tokens; 3,000 characters assumes ~2.9 characters per token.\n prompt: { referenceSyntax: \"numbered\", maxChars: 3000 },\n audio: \"always\",\n },\n defaults: { durationSeconds: 8, resolution: \"720p\", aspectRatio: \"16:9\" },\n usage: { ...VIDEO_USAGE, slug: \"veo\" },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"google\",\n description:\n \"Google's highest-quality video generation model. Supports up to 4K resolution and 8-second clips with reference image conditioning.\",\n logo: GOOGLE_LOGO,\n },\n // Veo's lastFrame \"must be used in combination with the image parameter\".\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES, lastFrameRequiresFirstFrame: true },\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: \"deprecated\",\n replacedBy: \"gemini-omni-1.1-flash\",\n exposure: [],\n constraints: {\n aspectRatios: [...OMNI_RATIOS],\n resolutions: [\"720p\", \"1080p\", \"4k\"],\n durations: [4, 6, 8],\n references: { images: 3 },\n supports: [\"lastFrame\", \"seed\"],\n audio: \"always\",\n },\n defaults: { durationSeconds: 8, resolution: \"720p\", aspectRatio: \"16:9\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"google\",\n description:\n \"Faster variant of Google Veo 3.1; text- and image-to-video with natively generated audio at 4 or 8 seconds.\",\n },\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n id: \"veo-3.1-lite\",\n aliases: [\n \"veo-3.1-lite-generate-001\",\n \"veo-3.1-lite-generate-preview\",\n \"veo-3.1-lite-generate-001-frame-specific\",\n ],\n label: \"Veo 3.1 Lite\",\n type: \"video\",\n adapter: \"google-genai\",\n providerModelId: \"veo-3.1-lite-generate-preview\",\n lifecycle: \"deprecated\",\n replacedBy: \"gemini-omni-1.1-flash\",\n exposure: [],\n constraints: {\n aspectRatios: [...OMNI_RATIOS],\n resolutions: [\"720p\", \"1080p\"],\n durations: [4, 6, 8],\n supports: [\"lastFrame\", \"seed\"],\n audio: \"always\",\n },\n defaults: { durationSeconds: 8, resolution: \"720p\", aspectRatio: \"16:9\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"google\",\n description:\n \"Efficiency-focused Google Veo 3.1 Lite for high-volume video generation and editing; text and image input, with no 4K output or video extension.\",\n },\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n id: \"gemini-omni-flash\",\n aliases: [\n \"gemini-omni-flash-preview\",\n \"geminiOmniFlash\",\n \"gemini-omni-video\",\n \"gemini-omni-reference\",\n \"gemini-omni-edit\",\n ],\n label: \"Gemini Omni Flash\",\n type: \"video\",\n adapter: \"google-genai\",\n providerModelId: \"gemini-omni-flash-preview\",\n lifecycle: \"deprecated\",\n replacedBy: \"gemini-omni-1.1-flash\",\n exposure: [],\n constraints: {\n // 1.0 rejects `resolution`; it renders 720p. No defaults: the adapter\n // sends ratio and duration only when the caller set them, so a\n // reference clip keeps its own framing.\n aspectRatios: [...OMNI_RATIOS],\n durations: [3, 4, 5, 6, 7, 8, 9, 10],\n references: { images: 6, videos: 1, videoSeconds: { max: 10 } },\n sourceVideoSeconds: { max: 10 },\n supports: [],\n prompt: OMNI_PROMPT,\n audio: \"always\",\n },\n defaults: {},\n usage: { ...VIDEO_USAGE, slug: \"gemini_omni\" },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"google\",\n description:\n \"Google's conversational video model with native audio, human support, and natural language editing. Aspect ratio only — resolution and duration are model-determined.\",\n logo: GOOGLE_LOGO,\n },\n capabilities: { acceptsSourceVideo: true, videoEdit: true },\n },\n {\n id: \"gemini-omni-1.1-flash\",\n aliases: [\"gemini-omni-1.1-video\", \"gemini-omni-1.1-reference\", \"gemini-omni-1.1-edit\"],\n label: \"Gemini Omni 1.1 Flash\",\n type: \"video\",\n adapter: \"google-genai\",\n providerModelId: \"gemini-omni-1.1-flash\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\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, videoSeconds: { max: 10 } },\n sourceVideoSeconds: { max: 10 },\n // Extension (probe 2026-09-24, 360p): each `taskType: \"extend\"` call\n // renders `durationSeconds` more and returns the FULL cumulative clip\n // (3 s -> 6 s -> 9 s); the provider caps the clip at 40 s. A first\n // extension can upload a <= 10 s source with task \"extend\"; later ones\n // chain by `previousInteractionId` (the API rejects the id together\n // with a video task, so those calls carry the prompt alone).\n // First-to-last-frame interpolation: `<LAST_FRAME>` goes with `<FIRST_FRAME>`.\n supports: [\"videoExtension\", \"lastFrame\"],\n extension: { segmentSeconds: 10, maxTotalSeconds: 40, returns: \"joined\" },\n prompt: OMNI_PROMPT,\n audio: \"always\",\n },\n defaults: {},\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"google\",\n logo: GOOGLE_LOGO,\n description:\n \"Google Gemini Omni Flash 1.1 conversational video generation, editing and extension; text, image, and up to 10-second video input, 3-10 second output at up to 4K and 24 FPS, extendable to 40 seconds.\",\n },\n capabilities: {\n acceptsSourceVideo: true,\n videoEdit: true,\n lastFrameRequiresFirstFrame: true,\n },\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 exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...SEEDANCE_RATIOS],\n resolutions: [\"480p\", \"720p\", \"1080p\", \"4k\"],\n durations: { min: 4, max: 15 },\n durationPresets: [4, 6, 8, 10, 12, 15],\n references: {\n images: 9,\n videos: 3,\n audios: 3,\n audioOnly: false,\n videoSeconds: { min: 2, max: 15, total: 15 },\n ...SEEDANCE_2_AUDIO,\n },\n sourceVideoSeconds: { min: 2, max: 15, inReferenceTotal: true },\n ratioIgnoredWith: [\"firstFrame\", \"sourceVideo\"],\n // No seed: 2.x echoes it but does not honour it (two seeded runs differed, 2026-10-01).\n supports: [\"generateAudio\", \"lastFrame\", \"watermark\"],\n prompt: SEEDANCE_PROMPT,\n audio: \"optional\",\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"720p\",\n aspectRatio: \"16:9\",\n generateAudio: true,\n },\n usage: { ...VIDEO_USAGE, slug: \"seedance2\", providerLabel: \"byteplus\" },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"bytedance\",\n description:\n \"High-quality AI video generation with reference image conditioning. Supports 4-15 second clips with human preprocessing.\",\n logo: BYTEDANCE_LOGO,\n },\n capabilities: { acceptsSourceVideo: true, videoEdit: false, ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n id: \"seedance-2.0-fast\",\n aliases: [\"seedance-2-0-fast\", \"dreamina-seedance-2-0-fast-260128\"],\n label: \"Seedance 2.0 Fast\",\n type: \"video\",\n adapter: \"ark\",\n providerModelId: \"dreamina-seedance-2-0-fast-260128\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...SEEDANCE_RATIOS],\n resolutions: [\"480p\", \"720p\"],\n durations: { min: 4, max: 15 },\n references: {\n images: 9,\n videos: 3,\n audios: 3,\n audioOnly: false,\n videoSeconds: { min: 2, max: 15, total: 15 },\n ...SEEDANCE_2_AUDIO,\n },\n sourceVideoSeconds: { min: 2, max: 15, inReferenceTotal: true },\n ratioIgnoredWith: [\"firstFrame\", \"sourceVideo\"],\n // No seed: 2.x echoes it but does not honour it (two seeded runs differed, 2026-10-01).\n supports: [\"generateAudio\", \"lastFrame\", \"watermark\"],\n prompt: SEEDANCE_PROMPT,\n audio: \"optional\",\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"720p\",\n aspectRatio: \"16:9\",\n generateAudio: true,\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"bytedance\",\n logo: BYTEDANCE_LOGO,\n description:\n \"Speed- and cost-optimized ByteDance Seedance 2.0 Fast; text plus image, video, and audio references to generate or edit 4-15 second clips.\",\n },\n capabilities: { acceptsSourceVideo: true, videoEdit: false, ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n // omni_reference_task_type edit/extend: adaptive ratio, edit sends duration -1.\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 exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...SEEDANCE_RATIOS],\n resolutions: [\"480p\", \"720p\", \"1080p\"],\n durations: { min: 4, max: 30 },\n references: {\n images: 30,\n videos: 10,\n audios: 10,\n videoSeconds: { min: 2, max: 30, total: 30, editMin: 4 },\n // BytePlus: 2-30 s per clip, 30 s in all, wav/mp3, 15 MB each.\n audioSeconds: { min: 2, max: 30, total: 30 },\n audioFormats: [\"wav\", \"mp3\"],\n audioMaxBytes: 15 * 1024 * 1024,\n },\n sourceVideoSeconds: { min: 2, max: 30, editMin: 4, inReferenceTotal: true },\n ratioIgnoredWith: [\"firstFrame\", \"sourceVideo\"],\n // No seed: 2.x echoes it but does not honour it (two seeded runs differed, 2026-10-01).\n supports: [\"generateAudio\", \"lastFrame\", \"watermark\", \"taskType\", \"videoExtension\"],\n // Extend (probe 2026-10-02, 480p): returns ONLY the added footage, continuing from\n // the source's last frame at the source's framing and fps but at the requested\n // resolution, so the caller joins the clips. Forward only in practice.\n extension: { segmentSeconds: 30, maxTotalSeconds: 60, returns: \"new\" },\n prompt: SEEDANCE_PROMPT,\n audio: \"optional\",\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"720p\",\n aspectRatio: \"16:9\",\n generateAudio: true,\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"bytedance\",\n logo: BYTEDANCE_LOGO,\n description:\n \"ByteDance Seedance 2.5 for long-form storytelling and omni-reference generation/editing; up to 50 reference assets and 4-30 second clips at up to 1080p.\",\n },\n capabilities: { acceptsSourceVideo: true, videoEdit: true, ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\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 exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...GROK_RATIOS],\n resolutions: [\"480p\", \"720p\"],\n durations: { min: 1, max: 15 },\n durationPresets: [4, 6, 8, 10],\n // xAI: \"A maximum of 7 reference images can be provided per request.\"\n references: { images: 7 },\n supports: [],\n // xAI can switch sound off (generate_audio); xai-video.ts never sends it.\n audio: \"always\",\n },\n // No resolution default: xAI picks its own unless the caller asks.\n defaults: { durationSeconds: 8, aspectRatio: \"16:9\" },\n usage: { unit: \"reported_cost_usd\", slug: \"grok\" },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"xai\",\n description:\n \"xAI's reference-to-video model. Generates short clips conditioned on up to 5 reference images with flexible aspect ratios.\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/858b7fcc-9bd5-411d-aea1-a7b35ecfffab_compressed.png\",\n },\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n id: \"kling-2.5\",\n aliases: [\"kling-v2.5-turbo-pro\", \"kling-2.5-turbo-pro\", \"kling-v2.5\"],\n label: \"Kling 2.5\",\n type: \"video\",\n adapter: \"higgsfield\",\n providerModelId: \"kling-video/v2.5-turbo/pro/image-to-video\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n // The endpoint has no aspect_ratio or last_image_url: the start image sets the framing.\n constraints: {\n durations: [5, 10],\n requires: [\"firstFrame\"],\n supports: [\"cfgScale\", \"negativePrompt\"],\n prompt: KLING_PROMPT,\n audio: \"never\",\n },\n defaults: {\n durationSeconds: 5,\n cfgScale: 0.5,\n negativePrompt: NEGATIVE_PROMPT,\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"kuaishou\",\n logo: \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/kling-color.png\",\n description:\n \"Kuaishou Kling 2.5 Turbo Pro image-to-video; animates a single input image from a text prompt, 5- or 10-second clips.\",\n },\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n // trigger-workflows validates 5/10 only; Space Builder allows 3-15s (Kling30Input).\n id: \"kling-3.0\",\n aliases: [\"kling-v3.0-pro\", \"kling-v3.0\", \"kling-3.0-pro\"],\n label: \"Kling 3.0\",\n type: \"video\",\n adapter: \"higgsfield\",\n providerModelId: \"kling-video/v3.0/pro/image-to-video\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n // The endpoint has no aspect_ratio or negative_prompt; sound is \"on\"/\"off\" (default on).\n constraints: {\n durations: { min: 3, max: 15 },\n requires: [\"firstFrame\"],\n supports: [\"cfgScale\", \"lastFrame\", \"generateAudio\"],\n prompt: KLING_PROMPT,\n audio: \"optional\",\n },\n defaults: {\n durationSeconds: 5,\n cfgScale: 0.5,\n generateAudio: true,\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"kuaishou\",\n logo: \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/kling-color.png\",\n description:\n \"Kuaishou Kling 3.0 Pro image-to-video; a required start image plus a text prompt (or multi-shot prompts) with optional end image and native audio, 3-15 second clips.\",\n },\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n // fal Kling O3 (adapters/fal-kling-omni.ts): mode standard/pro/4k selects 720p/1080p/4K\n // in the endpoint path. Moved off Replicate kwaivgi/kling-v3-omni-video, which fal sells\n // at half the price; the id and inputs stay. The Replicate mapper stays for deployed\n // model_catalog rows not yet switched. Frames and reference images share fal's cap of 7.\n // Reference video, multi-shot and keep-sound were never wired, so stay off.\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: \"fal\",\n providerModelId: \"fal-ai/kling-video/o3\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...KLING_OMNI_RATIOS],\n resolutions: [\"720p\", \"1080p\", \"4k\"],\n durations: { min: 3, max: 15 },\n references: { images: 7, videos: 0, audios: 0 },\n supports: [\"generateAudio\", \"lastFrame\"],\n prompt: KLING_PROMPT,\n audio: \"optional\",\n },\n defaults: { durationSeconds: 5, aspectRatio: \"16:9\", generateAudio: true, mode: \"pro\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"kuaishou\",\n logo: \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/kling-color.png\",\n description:\n \"Kuaishou Kling Video 3.0 Omni generation from text, start/end images and up to 7 reference images, with optional native audio; up to 15 seconds at up to 4K.\",\n },\n // No lastFrameRequiresFirstFrame: fal image-to-video needs a start frame, so the adapter\n // sends a lone end frame as the start frame, as the Replicate model took it.\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 exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...H3_RATIOS],\n resolutions: [\"480p\", \"768p\", \"2k\", \"4k\"],\n durations: { min: 5, max: 15 },\n // fal's image-to-video endpoint has no aspect_ratio; the frame sets it.\n ratioIgnoredWith: [\"firstFrame\"],\n supports: [\"seed\", \"promptExpansion\", \"lastFrame\", \"safetyChecker\"],\n prompt: H3_PROMPT,\n audio: \"always\",\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"2k\",\n aspectRatio: \"16:9\",\n promptExpansion: \"balanced\",\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/f4c2e906-28b7-4a4a-b491-df8fef7808ed.png\",\n description:\n \"MiniMax H3 multimodal video model for text-to-video, image-to-video (first/last frame), and reference-to-video with native audio, up to 2K.\",\n },\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n id: \"minimax-h3-max\",\n aliases: [],\n label: \"MiniMax H3 Max\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"minimax/h3-max\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...H3_RATIOS],\n resolutions: [\"480p\", \"768p\", \"1080p\"],\n durations: { min: 5, max: 15 },\n // fal's image-to-video endpoint has no aspect_ratio; the frame sets it.\n ratioIgnoredWith: [\"firstFrame\"],\n supports: [\"seed\", \"promptExpansion\", \"lastFrame\", \"safetyChecker\"],\n prompt: H3_PROMPT,\n audio: \"always\",\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"768p\",\n aspectRatio: \"16:9\",\n promptExpansion: \"balanced\",\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/f4c2e906-28b7-4a4a-b491-df8fef7808ed.png\",\n description:\n \"High-speed MiniMax H3 Max variant for text-to-video and image-to-video (first/last frame) only, up to 1080p.\",\n },\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n id: \"minimax-h3-reference\",\n aliases: [],\n label: \"MiniMax H3 Reference\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"minimax/h3/reference-to-video\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...H3_REFERENCE_RATIOS],\n resolutions: [\"480p\", \"768p\", \"2k\", \"4k\"],\n durations: { min: 5, max: 15 },\n // A start frame routes to image-to-video, which has no aspect_ratio.\n ratioIgnoredWith: [\"firstFrame\"],\n references: {\n images: 9,\n videos: 3,\n audios: 3,\n total: 12,\n audioOnly: false,\n videoSeconds: { min: 2, max: 15, total: 15 },\n },\n supports: [\"seed\", \"promptExpansion\", \"safetyChecker\"],\n prompt: H3_PROMPT,\n audio: \"always\",\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"2k\",\n aspectRatio: \"adaptive\",\n promptExpansion: \"balanced\",\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/f4c2e906-28b7-4a4a-b491-df8fef7808ed.png\",\n description:\n \"MiniMax H3 reference-to-video mode guided by up to 9 reference images, 3 reference videos, and 3 audio clips; reference and image-to-video inputs cannot be mixed.\",\n },\n // fal's reference-to-video endpoint never reads a frame; the resolver must drop the\n // references instead of the adapter silently dropping the frame.\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\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 exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...H3_REFERENCE_RATIOS],\n resolutions: [\"480p\", \"768p\", \"1080p\"],\n durations: { min: 5, max: 15 },\n // A start frame routes to image-to-video, which has no aspect_ratio.\n ratioIgnoredWith: [\"firstFrame\"],\n references: {\n images: 9,\n videos: 3,\n audios: 3,\n total: 12,\n audioOnly: false,\n videoSeconds: { min: 2, max: 15, total: 15 },\n },\n supports: [\"seed\", \"promptExpansion\", \"safetyChecker\"],\n prompt: H3_PROMPT,\n audio: \"always\",\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"768p\",\n aspectRatio: \"adaptive\",\n promptExpansion: \"balanced\",\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/f4c2e906-28b7-4a4a-b491-df8fef7808ed.png\",\n description:\n \"MiniMax H3 Max reference-to-video on fal; conditions on reference images, videos, and audio. MiniMax's own docs do not list a reference mode for H3 Max.\",\n },\n // fal's reference-to-video endpoint never reads a frame; the resolver must drop the\n // references instead of the adapter silently dropping the frame.\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n // One row for fal's three Wan 3.0 endpoints; the adapter picks text-, image- or\n // reference-to-video from the inputs. Each takes aspect_ratio, so none is ignored.\n // https://fal.ai/models/alibaba/wan-3.0/reference-to-video/api\n id: \"wan-3.0\",\n aliases: [\"wan-3\", \"wan3\"],\n label: \"Wan 3\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"alibaba/wan-3.0\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...WAN_RATIOS],\n resolutions: [\"480p\", \"720p\", \"1080p\"],\n durations: { min: 2, max: 30 },\n durationPresets: [5, 10, 15, 30],\n references: {\n images: 10,\n videos: 5,\n audios: 5,\n videoSeconds: { total: 15 },\n audioSeconds: { total: 15 },\n },\n supports: [\"seed\", \"lastFrame\", \"generateAudio\", \"safetyChecker\"],\n prompt: WAN_PROMPT,\n audio: \"optional\",\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"1080p\",\n aspectRatio: \"adaptive\",\n generateAudio: true,\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"alibaba\",\n description:\n \"Alibaba Wan 3 video model for text-to-video, image-to-video (start/end frame), and reference-to-video from up to 10 images, 5 videos and 5 audio clips, with native audio; 2-30 seconds at up to 1080p.\",\n },\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES, lastFrameRequiresFirstFrame: true },\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 exposure: [],\n constraints: {\n aspectRatios: [...KLING_RATIOS],\n durations: { min: 3, max: 10 },\n requires: [\"sourceVideo\"],\n sourceVideoSeconds: { min: 3, max: 10.05 },\n supports: [],\n audio: \"never\",\n },\n defaults: { durationSeconds: 5, aspectRatio: \"16:9\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"kuaishou\",\n logo: \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/kling-color.png\",\n description:\n \"Kuaishou Kling O1 Reference Video-to-Video; a prompt plus a 3-10 second reference video (optional reference images) generates 3-10 second clips preserving motion and camera language.\",\n },\n capabilities: { acceptsSourceVideo: true },\n },\n {\n id: \"hailuo-02\",\n aliases: [],\n label: \"Hailuo 02\",\n type: \"video\",\n adapter: \"replicate\",\n providerModelId: \"minimax/hailuo-02\",\n lifecycle: \"active\",\n exposure: [],\n constraints: {\n resolutions: [\"768p\"],\n durations: [6, 10],\n supports: [\"lastFrame\"],\n audio: \"never\",\n },\n defaults: { durationSeconds: 6, resolution: \"768p\" },\n usage: { unit: \"compute_seconds\" },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/f4c2e906-28b7-4a4a-b491-df8fef7808ed.png\",\n description:\n \"MiniMax Hailuo 02 text-to-video and image-to-video model with realistic physics and strong prompt following; outputs 768p at 6 or 10 seconds.\",\n },\n capabilities: {},\n },\n {\n id: \"higgsfield-dop-preview\",\n aliases: [],\n label: \"Higgsfield DOP Preview\",\n type: \"video\",\n adapter: \"higgsfield\",\n providerModelId: \"dop-preview\",\n lifecycle: \"active\",\n exposure: [],\n constraints: {\n requires: [\"firstFrame\"],\n supports: [\"seed\", \"lastFrame\"],\n audio: \"never\",\n },\n defaults: {},\n usage: { ...VIDEO_USAGE },\n // Higgsfield bills DoP per generation: a fixed-length clip with no duration knob.\n pricingKind: \"flat\",\n display: {\n provider: \"higgsfield\",\n description:\n \"Higgsfield DOP image-to-video model; animates a required first-frame image from a text prompt with an optional last-frame image and motion controls.\",\n },\n capabilities: {},\n },\n ...VIDEO_FAMILY_MODELS,\n ...LUMA_VIDEO_MODELS,\n];\n","import type { CatalogModel } from \"../types.js\";\nimport { VEED_SUBTITLES } from \"./canvas-tools.js\";\n\nconst TOPAZ_LOGO =\n \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/topazlabs.png\";\n\nconst FLUX_LOGO = \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/flux.png\";\n\n// fal caps every Topaz video endpoint at a 5-minute source.\nconst TOPAZ_SOURCE_SECONDS = { max: 300 };\n\nconst SECONDS_USAGE = { unit: \"seconds\" } as const;\n\n// fal's FLUX video upscale takes up to 20 seconds and 50 MB of source.\nconst FLUX_SOURCE_SECONDS = { max: 20 };\n\nconst FLUX_UPSCALE_TOOL = {\n kind: \"upscale\",\n upscaleFactor: { min: 1.5, max: 3 },\n maxOutputLongEdge: 3840,\n prompt: true,\n} as const;\n\n/**\n * Topaz Labs video tools on fal. `providerOptions.fal.model` names the Topaz model the\n * endpoint runs; the adapter sends it as `model`. Precision and Starlight are also listed in\n * Space Builder's video upscale node.\n *\n * FLUX video upscale on fal: one endpoint, two rows, because fal prices its `creativity`\n * modes differently and pricing is keyed by model. `providerOptions.fal.input` fixes the mode.\n */\nexport const VIDEO_TOOL_MODELS: CatalogModel[] = [\n {\n id: \"topaz-precision\",\n aliases: [],\n label: \"Topaz Precision\",\n type: \"video-tool\",\n adapter: \"fal\",\n providerModelId: \"topaz/upscale/video/precision\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n supports: [],\n sourceVideoSeconds: TOPAZ_SOURCE_SECONDS,\n tool: { kind: \"upscale\", upscaleFactor: { min: 1, max: 4 }, maxOutputLongEdge: 3840 },\n },\n defaults: {},\n providerOptions: { fal: { model: \"Proteus\" } },\n usage: SECONDS_USAGE,\n pricingKind: \"video_per_second\",\n display: {\n provider: \"topaz\",\n logo: TOPAZ_LOGO,\n description:\n \"Topaz Proteus upscaling: sharper, cleaner footage up to 4K while staying faithful to the source.\",\n sortOrder: 20,\n },\n },\n {\n id: \"topaz-starlight\",\n aliases: [],\n label: \"Topaz Starlight\",\n type: \"video-tool\",\n adapter: \"fal\",\n providerModelId: \"topaz/upscale/video/generative\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n supports: [],\n sourceVideoSeconds: TOPAZ_SOURCE_SECONDS,\n tool: { kind: \"upscale\", upscaleFactor: { min: 1, max: 4 }, maxOutputLongEdge: 3840 },\n },\n defaults: {},\n providerOptions: { fal: { model: \"Starlight Precise 2.6\" } },\n usage: SECONDS_USAGE,\n pricingKind: \"video_per_second\",\n display: {\n provider: \"topaz\",\n logo: TOPAZ_LOGO,\n description:\n \"Topaz Starlight Precise 2.6: generative upscaling that rebuilds fine detail, up to 4K. Slower and costlier than Precision.\",\n sortOrder: 10,\n },\n },\n {\n id: \"topaz-apollo\",\n aliases: [],\n label: \"Topaz Apollo\",\n type: \"video-tool\",\n adapter: \"fal\",\n providerModelId: \"topaz/interpolate/video\",\n lifecycle: \"active\",\n exposure: [\"cowork\"],\n constraints: {\n supports: [],\n sourceVideoSeconds: TOPAZ_SOURCE_SECONDS,\n tool: { kind: \"interpolate\", fps: { min: 16, max: 120 } },\n },\n defaults: {},\n providerOptions: { fal: { model: \"Apollo\" } },\n usage: SECONDS_USAGE,\n pricingKind: \"video_per_second\",\n display: {\n provider: \"topaz\",\n logo: TOPAZ_LOGO,\n description:\n \"Topaz Apollo frame interpolation: smoother motion at up to 120 fps, same length as the source.\",\n },\n },\n {\n id: \"topaz-hyperion-2.5\",\n aliases: [],\n label: \"Topaz Hyperion 2.5\",\n type: \"video-tool\",\n adapter: \"fal\",\n providerModelId: \"topaz/sdr-to-hdr/video\",\n lifecycle: \"active\",\n exposure: [\"cowork\"],\n constraints: {\n supports: [],\n sourceVideoSeconds: TOPAZ_SOURCE_SECONDS,\n tool: { kind: \"hdr\", outputFormats: [\"h265\", \"prores\"] },\n },\n defaults: {},\n usage: SECONDS_USAGE,\n pricingKind: \"video_per_second\",\n display: {\n provider: \"topaz\",\n logo: TOPAZ_LOGO,\n description:\n \"Topaz Hyperion 2.5 SDR to HDR: a 10-bit HDR master in H.265 (HDR10) or ProRes 422 HQ, at the source's size and frame rate.\",\n },\n },\n {\n id: \"flux-video-upscale-precise\",\n aliases: [],\n label: \"FLUX Upscale Precise\",\n type: \"video-tool\",\n adapter: \"fal\",\n providerModelId: \"blackforestlabs/flux-video-upscale\",\n lifecycle: \"active\",\n exposure: [\"space_builder\"],\n constraints: {\n supports: [],\n sourceVideoSeconds: FLUX_SOURCE_SECONDS,\n tool: FLUX_UPSCALE_TOOL,\n },\n defaults: {},\n providerOptions: { fal: { input: { creativity: 0 } } },\n usage: SECONDS_USAGE,\n pricingKind: \"video_per_second\",\n display: {\n provider: \"black-forest-labs\",\n logo: FLUX_LOGO,\n description:\n \"FLUX 3 super-resolution, source-faithful: 1.5x to 3x, up to 4K, for clips up to 20 seconds.\",\n sortOrder: 30,\n },\n },\n {\n id: \"flux-video-upscale-creative\",\n aliases: [],\n label: \"FLUX Upscale Creative\",\n type: \"video-tool\",\n adapter: \"fal\",\n providerModelId: \"blackforestlabs/flux-video-upscale\",\n lifecycle: \"active\",\n exposure: [\"space_builder\"],\n constraints: {\n supports: [],\n sourceVideoSeconds: FLUX_SOURCE_SECONDS,\n tool: FLUX_UPSCALE_TOOL,\n },\n defaults: {},\n providerOptions: { fal: { input: { creativity: 1 } } },\n usage: SECONDS_USAGE,\n pricingKind: \"video_per_second\",\n display: {\n provider: \"black-forest-labs\",\n logo: FLUX_LOGO,\n description:\n \"FLUX 3 super-resolution that adds fine detail, optionally guided by a prompt: 1.5x to 3x, up to 4K, for clips up to 20 seconds. Costs more than Precise.\",\n sortOrder: 40,\n },\n },\n {\n // https://fal.ai/models/fal-ai/flashvsr/upscale/video/api: upscale_factor 1-4, X264 MP4\n // by default; fal bills $0.0005 per output megapixel-frame (width x height x frames).\n // Retired (ENG-3314): the price rows tier by short edge, which under-prices square, wide\n // and above-4k outputs.\n id: \"flashvsr\",\n aliases: [\"flashvsr-upscale\"],\n label: \"FlashVSR\",\n type: \"video-tool\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/flashvsr/upscale/video\",\n lifecycle: \"retired\",\n replacedBy: \"flux-video-upscale-precise\",\n exposure: [],\n constraints: {\n supports: [],\n tool: { kind: \"upscale\", upscaleFactor: { min: 1, max: 4 } },\n },\n defaults: {},\n // fal drops the source soundtrack unless asked to copy it.\n providerOptions: { fal: { input: { preserve_audio: true } } },\n usage: SECONDS_USAGE,\n pricingKind: \"video_per_second\",\n display: {\n provider: \"flashvsr\",\n description:\n \"FlashVSR one-step diffusion video super-resolution: fast 1x to 4x upscaling that keeps the source's motion and sound.\",\n },\n },\n {\n // https://fal.ai/models/fal-ai/ltx-2.3-quality/hdr/api: a prompt is required; the output\n // is a ZIP of 16-bit EXR frames plus an MP4 preview, at most ~720p (short edge 704 px)\n // and 481 frames at up to 60 fps. fal bills $0.0027075 per output megapixel-frame.\n id: \"ltx-2.3-hdr\",\n aliases: [],\n label: \"LTX 2.3 HDR\",\n type: \"video-tool\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/ltx-2.3-quality/hdr\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n supports: [],\n tool: {\n kind: \"hdr\",\n outputFormats: [\"exr\"],\n prompt: true,\n maxOutputShortEdge: 704,\n minOutputFrames: 9,\n maxOutputFrames: 481,\n maxOutputFps: 60,\n },\n },\n defaults: {},\n usage: SECONDS_USAGE,\n pricingKind: \"video_per_second\",\n display: {\n provider: \"lightricks\",\n logo: \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/lightricks.png\",\n description:\n \"LTX 2.3 SDR to HDR: lifts a clip of up to 20 seconds into 16-bit EXR HDR frames at up to 720p, with an MP4 preview.\",\n },\n },\n {\n id: \"veed-video-background-removal\",\n aliases: [\"veed/video-background-removal/fast\"],\n label: \"VEED Video Background Removal\",\n type: \"video-tool\",\n adapter: \"fal\",\n providerModelId: \"veed/video-background-removal/fast\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: { supports: [], tool: { kind: \"bg-remove\" } },\n defaults: {},\n usage: { unit: \"seconds\" },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"veed\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/d540d2bb-0022-4371-8889-48aefaf46bbe.png\",\n description:\n \"VEED video background removal; cuts the subject out of a clip and returns a transparent VP9 WebM.\",\n },\n },\n VEED_SUBTITLES,\n];\n","import type { CatalogModel } from \"../types.js\";\nimport { IMAGE_MODELS } from \"./image.js\";\nimport { MEDIA_NODE_MODELS } from \"./media-nodes.js\";\nimport { MODEL3D_MODELS } from \"./model3d.js\";\nimport { OTHER_MODELS } from \"./other.js\";\nimport { TEXT_MODELS } from \"./text.js\";\nimport { VIDEO_MODELS } from \"./video.js\";\nimport { VIDEO_TOOL_MODELS } from \"./video-tools.js\";\n\n/**\n * Every row, aggregated from the exported per-type collections only, so a row added anywhere\n * else never reaches MODELS without its collection. Seeded from Cowork, Space Builder and\n * trigger-workflows. See catalog/*.ts.\n */\nexport const MODELS: CatalogModel[] = [\n ...TEXT_MODELS,\n ...IMAGE_MODELS,\n ...VIDEO_MODELS,\n ...VIDEO_TOOL_MODELS,\n ...MODEL3D_MODELS,\n ...OTHER_MODELS,\n ...MEDIA_NODE_MODELS,\n];\n","import { z } from \"zod\";\nimport { isPixel, isPixelBox } from \"../resolve-provider-rules.js\";\nimport type { AdapterId, CatalogModel, ProviderOptionValue, Surface } from \"../types.js\";\nimport { collisionIssues } from \"./collisions.js\";\nimport { AudioOutputSchema, normaliseConventions, PromptConventionsSchema } from \"./conventions.js\";\nimport { normalizeExposure } from \"./exposure.js\";\nimport { model3dSpecIssues } from \"./model3d-spec.js\";\nimport { validateInputSpec } from \"./input-spec.js\";\nimport { optionListIssues } from \"./option-lists.js\";\n\nexport const ADAPTER_IDS = [\n \"ai-sdk-text\",\n \"google-image\",\n \"openai-image\",\n \"google-genai\",\n \"ark\",\n \"fal\",\n \"replicate\",\n \"prodia\",\n \"higgsfield\",\n \"xai-video\",\n \"luma\",\n] as const;\n\ntype MissingAdapterIds = Exclude<AdapterId, (typeof ADAPTER_IDS)[number]>;\ntype ExtraAdapterIds = Exclude<(typeof ADAPTER_IDS)[number], AdapterId>;\nconst adapterIdsMatchUnion: [MissingAdapterIds | ExtraAdapterIds] extends [never]\n ? true\n : MissingAdapterIds | ExtraAdapterIds = true;\nvoid adapterIdsMatchUnion;\n\nconst ModelTypeSchema = z.enum([\n \"text\",\n \"image\",\n \"video\",\n \"audio\",\n \"sound-effect\",\n \"upscale\",\n \"bg-remove\",\n \"mask\",\n \"video-tool\",\n \"speech\",\n \"voice-change\",\n \"dubbing\",\n \"lipsync\",\n \"transcription\",\n \"model3d\",\n]);\nconst LifecycleSchema = z.enum([\"active\", \"deprecated\", \"retired\"]);\nexport const SurfaceSchema = z.enum([\"cowork\", \"space_builder\"]);\nexport const SURFACES = SurfaceSchema.options;\nexport const ExposureSchema: z.ZodType<Surface[], unknown> = z.preprocess(\n normalizeExposure,\n z.array(SurfaceSchema),\n) as z.ZodType<Surface[], unknown>;\nconst AdapterSchema = z.enum(ADAPTER_IDS);\nconst AspectRatioSchema = z.enum([\n \"1:1\",\n \"16:9\",\n \"9:16\",\n \"4:3\",\n \"3:4\",\n \"3:2\",\n \"2:3\",\n \"4:5\",\n \"5:4\",\n \"21:9\",\n \"9:21\",\n \"97:30\",\n \"1:4\",\n \"4:1\",\n \"1:8\",\n \"8:1\",\n \"adaptive\",\n]);\nconst ImageSizeSchema = z.enum([\"512\", \"1K\", \"2K\", \"4K\"]);\nexport const VideoResolutionSchema = z.enum([\"360p\", \"480p\", \"720p\", \"768p\", \"1080p\", \"2k\", \"4k\"]);\nconst ImageQualitySchema = z.enum([\"auto\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"]);\nconst OutputFormatSchema = z.enum([\"png\", \"jpeg\", \"webp\"]);\nconst RequiredInputSchema = z.enum([\"firstFrame\", \"sourceVideo\", \"references\", \"sourceAudio\"]);\nconst SupportedOptionSchema = z.enum([\n \"seed\",\n \"quality\",\n \"negativePrompt\",\n \"cfgScale\",\n \"generateAudio\",\n \"promptExpansion\",\n \"lastFrame\",\n \"count\",\n \"outputFormat\",\n \"scaleFactor\",\n \"safetySettings\",\n \"temperature\",\n \"upscale\",\n \"watermark\",\n \"safetyChecker\",\n \"taskType\",\n \"videoExtension\",\n \"instrumental\",\n \"lyrics\",\n \"style\",\n \"insertWindow\",\n \"points\",\n \"boxes\",\n]);\nconst UsageUnitSchema = z.enum([\n \"tokens\",\n \"images\",\n \"seconds\",\n \"reported_cost_usd\",\n \"compute_seconds\",\n \"requests\",\n]);\nconst PricingKindSchema = z.enum([\"token\", \"image_size\", \"video_per_second\", \"flat\"]);\n\nconst ProviderOptionValueSchema: z.ZodType<ProviderOptionValue> = z.lazy(() =>\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.array(ProviderOptionValueSchema),\n z.record(z.string(), ProviderOptionValueSchema),\n ]),\n);\nconst ProviderOptionsSchema = z.record(z.string(), z.record(z.string(), ProviderOptionValueSchema));\n\nconst VideoSecondsLimitsSchema = z.looseObject({\n min: z.number().optional(),\n max: z.number().optional(),\n total: z.number().optional(),\n editMin: z.number().optional(),\n});\n\nconst ReferenceLimitsSchema = z.looseObject({\n images: z.number().optional(),\n imagesWithVideo: z.number().optional(),\n videos: z.number().optional(),\n audios: z.number().optional(),\n total: z.number().optional(),\n audioOnly: z.boolean().optional(),\n videoSeconds: VideoSecondsLimitsSchema.optional(),\n audioSeconds: z\n .looseObject({\n min: z.number().optional(),\n max: z.number().optional(),\n total: z.number().optional(),\n })\n .optional(),\n audioFormats: z.array(z.string()).optional(),\n audioMaxBytes: z.number().positive().optional(),\n min: z\n .looseObject({\n images: z.number().int().nonnegative().optional(),\n videos: z.number().int().nonnegative().optional(),\n audios: z.number().int().nonnegative().optional(),\n })\n .optional(),\n});\n\nconst RangeSchema = z.looseObject({ min: z.number(), max: z.number() });\n\nconst VoiceOptionSchema = z.looseObject({\n id: z.string().min(1),\n name: z.string().min(1),\n gender: z.enum([\"male\", \"female\", \"neutral\"]).optional(),\n accent: z.string().optional(),\n languages: z.array(z.string().min(1)).optional(),\n description: z.string().optional(),\n previewUrl: z.url({ protocol: /^https$/ }).optional(),\n});\n\nconst LanguageOptionSchema = z.looseObject({\n code: z.string().min(1),\n name: z.string().min(1),\n});\nconst VideoToolConstraintsSchema = z.looseObject({\n kind: z.enum([\"upscale\", \"interpolate\", \"hdr\", \"bg-remove\", \"subtitles\"]),\n upscaleFactor: RangeSchema.optional(),\n maxOutputLongEdge: z.number().positive().optional(),\n prompt: z.boolean().optional(),\n fps: RangeSchema.optional(),\n outputFormats: z\n .array(z.enum([\"h265\", \"prores\", \"exr\"]))\n .min(1)\n .optional(),\n maxOutputShortEdge: z.number().positive().optional(),\n maxOutputFrames: z.number().positive().optional(),\n minOutputFrames: z.number().positive().optional(),\n maxOutputFps: z.number().positive().optional(),\n presets: z.array(z.string().min(1)).min(1).optional(),\n languages: z.array(z.string().min(1)).min(1).optional(),\n translationLanguages: z.array(z.string().min(1)).min(1).optional(),\n maxSecondsAbove1080p: z.number().positive().optional(),\n});\n\nconst Model3dTextureSchema = z.enum([\"none\", \"standard\", \"detailed\"]);\n\nconst Model3dConstraintsSchema = z.looseObject({\n family: z.enum([\"trellis\", \"hunyuan\", \"tripo\", \"rodin\", \"meshy\", \"hi3d\", \"sam\"]),\n endpoints: z.looseObject({\n text: z.string().min(1).optional(),\n image: z.string().min(1).optional(),\n multiImage: z.string().min(1).optional(),\n }),\n text: z.boolean(),\n imageRequired: z.boolean(),\n promptRequired: z.boolean().optional(),\n views: z.enum([\"none\", \"unordered\", \"ordered\", \"named\"]),\n maxImages: z.number().int().positive(),\n texture: z.array(Model3dTextureSchema),\n pbr: z.boolean(),\n textureRef: z.boolean(),\n seed: z.boolean(),\n seedMax: z.number().int().positive().optional(),\n resolutions: z\n .looseObject({\n label: z.string().min(1),\n options: z.array(z.string().min(1)).min(1),\n default: z.string().min(1),\n })\n .optional(),\n});\n\nconst ModelConstraintsSchema = z.looseObject({\n aspectRatios: z.array(AspectRatioSchema).optional(),\n sizes: z.array(ImageSizeSchema).optional(),\n resolutions: z.array(VideoResolutionSchema).optional(),\n durations: z\n .union([z.looseObject({ min: z.number(), max: z.number() }), z.array(z.number())])\n .optional(),\n durationPresets: z.array(z.number()).optional(),\n qualityOptions: z.array(z.string()).optional(),\n scaleFactors: z.array(z.number().positive()).min(1).optional(),\n exactSizes: z.record(z.string(), z.string()).optional(),\n references: ReferenceLimitsSchema.optional(),\n requires: z.array(RequiredInputSchema).optional(),\n requiresOneOf: z.array(RequiredInputSchema).min(2).optional(),\n noPrompt: z.boolean().optional(),\n supports: z.array(SupportedOptionSchema).optional(),\n ratioIgnoredWith: z.array(z.enum([\"firstFrame\", \"sourceVideo\"])).optional(),\n voices: z.array(VoiceOptionSchema).optional(),\n languages: z.array(LanguageOptionSchema).optional(),\n outputFormats: z.array(z.string().min(1)).min(1).optional(),\n sourceVideoSeconds: VideoSecondsLimitsSchema.omit({ total: true })\n .extend({ inReferenceTotal: z.boolean().optional() })\n .optional(),\n // segmentSeconds/maxTotalSeconds stay required: a kit before 0.3.0 drops a row whose\n // extension lacks them, so every extension block keeps them.\n extension: z\n .looseObject({\n segmentSeconds: z.number(),\n maxTotalSeconds: z.number(),\n returns: z.enum([\"new\", \"joined\"]).optional(),\n })\n .optional(),\n tool: VideoToolConstraintsSchema.optional(),\n model3d: Model3dConstraintsSchema.optional(),\n // Loose on purpose: the read path keeps a row whose value is invalid (the accessors in\n // conventions.ts read it as \"not set\"); CatalogModelSchema below rejects it on write.\n audio: z.unknown().optional(),\n prompt: z.unknown().optional(),\n});\n\nconst MediaRefSchema = z.union([\n z.looseObject({\n url: z.string(),\n label: z.string().optional(),\n durationSeconds: z.number().optional(),\n }),\n z.looseObject({\n bytes: z.instanceof(Uint8Array),\n mime: z.string(),\n label: z.string().optional(),\n durationSeconds: z.number().optional(),\n }),\n]);\n\nconst ImageSafetySettingSchema = z.looseObject({ category: z.string(), threshold: z.string() });\n\nconst UpscaleOptionsSchema = z.looseObject({\n enhanceModel: z.string().optional(),\n subjectDetection: z.string().optional(),\n faceEnhancement: z.boolean().optional(),\n faceEnhancementCreativity: z.number().optional(),\n faceEnhancementStrength: z.number().optional(),\n});\n\n// The request path's own rules: a default the SAM 3 resolver would refuse on every call is\n// rejected here instead of failing each request.\nconst PixelSchema = z.number().refine(isPixel, \"must be a whole, non-negative pixel\");\n\nconst MaskPointSchema = z.looseObject({\n x: PixelSchema,\n y: PixelSchema,\n label: z.enum([\"foreground\", \"background\"]).optional(),\n});\n\nconst MaskBoxSchema = z\n .looseObject({ xMin: PixelSchema, yMin: PixelSchema, xMax: PixelSchema, yMax: PixelSchema })\n .refine(isPixelBox, \"a box needs xMax > xMin and yMax > yMin\");\n\n// Shape only: the window's bounds belong to the endpoint (checkInsertWindow), not to the row.\nconst InsertWindowSchema = z.looseObject({ startSeconds: z.number(), resumeSeconds: z.number() });\n\nconst DefaultsSchema = z.looseObject({\n references: z.array(MediaRefSchema).optional(),\n aspectRatio: AspectRatioSchema.optional(),\n size: ImageSizeSchema.optional(),\n exactSize: z.string().optional(),\n quality: ImageQualitySchema.optional(),\n seed: z.number().optional(),\n count: z.number().optional(),\n // Image rows take OutputFormatSchema; audio rows one of constraints.outputFormats (checked on write).\n outputFormat: z.union([OutputFormatSchema, z.string().min(1)]).optional(),\n scaleFactor: z.number().optional(),\n safetySettings: z.array(ImageSafetySettingSchema).optional(),\n temperature: z.number().optional(),\n upscale: UpscaleOptionsSchema.optional(),\n points: z.array(MaskPointSchema).optional(),\n boxes: z.array(MaskBoxSchema).optional(),\n firstFrame: MediaRefSchema.optional(),\n lastFrame: MediaRefSchema.optional(),\n sourceVideo: MediaRefSchema.optional(),\n referenceImages: z.array(MediaRefSchema).optional(),\n referenceVideos: z.array(MediaRefSchema).optional(),\n referenceAudios: z.array(MediaRefSchema).optional(),\n resolution: VideoResolutionSchema.optional(),\n durationSeconds: z.number().optional(),\n generateAudio: z.boolean().optional(),\n negativePrompt: z.string().optional(),\n cfgScale: z.number().optional(),\n promptExpansion: z.enum([\"fast\", \"balanced\", \"quality\"]).optional(),\n watermark: z.boolean().optional(),\n safetyChecker: z.boolean().optional(),\n insertWindow: InsertWindowSchema.optional(),\n taskType: z.enum([\"reference\", \"edit\", \"extend\"]).optional(),\n mode: z.enum([\"standard\", \"pro\"]).optional(),\n instrumental: z.boolean().optional(),\n lyrics: z.string().optional(),\n voice: z.string().optional(),\n language: z.string().optional(),\n});\n\nconst CatalogDisplaySchema = z.looseObject({\n provider: z.string(),\n description: z.string(),\n logo: z.string().optional(),\n costTier: z.union([z.literal(1), z.literal(2), z.literal(3)]).optional(),\n recommended: z.boolean().optional(),\n sortOrder: z.number().optional(),\n chat: z\n .looseObject({\n providerOptions: ProviderOptionsSchema.optional(),\n temperature: z.number().optional(),\n })\n .optional(),\n});\n\nconst CatalogCapabilitiesSchema = z.looseObject({\n acceptsSourceVideo: z.boolean().optional(),\n videoEdit: z.boolean().optional(),\n framesExcludeReferences: z.boolean().optional(),\n sourceVideoExcludesFrames: z.boolean().optional(),\n lastFrameRequiresFirstFrame: z.boolean().optional(),\n reasoning: z.boolean().optional(),\n vision: z.boolean().optional(),\n contextWindow: z.number().optional(),\n});\n\nexport const CatalogModelSchemaBase = z\n .looseObject({\n id: z.string().min(1),\n aliases: z.array(z.string()).default([]),\n label: z.string().min(1),\n type: ModelTypeSchema,\n adapter: AdapterSchema,\n providerModelId: z.string().min(1),\n lifecycle: LifecycleSchema,\n replacedBy: z.string().optional(),\n exposure: ExposureSchema,\n constraints: ModelConstraintsSchema,\n defaults: DefaultsSchema,\n providerOptions: ProviderOptionsSchema.optional(),\n usage: z.looseObject({\n unit: UsageUnitSchema,\n slug: z.string().optional(),\n providerLabel: z.string().optional(),\n }),\n pricingKind: PricingKindSchema,\n display: CatalogDisplaySchema.optional(),\n capabilities: CatalogCapabilitiesSchema.optional(),\n })\n .superRefine((row, ctx) => {\n if (row.lifecycle === \"active\" && !row.display) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"display\"],\n message: \"active rows need display\",\n });\n }\n if (row.lifecycle === \"active\" && row.type === \"text\" && !row.capabilities?.contextWindow) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"capabilities\", \"contextWindow\"],\n message: \"active text rows need contextWindow\",\n });\n }\n if (row.type === \"video-tool\" && row.constraints.tool === undefined) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"constraints\", \"tool\"],\n message: \"video-tool rows need constraints.tool\",\n });\n }\n if (row.type === \"model3d\") {\n const spec = row.constraints.model3d;\n if (spec === undefined) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"constraints\", \"model3d\"],\n message: \"model3d rows need constraints.model3d\",\n });\n } else {\n for (const issue of model3dSpecIssues(spec)) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"constraints\", \"model3d\", ...issue.path],\n message: issue.message,\n });\n }\n }\n }\n if (row.replacedBy !== undefined && row.replacedBy === row.id) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"replacedBy\"],\n message: \"replacedBy must not equal id\",\n });\n }\n });\n\n// Zod infers `prop?: T | undefined` for optional fields while CatalogModel\n// declares them `prop?: T`; the shapes match at runtime and the UNKNOWN-keys\n// tolerance of looseObject is intentional, so the contract type is asserted.\n// SAFETY: zod output matches CatalogModel at runtime; only optional undefined variance differs.\n// The write path (pro-backend validates every admin edit with this schema) also rejects an\n// unknown transport, an invalid inputSpec, and an invalid `constraints.audio` or\n// `constraints.prompt`. The read path (the per-row base parse in load.ts quarantine) stays tolerant on purpose: a value a newer kit adds must not make an\n// older kit reject the whole catalog. A row whose providerOptions.modelkit.inputSpec is\n// present but invalid is kept with one warning; calls fail loudly at call time until it is fixed.\nexport const CatalogModelSchema: z.ZodType<CatalogModel> = CatalogModelSchemaBase.superRefine(\n (row, ctx) => {\n const transport = row.providerOptions?.[\"modelkit\"]?.[\"transport\"];\n if (transport !== undefined && transport !== \"direct\" && transport !== \"bedrock\") {\n ctx.addIssue({\n code: \"custom\",\n path: [\"providerOptions\", \"modelkit\", \"transport\"],\n message: 'transport must be \"direct\" or \"bedrock\"',\n });\n }\n const inputSpecRaw = row.providerOptions?.[\"modelkit\"]?.[\"inputSpec\"];\n if (inputSpecRaw !== undefined) {\n const result = validateInputSpec(inputSpecRaw, row);\n if (!result.ok) {\n for (const issue of result.issues) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"providerOptions\", \"modelkit\", \"inputSpec\", ...issue.path],\n message: issue.message,\n });\n }\n }\n }\n const audio = row.constraints.audio;\n if (audio !== undefined && !AudioOutputSchema.safeParse(audio).success) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"constraints\", \"audio\"],\n message: 'audio must be \"always\", \"optional\" or \"never\"',\n });\n }\n const refs = row.constraints.references;\n for (const kind of [\"images\", \"videos\", \"audios\"] as const) {\n const least = refs?.min?.[kind];\n const most = refs?.[kind];\n if (least !== undefined && most !== undefined && least > most) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"constraints\", \"references\", \"min\", kind],\n message: `references.min.${kind} ${least} is over references.${kind} ${most}`,\n });\n }\n }\n for (const issue of optionListIssues(row)) {\n ctx.addIssue({ code: \"custom\", path: issue.path, message: issue.message });\n }\n const prompt = row.constraints.prompt;\n if (prompt !== undefined) {\n const parsed = PromptConventionsSchema.safeParse(prompt);\n if (!parsed.success) {\n for (const issue of parsed.error.issues) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"constraints\", \"prompt\", ...issue.path.map(String)],\n message: issue.message,\n });\n }\n }\n }\n },\n) as z.ZodType<CatalogModel>;\n\n// SAFETY: array items match CatalogModel at runtime; only optional undefined variance differs.\nexport const CatalogSchema: z.ZodType<CatalogModel[]> = z\n .array(CatalogModelSchemaBase.transform((row) => normaliseConventions(row).row))\n .superRefine((rows, ctx) => {\n for (const issue of collisionIssues(rows)) {\n ctx.addIssue({\n code: \"custom\",\n path: [issue.index, ...issue.path],\n message: issue.message,\n });\n }\n }) as z.ZodType<CatalogModel[]>;\n","import { ModelKitError } from \"./errors.js\";\nimport type { OnUnsupported } from \"./resolve-options.js\";\nimport type {\n AudioRequest,\n CatalogModel,\n ImageRequest,\n MaskBox,\n VideoRequest,\n Warning,\n} from \"./types.js\";\n\n// Acceptance rules of single provider endpoints that the row schema cannot express. The\n// resolvers apply them, so `resolveOptions` refuses or coerces exactly what the client would;\n// the adapters re-check the same rules defensively for callers that skip the resolver.\n\ntype Row = Pick<CatalogModel, \"id\" | \"label\">;\n\n/** A rule's refusal, worded as the fal planners word it: \"<row label>: <message>\". */\nexport function ruleRefusal(row: Row, message: string, code: RuleProblem[\"code\"]) {\n return new ModelKitError({\n code,\n message: `${row.label}: ${message}`,\n model: row.id,\n retryable: false,\n });\n}\n\n/** Request fields a SAM 3 mask cannot take: it returns masks at the source size. */\nexport const MASK_SIZE_FIELDS = [\"aspectRatio\", \"size\", \"exactSize\"] as const;\n\n/** SAM 3 takes points and box corners in whole, non-negative source pixels. */\nexport function isPixel(n: number): boolean {\n return Number.isInteger(n) && n >= 0;\n}\n\n/** A box in pixel corners with positive width and height. */\nexport function isPixelBox(b: MaskBox): boolean {\n return [b.xMin, b.yMin, b.xMax, b.yMax].every(isPixel) && b.xMax > b.xMin && b.yMax > b.yMin;\n}\n\nexport interface RuleProblem {\n code: \"missing_input\" | \"unsupported_option\";\n message: string;\n}\n\nfunction geometryProblem(req: Pick<ImageRequest, \"points\" | \"boxes\">): string | undefined {\n if ((req.points ?? []).some((p) => !isPixel(p.x) || !isPixel(p.y))) {\n return \"points take whole, non-negative pixel coordinates\";\n }\n if (!(req.boxes ?? []).every(isPixelBox)) {\n return \"boxes take whole, non-negative pixel corners with xMax > xMin and yMax > yMin\";\n }\n return undefined;\n}\n\nfunction sizeMessage(field: string): string {\n return `returns masks at the source size and takes no ${field}`;\n}\n\n/** Why SAM 3 (`mask` rows) cannot take this request, or undefined when it can. */\nexport function maskProblem(req: ImageRequest): RuleProblem | undefined {\n // SAM 3's prompt defaults to \"wheel\", so a request without one would mask the wrong thing.\n if (req.prompt.trim().length === 0) {\n return { code: \"missing_input\", message: \"needs a prompt naming what to mask\" };\n }\n const sized = MASK_SIZE_FIELDS.find((field) => req[field] !== undefined);\n if (sized !== undefined) return { code: \"unsupported_option\", message: sizeMessage(sized) };\n const geometry = geometryProblem(req);\n return geometry === undefined ? undefined : { code: \"unsupported_option\", message: geometry };\n}\n\n/** `mask` rows: under `coerce` sizing fields drop with a warning; anything else is refused. */\nexport function applyMaskRules(\n model: CatalogModel,\n req: ImageRequest,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): void {\n if (onUnsupported === \"coerce\" && req.prompt.trim().length > 0) {\n for (const field of MASK_SIZE_FIELDS) {\n if (req[field] === undefined) continue;\n warnings.push({\n code: \"option_ignored\",\n field,\n from: req[field],\n message: `${model.id} ${sizeMessage(field)}; ignored`,\n });\n delete req[field];\n }\n }\n const problem = maskProblem(req);\n if (problem !== undefined) throw ruleRefusal(model, problem.message, problem.code);\n}\n\n/** fal's MiniMax Music 3 endpoint: its `lyrics` field is required. */\nexport const MINIMAX_MUSIC_3 = \"minimax/music-3\";\n\n/** MiniMax Music 3 sings lyrics or plays an instrumental; it has no default for either. */\nexport function musicLyricsProblem(\n endpoint: string,\n req: Pick<AudioRequest, \"lyrics\" | \"instrumental\">,\n): string | undefined {\n if (endpoint !== MINIMAX_MUSIC_3) return undefined;\n if ((req.lyrics ?? \"\").trim().length > 0 || req.instrumental === true) return undefined;\n return \"needs lyrics, or instrumental: true\";\n}\n\n/** fal's music and sound-effect endpoints that `generateAudio` maps (adapters/fal-audio-plan.ts). */\nexport const FAL_AUDIO = {\n elevenLabsMusic: \"elevenlabs/music/v2.5\",\n minimaxMusic: MINIMAX_MUSIC_3,\n elevenLabsSfx: \"fal-ai/elevenlabs/sound-effects/v2\",\n mireloText: \"mirelo-ai/sfx2.0/text-to-audio\",\n mireloVideo: \"mirelo-ai/sfx2.0/video-to-audio\",\n} as const;\n\nconst FAL_AUDIO_ENDPOINTS: ReadonlySet<string> = new Set(Object.values(FAL_AUDIO));\n\n/** Why a fal music or sound-effect endpoint cannot take this request, or undefined. */\nexport function falAudioProblem(endpoint: string, req: AudioRequest): RuleProblem | undefined {\n if (!FAL_AUDIO_ENDPOINTS.has(endpoint)) return undefined;\n // None of these endpoints has a field for an image or a second media input.\n if ((req.references ?? []).length > 0) {\n return { code: \"unsupported_option\", message: \"does not take references\" };\n }\n if (endpoint === FAL_AUDIO.mireloVideo) {\n return req.sourceVideo === undefined\n ? { code: \"missing_input\", message: \"needs sourceVideo\" }\n : undefined;\n }\n if (req.sourceVideo !== undefined) {\n return { code: \"unsupported_option\", message: \"does not take sourceVideo\" };\n }\n const lyrics = musicLyricsProblem(endpoint, req);\n if (lyrics !== undefined) return { code: \"missing_input\", message: lyrics };\n return req.prompt.trim().length === 0\n ? { code: \"missing_input\", message: \"needs a prompt\" }\n : undefined;\n}\n\n/** fal music and sound-effect rows: what the endpoint cannot take is refused in both modes. */\nexport function applyFalAudioRules(model: CatalogModel, req: AudioRequest): void {\n if (model.adapter !== \"fal\") return;\n const problem = falAudioProblem(model.providerModelId, withPromptForResolve(req));\n if (problem !== undefined) throw ruleRefusal(model, problem.message, problem.code);\n}\n\n/**\n * Resolution runs on drafts and config checks that carry no prompt yet (cowork resolves a\n * model config with `prompt: \"\"`), as it does for every older row. A blank prompt is still\n * refused by the adapter before any provider call; every other rule runs as written.\n */\nexport function withPromptForResolve<T extends { prompt: string }>(req: T): T {\n return req.prompt.trim().length > 0 ? req : { ...req, prompt: \"prompt\" };\n}\n\n/** xAI renders reference-to-video (references, or a pinned last frame) at up to 720p. */\nexport const XAI_REFERENCE_MAX_RESOLUTION = \"720p\";\n\nexport function xaiReferenceResolutionMessage(modelId: string): string {\n return `${modelId} renders reference images and a last frame at up to ${XAI_REFERENCE_MAX_RESOLUTION}`;\n}\n\n/** Whether the xai-video adapter sends this request in its reference mode. */\nexport function xaiReferenceMode(\n model: Pick<CatalogModel, \"constraints\">,\n req: Pick<VideoRequest, \"referenceImages\" | \"lastFrame\">,\n): boolean {\n const takesLastFrame = (model.constraints.supports ?? []).includes(\"lastFrame\");\n return (\n (req.referenceImages ?? []).length > 0 || (takesLastFrame && req.lastFrame !== undefined)\n );\n}\n\n/**\n * The resolution an xai-video request is lowered to, or undefined when it stands: 1080p in\n * reference mode is refused under \"error\" and lowered to 720p with a warning under \"coerce\".\n * The resolver and the adapter both apply it; only the adapter names itself on the error.\n */\nexport function xaiReferenceResolution(\n model: Pick<CatalogModel, \"id\" | \"constraints\">,\n req: Pick<VideoRequest, \"resolution\" | \"referenceImages\" | \"lastFrame\">,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n provider?: \"xai-video\",\n): typeof XAI_REFERENCE_MAX_RESOLUTION | undefined {\n if (req.resolution !== \"1080p\" || !xaiReferenceMode(model, req)) return undefined;\n const message = xaiReferenceResolutionMessage(model.id);\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message,\n ...(provider === undefined ? {} : { provider }),\n model: model.id,\n retryable: false,\n });\n }\n warnings.push({\n code: \"resolution_coerced\",\n field: \"resolution\",\n from: req.resolution,\n to: XAI_REFERENCE_MAX_RESOLUTION,\n message,\n });\n return XAI_REFERENCE_MAX_RESOLUTION;\n}\n\n/** xai-video rows: 1080p with references or a last frame is refused, or lowered to 720p. */\nexport function applyXaiVideoRules(\n model: CatalogModel,\n req: VideoRequest,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): void {\n if (model.adapter !== \"xai-video\") return;\n const lowered = xaiReferenceResolution(model, req, onUnsupported, warnings);\n if (lowered !== undefined) req.resolution = lowered;\n}\n\n/**\n * A row whose aspect ratio is the frame it renders its source into (Ray 3.2 Reframe): it\n * requires a source video and lists ratios without \"adaptive\", so the ratio is a target. Every\n * other edit row keeps the source's framing.\n */\nexport function takesTargetAspectRatio(model: Pick<CatalogModel, \"constraints\">): boolean {\n const ratios = model.constraints.aspectRatios ?? [];\n return (\n (model.constraints.requires ?? []).includes(\"sourceVideo\") &&\n ratios.length > 0 &&\n !ratios.includes(\"adaptive\")\n );\n}\n\n/** Luma renders 9:16 and 3:4 reframes at up to 720p. */\nexport const LUMA_REFRAME_VERTICAL_MAX_RESOLUTION = \"720p\";\n\n/** Whether a Luma reframe asks for a vertical target at 1080p, which Luma does not render. */\nexport function lumaReframeTooTall(req: Pick<VideoRequest, \"aspectRatio\" | \"resolution\">): boolean {\n const vertical = req.aspectRatio === \"9:16\" || req.aspectRatio === \"3:4\";\n return vertical && req.resolution === \"1080p\";\n}\n\n/**\n * luma rows that reframe a source: the target ratio must be a real ratio (an \"adaptive\" one\n * would fail at Luma after the hold), and a vertical 1080p target renders at 720p, so it is\n * refused or lowered here, where the quote reads it too.\n */\nexport function applyLumaVideoRules(\n model: CatalogModel,\n req: VideoRequest,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): void {\n if (model.adapter !== \"luma\" || !takesTargetAspectRatio(model)) return;\n if (req.aspectRatio === undefined || req.aspectRatio === \"adaptive\") {\n const listed = model.constraints.aspectRatios ?? [];\n const fallback =\n model.defaults.aspectRatio !== undefined && model.defaults.aspectRatio !== \"adaptive\"\n ? model.defaults.aspectRatio\n : listed[0];\n const message = `${model.id} needs a target aspect ratio: ${listed.join(\", \")}`;\n if (onUnsupported === \"error\" || fallback === undefined) {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message,\n model: model.id,\n retryable: false,\n });\n }\n warnings.push({\n code: \"ratio_coerced\",\n field: \"aspectRatio\",\n from: req.aspectRatio ?? \"adaptive\",\n to: fallback,\n message,\n });\n req.aspectRatio = fallback;\n }\n if (!lumaReframeTooTall(req)) return;\n const message = `${model.id} renders 9:16 and 3:4 reframes at up to ${LUMA_REFRAME_VERTICAL_MAX_RESOLUTION}`;\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message,\n model: model.id,\n retryable: false,\n });\n }\n warnings.push({\n code: \"resolution_coerced\",\n field: \"resolution\",\n from: req.resolution,\n to: LUMA_REFRAME_VERTICAL_MAX_RESOLUTION,\n message,\n });\n req.resolution = LUMA_REFRAME_VERTICAL_MAX_RESOLUTION;\n}\n\n/** fal's MiniMax H3 Max Insert endpoint. */\nexport const MINIMAX_H3_INSERT = \"minimax/h3-max/insert-video\";\n// fal schema: start_time minimum 1.625, resume_time exclusiveMinimum 1.625, both maximum 60.\nconst INSERT_MIN = 1.625;\nconst INSERT_MAX = 60;\n\nexport type InsertWindowCheck =\n | { ok: true; startSeconds: number; resumeSeconds: number }\n | ({ ok: false } & RuleProblem);\n\n/** Where H3 Max Insert starts its scene and resumes the source, within the fal schema's bounds. */\nexport function checkInsertWindow(\n req: Pick<VideoRequest, \"insertWindow\" | \"sourceVideo\">,\n): InsertWindowCheck {\n const window = req.insertWindow;\n if (window === undefined) {\n return {\n ok: false,\n code: \"missing_input\",\n message: \"needs an insert window (start and resume times)\",\n };\n }\n const { startSeconds, resumeSeconds } = window;\n const startOk = startSeconds >= INSERT_MIN && startSeconds <= INSERT_MAX;\n const resumeOk = resumeSeconds > INSERT_MIN && resumeSeconds <= INSERT_MAX;\n if (!startOk || !resumeOk) {\n return {\n ok: false,\n code: \"unsupported_option\",\n message: `starts the scene at ${INSERT_MIN}-${INSERT_MAX} s and resumes after ${INSERT_MIN} s, by ${INSERT_MAX} s`,\n };\n }\n if (resumeSeconds < startSeconds) {\n return {\n ok: false,\n code: \"unsupported_option\",\n message: \"resumes the source at or after the insert start\",\n };\n }\n const sourceSeconds = req.sourceVideo?.durationSeconds;\n if (sourceSeconds !== undefined && resumeSeconds > sourceSeconds) {\n return {\n ok: false,\n code: \"unsupported_option\",\n message: `resumes at ${resumeSeconds} s, past the ${sourceSeconds} s source`,\n };\n }\n return { ok: true, startSeconds, resumeSeconds };\n}\n","export interface CollisionRow {\n id: string;\n aliases: readonly string[];\n}\n\nexport interface CollisionIssue {\n index: number;\n path: (string | number)[];\n message: string;\n}\n\nexport function collisionIssues(rows: readonly CollisionRow[]): CollisionIssue[] {\n const issues: CollisionIssue[] = [];\n const seenIds = new Map<string, number>();\n const seenAliases = new Map<string, { index: number; aliasIndex: number }>();\n rows.forEach((row, index) => {\n if (seenIds.has(row.id)) {\n issues.push({\n index,\n path: [\"id\"],\n message: `Duplicate model id \"${row.id}\"`,\n });\n } else {\n // A canonical id wins over an earlier row's alias: the alias owner\n // is the row at fault, so the read path drops it, not the model.\n const aliasOwner = seenAliases.get(row.id);\n if (aliasOwner !== undefined) {\n issues.push({\n index: aliasOwner.index,\n path: [\"aliases\", aliasOwner.aliasIndex],\n message: `Alias \"${row.id}\" collides with a model id`,\n });\n }\n seenIds.set(row.id, index);\n }\n const local = new Set<string>();\n for (const [aliasIndex, alias] of row.aliases.entries()) {\n if (alias === row.id || seenIds.has(alias)) {\n issues.push({\n index,\n path: [\"aliases\", aliasIndex],\n message: `Alias \"${alias}\" collides with a model id`,\n });\n } else if (local.has(alias) || seenAliases.has(alias)) {\n issues.push({\n index,\n path: [\"aliases\", aliasIndex],\n message: `Duplicate alias \"${alias}\"`,\n });\n }\n local.add(alias);\n if (!seenAliases.has(alias)) seenAliases.set(alias, { index, aliasIndex });\n }\n });\n return issues;\n}\n","import { z } from \"zod\";\nimport type { AudioOutput, PromptConventions } from \"../types.js\";\n\nexport const AudioOutputSchema = z.enum([\"always\", \"optional\", \"never\"]);\nexport const ReferenceSyntaxSchema = z.enum([\"numbered\", \"caption\", \"descriptive\"]);\nconst MaxCharsSchema = z.number().int().positive();\n\n/** Write-path shape of `constraints.prompt`; the read path below tolerates bad data instead. */\nexport const PromptConventionsSchema = z.strictObject({\n referenceSyntax: ReferenceSyntaxSchema,\n maxChars: MaxCharsSchema.optional(),\n});\n\nexport const AUDIO_OUTPUTS = AudioOutputSchema.options;\nexport const REFERENCE_SYNTAXES = ReferenceSyntaxSchema.options;\n\n// Live rows are edited in pro-admin; a value an older kit wrote, or a typo that slipped past an\n// older pro-backend, reads as \"not set\" rather than failing the row.\nconst ConstraintsReadView = z.looseObject({\n audio: AudioOutputSchema.optional().catch(undefined),\n prompt: z\n .looseObject({\n referenceSyntax: ReferenceSyntaxSchema.catch(\"numbered\"),\n maxChars: MaxCharsSchema.optional().catch(undefined),\n })\n .optional()\n .catch(undefined),\n});\n\nconst DEFAULT_CONVENTIONS: PromptConventions = { referenceSyntax: \"numbered\" };\n\nexport function outputAudio(row: { constraints: unknown }): AudioOutput | undefined {\n const view = ConstraintsReadView.safeParse(row.constraints);\n return view.success ? view.data.audio : undefined;\n}\n\nconst DefaultsReadView = z.looseObject({\n generateAudio: z.boolean().optional().catch(undefined),\n});\n\n/**\n * Whether a video request is billed as having sound. `always` rows are true and `never` rows\n * false; an `optional` row takes the request's `generateAudio`, then the row's default, then\n * true. A row with no declared audio is true. Every fallback is true because the base video\n * price is the sound-on price: a guess must never pick the cheaper silent rate. Pass the same\n * `requested` value the request dispatches with, so the billed and generated sound agree.\n */\nexport function billedAudio(\n row: { constraints: unknown; defaults?: unknown },\n requested?: boolean,\n): boolean {\n const audio = outputAudio(row);\n if (audio === \"never\") return false;\n if (audio !== \"optional\") return true;\n if (requested !== undefined) return requested;\n const defaults = DefaultsReadView.safeParse(row.defaults);\n return (defaults.success ? defaults.data.generateAudio : undefined) ?? true;\n}\n\nexport function promptConventions(row: { constraints: unknown }): PromptConventions {\n const view = ConstraintsReadView.safeParse(row.constraints);\n const prompt = view.success ? view.data.prompt : undefined;\n if (prompt === undefined) return { ...DEFAULT_CONVENTIONS };\n const result: PromptConventions = { referenceSyntax: prompt.referenceSyntax };\n if (prompt.maxChars !== undefined) result.maxChars = prompt.maxChars;\n return result;\n}\n\n/**\n * Pure read-side cleanup for the two convention keys. The tolerant base schema lets any value\n * through so one bad key does not cost the row; this removes an invalid `audio` and replaces an\n * invalid `prompt` with its tolerant read. Returns the same row and `[]` when nothing changed;\n * never mutates the input.\n */\nexport interface NormalisedConventions<T> {\n row: T;\n invalidKeys: string[];\n}\n\nconst RawConventionsView = z.looseObject({\n audio: z.unknown().optional(),\n prompt: z.unknown().optional(),\n});\n\nexport function normaliseConventions<T extends { constraints: object }>(\n row: T,\n): NormalisedConventions<T> {\n const view = RawConventionsView.safeParse(row.constraints);\n if (!view.success) return { row, invalidKeys: [] };\n const { audio, prompt } = view.data;\n const badAudio = audio !== undefined && !AudioOutputSchema.safeParse(audio).success;\n const badPrompt = prompt !== undefined && !PromptConventionsSchema.safeParse(prompt).success;\n if (!badAudio && !badPrompt) return { row, invalidKeys: [] };\n const invalidKeys: string[] = [];\n if (badAudio) invalidKeys.push(\"constraints.audio\");\n if (badPrompt) invalidKeys.push(\"constraints.prompt\");\n const entries = Object.entries(row.constraints).flatMap(([key, value]) => {\n if (key === \"audio\" && badAudio) return [];\n if (key === \"prompt\" && badPrompt) return [[key, promptConventions(row)]];\n return [[key, value]];\n });\n return { row: { ...row, constraints: Object.fromEntries(entries) }, invalidKeys };\n}\n","import type {\n CatalogModel,\n Model3dConstraints,\n Model3dFamily,\n Model3dTexture,\n Model3dViews,\n} from \"../types.js\";\n\n/** A `model3d` row's spec, or undefined for any other row. */\nexport function model3dConstraints(row: CatalogModel): Model3dConstraints | undefined {\n if (row.type !== \"model3d\") return undefined;\n return row.constraints.model3d;\n}\n\n/** Which inputs a request carries (or a canvas node has wired). */\nexport interface Model3dWired {\n prompt: boolean;\n image: boolean;\n back: boolean;\n left: boolean;\n right: boolean;\n /** The fifth photo (`views.top`); only `unordered` rows read it. */\n top?: boolean;\n}\n\n/**\n * The image slots the fal adapter's request mapping (`model3dCall`) fills for each kind of\n * views, in the order it sends them. A row's `maxImages` may not exceed its kind's count.\n */\nexport const MODEL3D_IMAGE_SLOTS = {\n none: [\"image\"],\n named: [\"image\", \"back\", \"left\", \"right\"],\n ordered: [\"image\", \"left\", \"back\", \"right\"],\n unordered: [\"image\", \"back\", \"left\", \"right\", \"top\"],\n} as const satisfies Record<Model3dViews, readonly string[]>;\n\ninterface Model3dFamilyRules {\n /** Has a prompt-only endpoint; without one a text row must also require an image. */\n textPath: boolean;\n views: readonly Model3dViews[];\n /** Sends a request with views to `endpoints.multiImage`. */\n multiImage: boolean;\n /** The value the request mapping sends for each texture option; null when it has no texture switch. */\n texture: null | Readonly<Partial<Record<Model3dTexture, string | boolean | null>>>;\n pbr: boolean;\n seed: boolean;\n textureRef: boolean;\n /** null: no resolution option. \"integer\": sent as a number. Else the value sent for each option. */\n resolutions: null | \"integer\" | Readonly<Record<string, string>>;\n}\n\n/**\n * What the fal adapter's request mapping (fal-model3d.ts `model3dCall`) and the pricing SKUs\n * read for each family. A row may offer only what its family reads, and must carry every\n * endpoint and option that mapping needs, so that every request `model3dInputRefusal` lets\n * through can be submitted and priced. The texture and resolution maps are both the options a\n * row may offer and the provider values the mapping sends for them, so an option cannot be\n * offered without a value to send.\n */\nexport const MODEL3D_FAMILY_RULES = {\n trellis: {\n textPath: false,\n views: [\"none\"],\n multiImage: false,\n texture: null,\n pbr: false,\n seed: true,\n textureRef: false,\n resolutions: \"integer\",\n },\n hunyuan: {\n textPath: true,\n views: [\"none\", \"named\"],\n multiImage: false,\n // generate_type\n texture: { none: \"Geometry\", standard: \"Normal\" },\n pbr: true,\n seed: false,\n textureRef: false,\n resolutions: null,\n },\n tripo: {\n textPath: true,\n views: [\"none\", \"ordered\"],\n multiImage: true,\n // texture_quality; null sends an untextured model.\n texture: { none: null, standard: \"standard\", detailed: \"detailed\" },\n pbr: true,\n seed: true,\n textureRef: false,\n resolutions: null,\n },\n rodin: {\n textPath: true,\n views: [\"none\", \"unordered\"],\n multiImage: false,\n texture: null,\n pbr: false,\n seed: true,\n textureRef: false,\n resolutions: null,\n },\n meshy: {\n textPath: true,\n views: [\"none\", \"unordered\"],\n multiImage: true,\n // The text endpoint's mode; the image endpoints take should_texture.\n texture: { none: \"preview\", standard: \"full\" },\n pbr: true,\n seed: true,\n textureRef: true,\n resolutions: null,\n },\n hi3d: {\n textPath: false,\n views: [\"none\", \"named\"],\n multiImage: true,\n // enable_texture\n texture: { none: false, standard: true },\n pbr: true,\n seed: false,\n textureRef: false,\n resolutions: { quality: \"2048quality\", master: \"2048master\" },\n },\n sam: {\n textPath: false,\n views: [\"none\"],\n multiImage: false,\n texture: null,\n pbr: false,\n seed: true,\n textureRef: false,\n resolutions: null,\n },\n} as const satisfies Record<Model3dFamily, Model3dFamilyRules>;\n\n/** The fields of a `model3d` spec the write-path checks read, as the catalog schema parses them. */\nexport interface Model3dSpecCheckInput {\n family: Model3dFamily;\n endpoints: {\n text?: string | undefined;\n image?: string | undefined;\n multiImage?: string | undefined;\n };\n text: boolean;\n imageRequired: boolean;\n views: Model3dViews;\n maxImages: number;\n texture: readonly Model3dTexture[];\n pbr: boolean;\n textureRef: boolean;\n seed: boolean;\n seedMax?: number | undefined;\n resolutions?: { options: readonly string[]; default: string } | undefined;\n}\n\n/** Rules a `model3d` spec must hold for the adapter to serve every request it accepts. */\nexport function model3dSpecIssues(\n spec: Model3dSpecCheckInput,\n): { path: string[]; message: string }[] {\n const issues: { path: string[]; message: string }[] = [];\n const add = (path: string[], message: string) => issues.push({ path, message });\n const rules: Model3dFamilyRules = MODEL3D_FAMILY_RULES[spec.family];\n const promptOnly = spec.text && !spec.imageRequired;\n\n if (spec.endpoints.image === undefined)\n add([\"endpoints\", \"image\"], \"every row needs an image endpoint\");\n if (promptOnly && !rules.textPath) {\n add(\n [\"imageRequired\"],\n `${spec.family} has no text-to-3D endpoint; a text row needs an image`,\n );\n }\n if (promptOnly && spec.endpoints.text === undefined) {\n add([\"endpoints\", \"text\"], \"a text row needs a text endpoint\");\n }\n\n if (!rules.views.includes(spec.views)) {\n add([\"views\"], `${spec.family} takes views ${rules.views.join(\" or \")}`);\n }\n if (spec.views === \"none\" && spec.maxImages !== 1) {\n add([\"maxImages\"], \"a row without views takes 1 image\");\n }\n if (spec.views === \"unordered\" && spec.maxImages < 2) {\n add([\"maxImages\"], \"a row with views takes at least 2 images\");\n }\n // The request mapping fills a fixed set of image slots per views kind; a row may not\n // promise more images than it sends.\n const slots = MODEL3D_IMAGE_SLOTS[spec.views].length;\n if (spec.views !== \"none\" && spec.maxImages > slots) {\n add([\"maxImages\"], `a row with ${spec.views} views sends at most ${slots} images`);\n }\n // One slot per side; named and ordered rows send every slot set.\n if ((spec.views === \"named\" || spec.views === \"ordered\") && spec.maxImages < slots) {\n add(\n [\"maxImages\"],\n `a row with ${spec.views} views takes ${slots} images (front and three sides)`,\n );\n }\n if (spec.views !== \"none\" && rules.multiImage && spec.endpoints.multiImage === undefined) {\n add([\"endpoints\", \"multiImage\"], `${spec.family} sends views to a multi-image endpoint`);\n }\n\n if (rules.texture === null) {\n if (spec.texture.length > 0) add([\"texture\"], `${spec.family} has no texture switch`);\n } else {\n const allowed = rules.texture;\n if (spec.texture.length === 0) add([\"texture\"], `${spec.family} needs its texture options`);\n if (new Set(spec.texture).size !== spec.texture.length)\n add([\"texture\"], \"texture options repeat\");\n for (const t of spec.texture) {\n if (!Object.hasOwn(allowed, t))\n add([\"texture\"], `${spec.family} has no \"${t}\" texture`);\n }\n }\n if (spec.pbr && !rules.pbr) add([\"pbr\"], `${spec.family} has no PBR switch`);\n if (spec.pbr && !spec.texture.some((t) => t !== \"none\")) {\n add([\"pbr\"], \"PBR needs a textured option\");\n }\n if (spec.seed && !rules.seed) add([\"seed\"], `${spec.family} takes no seed`);\n if (spec.seedMax !== undefined && !spec.seed) add([\"seedMax\"], \"seedMax needs seed\");\n if (spec.textureRef && !rules.textureRef)\n add([\"textureRef\"], `${spec.family} takes no texture reference`);\n\n const res = spec.resolutions;\n if (rules.resolutions === null) {\n if (res !== undefined) add([\"resolutions\"], `${spec.family} has no resolution option`);\n } else if (res === undefined) {\n add([\"resolutions\"], `${spec.family} needs its resolution options`);\n } else {\n if (!res.options.includes(res.default)) {\n add([\"resolutions\", \"default\"], \"default must be an option\");\n }\n if (new Set(res.options).size !== res.options.length) {\n add([\"resolutions\", \"options\"], \"resolution options repeat\");\n }\n const allowed = rules.resolutions;\n for (const option of res.options) {\n const ok =\n allowed === \"integer\"\n ? /^[1-9][0-9]*$/.test(option)\n : Object.hasOwn(allowed, option);\n if (!ok)\n add([\"resolutions\", \"options\"], `${spec.family} has no \"${option}\" resolution`);\n }\n }\n return issues;\n}\n\nexport type Model3dInputRefusal =\n | \"model3d_needs_image\"\n | \"model3d_needs_prompt\"\n | \"model3d_needs_input\"\n | \"model3d_views_need_image\"\n | \"model3d_views_out_of_order\";\n\n/** Why a row cannot run with these inputs, or null when it can. */\nexport function model3dInputRefusal(\n spec: Model3dConstraints,\n wired: Model3dWired,\n): Model3dInputRefusal | null {\n const top = spec.views === \"unordered\" && wired.top === true;\n const anyView = spec.views !== \"none\" && (wired.back || wired.left || wired.right || top);\n if (anyView && !wired.image) return \"model3d_views_need_image\";\n if (spec.imageRequired && !wired.image) return \"model3d_needs_image\";\n if (spec.promptRequired && !wired.prompt) return \"model3d_needs_prompt\";\n if (!wired.image && !(spec.text && wired.prompt)) return \"model3d_needs_input\";\n if (spec.views === \"ordered\") {\n // Tripo reads views as front, left, back, right with no gaps.\n if ((wired.back || wired.right) && !wired.left) return \"model3d_views_out_of_order\";\n if (wired.right && !wired.back) return \"model3d_views_out_of_order\";\n }\n return null;\n}\n\n/** Whether the row's provider takes this seed: a non-negative integer up to its `seedMax`. */\nexport function model3dSeedFits(spec: Model3dConstraints, seed: number): boolean {\n return (\n Number.isSafeInteger(seed) && seed >= 0 && seed <= (spec.seedMax ?? Number.MAX_SAFE_INTEGER)\n );\n}\n\n/** The texture a request gets: its own when the row offers it, else the row's default. */\nexport function model3dTexture(\n spec: Model3dConstraints,\n requested: Model3dTexture | undefined,\n): Model3dTexture {\n if (requested !== undefined && spec.texture.includes(requested)) return requested;\n return spec.texture.includes(\"standard\") ? \"standard\" : (spec.texture[0] ?? \"standard\");\n}\n\n/** The resolution a request gets: its own when the row offers it, else the row's default. */\nexport function model3dResolution(\n spec: Model3dConstraints,\n requested: string | undefined,\n): string | undefined {\n const res = spec.resolutions;\n if (res === undefined) return undefined;\n return requested !== undefined && res.options.includes(requested) ? requested : res.default;\n}\n\n/** The options a request sets that change its price. */\nexport interface Model3dPricedOptions {\n texture?: Model3dTexture;\n pbr?: boolean;\n resolution?: string;\n}\n\n/**\n * What the request carries that changes its price: an image (Tripo prices text lower)\n * and side views (Hunyuan adds for them). A quote that cannot tell passes both true.\n */\nexport interface Model3dPricedInputs {\n image: boolean;\n views: boolean;\n}\n\n/** The pro-backend credit_pricing_flat key one request bills under. */\nexport function model3dPricingSku(\n row: CatalogModel,\n options: Model3dPricedOptions,\n inputs: Model3dPricedInputs,\n): string {\n const spec = model3dConstraints(row);\n if (spec === undefined) throw new Error(`${row.id} is not a 3D model`);\n const texture = model3dTexture(spec, options.texture);\n const textured = spec.texture.length > 0 && texture !== \"none\";\n const pbr = spec.pbr && textured && options.pbr === true;\n const resolution = model3dResolution(spec, options.resolution);\n switch (spec.family) {\n case \"meshy\":\n return `${row.id}__${textured ? \"textured\" : \"untextured\"}`;\n case \"tripo\":\n return `${row.id}__${inputs.image ? \"image\" : \"text\"}__${texture}`;\n case \"hunyuan\":\n return `${row.id}${pbr ? \"__pbr\" : \"\"}${inputs.views ? \"__views\" : \"\"}`;\n case \"trellis\":\n return `${row.id}__${resolution}`;\n case \"hi3d\":\n return `${row.id}__${resolution}__${\n textured ? (pbr ? \"texture-pbr\" : \"texture\") : \"geometry\"\n }`;\n case \"rodin\":\n case \"sam\":\n return row.id;\n }\n}\n\n/** Every SKU a row can bill under; pro-backend needs a price for each. */\nexport function model3dSkus(row: CatalogModel): string[] {\n const spec = model3dConstraints(row);\n if (spec === undefined) return [];\n const textures: (Model3dTexture | undefined)[] =\n spec.texture.length > 0 ? spec.texture : [undefined];\n const pbrs = spec.pbr ? [false, true] : [false];\n const resolutions: (string | undefined)[] = spec.resolutions?.options ?? [undefined];\n const images = spec.text && !spec.imageRequired ? [true, false] : [true];\n const views = spec.views === \"none\" ? [false] : [false, true];\n const skus = new Set<string>();\n for (const texture of textures)\n for (const pbr of pbrs)\n for (const resolution of resolutions)\n for (const image of images)\n for (const view of views) {\n if (view && !image) continue;\n skus.add(\n model3dPricingSku(\n row,\n {\n ...(texture !== undefined && { texture }),\n pbr,\n ...(resolution !== undefined && { resolution }),\n },\n { image, views: view },\n ),\n );\n }\n return [...skus].sort();\n}\n","import { z } from \"zod\";\nimport type { ProviderOptionValue, SupportedOption } from \"../types.js\";\n\nexport const VIDEO_INPUT_SPEC_KEYS = [\n \"prompt\",\n \"durationSeconds\",\n \"aspectRatio\",\n \"resolution\",\n \"firstFrame\",\n \"lastFrame\",\n \"seed\",\n \"negativePrompt\",\n \"generateAudio\",\n \"cfgScale\",\n \"promptExpansion\",\n \"referenceImages\",\n \"sourceVideo\",\n] as const;\n\nexport const IMAGE_INPUT_SPEC_KEYS = [\n \"prompt\",\n \"references\",\n \"aspectRatio\",\n \"size\",\n \"outputFormat\",\n \"seed\",\n] as const;\n\nexport const AUDIO_INPUT_SPEC_KEYS = [\n \"prompt\",\n \"durationSeconds\",\n \"seed\",\n \"negativePrompt\",\n \"references\",\n \"sourceVideo\",\n \"instrumental\",\n] as const;\n\n/** Image inputs that `inputSpec.arrays` can join into one provider array field. */\nexport const ARRAY_INPUT_SPEC_KEYS = [\n \"firstFrame\",\n \"referenceImages\",\n \"lastFrame\",\n \"references\",\n] as const;\n\nexport type ArrayInputSpecKey = (typeof ARRAY_INPUT_SPEC_KEYS)[number];\n\nexport type InputSpecKey =\n | (typeof VIDEO_INPUT_SPEC_KEYS)[number]\n | (typeof IMAGE_INPUT_SPEC_KEYS)[number]\n | (typeof AUDIO_INPUT_SPEC_KEYS)[number];\n\nexport const INPUT_SPEC_SUPPORTS_KEYS: readonly SupportedOption[] = [\n \"lastFrame\",\n \"seed\",\n \"negativePrompt\",\n \"generateAudio\",\n \"cfgScale\",\n \"promptExpansion\",\n \"outputFormat\",\n \"instrumental\",\n];\n\nconst VIDEO_KEY_SET: ReadonlySet<string> = new Set(VIDEO_INPUT_SPEC_KEYS);\nconst IMAGE_KEY_SET: ReadonlySet<string> = new Set(IMAGE_INPUT_SPEC_KEYS);\nconst AUDIO_KEY_SET: ReadonlySet<string> = new Set(AUDIO_INPUT_SPEC_KEYS);\nconst ARRAY_KEY_SET: ReadonlySet<string> = new Set(ARRAY_INPUT_SPEC_KEYS);\nconst ALL_KEY_SET: ReadonlySet<string> = new Set([\n ...VIDEO_INPUT_SPEC_KEYS,\n ...IMAGE_INPUT_SPEC_KEYS,\n ...AUDIO_INPUT_SPEC_KEYS,\n]);\n\nconst TYPES_BY_ADAPTER = new Map([\n [\"replicate\", [\"video\", \"image\", \"audio\"]],\n [\"fal\", [\"image\"]],\n]);\n\nconst ALLOWED_KEYS_BY_TYPE = new Map([\n [\"video\", VIDEO_KEY_SET],\n [\"image\", IMAGE_KEY_SET],\n [\"audio\", AUDIO_KEY_SET],\n]);\n\nconst ProviderScalarSchema = z.union([z.string(), z.number(), z.boolean()]);\n\nconst FieldsSchema = z.record(z.string(), z.string().min(1)).superRefine((fields, ctx) => {\n const keys = Object.keys(fields);\n if (keys.length === 0) {\n ctx.addIssue({\n code: \"custom\",\n message: \"inputSpec.fields must name at least one field\",\n });\n return;\n }\n for (const key of keys) {\n if (!ALL_KEY_SET.has(key)) {\n ctx.addIssue({\n code: \"custom\",\n message: `inputSpec.fields has unknown canonical key \"${key}\"`,\n });\n }\n }\n});\n\nconst ValuesSchema = z\n .record(z.string(), z.record(z.string(), ProviderScalarSchema))\n .superRefine((values, ctx) => {\n for (const key of Object.keys(values)) {\n if (!ALL_KEY_SET.has(key)) {\n ctx.addIssue({\n code: \"custom\",\n message: `inputSpec.values has unknown canonical key \"${key}\"`,\n });\n }\n }\n });\n\nconst StaticSchema = z.record(z.string(), ProviderScalarSchema);\n\nconst ArraysSchema = z\n .record(z.string().min(1), z.array(z.string()).min(1))\n .superRefine((arrays, ctx) => {\n for (const [name, keys] of Object.entries(arrays)) {\n for (const key of keys) {\n if (!ARRAY_KEY_SET.has(key)) {\n ctx.addIssue({\n code: \"custom\",\n path: [name],\n message: `inputSpec.arrays \"${name}\" has unknown image key \"${key}\"`,\n });\n }\n }\n }\n });\n\n/**\n * Sends `{ width, height }` in one provider field, computed from the request's\n * aspect ratio and size. `areas` is the target pixel count per size tier; the\n * long side is capped at `maxSide` and both sides round down to `multipleOf`.\n */\nconst DimensionsSchema = z.strictObject({\n field: z.string().min(1),\n areas: z\n .record(z.string(), z.number().int().positive())\n .refine((a) => Object.keys(a).length > 0, {\n message: \"inputSpec.dimensions.areas must name at least one size\",\n }),\n maxSide: z.number().int().positive().optional(),\n multipleOf: z.number().int().positive().optional(),\n});\n\nexport type InputSpecDimensions = z.infer<typeof DimensionsSchema>;\n\nexport const InputSpecSchema = z\n .strictObject({\n fields: FieldsSchema,\n values: ValuesSchema.optional(),\n static: StaticSchema.optional(),\n arrays: ArraysSchema.optional(),\n editEndpoint: z.string().min(1).optional(),\n dimensions: DimensionsSchema.optional(),\n })\n .superRefine((spec, ctx) => {\n const mappedNames = new Set([\n ...Object.values(spec.fields),\n ...Object.keys(spec.arrays ?? {}),\n ...(spec.dimensions ? [spec.dimensions.field] : []),\n ]);\n for (const key of Object.keys(spec.static ?? {})) {\n if (mappedNames.has(key)) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"static\", key],\n message: `inputSpec.static \"${key}\" collides with a mapped field name`,\n });\n }\n }\n });\n\nexport type InputSpec = z.infer<typeof InputSpecSchema>;\n\nexport interface InputSpecIssue {\n path: PropertyKey[];\n message: string;\n}\n\ninterface ValidateRow {\n type: string;\n adapter: string;\n constraints: { supports?: readonly SupportedOption[] | undefined };\n}\n\nexport function isInputSpecKey(key: string): key is InputSpecKey {\n return ALL_KEY_SET.has(key);\n}\n\nexport function isArrayInputSpecKey(key: string): key is ArrayInputSpecKey {\n return ARRAY_KEY_SET.has(key);\n}\n\nexport function validateInputSpec(\n raw: ProviderOptionValue,\n row: ValidateRow,\n): { ok: true; spec: InputSpec } | { ok: false; issues: InputSpecIssue[] } {\n const parsed = InputSpecSchema.safeParse(raw);\n if (!parsed.success) {\n return {\n ok: false,\n issues: parsed.error.issues.map((issue) => ({\n path: issue.path,\n message: issue.message,\n })),\n };\n }\n const spec = parsed.data;\n const supportedTypes = TYPES_BY_ADAPTER.get(row.adapter);\n if (supportedTypes === undefined) {\n return {\n ok: false,\n issues: [\n {\n path: [],\n message: \"inputSpec is only supported on replicate and fal rows\",\n },\n ],\n };\n }\n const issues: InputSpecIssue[] = [];\n const allowed = ALLOWED_KEYS_BY_TYPE.get(row.type);\n if (allowed === undefined || !supportedTypes.includes(row.type)) {\n issues.push({\n path: [],\n message:\n row.adapter === \"fal\"\n ? `inputSpec on fal rows is only supported for image rows, not \"${row.type}\"`\n : `inputSpec is not supported for \"${row.type}\" rows`,\n });\n } else {\n for (const key of Object.keys(spec.fields)) {\n if (!allowed.has(key)) {\n issues.push({\n path: [\"fields\", key],\n message: `inputSpec.fields \"${key}\" is not supported for ${row.type} rows`,\n });\n }\n }\n for (const key of Object.keys(spec.values ?? {})) {\n if (!allowed.has(key)) {\n issues.push({\n path: [\"values\", key],\n message: `inputSpec.values \"${key}\" is not supported for ${row.type} rows`,\n });\n }\n }\n }\n if (spec.editEndpoint !== undefined) {\n if (row.adapter !== \"fal\") {\n issues.push({\n path: [\"editEndpoint\"],\n message: \"inputSpec.editEndpoint is only supported on fal rows\",\n });\n } else if (!(\"references\" in spec.fields)) {\n issues.push({\n path: [\"editEndpoint\"],\n message: 'inputSpec.editEndpoint needs a \"references\" entry in inputSpec.fields',\n });\n }\n }\n const seenNames = new Map<string, string>();\n for (const [key, name] of Object.entries(spec.fields)) {\n const first = seenNames.get(name);\n if (first === undefined) seenNames.set(name, key);\n else {\n issues.push({\n path: [\"fields\", key],\n message: `inputSpec.fields \"${first}\" and \"${key}\" both map to \"${name}\"`,\n });\n }\n }\n for (const key of Object.keys(spec.values ?? {})) {\n if (!(key in spec.fields)) {\n issues.push({\n path: [\"values\", key],\n message: `inputSpec.values \"${key}\" has no matching fields entry`,\n });\n }\n }\n const arrayOwner = new Map<string, string>();\n for (const [name, keys] of Object.entries(spec.arrays ?? {})) {\n const fieldKey = seenNames.get(name);\n if (fieldKey !== undefined) {\n issues.push({\n path: [\"arrays\", name],\n message: `inputSpec.arrays \"${name}\" is also the provider field of inputSpec.fields \"${fieldKey}\"`,\n });\n }\n for (const key of keys) {\n if (allowed !== undefined && !allowed.has(key)) {\n issues.push({\n path: [\"arrays\", name],\n message: `inputSpec.arrays \"${key}\" is not supported for ${row.type} rows`,\n });\n }\n if (key in spec.fields) {\n issues.push({\n path: [\"arrays\", name],\n message: `inputSpec.arrays \"${key}\" is already mapped in inputSpec.fields`,\n });\n }\n const owner = arrayOwner.get(key);\n if (owner === undefined) arrayOwner.set(key, name);\n else {\n issues.push({\n path: [\"arrays\", name],\n message:\n owner === name\n ? `inputSpec.arrays \"${name}\" lists \"${key}\" twice`\n : `inputSpec.arrays \"${owner}\" and \"${name}\" both take \"${key}\"`,\n });\n }\n }\n }\n if (spec.dimensions !== undefined) {\n if (row.type !== \"image\") {\n issues.push({\n path: [\"dimensions\"],\n message: \"inputSpec.dimensions is only supported on image rows\",\n });\n }\n for (const key of [\"aspectRatio\", \"size\"] as const) {\n if (key in spec.fields) {\n issues.push({\n path: [\"fields\", key],\n message: `inputSpec.fields \"${key}\" cannot be set with inputSpec.dimensions, which sends it`,\n });\n }\n }\n const owner = seenNames.get(spec.dimensions.field);\n if (owner !== undefined || spec.dimensions.field in (spec.arrays ?? {})) {\n issues.push({\n path: [\"dimensions\", \"field\"],\n message: `inputSpec.dimensions.field \"${spec.dimensions.field}\" is already a mapped provider field`,\n });\n }\n }\n const supports = row.constraints.supports ?? [];\n for (const key of INPUT_SPEC_SUPPORTS_KEYS) {\n if (supports.includes(key)) continue;\n if (key in spec.fields) {\n issues.push({\n path: [\"fields\", key],\n message: `inputSpec.fields \"${key}\" needs \"${key}\" in constraints.supports`,\n });\n }\n const arrayName = arrayOwner.get(key);\n if (arrayName !== undefined) {\n issues.push({\n path: [\"arrays\", arrayName],\n message: `inputSpec.arrays \"${key}\" needs \"${key}\" in constraints.supports`,\n });\n }\n }\n if (issues.length > 0) return { ok: false, issues };\n return { ok: true, spec };\n}\n","// Write-path checks for the voice, language and output-format lists a row carries: the\n// defaults must name an entry, and an id names one entry only.\n\nexport interface OptionListRow {\n constraints: {\n voices?: readonly { id: string }[] | undefined;\n languages?: readonly { code: string }[] | undefined;\n outputFormats?: readonly string[] | undefined;\n };\n defaults: {\n voice?: string | undefined;\n language?: string | undefined;\n outputFormat?: string | undefined;\n };\n}\n\nexport interface OptionListIssue {\n path: string[];\n message: string;\n}\n\nconst IMAGE_FORMATS: ReadonlySet<string> = new Set([\"png\", \"jpeg\", \"webp\"]);\n\nfunction duplicate(values: readonly string[]): string | undefined {\n const seen = new Set<string>();\n for (const value of values) {\n if (seen.has(value)) return value;\n seen.add(value);\n }\n return undefined;\n}\n\nfunction listIssues(\n name: \"voices\" | \"languages\" | \"outputFormats\",\n values: readonly string[] | undefined,\n fallback: string | undefined,\n defaultKey: \"voice\" | \"language\" | \"outputFormat\",\n): OptionListIssue[] {\n const issues: OptionListIssue[] = [];\n const repeated = values === undefined ? undefined : duplicate(values);\n if (repeated !== undefined) {\n issues.push({ path: [\"constraints\", name], message: `\"${repeated}\" is listed twice` });\n }\n if (fallback !== undefined && values !== undefined && !values.includes(fallback)) {\n issues.push({\n path: [\"defaults\", defaultKey],\n message: `defaults.${defaultKey} \"${fallback}\" is not in constraints.${name}`,\n });\n }\n return issues;\n}\n\nexport function optionListIssues(row: OptionListRow): OptionListIssue[] {\n const { constraints, defaults } = row;\n const issues = [\n ...listIssues(\n \"voices\",\n constraints.voices?.map((v) => v.id),\n defaults.voice,\n \"voice\",\n ),\n ...listIssues(\n \"languages\",\n constraints.languages?.map((l) => l.code),\n defaults.language,\n \"language\",\n ),\n ...listIssues(\n \"outputFormats\",\n constraints.outputFormats,\n defaults.outputFormat,\n \"outputFormat\",\n ),\n ];\n const format = defaults.outputFormat;\n if (\n format !== undefined &&\n constraints.outputFormats === undefined &&\n !IMAGE_FORMATS.has(format)\n ) {\n issues.push({\n path: [\"defaults\", \"outputFormat\"],\n message: `defaults.outputFormat \"${format}\" needs constraints.outputFormats or an image format`,\n });\n }\n return issues;\n}\n","import { Catalog } from \"./registry.js\";\nimport { MODELS } from \"./models.js\";\n\n// The package ships two bundles (root and ./catalog). Module state would be\n// duplicated per bundle, so the live catalog and the prime state live on\n// globalThis and every bundle in the process shares them.\nexport type CatalogOrigin = \"remote\" | \"last-good\" | \"snapshot\";\n\nexport interface PrimeCatalogResult {\n origin: CatalogOrigin;\n rowCount: number;\n revision?: string;\n error?: string;\n droppedRows?: number;\n}\n\nconst KEY = Symbol.for(\"@shop-os/modelkit/live-catalog\");\n\nexport interface LiveCatalogState {\n catalog: Catalog;\n memo: Promise<PrimeCatalogResult> | undefined;\n timer: (ReturnType<typeof setInterval> & { unref?: () => void }) | undefined;\n revision: string | undefined;\n origin: CatalogOrigin;\n}\n\n// SAFETY: Symbol-keyed live catalog slot is owned by modelkit and has no declared global type.\nconst store = globalThis as typeof globalThis & Record<symbol, LiveCatalogState | undefined>;\nexport const liveState: LiveCatalogState = (store[KEY] ??= {\n catalog: new Catalog(MODELS),\n memo: undefined,\n timer: undefined,\n revision: undefined,\n origin: \"snapshot\",\n});\n\nexport const liveCatalog: Catalog = liveState.catalog;\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 { liveCatalog, liveState } from \"./live.js\";\nimport { MODELS } from \"./models.js\";\nimport { collisionIssues } from \"./collisions.js\";\nimport { validateInputSpec } from \"./input-spec.js\";\nimport { CatalogModelSchemaBase } from \"./schema.js\";\nimport { normaliseConventions } from \"./conventions.js\";\nimport type { CatalogModel, JsonValue } from \"../types.js\";\nimport { JsonValueSchema } from \"../json.js\";\nimport { z } from \"zod\";\n\nexport interface CatalogCache {\n get(): Promise<string | null>;\n set(json: string): Promise<void>;\n}\n\nexport type CatalogAuth = { bearer: string } | { apiKey: string };\n\nexport interface CatalogSource {\n baseUrl: string;\n auth: CatalogAuth;\n ttlMs?: number;\n /** Abort a fetch after this many ms. Default 10 s. */\n timeoutMs?: number;\n cache?: CatalogCache;\n fetch?: typeof fetch;\n logger?: Pick<Console, \"debug\" | \"info\" | \"warn\" | \"error\">;\n}\n\nimport type { CatalogOrigin, PrimeCatalogResult } from \"./live.js\";\nexport type { CatalogOrigin, PrimeCatalogResult };\n\ntype Logger = NonNullable<CatalogSource[\"logger\"]>;\n\nfunction rowCount(): number {\n return liveCatalog.list({ lifecycle: [\"active\", \"deprecated\", \"retired\"] }).length;\n}\n\nfunction authHeaders(auth: CatalogAuth): Record<string, string> {\n return \"bearer\" in auth\n ? { Authorization: `Bearer ${auth.bearer}` }\n : { \"x-api-key\": auth.apiKey };\n}\n\nconst EnvelopeSchema = z.object({\n rows: z.array(JsonValueSchema),\n revision: z.string().optional(),\n});\n\nexport interface CatalogEnvelope {\n rows: CatalogModel[];\n revision?: string;\n}\n\nexport interface QuarantineResult {\n rows: CatalogModel[];\n dropped: number;\n}\n\nfunction dropReason(path: PropertyKey[], message: string): string {\n return path.length === 0 ? message : `${path.map((part) => String(part)).join(\".\")} ${message}`;\n}\n\nfunction rowId(raw: JsonValue): string {\n const parsed = z\n .object({ id: z.string().min(1) })\n .loose()\n .safeParse(raw);\n if (!parsed.success) return \"?\";\n return parsed.data.id;\n}\n\nfunction quarantine(rawRows: JsonValue[], logger: Logger): QuarantineResult {\n const valid: CatalogModel[] = [];\n let dropped = 0;\n for (const raw of rawRows) {\n const parsed = CatalogModelSchemaBase.safeParse(raw);\n if (!parsed.success) {\n const first = parsed.error.issues[0];\n const reason = first ? dropReason(first.path, first.message) : \"invalid row\";\n logger.warn(`[modelkit] catalog row dropped id=${rowId(raw)} reason=${reason}`);\n dropped += 1;\n continue;\n }\n // SAFETY: zod output matches CatalogModel at runtime; only optional undefined variance differs.\n const row = parsed.data as CatalogModel;\n const inputSpecRaw = row.providerOptions?.[\"modelkit\"]?.[\"inputSpec\"];\n if (inputSpecRaw !== undefined) {\n const result = validateInputSpec(inputSpecRaw, row);\n if (!result.ok) {\n const first = result.issues[0];\n const detail = first ? dropReason(first.path, first.message) : \"invalid inputSpec\";\n logger.warn(\n `[modelkit] catalog row ${row.id} has an invalid providerOptions.modelkit.inputSpec: ${detail}; calls fail until it is fixed`,\n );\n }\n }\n const normalised = normaliseConventions(row);\n if (normalised.invalidKeys.length > 0) {\n logger.warn(\n `[modelkit] catalog row ${row.id} has an invalid ${normalised.invalidKeys.join(\", \")}; read as not set`,\n );\n }\n valid.push(normalised.row);\n }\n let kept = valid;\n for (;;) {\n const issues = collisionIssues(kept);\n if (issues.length === 0) break;\n const firstByIndex = new Map<number, (typeof issues)[number]>();\n for (const issue of issues) {\n if (!firstByIndex.has(issue.index)) firstByIndex.set(issue.index, issue);\n }\n for (const [index, issue] of [...firstByIndex.entries()].sort((a, b) => a[0] - b[0])) {\n const row = kept[index];\n if (!row) continue;\n logger.warn(\n `[modelkit] catalog row dropped id=${row.id} reason=${String(issue.path[0] ?? \"\")} ${issue.message}`,\n );\n }\n const dropSet = new Set(firstByIndex.keys());\n kept = kept.filter((_, index) => !dropSet.has(index));\n dropped += dropSet.size;\n }\n return { rows: kept, dropped };\n}\n\nfunction toEnvelope(\n data: { rows: JsonValue[]; revision?: string | undefined },\n logger: Logger,\n): CatalogEnvelope & { dropped: number } {\n const { rows, dropped } = quarantine(data.rows, logger);\n if (rows.length === 0) throw new Error(\"invalid catalog response: no rows\");\n const envelope: CatalogEnvelope & { dropped: number } = { rows, dropped };\n if (data.revision !== undefined) envelope.revision = data.revision;\n return envelope;\n}\n\n/** One string per line: pino-style loggers drop a trailing object argument. */\nfunction describeError(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n}\n\nfunction logPrimed(logger: Logger, result: PrimeCatalogResult): void {\n const revision = result.revision === undefined ? \"\" : ` revision=${result.revision}`;\n logger.info(\n `[modelkit] catalog primed origin=${result.origin} rowCount=${result.rowCount}${revision}`,\n );\n}\n\nasync function fetchRemote(\n source: CatalogSource,\n logger: Logger,\n): Promise<\n { rows: CatalogModel[]; revision?: string; fromCache: false; dropped: number } | { kept: true }\n> {\n const fetchImpl = source.fetch ?? globalThis.fetch;\n const headers: Record<string, string> = authHeaders(source.auth);\n if (liveState.revision !== undefined) headers[\"If-None-Match\"] = `\"${liveState.revision}\"`;\n const res = await fetchImpl(`${source.baseUrl}/models/catalog`, {\n headers,\n signal: AbortSignal.timeout(source.timeoutMs ?? 10_000),\n });\n if (res.status === 304) return { kept: true };\n if (!res.ok) throw new Error(`catalog fetch failed with status ${res.status}`);\n const json: unknown = await res.json();\n const parsed = EnvelopeSchema.safeParse(json);\n if (!parsed.success) throw new Error(\"invalid catalog response: missing rows\");\n const { rows, revision: rev, dropped } = toEnvelope(parsed.data, logger);\n if (rev === undefined) return { rows, fromCache: false, dropped };\n return { rows, revision: rev, fromCache: false, dropped };\n}\n\n/** A cache write failure must not demote a successful remote load. */\nasync function writeCache(\n source: CatalogSource,\n logger: Logger,\n rows: CatalogModel[],\n rev: string | undefined,\n): Promise<void> {\n if (!source.cache) return;\n try {\n await source.cache.set(JSON.stringify({ rows, revision: rev }));\n } catch (err) {\n logger.warn(`[modelkit] catalog cache write failed: ${describeError(err)}`);\n }\n}\n\nasync function prime(source: CatalogSource, logger: Logger): Promise<PrimeCatalogResult> {\n try {\n const fetched = await fetchRemote(source, logger);\n if (\"kept\" in fetched) {\n const result: PrimeCatalogResult = { origin: liveState.origin, rowCount: rowCount() };\n if (liveState.revision !== undefined) result.revision = liveState.revision;\n logPrimed(logger, result);\n return result;\n }\n liveCatalog.replace(fetched.rows);\n liveState.origin = \"remote\";\n liveState.revision = fetched.revision;\n await writeCache(source, logger, fetched.rows, fetched.revision);\n const result: PrimeCatalogResult = { origin: liveState.origin, rowCount: rowCount() };\n if (fetched.revision !== undefined) result.revision = fetched.revision;\n if (fetched.dropped > 0) result.droppedRows = fetched.dropped;\n logPrimed(logger, result);\n return result;\n } catch (err) {\n logger.warn(`[modelkit] catalog remote failed, trying cache: ${describeError(err)}`);\n const error = describeError(err);\n try {\n const cached = await source.cache?.get();\n if (!cached) throw new Error(\"no cached catalog\");\n const cachedParsed = EnvelopeSchema.safeParse(JSON.parse(cached));\n if (!cachedParsed.success) throw new Error(\"invalid catalog response: missing rows\");\n const { rows, revision: rev, dropped } = toEnvelope(cachedParsed.data, logger);\n liveCatalog.replace(rows);\n liveState.origin = \"last-good\";\n liveState.revision = rev;\n const result: PrimeCatalogResult = {\n origin: liveState.origin,\n rowCount: rowCount(),\n error,\n };\n if (rev !== undefined) result.revision = rev;\n if (dropped > 0) result.droppedRows = dropped;\n logPrimed(logger, result);\n return result;\n } catch (cacheErr) {\n logger.warn(\n `[modelkit] catalog cache failed, using snapshot: ${describeError(cacheErr)}`,\n );\n liveCatalog.replace([...MODELS]);\n liveState.origin = \"snapshot\";\n liveState.revision = undefined;\n const result: PrimeCatalogResult = {\n origin: liveState.origin,\n rowCount: rowCount(),\n error,\n };\n logPrimed(logger, result);\n return result;\n }\n }\n}\n\nasync function refresh(source: CatalogSource, logger: Logger): Promise<void> {\n try {\n const fetched = await fetchRemote(source, logger);\n if (\"kept\" in fetched) return;\n liveCatalog.replace(fetched.rows);\n liveState.origin = \"remote\";\n liveState.revision = fetched.revision;\n await writeCache(source, logger, fetched.rows, fetched.revision);\n } catch (err) {\n logger.warn(\n `[modelkit] catalog refresh failed, keeping current rows: ${describeError(err)}`,\n );\n }\n}\n\n/** Fetch, validate, swap into liveCatalog. Never throws. Second call returns the same promise. */\nexport function primeCatalog(source: CatalogSource): Promise<PrimeCatalogResult> {\n if (liveState.memo) return liveState.memo;\n const logger = source.logger ?? console;\n const pending = prime(source, logger).then((result) => {\n const ttlMs = source.ttlMs ?? 300_000;\n if (ttlMs > 0 && liveState.timer === undefined) {\n liveState.timer = setInterval(() => void refresh(source, logger), ttlMs);\n liveState.timer.unref?.();\n }\n return result;\n });\n liveState.memo = pending;\n return pending;\n}\n\n/** Test seam: stop the refresh timer, reset liveCatalog to MODELS and clear the memo. */\nexport function resetLiveCatalog(): void {\n if (liveState.timer !== undefined) {\n clearInterval(liveState.timer);\n liveState.timer = undefined;\n }\n liveState.memo = undefined;\n liveState.revision = undefined;\n liveState.origin = \"snapshot\";\n liveCatalog.replace([...MODELS]);\n}\n","import { z } from \"zod\";\nimport type {\n CatalogModel,\n VideoResolution,\n VideoToolConstraints,\n VideoToolOutputSpec,\n VideoToolRequest,\n} from \"../types.js\";\nimport { overMax } from \"../video-length.js\";\nimport { subtitleProblem } from \"./subtitles-spec.js\";\n\nconst RangeSchema = z.object({ min: z.number(), max: z.number() });\nconst ToolSchema = z.object({\n kind: z.enum([\"upscale\", \"interpolate\", \"hdr\", \"bg-remove\", \"subtitles\"]),\n upscaleFactor: RangeSchema.optional(),\n maxOutputLongEdge: z.number().positive().optional(),\n prompt: z.boolean().optional(),\n fps: RangeSchema.optional(),\n outputFormats: z\n .array(z.enum([\"h265\", \"prores\", \"exr\"]))\n .min(1)\n .optional(),\n maxOutputShortEdge: z.number().positive().optional(),\n maxOutputFrames: z.number().positive().optional(),\n minOutputFrames: z.number().positive().optional(),\n maxOutputFps: z.number().positive().optional(),\n presets: z.array(z.string().min(1)).min(1).optional(),\n languages: z.array(z.string().min(1)).min(1).optional(),\n translationLanguages: z.array(z.string().min(1)).min(1).optional(),\n maxSecondsAbove1080p: z.number().positive().optional(),\n});\n\n/** A video-tool row's constraints, or undefined when the row has none or they are invalid. */\nexport function videoToolConstraints(row: CatalogModel): VideoToolConstraints | undefined {\n if (row.type !== \"video-tool\") return undefined;\n const parsed = ToolSchema.safeParse(row.constraints.tool);\n if (!parsed.success) return undefined;\n const {\n kind,\n upscaleFactor,\n maxOutputLongEdge,\n prompt,\n fps,\n outputFormats,\n maxOutputShortEdge,\n maxOutputFrames,\n minOutputFrames,\n maxOutputFps,\n presets,\n languages,\n translationLanguages,\n maxSecondsAbove1080p,\n } = parsed.data;\n return {\n kind,\n ...(upscaleFactor !== undefined && { upscaleFactor }),\n ...(maxOutputLongEdge !== undefined && { maxOutputLongEdge }),\n ...(prompt !== undefined && { prompt }),\n ...(fps !== undefined && { fps }),\n ...(outputFormats !== undefined && { outputFormats }),\n ...(maxOutputShortEdge !== undefined && { maxOutputShortEdge }),\n ...(maxOutputFrames !== undefined && { maxOutputFrames }),\n ...(minOutputFrames !== undefined && { minOutputFrames }),\n ...(maxOutputFps !== undefined && { maxOutputFps }),\n ...(presets !== undefined && { presets }),\n ...(languages !== undefined && { languages }),\n ...(translationLanguages !== undefined && { translationLanguages }),\n ...(maxSecondsAbove1080p !== undefined && { maxSecondsAbove1080p }),\n };\n}\n\n/** The pricing tier a frame lands in, by its short edge. */\nexport function resolutionTier(width: number, height: number): VideoResolution {\n const shortEdge = Math.min(width, height);\n if (shortEdge <= 360) return \"360p\";\n if (shortEdge <= 480) return \"480p\";\n if (shortEdge <= 720) return \"720p\";\n if (shortEdge <= 1080) return \"1080p\";\n if (shortEdge <= 1440) return \"2k\";\n return \"4k\";\n}\n\nexport type VideoToolPlan =\n | { ok: true; output: VideoToolOutputSpec }\n | { ok: false; error: string };\n\nfunction fail(error: string): VideoToolPlan {\n return { ok: false, error };\n}\n\n/**\n * What a video-tool request produces, checked against the row. Pure: callers use it to\n * validate and price before submitting, and the adapter uses it to build the usage event.\n */\nexport function planVideoTool(\n row: CatalogModel,\n req: Omit<VideoToolRequest, \"model\">,\n): VideoToolPlan {\n const tool = videoToolConstraints(row);\n if (!tool) return fail(`${row.id} is not a video tool`);\n const { width, height, durationSeconds, fps } = req.source;\n if (!(width > 0 && height > 0 && durationSeconds > 0)) {\n return fail(\"The source video's width, height and duration are required\");\n }\n const maxSeconds = row.constraints.sourceVideoSeconds?.max;\n if (maxSeconds !== undefined && overMax(durationSeconds, maxSeconds)) {\n return fail(`${row.label} takes source videos up to ${maxSeconds} seconds.`);\n }\n const base = {\n durationSeconds,\n ...(fps !== undefined && { fps }),\n };\n if (tool.kind === \"upscale\") {\n const factor = req.upscaleFactor;\n if (factor === undefined) return fail(\"An upscale factor is required\");\n const range = tool.upscaleFactor;\n if (range && (factor < range.min || factor > range.max)) {\n return fail(`${row.label} upscales by ${range.min}x to ${range.max}x.`);\n }\n const outWidth = Math.round(width * factor);\n const outHeight = Math.round(height * factor);\n const limit = tool.maxOutputLongEdge;\n if (limit !== undefined && Math.max(outWidth, outHeight) > limit) {\n return fail(\n `A ${factor}x upscale of a ${width}x${height} video passes the ${limit}px limit.`,\n );\n }\n return {\n ok: true,\n output: {\n ...base,\n width: outWidth,\n height: outHeight,\n resolution: resolutionTier(outWidth, outHeight),\n format: \"h264\",\n },\n };\n }\n if (tool.kind === \"interpolate\") {\n const target = req.targetFps;\n if (target === undefined || !Number.isInteger(target)) {\n return fail(\"A whole-number target frame rate is required\");\n }\n const range = tool.fps;\n if (range && (target < range.min || target > range.max)) {\n return fail(`${row.label} outputs ${range.min} to ${range.max} fps.`);\n }\n return {\n ok: true,\n output: {\n durationSeconds,\n fps: target,\n width,\n height,\n resolution: resolutionTier(width, height),\n format: \"h264\",\n },\n };\n }\n if (tool.kind === \"bg-remove\") {\n return {\n ok: true,\n output: {\n ...base,\n width,\n height,\n resolution: resolutionTier(width, height),\n format: \"vp9\",\n },\n };\n }\n if (tool.kind === \"subtitles\") {\n const resolution = resolutionTier(width, height);\n const problem = subtitleProblem(\n row.label,\n tool,\n req.subtitles,\n resolution,\n durationSeconds,\n );\n if (problem !== undefined) return fail(problem);\n return { ok: true, output: { ...base, width, height, resolution, format: \"h264\" } };\n }\n const formats = tool.outputFormats ?? [\"h265\"];\n const format = req.outputFormat ?? formats[0] ?? \"h265\";\n if (!formats.includes(format)) {\n return fail(`${row.label} writes ${formats.join(\" or \")}.`);\n }\n const timing = renderedTiming(row, tool, durationSeconds, fps);\n if (!timing.ok) return fail(timing.error);\n const out = shrinkToShortEdge(width, height, tool.maxOutputShortEdge);\n return {\n ok: true,\n output: {\n durationSeconds: timing.durationSeconds ?? durationSeconds,\n ...(timing.fps !== undefined && { fps: timing.fps }),\n ...(timing.frames !== undefined && { frames: timing.frames }),\n ...out,\n resolution: resolutionTier(out.width, out.height),\n format,\n },\n };\n}\n\ntype RenderedTiming =\n | { ok: true; fps?: number; frames?: number; durationSeconds?: number }\n | { ok: false; error: string };\n\n// fal's default rate for frame-counted tools, used when the caller did not measure the source.\nconst DEFAULT_FPS = 24;\n\n/**\n * The rate, frame count and resulting length a frame-counted row renders (its rate cap and\n * frame bounds applied), or why it cannot. The length is frames / fps, so rounding and the\n * minimum-frame padding reach the output metadata and the billed seconds. A row without\n * frame limits keeps the source rate and length.\n */\nfunction renderedTiming(\n row: CatalogModel,\n tool: VideoToolConstraints,\n durationSeconds: number,\n fps: number | undefined,\n): RenderedTiming {\n const { maxOutputFps, minOutputFrames, maxOutputFrames } = tool;\n if (\n maxOutputFps === undefined &&\n minOutputFrames === undefined &&\n maxOutputFrames === undefined\n ) {\n return fps !== undefined ? { ok: true, fps } : { ok: true };\n }\n const rate = Math.min(fps ?? DEFAULT_FPS, maxOutputFps ?? Infinity);\n const frames = Math.max(minOutputFrames ?? 1, Math.round(durationSeconds * rate));\n if (maxOutputFrames !== undefined && frames > maxOutputFrames) {\n const limit = `${maxOutputFrames} frames (${seconds(maxOutputFrames, rate)})`;\n return { ok: false, error: `${row.label} renders up to ${limit}.` };\n }\n return { ok: true, fps: rate, frames, durationSeconds: frames / rate };\n}\n\nfunction seconds(frames: number, rate: number): string {\n return `${Math.floor((frames / rate) * 10) / 10} s at ${rate} fps`;\n}\n\ninterface FrameSize {\n width: number;\n height: number;\n}\n\nfunction shrinkToShortEdge(width: number, height: number, limit: number | undefined): FrameSize {\n const shortEdge = Math.min(width, height);\n if (limit === undefined || shortEdge <= limit) return { width, height };\n const scale = limit / shortEdge;\n return { width: Math.round(width * scale), height: Math.round(height * scale) };\n}\n","/** A measured video length at the tenth of a second. */\nexport function tenths(seconds: number): number {\n return Math.round(seconds * 10) / 10;\n}\n\n/**\n * Whether a measured length is over a maximum. ffprobe reads a clip at its container length (a\n * 10 s clip reads 10.04 s), so a clip is over only when its tenth is over too. Never stricter than\n * the raw comparison, so a limit that is not a whole tenth (10.05 s) still takes a clip at it.\n * Minimums stay raw: the over-read makes a clip that reads short shorter still.\n */\nexport function overMax(seconds: number, max: number): boolean {\n return seconds > max && tenths(seconds) > max;\n}\n\n/** Whether measured lengths add up past a total: each clip's over-read is forgiven once. */\nexport function overTotal(lengths: readonly number[], total: number): boolean {\n const sum = (values: readonly number[]) => values.reduce((acc, len) => acc + len, 0);\n return sum(lengths) > total && tenths(sum(lengths.map(tenths))) > total;\n}\n","import type {\n SubtitleOptions,\n SubtitleTextStyle,\n VideoResolution,\n VideoToolConstraints,\n} from \"../types.js\";\nimport { overMax } from \"../video-length.js\";\n\nconst HEX_COLOR = /^#([0-9A-Fa-f]{3}){1,2}$/;\n\nfunction textStyleProblem(tier: string, style: SubtitleTextStyle | undefined): string | undefined {\n if (style === undefined) return undefined;\n if (style.font !== undefined && style.font.trim() === \"\") {\n return `The ${tier} subtitle font is empty.`;\n }\n const { weight, color } = style;\n if (weight !== undefined && !(Number.isInteger(weight) && weight >= 100 && weight <= 900)) {\n return `The ${tier} subtitle weight must be a whole number from 100 to 900; got ${weight}.`;\n }\n if (color !== undefined && !HEX_COLOR.test(color)) {\n return `The ${tier} subtitle color must be #rgb or #rrggbb; got \"${color}\".`;\n }\n return undefined;\n}\n\nfunction listed(value: string | undefined, allowed: string[] | undefined): boolean {\n return value === undefined || allowed === undefined || allowed.includes(value);\n}\n\n/** The preset a subtitles request renders: the caller's, else the row's first. */\nexport function subtitlePreset(\n tool: VideoToolConstraints,\n options: SubtitleOptions | undefined,\n): string | undefined {\n return options?.preset ?? tool.presets?.[0];\n}\n\n/** Why the row cannot caption this source with these options, or undefined when it can. */\nexport function subtitleProblem(\n label: string,\n tool: VideoToolConstraints,\n options: SubtitleOptions | undefined,\n resolution: VideoResolution,\n durationSeconds: number,\n): string | undefined {\n const preset = subtitlePreset(tool, options);\n if (preset === undefined) return `${label} needs a subtitle preset.`;\n if (!listed(preset, tool.presets)) return `${label} has no subtitle preset \"${preset}\".`;\n if (!listed(options?.language, tool.languages)) {\n return `${label} does not transcribe language \"${options?.language}\".`;\n }\n // Translation is billed extra by the provider, so a row without a list refuses it.\n const translation = options?.translationLanguage;\n if (translation !== undefined && !(tool.translationLanguages ?? []).includes(translation)) {\n return `${label} does not translate into \"${options?.translationLanguage}\".`;\n }\n const aboveFullHd = resolution === \"2k\" || resolution === \"4k\";\n const cap = tool.maxSecondsAbove1080p;\n if (aboveFullHd && cap !== undefined && overMax(durationSeconds, cap)) {\n return `${label} takes source videos above 1080p up to ${cap} seconds.`;\n }\n return (\n textStyleProblem(\"baseline\", options?.baseline) ??\n textStyleProblem(\"highlighted\", options?.highlighted)\n );\n}\n","import { ModelKitError } from \"./errors.js\";\nimport type { OnUnsupported } from \"./resolve-options.js\";\nimport type { CatalogModel, Warning } from \"./types.js\";\n\n// A request value that must be one of a row's listed ids: a voice, a language, an output\n// format. Shared by the music resolver and the media-node resolvers.\n\nexport interface ListedChoice {\n /** The request field, as warnings and errors name it. */\n field: string;\n value: string | undefined;\n /** The ids the row lists; undefined when the row offers no choice. */\n listed: readonly string[] | undefined;\n /** The row default, used when the value is unset (and, coercing, when it is unknown). */\n fallback: string | undefined;\n /** A required value has no provider default to fall back to. */\n required?: boolean;\n}\n\nfunction preview(listed: readonly string[]): string {\n const shown = listed.slice(0, 12).join(\", \");\n return listed.length > 12 ? `${shown}, ... (${listed.length} in all)` : shown;\n}\n\n/** The value to send, or undefined to send none (the provider default). */\nexport function resolveListed(\n model: CatalogModel,\n choice: ListedChoice,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): string | undefined {\n const { field, listed, required } = choice;\n const value = choice.value?.trim() || undefined;\n if (value === undefined) {\n const fallback = listed === undefined ? undefined : choice.fallback;\n if (fallback === undefined && required) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} needs ${field}`,\n model: model.id,\n });\n }\n return fallback;\n }\n if (listed === undefined) {\n if (required) return value;\n warnings.push({\n code: \"option_ignored\",\n field,\n from: value,\n message: `${model.id} does not support ${field}; ignored`,\n });\n return undefined;\n }\n if (listed.includes(value)) return value;\n const fallback = required ? undefined : choice.fallback;\n if (onUnsupported === \"error\" || required) {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} has no ${field} \"${value}\". Supported: ${preview(listed)}.`,\n model: model.id,\n });\n }\n warnings.push({\n code: \"option_ignored\",\n field,\n from: value,\n ...(fallback !== undefined && { to: fallback }),\n message:\n fallback === undefined\n ? `${field} ${value} dropped for ${model.id}`\n : `${field} ${value} replaced by ${fallback} for ${model.id}`,\n });\n return fallback;\n}\n\n/** An output format the row lists, else its default; none when the row lists none. */\nexport function resolveOutputFormat(\n model: CatalogModel,\n format: string | undefined,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): string | undefined {\n const listed = model.constraints.outputFormats;\n const choice = {\n field: \"outputFormat\",\n value: format,\n listed,\n fallback: model.defaults.outputFormat,\n };\n return resolveListed(model, choice, onUnsupported, warnings);\n}\n","import { ModelKitError } from \"./errors.js\";\nimport { withPromptForResolve, type RuleProblem } from \"./resolve-provider-rules.js\";\nimport type {\n AspectRatio,\n CatalogModel,\n ImageQuality,\n ImageRequest,\n ImageSize,\n OutputFormat,\n Warning,\n} from \"./types.js\";\n\n// What each fal image family's endpoints accept, read from their queue OpenAPI schemas\n// (adapters/__fixtures__/fal). The resolver and the fal-image planner check a request against\n// the same spec, so `resolveOptions` refuses exactly what execution would.\n\n/** The custom `image_size` limits a fal endpoint's schema documents. */\nexport interface ExactSizeBounds {\n minSide: number;\n maxSide: number;\n minArea: number;\n maxArea: number;\n multipleOf: number;\n}\n\nexport interface FalImageSpec {\n label: string;\n /** The edit-only family (upscale): a source image is the input. */\n referencesRequired?: boolean;\n maxReferences: number;\n /** Images per call; 1 means the endpoint has no count field. */\n maxCount: number;\n outputFormats: readonly OutputFormat[];\n /** Provider prompt maxLength; absent means the endpoint takes no prompt or sets none. */\n promptMax?: number;\n promptRequired: boolean;\n /** Ratios the endpoints take; absent means the family sends none. */\n aspectRatios?: readonly AspectRatio[];\n qualities?: readonly ImageQuality[];\n /** Present when the endpoints take a custom `{ width, height }`. */\n exactSize?: ExactSizeBounds;\n}\n\nconst WIDE_RATIOS: readonly AspectRatio[] = [\n \"1:1\",\n \"16:9\",\n \"9:16\",\n \"4:3\",\n \"3:4\",\n \"3:2\",\n \"2:3\",\n \"4:5\",\n \"5:4\",\n \"21:9\",\n \"9:21\",\n];\n\nconst KLING_RATIOS: readonly AspectRatio[] = [\n \"16:9\",\n \"9:16\",\n \"1:1\",\n \"4:3\",\n \"3:4\",\n \"3:2\",\n \"2:3\",\n \"21:9\",\n];\n\n// \"adaptive\" where the edit endpoint keeps the source ratio (\"auto\") and text-to-image omits it.\nconst GROK_RATIOS: readonly AspectRatio[] = [\n \"16:9\",\n \"4:3\",\n \"3:2\",\n \"1:1\",\n \"2:3\",\n \"3:4\",\n \"9:16\",\n \"adaptive\",\n];\n\n// Recraft's canvas sizes (fal's named sizes plus custom 3:2 and 5:4 pairs).\nconst RECRAFT_RATIOS: readonly AspectRatio[] = [\n \"1:1\",\n \"4:3\",\n \"3:4\",\n \"16:9\",\n \"9:16\",\n \"3:2\",\n \"2:3\",\n \"5:4\",\n \"4:5\",\n];\n\nconst ALL_FORMATS: readonly OutputFormat[] = [\"png\", \"jpeg\", \"webp\"];\n\n// The schema's x-fal limits. fal rounds other sides up to 16, so only multiples are exact.\nconst KREA_EXACT: ExactSizeBounds = {\n minSide: 256,\n maxSide: 3200,\n minArea: 256 * 256,\n maxArea: 4_220_160,\n multipleOf: 16,\n};\n\n// The schema's ImageSize sides (integers up to 14142) and its 512² to 2048² total.\nconst QWEN_EXACT: ExactSizeBounds = {\n minSide: 1,\n maxSide: 14142,\n minArea: 512 * 512,\n maxArea: 2048 * 2048,\n multipleOf: 1,\n};\n\n/** fal image families by the row's `providerModelId` (the text-to-image or upscale id). */\nexport const FAL_IMAGE_SPECS = new Map<string, FalImageSpec>([\n [\n \"krea/v3/text-to-image\",\n {\n label: \"Krea 3\",\n maxReferences: 8,\n maxCount: 1,\n outputFormats: [\"png\", \"jpeg\"],\n promptMax: 5000,\n promptRequired: true,\n aspectRatios: WIDE_RATIOS,\n exactSize: KREA_EXACT,\n },\n ],\n // Neither the text-to-image nor the edit schema has an image_size field.\n [\n \"xai/grok-imagine-image/v2.0/text-to-image\",\n {\n label: \"Grok Imagine Image 2.0\",\n maxReferences: 5,\n maxCount: 4,\n outputFormats: [\"jpeg\", \"png\", \"webp\"],\n promptMax: 8000,\n promptRequired: true,\n aspectRatios: GROK_RATIOS,\n qualities: [\"auto\", \"low\", \"medium\"],\n },\n ],\n [\n \"alibaba/qwen-image-3/text-to-image\",\n {\n label: \"Qwen Image 3\",\n maxReferences: 3,\n maxCount: 6,\n outputFormats: ALL_FORMATS,\n promptMax: 5000,\n promptRequired: true,\n aspectRatios: WIDE_RATIOS,\n exactSize: QWEN_EXACT,\n },\n ],\n [\n \"fal-ai/kling-image/o3/text-to-image\",\n {\n label: \"Kling Image O3\",\n maxReferences: 10,\n maxCount: 9,\n outputFormats: ALL_FORMATS,\n promptMax: 2500,\n promptRequired: true,\n aspectRatios: [...KLING_RATIOS, \"adaptive\"],\n },\n ],\n [\n \"fal-ai/kling-image/v3/text-to-image\",\n {\n label: \"Kling Image 3.0\",\n maxReferences: 1,\n maxCount: 9,\n outputFormats: ALL_FORMATS,\n promptMax: 2500,\n promptRequired: true,\n aspectRatios: KLING_RATIOS,\n },\n ],\n [\n \"recraft/v4.1/flash/text-to-image\",\n {\n label: \"Recraft V4.1 Flash\",\n maxReferences: 0,\n maxCount: 1,\n outputFormats: [],\n promptMax: 10000,\n promptRequired: true,\n aspectRatios: RECRAFT_RATIOS,\n },\n ],\n [\n \"fal-ai/sensenova-u1-infographic\",\n {\n label: \"SenseNova U1 Infographic\",\n maxReferences: 0,\n maxCount: 1,\n outputFormats: [\"jpeg\", \"png\"],\n promptRequired: true,\n aspectRatios: [\"1:1\", \"16:9\", \"9:16\", \"3:2\", \"2:3\", \"4:3\", \"3:4\"],\n },\n ],\n [\n \"fal-ai/seedvr/upscale/image\",\n {\n label: \"SeedVR2 Upscale\",\n referencesRequired: true,\n maxReferences: 1,\n maxCount: 1,\n outputFormats: ALL_FORMATS,\n promptRequired: false,\n },\n ],\n]);\n\nexport function falImageSpec(providerModelId: string): FalImageSpec | undefined {\n return FAL_IMAGE_SPECS.get(providerModelId.toLowerCase());\n}\n\nconst AREA_1K = 1024 * 1024;\n\n/** An exact size the endpoint renders, and the tier it bills at. */\nexport interface ExactSize {\n width: number;\n height: number;\n tier: ImageSize;\n}\n\nexport type ExactSizeCheck = { ok: true; size: ExactSize } | { ok: false; message: string };\n\n/** Whether `exact` is within the bounds; it bills at the smallest tier whose area holds it. */\nexport function checkExactSize(exact: string, b: ExactSizeBounds): ExactSizeCheck {\n const match = /^(\\d+)x(\\d+)$/.exec(exact);\n if (match === null) {\n return { ok: false, message: `takes exactSize as WIDTHxHEIGHT in pixels; got \"${exact}\"` };\n }\n const width = Number(match[1]);\n const height = Number(match[2]);\n const area = width * height;\n const sideOk = [width, height].every(\n (side) => side >= b.minSide && side <= b.maxSide && side % b.multipleOf === 0,\n );\n if (!sideOk || area < b.minArea || area > b.maxArea) {\n const step = b.multipleOf > 1 ? `, multiples of ${b.multipleOf}` : \"\";\n return {\n ok: false,\n message: `takes an exactSize with sides of ${b.minSide} to ${b.maxSide} px${step} and ${b.minArea} to ${b.maxArea} px in total; got ${exact}`,\n };\n }\n return { ok: true, size: { width, height, tier: area <= AREA_1K ? \"1K\" : \"2K\" } };\n}\n\nfunction unsupported(message: string): RuleProblem {\n return { code: \"unsupported_option\", message };\n}\n\nfunction notListed(\n spec: FalImageSpec,\n field: string,\n value: string,\n listed: readonly string[],\n): RuleProblem | undefined {\n if (listed.includes(value)) return undefined;\n return unsupported(\n `${spec.label} does not support ${field} \"${value}\". Supported: ${listed.join(\", \") || \"none\"}.`,\n );\n}\n\nfunction sizeProblem(spec: FalImageSpec, req: ImageRequest): RuleProblem | undefined {\n if (req.exactSize !== undefined) {\n if (spec.exactSize === undefined) {\n return unsupported(\n `${spec.label} takes a size tier and aspect ratio, not an exactSize`,\n );\n }\n const check = checkExactSize(req.exactSize, spec.exactSize);\n // An exact size sets the canvas, so the ratio is not sent.\n return check.ok ? undefined : unsupported(`${spec.label}: ${check.message}`);\n }\n if (req.aspectRatio === undefined || spec.aspectRatios === undefined) return undefined;\n return notListed(spec, \"aspectRatio\", req.aspectRatio, spec.aspectRatios);\n}\n\n/** Why the family's endpoints cannot take this request, or undefined when they can. */\nexport function falImageProblem(spec: FalImageSpec, req: ImageRequest): RuleProblem | undefined {\n const refs = (req.references ?? []).length;\n if (refs === 0 && spec.referencesRequired) {\n return { code: \"missing_input\", message: `${spec.label} requires a source image` };\n }\n if (refs > 0 && spec.maxReferences === 0) {\n return unsupported(`${spec.label} generates from a prompt only and takes no images`);\n }\n if (refs > spec.maxReferences) {\n return unsupported(\n `${spec.label} takes at most ${spec.maxReferences} image(s); got ${refs}`,\n );\n }\n const count = req.count ?? 1;\n if (!Number.isInteger(count) || count < 1 || count > spec.maxCount) {\n return unsupported(`${spec.label} makes 1 to ${spec.maxCount} image(s) per call`);\n }\n if (req.outputFormat !== undefined) {\n const problem = notListed(spec, \"outputFormat\", req.outputFormat, spec.outputFormats);\n if (problem !== undefined) return problem;\n }\n if (spec.promptRequired && req.prompt.trim().length === 0) {\n return { code: \"missing_input\", message: `${spec.label} needs a prompt` };\n }\n if (spec.promptMax !== undefined && req.prompt.length > spec.promptMax) {\n return unsupported(`${spec.label} takes a prompt of at most ${spec.promptMax} characters`);\n }\n const size = sizeProblem(spec, req);\n if (size !== undefined) return size;\n if (req.quality !== undefined && spec.qualities !== undefined) {\n return notListed(spec, \"quality\", req.quality, spec.qualities);\n }\n return undefined;\n}\n\n/** The checked exact size of a request the spec accepts, or undefined when it sets none. */\nexport function falExactSize(spec: FalImageSpec, req: ImageRequest): ExactSize | undefined {\n if (req.exactSize === undefined || spec.exactSize === undefined) return undefined;\n const check = checkExactSize(req.exactSize, spec.exactSize);\n return check.ok ? check.size : undefined;\n}\n\n/**\n * fal image family rows: a request the endpoints cannot take is refused in both modes, and\n * an exact size sets `size` to the tier it bills at, so the resolved request carries it.\n * `callerSize` is the caller's own (resolved) size, undefined when only the row default set\n * it; only a caller's size that differs warns.\n */\nexport function applyFalImageRules(\n model: CatalogModel,\n req: ImageRequest,\n callerSize: ImageSize | undefined,\n warnings: Warning[],\n): void {\n if (model.adapter !== \"fal\") return;\n const spec = falImageSpec(model.providerModelId);\n if (spec === undefined) return;\n const problem = falImageProblem(spec, withPromptForResolve(req));\n if (problem !== undefined) {\n throw new ModelKitError({\n code: problem.code,\n message: problem.message,\n model: model.id,\n retryable: false,\n });\n }\n const exact = falExactSize(spec, req);\n if (exact === undefined) return;\n if (callerSize !== undefined && callerSize !== exact.tier) {\n warnings.push({\n code: \"size_coerced\",\n field: \"size\",\n from: callerSize,\n to: exact.tier,\n message: `${model.id} bills exactSize ${req.exactSize} at ${exact.tier}`,\n });\n }\n req.size = exact.tier;\n}\n","import type { VideoRequest, VideoResolution } from \"./types.js\";\n\n// Kept free of the Replicate SDK: the resolver, which the browser-safe catalog entry\n// reaches, reads the Kling tier too.\n\n/** Drop a \":version\" suffix so a pinned prediction routes by its base model id. */\nexport function replicateBaseModelId(providerModelId: string): string {\n const colon = providerModelId.indexOf(\":\");\n return colon === -1 ? providerModelId : providerModelId.slice(0, colon);\n}\n\nexport type ReplicateVideoKind = \"kling\" | \"kling-omni\" | \"hailuo\";\n\nconst REPLICATE_VIDEO_KINDS = new Map<string, ReplicateVideoKind>([\n [\"kling-video/v2.5-turbo/pro/image-to-video\", \"kling\"],\n [\"kling-video/v3.0/pro/image-to-video\", \"kling\"],\n [\"kwaivgi/kling-v3-video\", \"kling\"],\n [\"kwaivgi/kling-v3-omni-video\", \"kling-omni\"],\n [\"minimax/hailuo-02\", \"hailuo\"],\n]);\n\nexport function videoKind(providerModelId: string): ReplicateVideoKind | undefined {\n return REPLICATE_VIDEO_KINDS.get(replicateBaseModelId(providerModelId));\n}\n\nconst KLING_TIERS = [\n { mode: \"standard\", resolution: \"720p\" },\n { mode: \"pro\", resolution: \"1080p\" },\n { mode: \"4k\", resolution: \"4k\" },\n] as const satisfies readonly { mode: string; resolution: VideoResolution }[];\n\nexport type KlingTier = (typeof KLING_TIERS)[number];\n\n/** fal's Kling O3 endpoints, `<id>/<mode>/<task>`; the kling-v3-omni-video row runs here. */\nexport const KLING_O3_OMNI = \"fal-ai/kling-video/o3\";\n\n// The Replicate Kling V3 models have no resolution field: their mode enum selects\n// 720p (standard), 1080p (pro) or 4K (\"4k\"). fal's Kling O3 spells the same tiers in its\n// endpoint path. A resolution wins over an explicit mode.\nexport function klingTier(req: VideoRequest): KlingTier {\n return (\n KLING_TIERS.find((tier) => tier.resolution === req.resolution) ??\n KLING_TIERS.find((tier) => tier.mode === req.mode) ??\n KLING_TIERS[0]\n );\n}\n","import {\n checkInsertWindow,\n MINIMAX_H3_INSERT,\n ruleRefusal,\n withPromptForResolve,\n type RuleProblem,\n} from \"./resolve-provider-rules.js\";\nimport { KLING_O3_OMNI, klingTier, videoKind } from \"./replicate-video-kinds.js\";\nimport type { CatalogModel, MediaRef, VideoRequest, Warning } from \"./types.js\";\n\n// What the fal video family endpoints accept beyond what a row's constraints say: inputs that\n// must come together, inputs an endpoint has no field for, a required prompt, and limits on\n// one input that depend on another. The resolver and the family planners (adapters/fal-*.ts)\n// both check them, so `resolveOptions` refuses, in both modes, exactly what execution would.\n\ntype Problem = RuleProblem | undefined;\n\nconst MOTION_PRO = \"fal-ai/kling-video/v3/pro/motion-control\";\nconst MOTION_STANDARD = \"fal-ai/kling-video/v3/standard/motion-control\";\nconst O3_REFERENCE = \"fal-ai/kling-video/o3/pro/reference-to-video\";\nconst O3_EDIT = \"fal-ai/kling-video/o3/pro/video-to-video/edit\";\nconst KLING_V4 = \"kling/v4\";\nconst KLING_V4_EDIT = \"kling/v4/video-to-video/edit\";\nconst H3_TURBO = \"minimax/h3-max-turbo\";\nconst H3_RECAST = \"minimax/h3-max/recast\";\nconst H3_RELIGHT = \"minimax/h3-max/relight\";\nconst HAPPY_HORSE = \"alibaba/happy-horse/v1.1\";\nconst HAPPY_HORSE_EDIT = \"alibaba/happy-horse/video-edit\";\nconst VIDU_Q4 = \"fal-ai/vidu/q4\";\nconst OMNIHUMAN_V2 = \"bytedance/omnihuman/v2\";\n\n// Kling counts start/end frames and reference images against one cap of 7 per request.\nconst KLING_O3_IMAGE_CAP = 7;\n// Kling 4.0 reference-to-video: image_urls holds 10, and a start frame counts toward them.\nconst KLING_V4_IMAGE_CAP = 10;\n// fal: target_audio_url needs a clip of at least 2 s and a video of at least 2 s.\nconst TURBO_AUDIO_MIN_SECONDS = 2;\n// fal: wav or mp3, 4 to 300 seconds; the output runs as long as the audio.\nconst OMNIHUMAN_AUDIO_SECONDS = { min: 4, max: 300 };\n\nfunction missing(message: string): RuleProblem {\n return { code: \"missing_input\", message };\n}\n\nfunction unsupported(message: string): RuleProblem {\n return { code: \"unsupported_option\", message };\n}\n\nfunction count(refs: MediaRef[] | undefined): number {\n return (refs ?? []).length;\n}\n\nfunction noFrames(req: VideoRequest): Problem {\n if (req.firstFrame === undefined && req.lastFrame === undefined) return undefined;\n return unsupported(\"takes no start or end frame\");\n}\n\nfunction needsPrompt(req: VideoRequest): Problem {\n return req.prompt.trim().length === 0 ? missing(\"needs a prompt\") : undefined;\n}\n\nfunction needsSource(req: VideoRequest): Problem {\n return (\n noFrames(req) ??\n (req.sourceVideo === undefined ? missing(\"needs a source video\") : undefined)\n );\n}\n\n/** A limit fal documents on an input whose length the caller measured. */\nfunction inputSeconds(\n what: string,\n ref: MediaRef | undefined,\n limits: { min?: number; max?: number },\n): Problem {\n const length = ref?.durationSeconds;\n if (length === undefined) return undefined;\n if (limits.min !== undefined && length < limits.min) {\n return unsupported(`takes ${what} of at least ${limits.min} s; this one is ${length} s`);\n }\n if (limits.max !== undefined && length > limits.max) {\n return unsupported(`takes ${what} up to ${limits.max} s; this one is ${length} s`);\n }\n return undefined;\n}\n\nfunction motionControl(req: VideoRequest): Problem {\n const frames = noFrames(req);\n if (frames !== undefined) return frames;\n const images = count(req.referenceImages);\n const videos = count(req.referenceVideos);\n if (images === 0 || videos === 0) {\n return missing(\"needs one character image and one motion video\");\n }\n if (images > 1 || videos > 1) {\n return unsupported(\"takes exactly one character image and one motion video\");\n }\n return undefined;\n}\n\nfunction o3Reference(req: VideoRequest): Problem {\n const images = count(req.referenceImages);\n const frames = [req.firstFrame, req.lastFrame].filter((f) => f !== undefined).length;\n if (images + frames > KLING_O3_IMAGE_CAP) {\n return unsupported(\n `takes up to ${KLING_O3_IMAGE_CAP} images in all, frames included; this request has ${images + frames}`,\n );\n }\n return needsPrompt(req);\n}\n\nfunction hasReferences(req: VideoRequest): boolean {\n return count(req.referenceImages) + count(req.referenceVideos) > 0;\n}\n\n/** References route to reference-to-video, which has a start frame but no end frame. */\nfunction klingV4(req: VideoRequest): Problem {\n if (hasReferences(req)) {\n if (req.lastFrame !== undefined) {\n return unsupported(\"takes an end frame only without reference images or videos\");\n }\n const images = count(req.referenceImages) + (req.firstFrame === undefined ? 0 : 1);\n if (images > KLING_V4_IMAGE_CAP) {\n return unsupported(\n `takes up to ${KLING_V4_IMAGE_CAP} images in all, the start frame included; this request has ${images}`,\n );\n }\n }\n return needsPrompt(req);\n}\n\nfunction h3Turbo(req: VideoRequest): Problem {\n if (count(req.referenceImages) + count(req.referenceVideos) > 0) {\n return unsupported(\"takes no reference images or videos\");\n }\n const [audio, ...extra] = req.referenceAudios ?? [];\n if (extra.length > 0) return unsupported(\"takes one soundtrack audio clip\");\n if (audio !== undefined && (req.durationSeconds ?? 5) < TURBO_AUDIO_MIN_SECONDS) {\n return unsupported(\n `needs at least ${TURBO_AUDIO_MIN_SECONDS} s of video with a soundtrack`,\n );\n }\n return (\n inputSeconds(\"a soundtrack\", audio, { min: TURBO_AUDIO_MIN_SECONDS }) ?? needsPrompt(req)\n );\n}\n\nfunction h3Insert(req: VideoRequest): Problem {\n const source = needsSource(req);\n if (source !== undefined) return source;\n const window = checkInsertWindow(req);\n return window.ok ? undefined : { code: window.code, message: window.message };\n}\n\nfunction h3Recast(req: VideoRequest): Problem {\n const source = needsSource(req);\n if (source !== undefined) return source;\n return count(req.referenceImages) === 0\n ? missing(\"needs a photo of each new person\")\n : undefined;\n}\n\nfunction h3Relight(req: VideoRequest): Problem {\n const source = needsSource(req);\n if (source !== undefined) return source;\n const spheres = count(req.referenceImages);\n if (spheres === 0) return missing(\"needs a lighting sphere image\");\n return spheres > 1 ? unsupported(\"takes one lighting sphere image\") : undefined;\n}\n\n/** References route to reference-to-video, a start frame to image-to-video, else text. */\nfunction happyHorse(req: VideoRequest): Problem {\n if (req.lastFrame !== undefined) return unsupported(\"takes no end frame\");\n if (count(req.referenceVideos) + count(req.referenceAudios) > 0) {\n return unsupported(\"takes reference images only\");\n }\n const images = count(req.referenceImages);\n if (images > 0 && req.firstFrame !== undefined) {\n return unsupported(\"takes a start frame or reference images, not both\");\n }\n // image-to-video's prompt is optional; the other two endpoints require one.\n return images > 0 || req.firstFrame === undefined ? needsPrompt(req) : undefined;\n}\n\nfunction happyHorseEdit(req: VideoRequest): Problem {\n return needsSource(req) ?? needsPrompt(req);\n}\n\n/** fal has no Q4 text-to-video: references or a start frame are required. */\nfunction viduQ4(req: VideoRequest): Problem {\n if (req.lastFrame !== undefined) return unsupported(\"takes no end frame\");\n if (count(req.referenceVideos) > 0) return unsupported(\"takes no reference videos\");\n const images = count(req.referenceImages);\n if (images + count(req.referenceAudios) > 0) {\n if (req.firstFrame !== undefined) {\n return unsupported(\"takes a start frame or references, not both\");\n }\n if (images === 0) return missing(\"needs a reference image with reference audio\");\n return needsPrompt(req);\n }\n return req.firstFrame === undefined\n ? missing(\"needs a start frame or reference images\")\n : undefined;\n}\n\nfunction omnihuman(req: VideoRequest): Problem {\n const frames = noFrames(req);\n if (frames !== undefined) return frames;\n if (count(req.referenceVideos) > 0) return unsupported(\"takes no reference videos\");\n const [image, ...extraImages] = req.referenceImages ?? [];\n const [audio, ...extraAudios] = req.referenceAudios ?? [];\n if (image === undefined || audio === undefined) {\n return missing(\"needs one portrait image and one audio clip\");\n }\n if (extraImages.length > 0 || extraAudios.length > 0) {\n return unsupported(\"takes exactly one image and one audio clip\");\n }\n return inputSeconds(\"audio\", audio, OMNIHUMAN_AUDIO_SECONDS);\n}\n\nconst RULES: ReadonlyMap<string, (req: VideoRequest) => Problem> = new Map([\n [MOTION_PRO, motionControl],\n [MOTION_STANDARD, motionControl],\n [O3_REFERENCE, o3Reference],\n [KLING_O3_OMNI, o3Reference],\n [O3_EDIT, (req: VideoRequest) => needsSource(req) ?? needsPrompt(req)],\n [KLING_V4, klingV4],\n [KLING_V4_EDIT, (req: VideoRequest) => needsSource(req) ?? needsPrompt(req)],\n [H3_TURBO, h3Turbo],\n [MINIMAX_H3_INSERT, h3Insert],\n [H3_RECAST, h3Recast],\n [H3_RELIGHT, h3Relight],\n [HAPPY_HORSE, happyHorse],\n [HAPPY_HORSE_EDIT, happyHorseEdit],\n [VIDU_Q4, viduQ4],\n [OMNIHUMAN_V2, omnihuman],\n]);\n\n/** Why a fal family endpoint cannot take this request, or undefined when it can. */\nexport function falVideoProblem(providerModelId: string, req: VideoRequest): Problem {\n return RULES.get(providerModelId.toLowerCase())?.(req);\n}\n\n/** Vidu Q4 image-to-video renders no sound; sound is a reference-to-video option. */\nexport function viduSilentWarning(model: Pick<CatalogModel, \"id\">): Warning {\n return {\n code: \"option_ignored\",\n field: \"generateAudio\",\n from: true,\n message: `${model.id} image-to-video is silent; generateAudio applies to reference-to-video only`,\n };\n}\n\n/** H3 Max Turbo image-to-video has no aspect_ratio: an end frame alone sets the framing. */\nexport function h3EndFrameRatioWarning(\n model: Pick<CatalogModel, \"id\">,\n ratio: VideoRequest[\"aspectRatio\"],\n): Warning {\n return {\n code: \"ratio_dropped\",\n field: \"aspectRatio\",\n from: ratio,\n message: `${model.id} follows the end frame's aspect ratio`,\n };\n}\n\n/**\n * Kling rows that pick 720p/1080p/4K with `mode` (Replicate Kling V3, fal Kling O3 Omni), where\n * a resolution wins over it. The resolved request keeps only the resolution that renders, so a\n * stored request never pairs `resolution: \"720p\"` with the row's `mode: \"pro\"` default.\n */\nexport function takesKlingMode(model: CatalogModel): boolean {\n if (model.adapter === \"fal\") return model.providerModelId.toLowerCase() === KLING_O3_OMNI;\n if (model.adapter !== \"replicate\") return false;\n const kind = videoKind(model.providerModelId);\n return kind === \"kling\" || kind === \"kling-omni\";\n}\n\n/** Before the resolution check, so a resolution taken from `mode` is checked like any other. */\nexport function fillKlingModeResolution(model: CatalogModel, req: VideoRequest): void {\n if (takesKlingMode(model) && req.resolution === undefined) {\n req.resolution = klingTier(req).resolution;\n }\n}\n\n/**\n * fal video family rows: what the endpoint cannot take is refused in both modes. Two inputs\n * switch an option off, with a warning when the caller set it: a Vidu Q4 start frame runs\n * the silent image-to-video, and an H3 Max Turbo end frame alone sets the framing.\n */\nexport function applyFalVideoRules(\n model: CatalogModel,\n req: VideoRequest,\n callerRatio: VideoRequest[\"aspectRatio\"],\n warnings: Warning[],\n): void {\n if (model.adapter !== \"fal\") return;\n const problem = falVideoProblem(model.providerModelId, withPromptForResolve(req));\n if (problem !== undefined) throw ruleRefusal(model, problem.message, problem.code);\n const id = model.providerModelId.toLowerCase();\n const references = count(req.referenceImages) + count(req.referenceAudios);\n if (id === VIDU_Q4 && references === 0 && req.generateAudio === true) {\n warnings.push(viduSilentWarning(model));\n req.generateAudio = false;\n }\n // Kling 4.0 image-to-video takes no aspect_ratio: the start frame sets the framing.\n if (id === KLING_V4 && req.firstFrame !== undefined && !hasReferences(req)) {\n if (req.aspectRatio !== undefined) {\n if (callerRatio !== undefined) {\n warnings.push({\n code: \"ratio_dropped\",\n field: \"aspectRatio\",\n from: req.aspectRatio,\n message: `${model.id} follows the start frame's aspect ratio`,\n });\n }\n delete req.aspectRatio;\n }\n }\n const endFrameOnly = req.lastFrame !== undefined && req.firstFrame === undefined;\n if (id === H3_TURBO && endFrameOnly && req.aspectRatio !== undefined) {\n if (callerRatio !== undefined && callerRatio !== \"adaptive\") {\n warnings.push(h3EndFrameRatioWarning(model, req.aspectRatio));\n }\n delete req.aspectRatio;\n }\n}\n","import { ModelKitError } from \"./errors.js\";\nimport { resolveOutputFormat } from \"./resolve-lists.js\";\nimport { applyFalImageRules } from \"./resolve-image-rules.js\";\nimport {\n applyFalAudioRules,\n applyLumaVideoRules,\n applyMaskRules,\n applyXaiVideoRules,\n} from \"./resolve-provider-rules.js\";\nimport {\n applyFalVideoRules,\n fillKlingModeResolution,\n takesKlingMode,\n} from \"./resolve-video-rules.js\";\nimport { overMax, overTotal } from \"./video-length.js\";\nimport type {\n AspectRatio,\n AudioRequest,\n CatalogModel,\n ImageRequest,\n ImageSize,\n MediaRef,\n OutputFormat,\n RequiredInput,\n VideoRequest,\n VideoResolution,\n Warning,\n} from \"./types.js\";\n\nexport type OnUnsupported = \"error\" | \"coerce\";\n\nexport interface ResolveResult<T> {\n request: T;\n warnings: Warning[];\n}\n\nconst SIZE_ORDER: ImageSize[] = [\"512\", \"1K\", \"2K\", \"4K\"];\nconst RESOLUTION_ORDER: VideoResolution[] = [\"360p\", \"480p\", \"720p\", \"768p\", \"1080p\", \"2k\", \"4k\"];\n\nfunction ratioValue(r: AspectRatio): number {\n if (r === \"adaptive\") return 1;\n // SAFETY: every non-adaptive AspectRatio literal is \"<int>:<int>\", so the split has two numbers.\n const [w, h] = r.split(\":\").map(Number) as [number, number];\n return w / h;\n}\n\ntype Orientation = \"landscape\" | \"portrait\" | \"square\";\nfunction orientation(r: AspectRatio): Orientation {\n const v = ratioValue(r);\n return v > 1 ? \"landscape\" : v < 1 ? \"portrait\" : \"square\";\n}\n\n/** Nearest supported ratio in the same orientation bucket, else nearest overall, by log distance. */\nexport function nearestAspectRatio(requested: AspectRatio, supported: AspectRatio[]): AspectRatio {\n if (supported.includes(requested)) return requested;\n const target = requested === \"adaptive\" ? \"1:1\" : requested;\n const sameBucket = supported.filter(\n (s) => s !== \"adaptive\" && orientation(s) === orientation(target),\n );\n const pool = sameBucket.length > 0 ? sameBucket : supported.filter((s) => s !== \"adaptive\");\n const fallback = pool[0] ?? supported[0];\n if (!fallback) return target;\n const dist = (s: AspectRatio) =>\n Math.abs(Math.log(ratioValue(s)) - Math.log(ratioValue(target)));\n return pool.reduce((best, s) => (dist(s) < dist(best) ? s : best), fallback);\n}\n\nfunction nearestLowerTier<T extends string>(requested: T, supported: T[], order: T[]): T {\n const idx = order.indexOf(requested);\n for (let i = idx; i >= 0; i--) {\n const candidate = order[i];\n if (candidate !== undefined && supported.includes(candidate)) return candidate;\n }\n for (let i = idx + 1; i < order.length; i++) {\n const candidate = order[i];\n if (candidate !== undefined && supported.includes(candidate)) return candidate;\n }\n return requested;\n}\n\nfunction resolveTier<T extends string>(\n field: string,\n code: Warning[\"code\"],\n requested: T | undefined,\n supported: T[] | undefined,\n order: T[],\n model: CatalogModel,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): T | undefined {\n if (requested === undefined || !supported || supported.includes(requested)) return requested;\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} does not support ${field} \"${requested}\". Supported: ${supported.join(\", \")}.`,\n model: model.id,\n });\n }\n const to = nearestLowerTier(requested, supported, order);\n warnings.push({\n code,\n field,\n from: requested,\n to,\n message: `${field} ${requested} coerced to ${to} for ${model.id}`,\n });\n return to;\n}\n\n/**\n * A video resolution the row renders: unchanged when supported, else refused, or coerced to\n * the nearest supported lower tier (the nearest higher one when the row has none lower).\n */\nexport function resolveVideoResolution(\n requested: VideoResolution | undefined,\n model: CatalogModel,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): VideoResolution | undefined {\n return resolveTier(\n \"resolution\",\n \"resolution_coerced\",\n requested,\n model.constraints.resolutions,\n RESOLUTION_ORDER,\n model,\n onUnsupported,\n warnings,\n );\n}\n\nfunction resolveDuration(\n requested: number | undefined,\n durations: CatalogModel[\"constraints\"][\"durations\"],\n model: CatalogModel,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): number | undefined {\n if (requested === undefined || !durations) return requested;\n const inSet = Array.isArray(durations)\n ? durations.includes(requested)\n : requested >= durations.min && requested <= durations.max;\n if (inSet) return requested;\n if (onUnsupported === \"error\") {\n const supported = Array.isArray(durations)\n ? `Supported: ${durations.join(\", \")}.`\n : `Supported range: ${durations.min}-${durations.max}.`;\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} does not support durationSeconds ${requested}. ${supported}`,\n model: model.id,\n });\n }\n const to = Array.isArray(durations)\n ? durations.reduce(\n (best, d) => (Math.abs(d - requested) < Math.abs(best - requested) ? d : best),\n durations[0] ?? requested,\n )\n : Math.min(Math.max(requested, durations.min), durations.max);\n warnings.push({\n code: \"duration_coerced\",\n field: \"durationSeconds\",\n from: requested,\n to,\n message: `duration ${requested}s coerced to ${to}s for ${model.id}`,\n });\n return to;\n}\n\n/** An unsupported ratio errors under \"error\"; under \"coerce\" it snaps with a warning. */\nfunction resolveAspectRatio(\n requested: AspectRatio | undefined,\n supported: AspectRatio[] | undefined,\n model: CatalogModel,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): AspectRatio | undefined {\n if (requested === undefined || requested === \"adaptive\" || !supported) return requested;\n if (supported.includes(requested)) return requested;\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} does not support aspectRatio \"${requested}\". Supported: ${supported.join(\", \")}.`,\n model: model.id,\n });\n }\n const to = nearestAspectRatio(requested, supported);\n warnings.push({\n code: \"ratio_coerced\",\n field: \"aspectRatio\",\n from: requested,\n to,\n message: `aspect ratio ${requested} coerced to ${to} for ${model.id}`,\n });\n return to;\n}\n\nfunction compact(refs: MediaRef[] | undefined): MediaRef[] {\n return (refs ?? []).filter((r): r is MediaRef => Boolean(r));\n}\n\nfunction trim(\n field: string,\n refs: MediaRef[],\n limit: number | undefined,\n model: CatalogModel,\n warnings: Warning[],\n): MediaRef[] {\n if (limit === undefined || refs.length <= limit) return refs;\n warnings.push({\n code: \"references_trimmed\",\n field,\n from: refs.length,\n to: limit,\n message: `${field} trimmed from ${refs.length} to ${limit} for ${model.id}`,\n });\n return refs.slice(0, limit);\n}\n\nfunction knownLength(value: number | undefined): number | undefined {\n return value !== undefined && Number.isFinite(value) ? value : undefined;\n}\n\n/** One decimal, or more when rounding would make the length read as equal to the limit. */\nfunction seconds(len: number, limit: number): string {\n let digits = 1;\n while (digits < 3 && Number(len.toFixed(digits)) === limit) digits++;\n return len.toFixed(digits);\n}\n\nfunction effectiveMin(\n limits: { min?: number; editMin?: number } | undefined,\n taskType: string | undefined,\n): number | undefined {\n if (taskType !== \"edit\" || limits?.editMin === undefined) return limits?.min;\n return Math.max(limits.min ?? 0, limits.editMin);\n}\n\n/** First length violation for the videos a request sends, as a user-facing message. */\nexport function videoLengthViolation(\n model: CatalogModel,\n input: {\n referenceVideos?: (number | undefined)[];\n sourceVideo?: number;\n taskType?: VideoRequest[\"taskType\"];\n },\n): string | undefined {\n const limits = model.constraints.references?.videoSeconds;\n const refMin = effectiveMin(limits, input.taskType);\n const lengths = (input.referenceVideos ?? []).map(knownLength);\n if (limits?.max !== undefined) {\n const max = limits.max;\n const i = lengths.findIndex((len) => len !== undefined && overMax(len, max));\n if (i >= 0)\n return `${model.label} takes reference videos up to ${String(max)} s each; video ${i + 1} is ${seconds(lengths[i]!, max)} s.`;\n }\n if (refMin !== undefined) {\n const i = lengths.findIndex((len) => len !== undefined && len < refMin);\n if (i >= 0)\n return `${model.label} takes reference videos of at least ${String(refMin)} s each; video ${i + 1} is ${seconds(lengths[i]!, refMin)} s.`;\n }\n const source = knownLength(input.sourceVideo);\n const sourceLimits = model.constraints.sourceVideoSeconds;\n if (limits?.total !== undefined) {\n const counted = [\n ...lengths.filter((len): len is number => len !== undefined),\n ...(sourceLimits?.inReferenceTotal && source !== undefined ? [source] : []),\n ];\n const sum = counted.reduce((acc, len) => acc + len, 0);\n if (overTotal(counted, limits.total))\n return `${model.label} takes reference videos up to ${String(limits.total)} s combined; these add up to ${seconds(sum, limits.total)} s.`;\n }\n if (source === undefined) return undefined;\n const sourceMin = effectiveMin(sourceLimits, input.taskType);\n if (sourceLimits?.max !== undefined && overMax(source, sourceLimits.max))\n return `${model.label} takes a source video up to ${String(sourceLimits.max)} s; this one is ${seconds(source, sourceLimits.max)} s.`;\n if (sourceMin !== undefined && source < sourceMin)\n return `${model.label} takes a source video of at least ${String(sourceMin)} s; this one is ${seconds(source, sourceMin)} s.`;\n return undefined;\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 { outputFormat: defaultFormat, ...defaults } = model.defaults;\n const merged: ImageRequest = {\n ...defaults,\n ...(isImageFormat(defaultFormat) && { outputFormat: defaultFormat }),\n ...stripUndefined(request),\n model: model.id,\n };\n\n const aspectRatio = resolveAspectRatio(\n merged.aspectRatio,\n c.aspectRatios,\n model,\n onUnsupported,\n warnings,\n );\n if (aspectRatio !== undefined) merged.aspectRatio = aspectRatio;\n const 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 referenceLimit = c.references?.images ?? c.references?.total;\n const given = compact(merged.references);\n if (referenceLimit === 0 && given.length > 0 && onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} takes no images; it generates from the prompt alone`,\n model: model.id,\n });\n }\n const references = trim(\"references\", given, referenceLimit, model, warnings);\n if (references.length > 0) merged.references = references;\n else delete merged.references;\n if (c.requires?.includes(\"references\") && references.length === 0) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} requires at least one reference image`,\n model: model.id,\n });\n }\n dropUnsupported(merged, model, warnings, [\n \"seed\",\n \"quality\",\n \"count\",\n \"outputFormat\",\n \"scaleFactor\",\n \"safetySettings\",\n \"temperature\",\n \"upscale\",\n \"points\",\n \"boxes\",\n ]);\n const factor = merged.scaleFactor;\n if (factor !== undefined && c.scaleFactors && !c.scaleFactors.includes(factor)) {\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} does not offer scaleFactor ${factor}. Supported: ${c.scaleFactors.join(\", \")}.`,\n model: model.id,\n });\n }\n warnings.push({\n code: \"option_ignored\",\n field: \"scaleFactor\",\n from: factor,\n message: `${model.id} does not offer ${factor}x; the row default applies`,\n });\n delete merged.scaleFactor;\n const fallback = model.defaults?.scaleFactor;\n if (fallback !== undefined && c.scaleFactors.includes(fallback)) {\n merged.scaleFactor = fallback;\n }\n }\n if (model.type === \"mask\") applyMaskRules(model, merged, onUnsupported, warnings);\n applyFalImageRules(\n model,\n merged,\n request.size === undefined ? undefined : merged.size,\n warnings,\n );\n return { request: merged, warnings };\n}\n\nexport function resolveVideoOptions(\n model: CatalogModel,\n request: VideoRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<VideoRequest> {\n const warnings: Warning[] = [];\n const c = model.constraints;\n const merged: VideoRequest = { ...model.defaults, ...stripUndefined(request), model: model.id };\n\n // Dropped in both modes: the endpoint has no prompt field, so there is nothing to refuse.\n if (c.noPrompt) {\n const prompt = (merged.prompt ?? \"\").trim();\n if (prompt.length > 0) {\n warnings.push({\n code: \"option_ignored\",\n field: \"prompt\",\n message: `${model.id} takes no prompt; ignored`,\n });\n }\n merged.prompt = \"\";\n }\n\n // Conditioning compatibility: a source video only where the row takes\n // one, and frames never next to references where the row treats them\n // as exclusive. \"error\" refuses; \"coerce\" drops the losing input.\n if (merged.sourceVideo !== undefined && !model.capabilities?.acceptsSourceVideo) {\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} does not take a source video`,\n model: model.id,\n });\n }\n warnings.push({\n code: \"option_ignored\",\n field: \"sourceVideo\",\n message: `${model.id} does not take a source video; dropped`,\n });\n delete merged.sourceVideo;\n }\n const imageInputs = ([\"firstFrame\", \"lastFrame\", \"referenceImages\"] as const).filter((field) =>\n field === \"referenceImages\"\n ? compact(merged.referenceImages).length > 0\n : merged[field] !== undefined,\n );\n if (\n merged.sourceVideo !== undefined &&\n imageInputs.length > 0 &&\n model.capabilities?.sourceVideoExcludesFrames\n ) {\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} takes a source video or images, not both`,\n model: model.id,\n });\n }\n for (const field of imageInputs) {\n warnings.push({\n code: \"option_ignored\",\n field,\n message: `${model.id} takes a source video or images, not both; ${field} dropped`,\n });\n delete merged[field];\n }\n }\n // A row that takes an end frame only with a start frame: \"error\" refuses a lone\n // end frame; \"coerce\" sends it as the start frame, as callers got before the flag.\n if (\n merged.lastFrame !== undefined &&\n merged.firstFrame === undefined &&\n model.capabilities?.lastFrameRequiresFirstFrame\n ) {\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} takes an end frame only together with a start frame`,\n model: model.id,\n retryable: false,\n });\n }\n warnings.push({\n code: \"option_ignored\",\n field: \"lastFrame\",\n to: \"firstFrame\",\n message: `end frame used as start frame: ${model.id} needs a start frame with an end frame`,\n });\n merged.firstFrame = merged.lastFrame;\n delete merged.lastFrame;\n }\n const hasFrames = merged.firstFrame !== undefined || merged.lastFrame !== undefined;\n const hasRefs =\n compact(merged.referenceImages).length +\n compact(merged.referenceVideos).length +\n compact(merged.referenceAudios).length >\n 0;\n if (hasFrames && hasRefs && model.capabilities?.framesExcludeReferences) {\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} takes frames or references, not both`,\n model: model.id,\n });\n }\n warnings.push({\n code: \"option_ignored\",\n field: \"referenceImages\",\n message: `${model.id} takes frames or references, not both; references dropped`,\n });\n delete merged.referenceImages;\n delete merged.referenceVideos;\n delete merged.referenceAudios;\n }\n\n for (const input of c.ratioIgnoredWith ?? []) {\n if (merged[input] !== undefined && merged.aspectRatio !== undefined) {\n // Only the caller's own ratio deserves a warning; a catalog default dropping is expected.\n if (request.aspectRatio !== undefined) {\n warnings.push({\n code: \"ratio_dropped\",\n field: \"aspectRatio\",\n from: merged.aspectRatio,\n message: `${model.id} ignores aspectRatio when ${input} is set`,\n });\n }\n delete merged.aspectRatio;\n }\n }\n const aspectRatio = resolveAspectRatio(\n merged.aspectRatio,\n c.aspectRatios,\n model,\n onUnsupported,\n warnings,\n );\n if (aspectRatio !== undefined) merged.aspectRatio = aspectRatio;\n fillKlingModeResolution(model, merged);\n const resolution = resolveVideoResolution(merged.resolution, model, onUnsupported, warnings);\n if (resolution !== undefined) merged.resolution = resolution;\n if (takesKlingMode(model)) delete merged.mode;\n const duration = resolveDuration(\n merged.durationSeconds,\n c.durations,\n model,\n onUnsupported,\n warnings,\n );\n if (duration !== undefined) merged.durationSeconds = duration;\n\n const limits = c.references ?? {};\n let images = trim(\n \"referenceImages\",\n compact(merged.referenceImages),\n limits.images,\n model,\n warnings,\n );\n let videos = trim(\n \"referenceVideos\",\n compact(merged.referenceVideos),\n limits.videos,\n model,\n warnings,\n );\n let audios = trim(\n \"referenceAudios\",\n compact(merged.referenceAudios),\n limits.audios,\n model,\n warnings,\n );\n // Dormant on rows that accept no reference video: the adapter would drop\n // the clip and the lower cap would apply for nothing.\n if (\n limits.imagesWithVideo !== undefined &&\n (limits.videos ?? 0) > 0 &&\n videos.length > 0 &&\n images.length > limits.imagesWithVideo\n ) {\n images = trim(\"referenceImages\", images, limits.imagesWithVideo, model, 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 const lengthViolation = videoLengthViolation(model, {\n referenceVideos: videos.map((v) => v.durationSeconds),\n taskType: merged.taskType,\n ...(merged.sourceVideo?.durationSeconds !== undefined && {\n sourceVideo: merged.sourceVideo.durationSeconds,\n }),\n });\n if (lengthViolation !== undefined) {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: lengthViolation,\n model: model.id,\n retryable: false,\n });\n }\n setOrDelete(merged, \"referenceImages\", images);\n setOrDelete(merged, \"referenceVideos\", videos);\n setOrDelete(merged, \"referenceAudios\", audios);\n\n // `taskType` rides on \"taskType\" (Seedance's subtask hint); an extension row\n // accepts exactly `extend` without offering the other subtasks.\n const keepExtend =\n merged.taskType === \"extend\" &&\n (model.constraints.supports ?? []).includes(\"videoExtension\");\n dropUnsupported(merged, model, warnings, [\n \"seed\",\n \"negativePrompt\",\n \"cfgScale\",\n \"generateAudio\",\n \"promptExpansion\",\n \"lastFrame\",\n \"watermark\",\n \"safetyChecker\",\n \"insertWindow\",\n ...(keepExtend ? [] : ([\"taskType\"] as const)),\n ]);\n if (merged.previousInteractionId !== undefined && !keepExtend) {\n warnings.push({\n code: \"option_ignored\",\n field: \"previousInteractionId\",\n from: merged.previousInteractionId,\n message: `${model.id} does not support previousInteractionId; ignored`,\n });\n delete merged.previousInteractionId;\n }\n applyXaiVideoRules(model, merged, onUnsupported, warnings);\n applyLumaVideoRules(model, merged, onUnsupported, warnings);\n // Last, so an input that the trimming or coercion above removed cannot satisfy it.\n checkVideoRequired(model, merged);\n applyFalVideoRules(model, merged, request.aspectRatio, warnings);\n return { request: merged, warnings };\n}\n\nfunction checkVideoRequired(model: CatalogModel, req: VideoRequest): void {\n const c = model.constraints;\n const present = (input: RequiredInput): boolean =>\n input === \"references\"\n ? compact(req.referenceImages).length +\n compact(req.referenceVideos).length +\n compact(req.referenceAudios).length >\n 0\n : input !== \"sourceAudio\" && req[input] !== undefined;\n for (const input of c.requires ?? []) {\n if (!present(input))\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} requires ${input}`,\n model: model.id,\n });\n }\n if (c.requiresOneOf && !c.requiresOneOf.some(present)) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} requires one of: ${c.requiresOneOf.join(\", \")}`,\n model: model.id,\n });\n }\n const least = c.references?.min;\n const given = {\n images: compact(req.referenceImages).length,\n videos: compact(req.referenceVideos).length,\n audios: compact(req.referenceAudios).length,\n };\n for (const kind of [\"images\", \"videos\", \"audios\"] as const) {\n const needed = least?.[kind] ?? 0;\n if (given[kind] < needed) {\n const noun = kind.slice(0, -1);\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} requires at least ${needed} reference ${noun}${needed > 1 ? \"s\" : \"\"}`,\n model: model.id,\n });\n }\n }\n}\n\nexport function resolveAudioOptions(\n model: CatalogModel,\n request: AudioRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<AudioRequest> {\n const warnings: Warning[] = [];\n const c = model.constraints;\n const { voice: _voice, language: _language, ...defaults } = model.defaults;\n const merged: AudioRequest = { ...defaults, ...stripUndefined(request), model: model.id };\n\n const duration = resolveDuration(\n merged.durationSeconds,\n c.durations,\n model,\n onUnsupported,\n warnings,\n );\n if (duration !== undefined) merged.durationSeconds = duration;\n\n const references = trim(\n \"references\",\n compact(merged.references),\n c.references?.images ?? c.references?.total,\n model,\n warnings,\n );\n if (references.length > 0) merged.references = references;\n else delete merged.references;\n for (const input of c.requires ?? []) {\n const present =\n input === \"references\"\n ? references.length > 0\n : input === \"sourceVideo\" && merged.sourceVideo !== undefined;\n if (!present)\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} requires ${input}`,\n model: model.id,\n });\n }\n\n dropUnsupported(merged, model, warnings, [\"seed\", \"negativePrompt\", \"instrumental\", \"lyrics\"]);\n applyFalAudioRules(model, merged);\n const format = resolveOutputFormat(model, request.outputFormat, onUnsupported, warnings);\n if (format !== undefined) merged.outputFormat = format;\n else delete merged.outputFormat;\n return { request: merged, warnings };\n}\n\nfunction dropUnsupported<T extends object>(\n req: T,\n model: CatalogModel,\n warnings: Warning[],\n fields: (keyof T & string)[],\n): void {\n const supports = model.constraints.supports ?? [];\n for (const field of fields) {\n // SAFETY: `fields` are a subset of SupportedOption; the cast only bridges the generic key type.\n if (req[field] !== undefined && !supports.includes(field as never)) {\n warnings.push({\n code: \"option_ignored\",\n field,\n from: req[field],\n message: `${model.id} does not support ${field}; ignored`,\n });\n delete req[field];\n }\n }\n}\n\nfunction setOrDelete(\n req: VideoRequest,\n field: \"referenceImages\" | \"referenceVideos\" | \"referenceAudios\",\n refs: MediaRef[],\n): void {\n if (refs.length > 0) req[field] = refs;\n else delete req[field];\n}\n\nfunction isImageFormat(format: string | undefined): format is OutputFormat {\n return format === \"png\" || format === \"jpeg\" || format === \"webp\";\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 { promptConventions } from \"./catalog/conventions.js\";\nimport { ModelKitError } from \"./errors.js\";\nimport { resolveListed, resolveOutputFormat } from \"./resolve-lists.js\";\nimport {\n resolveVideoResolution,\n type OnUnsupported,\n type ResolveResult,\n} from \"./resolve-options.js\";\nimport type {\n CatalogModel,\n DubbingRequest,\n LipsyncRequest,\n MediaRef,\n RequiredInput,\n SpeechRequest,\n TranscriptionRequest,\n VoiceChangeRequest,\n Warning,\n} from \"./types.js\";\n\n// Resolvers for the speech, voice-change, lipsync, dubbing and transcription rows: the row's\n// required inputs and length limits are checked, a voice, language or format must be one the\n// row lists, and an option the row does not take is dropped with a warning.\n\ntype Present = Partial<Record<RequiredInput, boolean>>;\n\nfunction missing(model: CatalogModel, what: string): ModelKitError {\n return new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} requires ${what}`,\n model: model.id,\n });\n}\n\nfunction unsupported(model: CatalogModel, message: string): ModelKitError {\n return new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.label} ${message}`,\n model: model.id,\n });\n}\n\nfunction checkRequired(model: CatalogModel, present: Present): void {\n for (const input of model.constraints.requires ?? []) {\n if (present[input] !== true) throw missing(model, input);\n }\n const oneOf = model.constraints.requiresOneOf;\n if (oneOf !== undefined && !oneOf.some((input) => present[input] === true)) {\n throw missing(model, `one of ${oneOf.join(\", \")}`);\n }\n}\n\nfunction checkLength(\n model: CatalogModel,\n field: string,\n ref: MediaRef | undefined,\n limits: { min?: number; max?: number } | undefined,\n): void {\n const length = ref?.durationSeconds;\n if (length === undefined || limits === undefined) return;\n const tooShort = limits.min !== undefined && length < limits.min;\n const tooLong = limits.max !== undefined && length > limits.max;\n if (!tooShort && !tooLong) return;\n const range = `${limits.min ?? 0}-${limits.max ?? \"any\"} s`;\n throw unsupported(model, `takes ${field} of ${range}; got ${length} s`);\n}\n\nfunction ignored(\n warnings: Warning[],\n model: CatalogModel,\n field: string,\n from: string | undefined,\n): void {\n warnings.push({\n code: \"option_ignored\",\n field,\n from,\n message: `${model.id} does not support ${field}; ignored`,\n });\n}\n\nfunction voiceIds(model: CatalogModel): string[] | undefined {\n return model.constraints.voices?.map((v) => v.id);\n}\n\nfunction languageCodes(model: CatalogModel): string[] | undefined {\n return model.constraints.languages?.map((l) => l.code);\n}\n\nfunction resolveVoice(\n model: CatalogModel,\n voice: string | undefined,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): string | undefined {\n const choice = {\n field: \"voice\",\n value: voice,\n listed: voiceIds(model),\n fallback: model.defaults.voice,\n };\n return resolveListed(model, choice, onUnsupported, warnings);\n}\n\nfunction checkScript(model: CatalogModel, script: string): void {\n const text = script.trim();\n if (!text) throw missing(model, \"text\");\n const max = promptConventions(model).maxChars;\n if (max !== undefined && text.length > max) {\n throw unsupported(model, `takes up to ${max} characters; got ${text.length}`);\n }\n}\n\n/** `generateSpeech` on a `speech` row. */\nexport function resolveSpeechOptions(\n model: CatalogModel,\n request: SpeechRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<SpeechRequest> {\n const warnings: Warning[] = [];\n checkScript(model, request.text);\n const resolved: SpeechRequest = { model: model.id, text: request.text };\n const voice = resolveVoice(model, request.voice, onUnsupported, warnings);\n if (voice !== undefined) resolved.voice = voice;\n const language = resolveListed(\n model,\n {\n field: \"language\",\n value: request.language,\n listed: languageCodes(model),\n fallback: model.defaults.language,\n },\n onUnsupported,\n warnings,\n );\n if (language !== undefined) resolved.language = language;\n const style = request.style?.trim();\n if (style && !(model.constraints.supports ?? []).includes(\"style\")) {\n ignored(warnings, model, \"style\", style);\n } else if (style) resolved.style = style;\n const format = resolveOutputFormat(model, request.outputFormat, onUnsupported, warnings);\n if (format !== undefined) resolved.outputFormat = format;\n return { request: resolved, warnings };\n}\n\n/** `changeVoice` on a `voice-change` row. */\nexport function resolveVoiceChangeOptions(\n model: CatalogModel,\n request: VoiceChangeRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<VoiceChangeRequest> {\n const warnings: Warning[] = [];\n checkRequired(model, { sourceAudio: true });\n checkLength(\n model,\n \"sourceAudio\",\n request.sourceAudio,\n model.constraints.references?.audioSeconds,\n );\n const resolved: VoiceChangeRequest = { model: model.id, sourceAudio: request.sourceAudio };\n const voice = resolveVoice(model, request.voice, onUnsupported, warnings);\n if (voice !== undefined) resolved.voice = voice;\n const format = resolveOutputFormat(model, request.outputFormat, onUnsupported, warnings);\n if (format !== undefined) resolved.outputFormat = format;\n return { request: resolved, warnings };\n}\n\n/** `lipsync` on a `lipsync` row: the face input is the one its `requires` names. */\nexport function resolveLipsyncOptions(\n model: CatalogModel,\n request: LipsyncRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<LipsyncRequest> {\n const warnings: Warning[] = [];\n const requires = model.constraints.requires ?? [];\n if (request.image !== undefined && !requires.includes(\"firstFrame\")) {\n throw unsupported(model, \"re-times a video and does not take an image\");\n }\n if (request.sourceVideo !== undefined && !requires.includes(\"sourceVideo\")) {\n throw unsupported(model, \"animates an image and does not take a sourceVideo\");\n }\n checkRequired(model, {\n sourceVideo: request.sourceVideo !== undefined,\n firstFrame: request.image !== undefined,\n sourceAudio: true,\n });\n checkLength(model, \"audio\", request.audio, model.constraints.references?.audioSeconds);\n checkLength(model, \"sourceVideo\", request.sourceVideo, model.constraints.sourceVideoSeconds);\n const resolved: LipsyncRequest = { model: model.id, audio: request.audio };\n if (request.sourceVideo !== undefined) resolved.sourceVideo = request.sourceVideo;\n if (request.image !== undefined) resolved.image = request.image;\n const asked = request.resolution ?? model.defaults.resolution;\n if ((model.constraints.resolutions ?? []).length === 0) {\n if (request.resolution !== undefined) ignored(warnings, model, \"resolution\", asked);\n } else {\n const resolution = resolveVideoResolution(asked, model, onUnsupported, warnings);\n if (resolution !== undefined) resolved.resolution = resolution;\n }\n return { request: resolved, warnings };\n}\n\n/** `dub` on a `dubbing` row: one source, a target language the row lists. */\nexport function resolveDubbingOptions(\n model: CatalogModel,\n request: DubbingRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<DubbingRequest> {\n const warnings: Warning[] = [];\n if (request.sourceVideo !== undefined && request.sourceAudio !== undefined) {\n throw unsupported(model, \"takes a sourceVideo or a sourceAudio, not both\");\n }\n checkRequired(model, {\n sourceVideo: request.sourceVideo !== undefined,\n sourceAudio: request.sourceAudio !== undefined,\n });\n checkLength(model, \"sourceVideo\", request.sourceVideo, model.constraints.sourceVideoSeconds);\n checkLength(\n model,\n \"sourceAudio\",\n request.sourceAudio,\n model.constraints.references?.audioSeconds,\n );\n const target = resolveListed(\n model,\n {\n field: \"targetLanguage\",\n value: request.targetLanguage,\n listed: languageCodes(model),\n fallback: model.defaults.language,\n required: true,\n },\n onUnsupported,\n warnings,\n );\n if (target === undefined) throw missing(model, \"targetLanguage\");\n const resolved: DubbingRequest = { model: model.id, targetLanguage: target };\n if (request.sourceVideo !== undefined) resolved.sourceVideo = request.sourceVideo;\n if (request.sourceAudio !== undefined) resolved.sourceAudio = request.sourceAudio;\n const format = resolveOutputFormat(model, request.outputFormat, onUnsupported, warnings);\n if (format !== undefined) resolved.outputFormat = format;\n return { request: resolved, warnings };\n}\n\n/** `transcribe` on a `transcription` row. */\nexport function resolveTranscriptionOptions(\n model: CatalogModel,\n request: TranscriptionRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<TranscriptionRequest> {\n const warnings: Warning[] = [];\n checkRequired(model, { sourceAudio: true });\n checkLength(model, \"source\", request.source, model.constraints.references?.audioSeconds);\n const resolved: TranscriptionRequest = { model: model.id, source: request.source };\n const language = resolveListed(\n model,\n {\n field: \"language\",\n value: request.language,\n listed: languageCodes(model),\n fallback: model.defaults.language,\n },\n onUnsupported,\n warnings,\n );\n if (language !== undefined) resolved.language = language;\n if (request.timestamps !== undefined) resolved.timestamps = request.timestamps;\n return { request: resolved, warnings };\n}\n","import { planVideoTool } from \"./catalog/video-tools-spec.js\";\nimport { ModelKitError } from \"./errors.js\";\nimport {\n resolveAudioOptions,\n resolveImageOptions,\n resolveVideoOptions,\n type OnUnsupported,\n type ResolveResult,\n} from \"./resolve-options.js\";\nimport {\n resolveDubbingOptions,\n resolveLipsyncOptions,\n resolveSpeechOptions,\n resolveTranscriptionOptions,\n resolveVoiceChangeOptions,\n} from \"./resolve-media.js\";\nimport type {\n AudioRequest,\n CatalogModel,\n DubbingRequest,\n ImageRequest,\n LipsyncRequest,\n ModelType,\n SpeechRequest,\n TranscriptionRequest,\n VideoRequest,\n VideoToolOutputSpec,\n VideoToolRequest,\n VoiceChangeRequest,\n Warning,\n} from \"./types.js\";\n\n/** The client methods that execute a catalog row (text rows run through the text helpers). */\nexport type MediaMethod =\n | \"generateImage\"\n | \"generateVideo\"\n | \"generateAudio\"\n | \"generateSpeech\"\n | \"changeVoice\"\n | \"lipsync\"\n | \"dub\"\n | \"transcribe\"\n | \"submitVideoTool\";\n\n/** Typed as a full `Record` so a new `ModelType` does not compile until it is routed here. */\nexport const MEDIA_METHODS: Record<ModelType, readonly MediaMethod[]> = {\n text: [],\n image: [\"generateImage\"],\n upscale: [\"generateImage\"],\n \"bg-remove\": [\"generateImage\"],\n mask: [\"generateImage\"],\n video: [\"generateVideo\"],\n audio: [\"generateAudio\"],\n \"sound-effect\": [\"generateAudio\"],\n speech: [\"generateSpeech\"],\n \"voice-change\": [\"changeVoice\"],\n lipsync: [\"lipsync\"],\n dubbing: [\"dub\"],\n transcription: [\"transcribe\"],\n \"video-tool\": [\"submitVideoTool\"],\n // 3D jobs run through submitModel3d, which checks the row type itself; their preflight\n // is model3dInputRefusal, not resolveOptions.\n model3d: [],\n};\n\nconst METHOD_NOUN: Record<MediaMethod, string> = {\n generateImage: \"an image model\",\n generateVideo: \"a video model\",\n generateAudio: \"a music or sound-effect model\",\n generateSpeech: \"a text-to-speech model\",\n changeVoice: \"a voice changer\",\n lipsync: \"a lipsync model\",\n dub: \"a dubbing model\",\n transcribe: \"a transcription model\",\n submitVideoTool: \"a video tool\",\n};\n\n/** Refuses a row whose type the method does not execute, with the client's error. */\nexport function assertMethod(model: CatalogModel, method: MediaMethod): void {\n if (MEDIA_METHODS[model.type].includes(method)) return;\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} is not ${METHOD_NOUN[method]}`,\n model: model.id,\n });\n}\n\nexport function resolveImageCall(\n model: CatalogModel,\n request: ImageRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<ImageRequest> {\n assertMethod(model, \"generateImage\");\n return resolveImageOptions(model, request, onUnsupported);\n}\n\nexport function resolveVideoCall(\n model: CatalogModel,\n request: VideoRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<VideoRequest> {\n assertMethod(model, \"generateVideo\");\n return resolveVideoOptions(model, request, onUnsupported);\n}\n\nexport function resolveAudioCall(\n model: CatalogModel,\n request: AudioRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<AudioRequest> {\n assertMethod(model, \"generateAudio\");\n return resolveAudioOptions(model, request, onUnsupported);\n}\n\nexport function resolveSpeechCall(\n model: CatalogModel,\n request: SpeechRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<SpeechRequest> {\n assertMethod(model, \"generateSpeech\");\n return resolveSpeechOptions(model, request, onUnsupported);\n}\n\nexport function resolveVoiceChangeCall(\n model: CatalogModel,\n request: VoiceChangeRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<VoiceChangeRequest> {\n assertMethod(model, \"changeVoice\");\n return resolveVoiceChangeOptions(model, request, onUnsupported);\n}\n\nexport function resolveLipsyncCall(\n model: CatalogModel,\n request: LipsyncRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<LipsyncRequest> {\n assertMethod(model, \"lipsync\");\n return resolveLipsyncOptions(model, request, onUnsupported);\n}\n\nexport function resolveDubbingCall(\n model: CatalogModel,\n request: DubbingRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<DubbingRequest> {\n assertMethod(model, \"dub\");\n return resolveDubbingOptions(model, request, onUnsupported);\n}\n\nexport function resolveTranscriptionCall(\n model: CatalogModel,\n request: TranscriptionRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<TranscriptionRequest> {\n assertMethod(model, \"transcribe\");\n return resolveTranscriptionOptions(model, request, onUnsupported);\n}\n\n/** Video tools pass through unchanged: `planVideoTool` (what the adapter runs) accepts or refuses them. */\nexport function resolveVideoToolCall(\n model: CatalogModel,\n request: VideoToolRequest,\n): ResolveResult<VideoToolRequest> & { output: VideoToolOutputSpec } {\n assertMethod(model, \"submitVideoTool\");\n const plan = planVideoTool(model, request);\n if (!plan.ok) {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: plan.error,\n model: model.id,\n retryable: false,\n });\n }\n return { request, warnings: [], output: plan.output };\n}\n\n/** A request tagged with the client method it is meant for. */\nexport type ResolveCall =\n | { method: \"generateImage\"; request: ImageRequest }\n | { method: \"generateVideo\"; request: VideoRequest }\n | { method: \"generateAudio\"; request: AudioRequest }\n | { method: \"generateSpeech\"; request: SpeechRequest }\n | { method: \"changeVoice\"; request: VoiceChangeRequest }\n | { method: \"lipsync\"; request: LipsyncRequest }\n | { method: \"dub\"; request: DubbingRequest }\n | { method: \"transcribe\"; request: TranscriptionRequest }\n | { method: \"submitVideoTool\"; request: VideoToolRequest };\n\nexport type ResolvedCall =\n | { method: \"generateImage\"; request: ImageRequest; warnings: Warning[] }\n | { method: \"generateVideo\"; request: VideoRequest; warnings: Warning[] }\n | { method: \"generateAudio\"; request: AudioRequest; warnings: Warning[] }\n | { method: \"generateSpeech\"; request: SpeechRequest; warnings: Warning[] }\n | { method: \"changeVoice\"; request: VoiceChangeRequest; warnings: Warning[] }\n | { method: \"lipsync\"; request: LipsyncRequest; warnings: Warning[] }\n | { method: \"dub\"; request: DubbingRequest; warnings: Warning[] }\n | { method: \"transcribe\"; request: TranscriptionRequest; warnings: Warning[] }\n | {\n method: \"submitVideoTool\";\n request: VideoToolRequest;\n warnings: Warning[];\n output: VideoToolOutputSpec;\n };\n\n/** Resolves a request exactly as the client method it names would before calling the provider. */\nexport function resolveOptions(\n model: CatalogModel,\n call: ResolveCall,\n onUnsupported: OnUnsupported = \"error\",\n): ResolvedCall {\n switch (call.method) {\n case \"generateImage\":\n return { method: call.method, ...resolveImageCall(model, call.request, onUnsupported) };\n case \"generateVideo\":\n return { method: call.method, ...resolveVideoCall(model, call.request, onUnsupported) };\n case \"generateAudio\":\n return { method: call.method, ...resolveAudioCall(model, call.request, onUnsupported) };\n case \"generateSpeech\":\n return {\n method: call.method,\n ...resolveSpeechCall(model, call.request, onUnsupported),\n };\n case \"changeVoice\":\n return {\n method: call.method,\n ...resolveVoiceChangeCall(model, call.request, onUnsupported),\n };\n case \"lipsync\":\n return {\n method: call.method,\n ...resolveLipsyncCall(model, call.request, onUnsupported),\n };\n case \"dub\":\n return {\n method: call.method,\n ...resolveDubbingCall(model, call.request, onUnsupported),\n };\n case \"transcribe\":\n return {\n method: call.method,\n ...resolveTranscriptionCall(model, call.request, onUnsupported),\n };\n case \"submitVideoTool\":\n return { method: call.method, ...resolveVideoToolCall(model, call.request) };\n }\n}\n"],"mappings":"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,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;;;AClKA,IAAMC,YAAqC,CAAC,UAAU,eAAe;AACrE,IAAM,YACF;AAMG,IAAM,wBAAwB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAEO,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,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA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I,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,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,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAA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","names":["SURFACES","row","IMAGE_USAGE","EXPOSURE","LOBE","IMAGE_USAGE","EXPOSURE","EXPOSURE","GOOGLE_LOGO","ELEVENLABS_LOGO","MINIMAX_LOGO","MINIMAX_LOGO","VIDEO_USAGE","EXPOSURE","LUMA_LOGO","VIDEO_USAGE","KLING_RATIOS","H3_RATIOS","KLING_PROMPT","H3_PROMPT","BYTEDANCE_LOGO","GOOGLE_LOGO","import_zod","row","listed","message","row","row","row","import_zod","row","row","SURFACES","row","import_zod","import_zod","row","result","import_zod","seconds","RangeSchema","row","range","listed","fallback","KLING_RATIOS","GROK_RATIOS","RECRAFT_RATIOS","listed","count","unsupported","seconds","missing","unsupported","range","text"]}
|
|
1
|
+
{"version":3,"sources":["../src/catalog-entry.ts","../src/errors.ts","../src/catalog/order.ts","../src/catalog/registry.ts","../src/catalog/exposure.ts","../src/catalog/image-fal.ts","../src/catalog/image-luma.ts","../src/catalog/image.ts","../src/catalog/audio-formats.ts","../src/catalog/veed-subtitle-languages.ts","../src/catalog/canvas-tools.ts","../src/catalog/languages-audio.ts","../src/catalog/voices-elevenlabs.ts","../src/catalog/speech-elevenlabs-direct.ts","../src/catalog/voices-fish.ts","../src/catalog/speech-fish.ts","../src/catalog/voices-gemini.ts","../src/catalog/voices-minimax.ts","../src/catalog/media-nodes.ts","../src/catalog/model3d.ts","../src/catalog/other.ts","../src/catalog/text.ts","../src/catalog/video-families.ts","../src/catalog/video-luma.ts","../src/catalog/video.ts","../src/catalog/video-tools.ts","../src/catalog/models.ts","../src/catalog/schema.ts","../src/resolve-provider-rules.ts","../src/catalog/collisions.ts","../src/catalog/conventions.ts","../src/catalog/model3d-spec.ts","../src/catalog/input-spec.ts","../src/catalog/option-lists.ts","../src/catalog/live.ts","../src/json.ts","../src/catalog/load.ts","../src/catalog/video-tools-spec.ts","../src/video-length.ts","../src/catalog/subtitles-spec.ts","../src/resolve-lists.ts","../src/resolve-image-rules.ts","../src/replicate-video-kinds.ts","../src/resolve-video-rules.ts","../src/resolve-options.ts","../src/resolve-media.ts","../src/resolve-voice.ts","../src/resolve-call.ts"],"sourcesContent":["/**\n * Browser-safe catalog subpath (`@shop-os/modelkit/catalog`).\n *\n * Catalog rows, the option resolver and error types only. No adapters, no\n * client, no key handling, no text helpers and no provider SDKs, so the\n * bundle is safe to ship to browsers (Space Builder pickers, vibe-shared).\n */\nexport { Catalog } from \"./catalog/registry.js\";\nexport { compareCatalogOrder, sortCatalogRows } from \"./catalog/order.js\";\nexport { isListedOn, isListed, normalizeExposure } from \"./catalog/exposure.js\";\nexport type { Surface } from \"./types.js\";\nexport { MODELS } from \"./catalog/models.js\";\nexport * from \"./catalog/schema.js\";\nexport * from \"./catalog/live.js\";\nexport * from \"./catalog/load.js\";\nexport { IMAGE_MODELS } from \"./catalog/image.js\";\nexport { VIDEO_MODELS } from \"./catalog/video.js\";\nexport { VIDEO_TOOL_MODELS } from \"./catalog/video-tools.js\";\nexport { planVideoTool, resolutionTier, videoToolConstraints } from \"./catalog/video-tools-spec.js\";\nexport type { VideoToolPlan } from \"./catalog/video-tools-spec.js\";\nexport { MODEL3D_MODELS } from \"./catalog/model3d.js\";\nexport {\n MODEL3D_IMAGE_SLOTS,\n model3dConstraints,\n model3dInputRefusal,\n model3dSeedFits,\n model3dPricingSku,\n model3dResolution,\n model3dSkus,\n model3dTexture,\n} from \"./catalog/model3d-spec.js\";\nexport type {\n Model3dInputRefusal,\n Model3dPricedInputs,\n Model3dPricedOptions,\n Model3dWired,\n} from \"./catalog/model3d-spec.js\";\nexport { TEXT_MODELS } from \"./catalog/text.js\";\nexport { OTHER_MODELS } from \"./catalog/other.js\";\nexport {\n resolveAudioOptions,\n resolveImageOptions,\n resolveVideoOptions,\n nearestAspectRatio,\n videoLengthViolation,\n} from \"./resolve-options.js\";\nexport type { OnUnsupported, ResolveResult } from \"./resolve-options.js\";\nexport { lumaReframeTooTall, takesTargetAspectRatio } from \"./resolve-provider-rules.js\";\nexport {\n resolveDubbingOptions,\n resolveLipsyncOptions,\n resolveSpeechOptions,\n resolveTranscriptionOptions,\n resolveVoiceChangeOptions,\n} from \"./resolve-media.js\";\nexport { resolveVoiceCloneOptions, resolveVoiceDesignOptions } from \"./resolve-voice.js\";\nexport { MEDIA_METHODS, resolveOptions } from \"./resolve-call.js\";\nexport type { MediaMethod, ResolveCall, ResolvedCall } from \"./resolve-call.js\";\nexport { MEDIA_NODE_MODELS } from \"./catalog/media-nodes.js\";\nexport type { VideoSecondsLimits } from \"./types.js\";\nexport {\n outputAudio,\n billedAudio,\n promptConventions,\n AUDIO_OUTPUTS,\n REFERENCE_SYNTAXES,\n} from \"./catalog/conventions.js\";\nexport { ModelKitError, isModelKitError } from \"./errors.js\";\nexport type { ModelKitErrorCode, ModelKitErrorInit, ProviderErrorBody } from \"./errors.js\";\nexport type * from \"./types.js\";\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 /** The provider account is out of credit or quota (HTTP 402 and its body spellings). Never retried. */\n | \"provider_billing\"\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 type { CatalogModel } from \"../types.js\";\n\n/**\n * Picker order for every surface: `display.sortOrder` descending (a higher\n * number shows first), rows without one after the ordered ones, then `label`\n * ascending (case-insensitive), then `id` so the order is total.\n *\n * pro-backend applies the same rule in SQL (`ORDER BY sortOrder DESC NULLS\n * LAST, lower(label), id`); this comparator covers the snapshot and cache\n * fallbacks and any consumer that sorts a subset.\n */\nexport function compareCatalogOrder(a: CatalogModel, b: CatalogModel): number {\n const sa = a.display?.sortOrder;\n const sb = b.display?.sortOrder;\n if (sa !== undefined && sb !== undefined && sa !== sb) return sb - sa;\n if (sa !== undefined && sb === undefined) return -1;\n if (sa === undefined && sb !== undefined) return 1;\n return compareText(a.label.toLowerCase(), b.label.toLowerCase()) || compareText(a.id, b.id);\n}\n\nfunction compareText(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nexport function sortCatalogRows<T extends CatalogModel>(rows: readonly T[]): T[] {\n return [...rows].sort(compareCatalogOrder);\n}\n","import { ModelKitError } from \"../errors.js\";\nimport type { CatalogModel, Lifecycle, ModelType } from \"../types.js\";\nimport { compareCatalogOrder } from \"./order.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 if (this.byId.has(model.id)) {\n throw new Error(`Duplicate model id \"${model.id}\"`);\n }\n if (this.byAlias.has(model.id)) {\n throw new Error(\n `Model id \"${model.id}\" collides with an alias of \"${this.byAlias.get(model.id)}\"`,\n );\n }\n for (const alias of model.aliases) {\n if (alias === model.id) {\n throw new Error(`Alias \"${alias}\" collides with its own model id \"${model.id}\"`);\n }\n const existing = this.byAlias.get(alias);\n if (existing !== undefined) {\n throw new Error(`Duplicate alias \"${alias}\" (already maps to \"${existing}\")`);\n }\n }\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 /** Rows in picker order: `display.sortOrder` descending, then label. See `compareCatalogOrder`. */\n list(filter: { type?: ModelType; lifecycle?: Lifecycle[] } = {}): CatalogModel[] {\n const lifecycles = filter.lifecycle ?? [\"active\"];\n return [...this.byId.values()]\n .filter(\n (m) =>\n (filter.type ? m.type === filter.type : true) &&\n lifecycles.includes(m.lifecycle),\n )\n .sort(compareCatalogOrder);\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 /** Atomically swap every row. Builds the maps first so a bad batch throws before anything changes. */\n replace(rows: CatalogModel[]): void {\n const next = new Catalog(rows);\n this.byId.clear();\n this.byAlias.clear();\n for (const [id, model] of next.byId) this.byId.set(id, model);\n for (const [alias, id] of next.byAlias) this.byAlias.set(alias, id);\n }\n}\n","import type { CatalogModel, Surface } from \"../types.js\";\n\nexport const SURFACES: readonly Surface[] = [\"cowork\", \"space_builder\"];\n\nexport function normalizeExposure(value: unknown): unknown {\n if (value === \"catalog\") return [\"cowork\", \"space_builder\"];\n if (value === \"internal\") return [];\n if (Array.isArray(value)) {\n if (\n value.every((entry): entry is Surface =>\n (SURFACES as readonly unknown[]).includes(entry),\n )\n ) {\n const present = new Set<unknown>(value);\n return SURFACES.filter((surface) => present.has(surface));\n }\n return value;\n }\n return value;\n}\n\n/** True when an active row is listed on `surface`. */\nexport function isListedOn(row: CatalogModel, surface: Surface): boolean {\n return row.lifecycle === \"active\" && row.exposure.includes(surface);\n}\n\n/** True when an active row is listed on at least one surface. */\nexport function isListed(row: CatalogModel): boolean {\n return row.lifecycle === \"active\" && row.exposure.length > 0;\n}\n","import type { AspectRatio, CatalogModel } from \"../types.js\";\n\n// fal image rows whose request bodies adapters/fal-image.ts builds. Every constraint below is\n// read from the endpoint's queue OpenAPI schema (https://fal.ai/api/openapi/queue/openapi.json\n// ?endpoint_id=<id>, saved under src/adapters/__fixtures__/fal); prices from the fal model pages.\n\nconst IMAGE_USAGE = { unit: \"images\" } as const;\nconst EXPOSURE: CatalogModel[\"exposure\"] = [\"cowork\", \"space_builder\"];\nconst LOBE = \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light\";\n\n// Custom pixel sizes (Krea, Qwen) take any ratio; these are the canonical ones they get.\nconst SIZED_RATIOS: AspectRatio[] = [\n \"1:1\",\n \"16:9\",\n \"9:16\",\n \"4:3\",\n \"3:4\",\n \"3:2\",\n \"2:3\",\n \"4:5\",\n \"5:4\",\n \"21:9\",\n \"9:21\",\n];\n\nconst KLING_RATIOS: AspectRatio[] = [\"16:9\", \"9:16\", \"1:1\", \"4:3\", \"3:4\", \"3:2\", \"2:3\", \"21:9\"];\n\nconst RECRAFT_RATIOS: AspectRatio[] = [\n \"1:1\",\n \"4:3\",\n \"3:4\",\n \"16:9\",\n \"9:16\",\n \"3:2\",\n \"2:3\",\n \"5:4\",\n \"4:5\",\n];\n\nexport const FAL_IMAGE_MODELS: CatalogModel[] = [\n {\n // krea/v3/text-to-image; references switch to krea/v3/edit (1-8 images). Billed per\n // output megapixel ($0.025/MP) plus each reference image's megapixels.\n id: \"krea-3\",\n aliases: [],\n label: \"Krea 3\",\n type: \"image\",\n adapter: \"fal\",\n providerModelId: \"krea/v3/text-to-image\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n aspectRatios: [...SIZED_RATIOS],\n sizes: [\"1K\", \"2K\"],\n references: { images: 8 },\n supports: [\"seed\", \"outputFormat\"],\n prompt: { referenceSyntax: \"numbered\", maxChars: 5000 },\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\", outputFormat: \"png\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"krea\",\n description:\n \"Krea 3 photoreal image generation and multi-image editing; takes a prompt and up to 8 reference images and outputs up to 4 megapixels.\",\n logo: `${LOBE}/krea.png`,\n },\n },\n {\n // xai/grok-imagine-image/v2.0/text-to-image; references switch to .../edit (up to 5).\n // $0.04 low / $0.06 medium at 1K, $0.06 / $0.08 at 2K; edits add $0.01 per input image.\n id: \"grok-imagine-image-2.0\",\n aliases: [],\n label: \"Grok Imagine Image 2.0\",\n type: \"image\",\n adapter: \"fal\",\n providerModelId: \"xai/grok-imagine-image/v2.0/text-to-image\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n aspectRatios: [\"1:1\", \"16:9\", \"9:16\", \"4:3\", \"3:4\", \"3:2\", \"2:3\", \"adaptive\"],\n sizes: [\"1K\", \"2K\"],\n qualityOptions: [\"low\", \"medium\"],\n references: { images: 5 },\n supports: [\"quality\", \"count\", \"outputFormat\"],\n prompt: { referenceSyntax: \"numbered\", maxChars: 8000 },\n },\n defaults: { size: \"1K\", aspectRatio: \"adaptive\", quality: \"medium\", count: 1 },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"xai\",\n description:\n \"xAI Grok Imagine Image 2.0 text-to-image and editing; takes a prompt and up to 5 images and outputs 1K or 2K in low or medium quality.\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/858b7fcc-9bd5-411d-aea1-a7b35ecfffab_compressed.png\",\n },\n },\n {\n // alibaba/qwen-image-3/text-to-image; references switch to .../edit (1-3 images, addressed\n // as \"image 1\"..\"image 3\"). $0.04 per image at 1K, $0.075 at 2K.\n id: \"qwen-image-3\",\n aliases: [],\n label: \"Qwen Image 3\",\n type: \"image\",\n adapter: \"fal\",\n providerModelId: \"alibaba/qwen-image-3/text-to-image\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n aspectRatios: [...SIZED_RATIOS],\n sizes: [\"1K\", \"2K\"],\n references: { images: 3 },\n supports: [\"seed\", \"count\", \"outputFormat\"],\n prompt: { referenceSyntax: \"numbered\", maxChars: 5000 },\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\", count: 1 },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"alibaba\",\n description:\n \"Alibaba Qwen Image 3 text-to-image and multi-image editing with strong text rendering; takes a prompt and up to 3 reference images and outputs 1K or 2K.\",\n logo: `${LOBE}/qwen-color.png`,\n },\n },\n {\n // fal-ai/kling-image/o3/text-to-image; references switch to .../o3/image-to-image (up to\n // 10, \"@Image1\"..\"@Image10\"). $0.028 per image at 1K and 2K, double at 4K.\n id: \"kling-image-o3\",\n aliases: [],\n label: \"Kling Image O3\",\n type: \"image\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/kling-image/o3/text-to-image\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n aspectRatios: [...KLING_RATIOS, \"adaptive\"],\n sizes: [\"1K\", \"2K\", \"4K\"],\n references: { images: 10 },\n supports: [\"count\", \"outputFormat\"],\n prompt: { referenceSyntax: \"numbered\", maxChars: 2500 },\n },\n defaults: { size: \"1K\", aspectRatio: \"adaptive\", count: 1 },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"kuaishou\",\n description:\n \"Kling Image O3 text-to-image and multi-reference image editing; takes a prompt and up to 10 reference images and outputs 1K, 2K or 4K.\",\n logo: `${LOBE}/kling-color.png`,\n },\n },\n {\n // fal-ai/kling-image/v3/text-to-image; a reference switches to .../v3/image-to-image, which\n // takes exactly one image_url and no \"auto\" ratio. $0.028 per image.\n id: \"kling-image-3.0\",\n aliases: [],\n label: \"Kling Image 3.0\",\n type: \"image\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/kling-image/v3/text-to-image\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n aspectRatios: [...KLING_RATIOS],\n sizes: [\"1K\", \"2K\"],\n references: { images: 1 },\n supports: [\"count\", \"outputFormat\"],\n prompt: { referenceSyntax: \"numbered\", maxChars: 2500 },\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\", count: 1 },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"kuaishou\",\n description:\n \"Kling Image 3.0 text-to-image and single-image restyling; takes a prompt and an optional reference image and outputs 1K or 2K.\",\n logo: `${LOBE}/kling-color.png`,\n },\n },\n {\n // $0.007 per image. Generation only: Recraft V4.1 has no edit endpoint on fal. Size is\n // not sent (the ratio picks Recraft's canvas); the one tier is the pricing key.\n id: \"recraft-v4.1-flash\",\n aliases: [],\n label: \"Recraft V4.1 Flash\",\n type: \"image\",\n adapter: \"fal\",\n providerModelId: \"recraft/v4.1/flash/text-to-image\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n references: { images: 0 },\n aspectRatios: [...RECRAFT_RATIOS],\n sizes: [\"1K\"],\n supports: [],\n prompt: { referenceSyntax: \"numbered\", maxChars: 10000 },\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"recraft\",\n description:\n \"Recraft V4.1 Flash fast design-first text-to-image for brand, editorial and layout work; takes a prompt and outputs a raster image.\",\n logo: `${LOBE}/recraft.png`,\n },\n },\n {\n // Generation only. $0.05 per image (thinking mode, not sent, would be 1.2x). No size\n // field; the one tier is the pricing key.\n id: \"sensenova-u1-infographic\",\n aliases: [],\n label: \"SenseNova U1 Infographic\",\n type: \"image\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/sensenova-u1-infographic\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n references: { images: 0 },\n aspectRatios: [\"1:1\", \"16:9\", \"9:16\", \"3:2\", \"2:3\", \"4:3\", \"3:4\"],\n sizes: [\"1K\"],\n supports: [\"seed\", \"outputFormat\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"16:9\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"sensetime\",\n description:\n \"SenseNova U1 Infographic turns a detailed prompt into a laid-out infographic with charts, sections and legible text.\",\n logo: `${LOBE}/sensenova-color.png`,\n },\n },\n];\n","import type { AspectRatio, CatalogModel } from \"../types.js\";\n\n// Luma image rows (Agents API uni models). Every limit below is from the\n// verified request shapes in the ENG-3272 work order (docs.agents.lumalabs.ai):\n// one image per call, the first reference is the source to edit, aspect_ratio\n// is omitted on edits and when adaptive, output_format is png or jpeg.\n\nconst IMAGE_USAGE = { unit: \"images\" } as const;\nconst EXPOSURE: CatalogModel[\"exposure\"] = [\"cowork\", \"space_builder\"];\nconst LOBE = \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light\";\nconst LUMA_LOGO = `${LOBE}/luma-color.png`;\n\nconst UNI_RATIOS: AspectRatio[] = [\"adaptive\", \"16:9\", \"3:2\", \"1:1\", \"2:3\", \"9:16\"];\n\nfunction uniImage(\n id: string,\n label: string,\n providerModelId: string,\n description: string,\n): CatalogModel {\n return {\n // https://docs.agents.lumalabs.ai: type \"image\" without references, else\n // \"image_edit\" with the first reference as source and up to 8 more as\n // image_ref. The output is always 2048 px on the long side.\n id,\n aliases: [],\n label,\n type: \"image\",\n adapter: \"luma\",\n providerModelId,\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n aspectRatios: [...UNI_RATIOS],\n sizes: [\"2K\"],\n references: { images: 9 },\n supports: [\"outputFormat\"],\n prompt: { referenceSyntax: \"numbered\", maxChars: 6000 },\n },\n defaults: { size: \"2K\", aspectRatio: \"adaptive\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"luma\",\n description,\n logo: LUMA_LOGO,\n },\n };\n}\n\nexport const LUMA_IMAGE_MODELS: CatalogModel[] = [\n uniImage(\n \"uni-1\",\n \"Uni-1\",\n \"uni-1\",\n \"Luma Uni-1 fast image generation and editing; takes a prompt and up to 9 reference images and outputs 2K.\",\n ),\n uniImage(\n \"uni-1-max\",\n \"Uni-1 Max\",\n \"uni-1-max\",\n \"Luma Uni-1 Max higher-quality image generation and editing; takes a prompt and up to 9 reference images and outputs 2K.\",\n ),\n];\n","import type {\n AspectRatio,\n CatalogDisplay,\n CatalogModel,\n ImageSize,\n PromptConventions,\n ReferenceLimits,\n Surface,\n} from \"../types.js\";\nimport { FAL_IMAGE_MODELS } from \"./image-fal.js\";\nimport { LUMA_IMAGE_MODELS } from \"./image-luma.js\";\n\nconst IMAGE_USAGE = { unit: \"images\" } as const;\n\n// Every image row generates from a prompt and conditions on references, so the\n// two flags travel together; vendor rows still declare them per row below.\n\n// https://ai.google.dev/gemini-api/docs/image-generation#aspect_ratios\nconst GEMINI_RATIOS: AspectRatio[] = [\n \"1:1\",\n \"2:3\",\n \"3:2\",\n \"16:9\",\n \"9:16\",\n \"4:3\",\n \"3:4\",\n \"21:9\",\n \"4:5\",\n \"5:4\",\n \"adaptive\",\n];\n\n// Nano Banana 2.1 adds the tall and wide strips and fixes their tiling at 2K and 4K.\n// https://ai.google.dev/gemini-api/docs/models/gemini-nano-banana-2.1\nconst NANO_BANANA_2_1_RATIOS: AspectRatio[] = [\n ...GEMINI_RATIOS.filter((r) => r !== \"adaptive\"),\n \"1:4\",\n \"4:1\",\n \"1:8\",\n \"8:1\",\n \"adaptive\",\n];\n\n// Gemini image token budgets are far above this; 50,000 matches cowork's global prompt ceiling.\nconst GEMINI_PROMPT_MAX_CHARS = 50000;\n// OpenAI's images API caps a GPT image model prompt at 32,000 characters.\nconst GPT_IMAGE_PROMPT = { referenceSyntax: \"numbered\", maxChars: 32000 } as const;\n\nfunction geminiImage(\n id: string,\n label: string,\n aliases: string[],\n sizes: ImageSize[],\n display: CatalogDisplay,\n exposure: Surface[],\n references?: ReferenceLimits,\n promptMaxChars?: number,\n aspectRatios: AspectRatio[] = GEMINI_RATIOS,\n): CatalogModel {\n // google-image sends MediaRef.label as a text part beside each reference.\n const prompt: PromptConventions = { referenceSyntax: \"caption\" };\n if (promptMaxChars !== undefined) prompt.maxChars = promptMaxChars;\n const constraints: CatalogModel[\"constraints\"] = {\n aspectRatios: [...aspectRatios],\n sizes,\n supports: [\"safetySettings\", \"temperature\"],\n prompt,\n };\n if (references !== undefined) constraints.references = references;\n const model: CatalogModel = {\n id,\n aliases,\n label,\n type: \"image\",\n adapter: \"google-image\",\n providerModelId: id,\n lifecycle: \"active\",\n exposure,\n constraints,\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE, slug: \"gemini\" },\n pricingKind: \"image_size\",\n display,\n };\n return model;\n}\n\nexport const IMAGE_MODELS: CatalogModel[] = [\n geminiImage(\n \"gemini-nano-banana-2.1\",\n \"Nano Banana 2.1\",\n [\"nb-2.1\"],\n [\"1K\", \"2K\", \"4K\"],\n {\n provider: \"google\",\n description:\n \"Latest high-efficiency Nano Banana. Better realism, prompt adherence, text rendering and character consistency at Flash speed. Great for campaigns, infographics, and iterative edits.\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png\",\n },\n [\"cowork\", \"space_builder\"],\n { images: 14 },\n GEMINI_PROMPT_MAX_CHARS,\n NANO_BANANA_2_1_RATIOS,\n ),\n // Google retired the -preview endpoints for the GA ids; the catalog ids stay because they\n // are pricing keys and stored model ids.\n {\n ...geminiImage(\n \"gemini-3-pro-image-preview\",\n \"Nano Banana Pro\",\n [\"nb-pro\"],\n [\"1K\", \"2K\", \"4K\"],\n {\n provider: \"google\",\n description:\n \"Create stunning, production-quality visuals with exceptional realism, detail, and typography. Best for campaigns, e-commerce, product photography, and hero creatives.\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png\",\n },\n [\"cowork\", \"space_builder\"],\n { images: 14 },\n GEMINI_PROMPT_MAX_CHARS,\n ),\n providerModelId: \"gemini-3-pro-image\",\n },\n {\n ...geminiImage(\n \"gemini-3.1-flash-image-preview\",\n \"Nano Banana 2\",\n [\"nb-2\"],\n // Flash 3.1 is the only Gemini image model with the 512 tier.\n [\"512\", \"1K\", \"2K\", \"4K\"],\n {\n provider: \"google\",\n description:\n \"Generate high-quality images at speed. Perfect for brainstorming, concept boards, concept testing, creative exploration, and large batch workflows.\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png\",\n },\n [\"cowork\", \"space_builder\"],\n { images: 14 },\n GEMINI_PROMPT_MAX_CHARS,\n ),\n providerModelId: \"gemini-3.1-flash-image\",\n },\n geminiImage(\n \"gemini-3.1-flash-lite-image\",\n \"Nano Banana Lite\",\n [\"nb-lite\"],\n [\"1K\"],\n {\n provider: \"google\",\n description:\n \"The fastest and most affordable image model. Ideal for rapid drafts, bulk exploration, and iterative concept testing at 1K resolution.\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png\",\n },\n [\"cowork\", \"space_builder\"],\n { images: 14 },\n GEMINI_PROMPT_MAX_CHARS,\n ),\n // trigger-workflows validates 1K only; pricing seeds 2K/4K rows so allow all three.\n geminiImage(\n \"gemini-2.5-flash-image\",\n \"Gemini 2.5 Flash Image\",\n [],\n [\"1K\"],\n {\n provider: \"google\",\n description:\n \"Nano Banana (legacy Gemini 2.5 Flash Image) native image generation and editing model for high-volume, low-latency creative workflows.\",\n },\n [],\n ),\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 exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n exactSizes: {\n \"1:1\": \"1024x1024\",\n \"3:2\": \"1536x1024\",\n \"2:3\": \"1024x1536\",\n \"16:9\": \"2048x1152\",\n \"9:16\": \"1152x2048\",\n \"4:5\": \"1024x1280\",\n \"5:4\": \"1280x1024\",\n },\n aspectRatios: [\"1:1\", \"3:2\", \"2:3\", \"16:9\", \"9:16\", \"4:5\", \"5:4\", \"adaptive\"],\n sizes: [\"1K\", \"2K\", \"4K\"],\n qualityOptions: [\"auto\", \"low\", \"medium\", \"high\"],\n references: { images: 16 },\n supports: [\"quality\", \"count\", \"outputFormat\"],\n prompt: GPT_IMAGE_PROMPT,\n },\n defaults: { size: \"1K\", aspectRatio: \"adaptive\", quality: \"auto\" },\n usage: { ...IMAGE_USAGE, slug: \"gpt\" },\n pricingKind: \"image_size\",\n display: {\n provider: \"openai\",\n description:\n \"The most capable model for image editing and complex creative instructions. Excels at text rendering, visual consistency, design generation, and iterative refinement.\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/1204b494-8962-4f7f-af5e-699a8bdc98e3_compressed.png\",\n },\n },\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 exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n exactSizes: {\n \"1:1\": \"1024x1024\",\n \"3:2\": \"1536x1024\",\n \"2:3\": \"1024x1536\",\n \"16:9\": \"2048x1152\",\n \"9:16\": \"1152x2048\",\n \"4:5\": \"1024x1280\",\n \"5:4\": \"1280x1024\",\n },\n aspectRatios: [\"1:1\", \"3:2\", \"2:3\", \"16:9\", \"9:16\", \"4:5\", \"5:4\", \"adaptive\"],\n sizes: [\"1K\", \"2K\", \"4K\"],\n qualityOptions: [\"auto\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"],\n references: { images: 16 },\n supports: [\"quality\", \"count\", \"outputFormat\"],\n prompt: GPT_IMAGE_PROMPT,\n },\n defaults: { size: \"1K\", aspectRatio: \"adaptive\", quality: \"auto\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"openai\",\n description:\n \"OpenAI's most capable GPT Image 2.5 tier, built for editing precision; takes text and image input and outputs images in low, medium, high, xhigh, or max quality.\",\n },\n },\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 exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n exactSizes: {\n \"1:1\": \"1024x1024\",\n \"3:2\": \"1536x1024\",\n \"2:3\": \"1024x1536\",\n \"16:9\": \"2048x1152\",\n \"9:16\": \"1152x2048\",\n \"4:5\": \"1024x1280\",\n \"5:4\": \"1280x1024\",\n },\n aspectRatios: [\"1:1\", \"3:2\", \"2:3\", \"16:9\", \"9:16\", \"4:5\", \"5:4\", \"adaptive\"],\n sizes: [\"1K\", \"2K\", \"4K\"],\n qualityOptions: [\"auto\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"],\n references: { images: 16 },\n supports: [\"quality\", \"count\", \"outputFormat\"],\n prompt: GPT_IMAGE_PROMPT,\n },\n defaults: { size: \"1K\", aspectRatio: \"adaptive\", quality: \"auto\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"openai\",\n description:\n \"OpenAI's fastest GPT Image 2.5 tier for high-quality everyday image generation and editing; takes text and image input and outputs images.\",\n },\n },\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: [\"meta-muse\"],\n label: \"Meta Muse\",\n type: \"image\",\n adapter: \"fal\",\n providerModelId: \"muse-image-1.0\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\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 \"9:21\",\n \"adaptive\",\n ],\n sizes: [\"1K\"],\n references: { images: 10 },\n supports: [\"count\", \"outputFormat\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\", outputFormat: \"png\", count: 1 },\n usage: { ...IMAGE_USAGE, slug: \"muse\" },\n pricingKind: \"image_size\",\n display: {\n provider: \"meta\",\n description:\n \"Meta's image model with built-in world knowledge and strong prompt adherence. Great for concept-rich scenes, realistic compositions, and reference-guided edits.\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/characters/1787909065794-k9a7zz.png\",\n },\n },\n {\n // References switch to the edit endpoint: the first is the image to edit,\n // the rest (up to 4) guide it.\n id: \"ideogram-4.5\",\n aliases: [],\n label: \"Ideogram 4.5\",\n type: \"image\",\n adapter: \"fal\",\n providerModelId: \"ideogram/v4.5\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [\"1:1\", \"16:9\", \"9:16\", \"4:3\", \"3:4\", \"3:2\", \"2:3\", \"5:4\", \"4:5\"],\n sizes: [\"1K\", \"2K\"],\n qualityOptions: [\"auto\", \"low\", \"medium\", \"high\"],\n references: { images: 5 },\n supports: [\"quality\", \"count\", \"seed\"],\n },\n defaults: { size: \"2K\", aspectRatio: \"1:1\", quality: \"medium\", count: 1 },\n usage: { ...IMAGE_USAGE, slug: \"ideogram\" },\n pricingKind: \"image_size\",\n display: {\n provider: \"ideogram\",\n description:\n \"Ideogram's precise edit model: repeated edits keep the untouched pixels and colours intact, at the source's native resolution. Also generates from text.\",\n },\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 exposure: [\"cowork\", \"space_builder\"],\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\", \"outputFormat\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"bytedance\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/3bba5d81-4e57-4e71-911b-cdfa05acca2c_compressed.png\",\n description:\n \"ByteDance Seedream 5.0 Pro text-to-image and multi-reference image-to-image (up to 10 inputs) with region editing; outputs 1K, 1.5K, or 2K.\",\n },\n },\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 exposure: [],\n constraints: {\n // 97:30 has no Ark size spelling; the A+ flow pads inputs to 97:30 and\n // omits the ratio instead. Advertise only sizes the adapter can send.\n aspectRatios: [\n \"1:1\",\n \"2:3\",\n \"3:2\",\n \"4:3\",\n \"3:4\",\n \"4:5\",\n \"5:4\",\n \"9:16\",\n \"16:9\",\n \"21:9\",\n \"9:21\",\n ],\n sizes: [\"2K\", \"4K\"],\n references: { images: 10 },\n supports: [\"seed\"],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"bytedance\",\n description:\n \"ByteDance Seedream 4.5 text-to-image and image-to-image with up to 14 reference images and batch image-set generation; outputs 2K or 4K.\",\n },\n },\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 exposure: [\"cowork\", \"space_builder\"],\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 references: { images: 8 },\n // flux-2-pro's job type always returns image/png; only the seed is forwarded.\n supports: [\"seed\"],\n // Prodia's flux-2-pro schema gives the prompt a maxLength of 32,768.\n prompt: { referenceSyntax: \"numbered\", maxChars: 32768 },\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"black-forest-labs\",\n logo: \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/flux.png\",\n description:\n \"Black Forest Labs FLUX.2 [pro] text-to-image and multi-reference editing model served via Prodia; takes a prompt and up to 8 input images and outputs up to 4096x4096.\",\n },\n },\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 exposure: [],\n constraints: {\n aspectRatios: [\"1:1\", \"2:3\", \"3:2\", \"4:3\", \"3:4\", \"4:5\", \"5:4\", \"9:16\", \"16:9\", \"21:9\"],\n sizes: [\"1K\", \"2K\", \"4K\"],\n requires: [\"references\"],\n supports: [],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"google\",\n description:\n \"Google Gemini 3 Pro image generation and editing served via Prodia; takes a prompt plus up to 3 reference images and outputs 1K, 2K, or 4K.\",\n },\n },\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 exposure: [],\n constraints: {\n aspectRatios: [\"1:1\", \"2:3\", \"3:4\", \"4:3\", \"9:16\", \"16:9\", \"21:9\"],\n sizes: [\"1K\"],\n requires: [\"references\"],\n supports: [],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { ...IMAGE_USAGE },\n pricingKind: \"image_size\",\n display: {\n provider: \"google\",\n description:\n \"Google Nano Banana image generation and editing served via Prodia; takes a prompt plus 1-3 input images and matches the first input's aspect ratio in roughly 8 seconds.\",\n },\n },\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 exposure: [],\n constraints: {\n aspectRatios: [\"1:1\", \"16:9\", \"9:16\", \"4:3\", \"3:4\"],\n sizes: [\"1K\", \"2K\", \"4K\"],\n references: { images: 9 },\n supports: [],\n },\n defaults: { size: \"1K\", aspectRatio: \"1:1\" },\n usage: { unit: \"compute_seconds\" },\n pricingKind: \"image_size\",\n display: {\n provider: \"alibaba\",\n description:\n \"Alibaba Wan 2.7 Image Pro text-to-image and image-editing model; takes a prompt plus up to 9 reference images and generates up to 4K (4096x4096).\",\n },\n },\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 exposure: [],\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 supports: [],\n },\n defaults: { aspectRatio: \"1:1\" },\n usage: { unit: \"compute_seconds\" },\n pricingKind: \"image_size\",\n display: {\n provider: \"alibaba\",\n description:\n \"Alibaba Qwen Image 2 Pro unified text-to-image and editing model; takes a prompt plus an optional single reference image and generates native 2K output.\",\n },\n },\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 exposure: [],\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\" },\n pricingKind: \"image_size\",\n display: {\n provider: \"alibaba\",\n description:\n \"Alibaba Qwen Image Edit Plus with Lightning and a skin-retouching LoRA; takes one or more reference images plus an edit prompt and outputs webp, jpg, or png.\",\n },\n },\n ...FAL_IMAGE_MODELS,\n ...LUMA_IMAGE_MODELS,\n];\n","// Output formats an audio row offers, as the provider spells them. Only MP3 and WAV: the\n// raw PCM, mu-law and A-law outputs have no container, and the canvas stores the result\n// as .mp3 unless its MIME says WAV.\n\n/** ElevenLabs TTS, voice changer and sound effects `output_format` (fal's default first). */\nexport const ELEVENLABS_MP3_FORMATS = [\n \"mp3_44100_128\",\n \"mp3_22050_32\",\n \"mp3_44100_32\",\n \"mp3_44100_64\",\n \"mp3_44100_96\",\n \"mp3_44100_192\",\n];\n\n/** ElevenLabs Music v2.5 `output_format` (fal's default first). */\nexport const ELEVENLABS_MUSIC_FORMATS = [\n \"mp3_48000_192\",\n \"mp3_22050_32\",\n \"mp3_24000_48\",\n \"mp3_44100_32\",\n \"mp3_44100_64\",\n \"mp3_44100_96\",\n \"mp3_44100_128\",\n \"mp3_44100_192\",\n \"mp3_48000_128\",\n \"mp3_48000_240\",\n \"mp3_48000_320\",\n];\n\n/** Mirelo SFX 2.0 `upload_audio_format` (fal's default first). */\nexport const MIRELO_FORMATS = [\"wav\", \"mp3\"];\n","// fal's `veed/subtitles` queue OpenAPI (`SubtitlesInput`), saved under adapters/__fixtures__/fal.\n\n/** The spoken-language codes VEED transcribes (`language`). */\nexport const VEED_SUBTITLE_LANGUAGES = [\n \"af-ZA\",\n \"am-ET\",\n \"ar-AE\",\n \"ar-BH\",\n \"ar-DZ\",\n \"ar-EG\",\n \"ar-IL\",\n \"ar-IQ\",\n \"ar-JO\",\n \"ar-KW\",\n \"ar-LB\",\n \"ar-MA\",\n \"ar-OM\",\n \"ar-PS\",\n \"ar-QA\",\n \"ar-SA\",\n \"ar-TN\",\n \"ast-ES\",\n \"az-AZ\",\n \"ba\",\n \"bas\",\n \"be-BY\",\n \"bg-BG\",\n \"br\",\n \"bs-BA\",\n \"ca-ES\",\n \"ceb-PH\",\n \"ckb-IQ\",\n \"cs-CZ\",\n \"cy-GB\",\n \"da-DK\",\n \"de-DE\",\n \"dyu\",\n \"el-GR\",\n \"en-AU\",\n \"en-GB\",\n \"en-IN\",\n \"en-NZ\",\n \"en-US\",\n \"eo\",\n \"es-AR\",\n \"es-BO\",\n \"es-CL\",\n \"es-CO\",\n \"es-CR\",\n \"es-DO\",\n \"es-EC\",\n \"es-ES\",\n \"es-GT\",\n \"es-HN\",\n \"es-MX\",\n \"es-NI\",\n \"es-PA\",\n \"es-PE\",\n \"es-PR\",\n \"es-PY\",\n \"es-SV\",\n \"es-US\",\n \"es-UY\",\n \"es-VE\",\n \"et-EE\",\n \"eu-ES\",\n \"fa-IR\",\n \"ff\",\n \"fi-FI\",\n \"fil-PH\",\n \"fo\",\n \"fr-CA\",\n \"fr-FR\",\n \"fy\",\n \"ga\",\n \"gd\",\n \"gl-ES\",\n \"ha-NG\",\n \"haw\",\n \"he-IL\",\n \"hr-HR\",\n \"hsb\",\n \"ht\",\n \"hu-HU\",\n \"hy-AM\",\n \"id-ID\",\n \"ig\",\n \"is-IS\",\n \"it-IT\",\n \"ja-JP\",\n \"ja-Latn-JP\",\n \"jv-ID\",\n \"ka-GE\",\n \"kab\",\n \"kam-KE\",\n \"kea-CV\",\n \"kk-KZ\",\n \"ko-KR\",\n \"ku\",\n \"ky-KG\",\n \"la\",\n \"lb-LU\",\n \"lg\",\n \"lij\",\n \"ln-CD\",\n \"lo-LA\",\n \"lt-LT\",\n \"luo-KE\",\n \"lv-LV\",\n \"mg\",\n \"mi-NZ\",\n \"mk-MK\",\n \"mn-MN\",\n \"ms-MY\",\n \"mt-MT\",\n \"nb-NO\",\n \"nl-NL\",\n \"nso-ZA\",\n \"ny-MW\",\n \"oc-FR\",\n \"pl-PL\",\n \"ps-AF\",\n \"pt-BR\",\n \"pt-PT\",\n \"ro-RO\",\n \"roh\",\n \"ru-RU\",\n \"rw-RW\",\n \"sah\",\n \"sk-SK\",\n \"sl-SI\",\n \"sm\",\n \"sn-ZW\",\n \"so-SO\",\n \"sq-AL\",\n \"sr-Latn-RS\",\n \"sr-RS\",\n \"srd\",\n \"ss\",\n \"su-ID\",\n \"sv-SE\",\n \"sw-KE\",\n \"sw-TZ\",\n \"tg-TJ\",\n \"th-TH\",\n \"tk\",\n \"tn\",\n \"tok\",\n \"ton\",\n \"tr-TR\",\n \"ts-ZA\",\n \"tt\",\n \"uk-UA\",\n \"umb-AO\",\n \"ur-IN\",\n \"ur-PK\",\n \"uz-UZ\",\n \"vi-VN\",\n \"vro\",\n \"wo-SN\",\n \"xh-ZA\",\n \"yi\",\n \"yo-NG\",\n \"yue-Hant-HK\",\n \"zh\",\n \"zh-HK\",\n \"zh-TW\",\n \"zu-ZA\",\n];\n\n/** The codes VEED translates captions into (`translation_language`). */\nexport const VEED_SUBTITLE_TRANSLATION_LANGUAGES = [\n \"ab\",\n \"ace\",\n \"ach\",\n \"af-ZA\",\n \"ak\",\n \"alz\",\n \"am-ET\",\n \"ar-AE\",\n \"ar-BH\",\n \"ar-DZ\",\n \"ar-EG\",\n \"ar-IL\",\n \"ar-IQ\",\n \"ar-JO\",\n \"ar-KW\",\n \"ar-LB\",\n \"ar-MA\",\n \"ar-OM\",\n \"ar-PS\",\n \"ar-QA\",\n \"ar-SA\",\n \"ar-TN\",\n \"awa\",\n \"ay\",\n \"az-AZ\",\n \"ban\",\n \"bbc\",\n \"be-BY\",\n \"bem\",\n \"bew\",\n \"bg-BG\",\n \"bho\",\n \"bik\",\n \"bm\",\n \"bs-BA\",\n \"bts\",\n \"btx\",\n \"bua\",\n \"ca-ES\",\n \"ceb-PH\",\n \"cgg\",\n \"chm\",\n \"ckb-IQ\",\n \"cnh\",\n \"co\",\n \"crh\",\n \"crs\",\n \"cs-CZ\",\n \"cv\",\n \"cy-GB\",\n \"da-DK\",\n \"de-DE\",\n \"din\",\n \"doi\",\n \"dov\",\n \"dv\",\n \"dz\",\n \"ee\",\n \"el-GR\",\n \"en-AU\",\n \"en-GB\",\n \"en-IN\",\n \"en-NZ\",\n \"en-US\",\n \"eo\",\n \"es-AR\",\n \"es-BO\",\n \"es-CL\",\n \"es-CO\",\n \"es-CR\",\n \"es-DO\",\n \"es-EC\",\n \"es-ES\",\n \"es-GT\",\n \"es-HN\",\n \"es-MX\",\n \"es-NI\",\n \"es-PA\",\n \"es-PE\",\n \"es-PR\",\n \"es-PY\",\n \"es-SV\",\n \"es-US\",\n \"es-UY\",\n \"es-VE\",\n \"et-EE\",\n \"eu-ES\",\n \"fa-IR\",\n \"ff\",\n \"fi-FI\",\n \"fil-PH\",\n \"fj\",\n \"fr-CA\",\n \"fr-FR\",\n \"fy\",\n \"ga\",\n \"gaa\",\n \"gd\",\n \"gl-ES\",\n \"gn\",\n \"gom\",\n \"ha-NG\",\n \"haw\",\n \"he-IL\",\n \"hil\",\n \"hmn\",\n \"hr-HR\",\n \"hrx\",\n \"ht\",\n \"hu-HU\",\n \"hy-AM\",\n \"id-ID\",\n \"ig\",\n \"ilo\",\n \"is-IS\",\n \"it-IT\",\n \"ja-JP\",\n \"ja-Latn-JP\",\n \"jv-ID\",\n \"ka-GE\",\n \"kk-KZ\",\n \"ko-KR\",\n \"kri\",\n \"ktu\",\n \"ku\",\n \"ky-KG\",\n \"la\",\n \"lb-LU\",\n \"lg\",\n \"li\",\n \"lij\",\n \"lmo\",\n \"ln-CD\",\n \"lo-LA\",\n \"lt-LT\",\n \"ltg\",\n \"luo-KE\",\n \"lus\",\n \"lv-LV\",\n \"mai\",\n \"mak\",\n \"mg\",\n \"mi-NZ\",\n \"min\",\n \"mk-MK\",\n \"mn-MN\",\n \"mni-Mtei\",\n \"ms-Arab\",\n \"ms-MY\",\n \"mt-MT\",\n \"nb-NO\",\n \"new\",\n \"nl-NL\",\n \"nr\",\n \"nso-ZA\",\n \"nus\",\n \"ny-MW\",\n \"oc-FR\",\n \"om\",\n \"pag\",\n \"pam\",\n \"pap\",\n \"pl-PL\",\n \"ps-AF\",\n \"pt-BR\",\n \"pt-PT\",\n \"qu\",\n \"rn\",\n \"ro-RO\",\n \"rom\",\n \"ru-RU\",\n \"rw-RW\",\n \"scn\",\n \"sg\",\n \"shn\",\n \"sk-SK\",\n \"sl-SI\",\n \"sm\",\n \"sn-ZW\",\n \"so-SO\",\n \"sq-AL\",\n \"sr-Latn-RS\",\n \"sr-RS\",\n \"ss\",\n \"st\",\n \"su-ID\",\n \"sv-SE\",\n \"sw-KE\",\n \"sw-TZ\",\n \"szl\",\n \"tet\",\n \"tg-TJ\",\n \"th-TH\",\n \"ti\",\n \"tk\",\n \"tn\",\n \"tr-TR\",\n \"ts-ZA\",\n \"tt\",\n \"ug\",\n \"uk-UA\",\n \"ur-IN\",\n \"ur-PK\",\n \"uz-UZ\",\n \"vi-VN\",\n \"xh-ZA\",\n \"yi\",\n \"yo-NG\",\n \"yua\",\n \"yue-Hant-HK\",\n \"zh\",\n \"zh-HK\",\n \"zh-TW\",\n \"zu-ZA\",\n];\n","import type { CatalogModel } from \"../types.js\";\nimport { VEED_SUBTITLE_LANGUAGES } from \"./veed-subtitle-languages.js\";\n\n// Rows for the Auto Mask and Subtitles canvas nodes, which called fal directly before 0.5.0.\n// Schemas: fal's queue OpenAPI per endpoint id (saved under adapters/__fixtures__/fal).\n\nconst EXPOSURE: CatalogModel[\"exposure\"] = [\"cowork\", \"space_builder\"];\nconst META_LOGO =\n \"https://d31vvfpk2ppdyq.cloudfront.net/assets/characters/1787909065794-k9a7zz.png\";\n\n/**\n * VEED's `preset` enum, \"simple\" first because it is the default (the Subtitles node's).\n * fal bills the dynamic ones (glass to backdrop2) at twice the basic rate.\n */\nexport const VEED_SUBTITLE_PRESETS = [\n \"simple\",\n \"glass\",\n \"whisper\",\n \"glide2\",\n \"fusion\",\n \"glide\",\n \"terminal\",\n \"handwritten\",\n \"backdrop\",\n \"backdrop2\",\n \"plain\",\n \"beans\",\n \"corpo\",\n \"boo\",\n \"shadeplay\",\n \"casper\",\n \"capri\",\n \"lowkey\",\n \"vinta\",\n \"diego\",\n \"ali\",\n \"slay\",\n \"kitty\",\n \"hustle\",\n \"karl\",\n \"sprout\",\n \"flex\",\n \"mint\",\n \"rizz\",\n \"vegas\",\n];\n\nexport const SAM_3_IMAGE: CatalogModel = {\n id: \"sam-3-image\",\n aliases: [\"fal-ai/sam-3/image\"],\n label: \"SAM 3 Segmentation\",\n type: \"mask\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/sam-3/image\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n references: { images: 1 },\n requires: [\"references\"],\n supports: [\"points\", \"boxes\"],\n },\n defaults: {},\n usage: { unit: \"images\" },\n pricingKind: \"flat\",\n display: {\n provider: \"meta\",\n logo: META_LOGO,\n description:\n \"Meta SAM 3 on fal; finds every object a prompt names in one image and returns a black-and-white mask for each.\",\n },\n};\n\nexport const VEED_SUBTITLES: CatalogModel = {\n id: \"veed-subtitles\",\n aliases: [\"veed/subtitles\"],\n label: \"VEED Subtitles\",\n type: \"video-tool\",\n adapter: \"fal\",\n providerModelId: \"veed/subtitles\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n supports: [],\n // fal: up to 2 hours at 1080p or below, 1 hour above.\n sourceVideoSeconds: { max: 7200 },\n tool: {\n kind: \"subtitles\",\n presets: VEED_SUBTITLE_PRESETS,\n languages: VEED_SUBTITLE_LANGUAGES,\n maxSecondsAbove1080p: 3600,\n },\n },\n defaults: {},\n usage: { unit: \"seconds\" },\n // Billed per source second like the other video tools ($0.10 per minute at every tier).\n pricingKind: \"video_per_second\",\n display: {\n provider: \"veed\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/d540d2bb-0022-4371-8889-48aefaf46bbe.png\",\n description:\n \"VEED subtitles; transcribes a clip's speech and burns in styled, word-timed captions.\",\n },\n};\n","import type { LanguageOption } from \"../types.js\";\n\n// Data only. `code` is the value sent to the provider. Sources: ElevenLabs model, dubbing and\n// speech-to-text docs (2026-10-20) and the `language_boost` enum of fal's MiniMax Speech schema.\n\n/** Eleven v4 and v4 Turbo `language_code`: ISO 639-1, or 639-3 where 639-1 has none. */\nexport const ELEVENLABS_V4_LANGUAGES: LanguageOption[] = [\n { code: \"af\", name: \"Afrikaans\" },\n { code: \"ar\", name: \"Arabic\" },\n { code: \"hy\", name: \"Armenian\" },\n { code: \"as\", name: \"Assamese\" },\n { code: \"ast\", name: \"Asturian\" },\n { code: \"az\", name: \"Azerbaijani\" },\n { code: \"be\", name: \"Belarusian\" },\n { code: \"bn\", name: \"Bengali\" },\n { code: \"bs\", name: \"Bosnian\" },\n { code: \"bg\", name: \"Bulgarian\" },\n { code: \"my\", name: \"Burmese\" },\n { code: \"yue\", name: \"Cantonese\" },\n { code: \"ca\", name: \"Catalan\" },\n { code: \"ceb\", name: \"Cebuano\" },\n { code: \"hr\", name: \"Croatian\" },\n { code: \"cs\", name: \"Czech\" },\n { code: \"da\", name: \"Danish\" },\n { code: \"nl\", name: \"Dutch\" },\n { code: \"en\", name: \"English\" },\n { code: \"et\", name: \"Estonian\" },\n { code: \"fil\", name: \"Filipino\" },\n { code: \"fi\", name: \"Finnish\" },\n { code: \"fr\", name: \"French\" },\n { code: \"gl\", name: \"Galician\" },\n { code: \"ka\", name: \"Georgian\" },\n { code: \"de\", name: \"German\" },\n { code: \"el\", name: \"Greek\" },\n { code: \"gu\", name: \"Gujarati\" },\n { code: \"ha\", name: \"Hausa\" },\n { code: \"he\", name: \"Hebrew\" },\n { code: \"hi\", name: \"Hindi\" },\n { code: \"hu\", name: \"Hungarian\" },\n { code: \"is\", name: \"Icelandic\" },\n { code: \"id\", name: \"Indonesian\" },\n { code: \"ga\", name: \"Irish\" },\n { code: \"it\", name: \"Italian\" },\n { code: \"ja\", name: \"Japanese\" },\n { code: \"jv\", name: \"Javanese\" },\n { code: \"kn\", name: \"Kannada\" },\n { code: \"kk\", name: \"Kazakh\" },\n { code: \"ko\", name: \"Korean\" },\n { code: \"ky\", name: \"Kyrgyz\" },\n { code: \"lv\", name: \"Latvian\" },\n { code: \"ln\", name: \"Lingala\" },\n { code: \"lt\", name: \"Lithuanian\" },\n { code: \"lb\", name: \"Luxembourgish\" },\n { code: \"mk\", name: \"Macedonian\" },\n { code: \"ms\", name: \"Malay\" },\n { code: \"ml\", name: \"Malayalam\" },\n { code: \"mt\", name: \"Maltese\" },\n { code: \"zh\", name: \"Mandarin Chinese\" },\n { code: \"mi\", name: \"Māori\" },\n { code: \"mr\", name: \"Marathi\" },\n { code: \"mn\", name: \"Mongolian\" },\n { code: \"ne\", name: \"Nepali\" },\n { code: \"no\", name: \"Norwegian\" },\n { code: \"oc\", name: \"Occitan\" },\n { code: \"or\", name: \"Odia\" },\n { code: \"ps\", name: \"Pashto\" },\n { code: \"fa\", name: \"Persian\" },\n { code: \"pl\", name: \"Polish\" },\n { code: \"pt\", name: \"Portuguese\" },\n { code: \"pa\", name: \"Punjabi\" },\n { code: \"ro\", name: \"Romanian\" },\n { code: \"ru\", name: \"Russian\" },\n { code: \"sr\", name: \"Serbian\" },\n { code: \"sd\", name: \"Sindhi\" },\n { code: \"sk\", name: \"Slovak\" },\n { code: \"sl\", name: \"Slovenian\" },\n { code: \"so\", name: \"Somali\" },\n { code: \"es\", name: \"Spanish\" },\n { code: \"sw\", name: \"Swahili\" },\n { code: \"sv\", name: \"Swedish\" },\n { code: \"tg\", name: \"Tajik\" },\n { code: \"ta\", name: \"Tamil\" },\n { code: \"te\", name: \"Telugu\" },\n { code: \"th\", name: \"Thai\" },\n { code: \"tr\", name: \"Turkish\" },\n { code: \"uk\", name: \"Ukrainian\" },\n { code: \"ur\", name: \"Urdu\" },\n { code: \"uz\", name: \"Uzbek\" },\n { code: \"vi\", name: \"Vietnamese\" },\n { code: \"cy\", name: \"Welsh\" },\n { code: \"yo\", name: \"Yoruba\" },\n];\n\n/** Multilingual v2's 29 languages. */\nexport const ELEVENLABS_MULTILINGUAL_V2_LANGUAGES: LanguageOption[] = [\n { code: \"en\", name: \"English\" },\n { code: \"ja\", name: \"Japanese\" },\n { code: \"zh\", name: \"Chinese\" },\n { code: \"de\", name: \"German\" },\n { code: \"hi\", name: \"Hindi\" },\n { code: \"fr\", name: \"French\" },\n { code: \"ko\", name: \"Korean\" },\n { code: \"pt\", name: \"Portuguese\" },\n { code: \"it\", name: \"Italian\" },\n { code: \"es\", name: \"Spanish\" },\n { code: \"id\", name: \"Indonesian\" },\n { code: \"nl\", name: \"Dutch\" },\n { code: \"tr\", name: \"Turkish\" },\n { code: \"fil\", name: \"Filipino\" },\n { code: \"pl\", name: \"Polish\" },\n { code: \"sv\", name: \"Swedish\" },\n { code: \"bg\", name: \"Bulgarian\" },\n { code: \"ro\", name: \"Romanian\" },\n { code: \"ar\", name: \"Arabic\" },\n { code: \"cs\", name: \"Czech\" },\n { code: \"el\", name: \"Greek\" },\n { code: \"fi\", name: \"Finnish\" },\n { code: \"hr\", name: \"Croatian\" },\n { code: \"ms\", name: \"Malay\" },\n { code: \"sk\", name: \"Slovak\" },\n { code: \"da\", name: \"Danish\" },\n { code: \"ta\", name: \"Tamil\" },\n { code: \"uk\", name: \"Ukrainian\" },\n { code: \"ru\", name: \"Russian\" },\n];\n\n/** Dubbing `target_lang`: languages both ElevenLabs Dubbing v1 and v2 take, as fal does not say which runs. */\nexport const ELEVENLABS_DUBBING_LANGUAGES: LanguageOption[] = [\n { code: \"af\", name: \"Afrikaans\" },\n { code: \"ar\", name: \"Arabic\" },\n { code: \"hy\", name: \"Armenian\" },\n { code: \"as\", name: \"Assamese\" },\n { code: \"az\", name: \"Azerbaijani\" },\n { code: \"be\", name: \"Belarusian\" },\n { code: \"bs\", name: \"Bosnian\" },\n { code: \"bg\", name: \"Bulgarian\" },\n { code: \"my\", name: \"Burmese\" },\n { code: \"yue\", name: \"Cantonese\" },\n { code: \"ca\", name: \"Catalan\" },\n { code: \"ceb\", name: \"Cebuano\" },\n { code: \"zh\", name: \"Chinese\" },\n { code: \"hr\", name: \"Croatian\" },\n { code: \"cs\", name: \"Czech\" },\n { code: \"da\", name: \"Danish\" },\n { code: \"nl\", name: \"Dutch\" },\n { code: \"en\", name: \"English\" },\n { code: \"et\", name: \"Estonian\" },\n { code: \"fil\", name: \"Filipino (Tagalog)\" },\n { code: \"fi\", name: \"Finnish\" },\n { code: \"fr\", name: \"French\" },\n { code: \"gl\", name: \"Galician\" },\n { code: \"ka\", name: \"Georgian\" },\n { code: \"de\", name: \"German\" },\n { code: \"el\", name: \"Greek\" },\n { code: \"gu\", name: \"Gujarati\" },\n { code: \"ha\", name: \"Hausa\" },\n { code: \"he\", name: \"Hebrew\" },\n { code: \"hi\", name: \"Hindi\" },\n { code: \"hu\", name: \"Hungarian\" },\n { code: \"is\", name: \"Icelandic\" },\n { code: \"id\", name: \"Indonesian\" },\n { code: \"it\", name: \"Italian\" },\n { code: \"ja\", name: \"Japanese\" },\n { code: \"jv\", name: \"Javanese\" },\n { code: \"kn\", name: \"Kannada\" },\n { code: \"kk\", name: \"Kazakh\" },\n { code: \"ko\", name: \"Korean\" },\n { code: \"ky\", name: \"Kyrgyz\" },\n { code: \"lv\", name: \"Latvian\" },\n { code: \"lt\", name: \"Lithuanian\" },\n { code: \"mk\", name: \"Macedonian\" },\n { code: \"ms\", name: \"Malay\" },\n { code: \"ml\", name: \"Malayalam\" },\n { code: \"mr\", name: \"Marathi\" },\n { code: \"mn\", name: \"Mongolian\" },\n { code: \"ne\", name: \"Nepali\" },\n { code: \"no\", name: \"Norwegian\" },\n { code: \"fa\", name: \"Persian\" },\n { code: \"pl\", name: \"Polish\" },\n { code: \"pt\", name: \"Portuguese\" },\n { code: \"pa\", name: \"Punjabi\" },\n { code: \"ro\", name: \"Romanian\" },\n { code: \"ru\", name: \"Russian\" },\n { code: \"sd\", name: \"Sindhi\" },\n { code: \"sk\", name: \"Slovak\" },\n { code: \"sl\", name: \"Slovenian\" },\n { code: \"es\", name: \"Spanish\" },\n { code: \"sw\", name: \"Swahili\" },\n { code: \"sv\", name: \"Swedish\" },\n { code: \"tg\", name: \"Tajik\" },\n { code: \"ta\", name: \"Tamil\" },\n { code: \"te\", name: \"Telugu\" },\n { code: \"th\", name: \"Thai\" },\n { code: \"tr\", name: \"Turkish\" },\n { code: \"uk\", name: \"Ukrainian\" },\n { code: \"ur\", name: \"Urdu\" },\n { code: \"uz\", name: \"Uzbek\" },\n { code: \"vi\", name: \"Vietnamese\" },\n { code: \"cy\", name: \"Welsh\" },\n { code: \"yo\", name: \"Yoruba\" },\n];\n\n/** Scribe v2 `language_code`, ISO 639-3 as fal's schema examples are. */\nexport const SCRIBE_V2_LANGUAGES: LanguageOption[] = [\n { code: \"afr\", name: \"Afrikaans\" },\n { code: \"amh\", name: \"Amharic\" },\n { code: \"ara\", name: \"Arabic\" },\n { code: \"hye\", name: \"Armenian\" },\n { code: \"asm\", name: \"Assamese\" },\n { code: \"ast\", name: \"Asturian\" },\n { code: \"aze\", name: \"Azerbaijani\" },\n { code: \"bel\", name: \"Belarusian\" },\n { code: \"ben\", name: \"Bengali\" },\n { code: \"bos\", name: \"Bosnian\" },\n { code: \"bul\", name: \"Bulgarian\" },\n { code: \"mya\", name: \"Burmese\" },\n { code: \"yue\", name: \"Cantonese\" },\n { code: \"cat\", name: \"Catalan\" },\n { code: \"ceb\", name: \"Cebuano\" },\n { code: \"nya\", name: \"Chichewa\" },\n { code: \"hrv\", name: \"Croatian\" },\n { code: \"ces\", name: \"Czech\" },\n { code: \"dan\", name: \"Danish\" },\n { code: \"nld\", name: \"Dutch\" },\n { code: \"eng\", name: \"English\" },\n { code: \"est\", name: \"Estonian\" },\n { code: \"fil\", name: \"Filipino\" },\n { code: \"fin\", name: \"Finnish\" },\n { code: \"fra\", name: \"French\" },\n { code: \"ful\", name: \"Fulah\" },\n { code: \"glg\", name: \"Galician\" },\n { code: \"lug\", name: \"Ganda\" },\n { code: \"kat\", name: \"Georgian\" },\n { code: \"deu\", name: \"German\" },\n { code: \"ell\", name: \"Greek\" },\n { code: \"guj\", name: \"Gujarati\" },\n { code: \"hau\", name: \"Hausa\" },\n { code: \"heb\", name: \"Hebrew\" },\n { code: \"hin\", name: \"Hindi\" },\n { code: \"hun\", name: \"Hungarian\" },\n { code: \"isl\", name: \"Icelandic\" },\n { code: \"ibo\", name: \"Igbo\" },\n { code: \"ind\", name: \"Indonesian\" },\n { code: \"gle\", name: \"Irish\" },\n { code: \"ita\", name: \"Italian\" },\n { code: \"jpn\", name: \"Japanese\" },\n { code: \"jav\", name: \"Javanese\" },\n { code: \"kea\", name: \"Kabuverdianu\" },\n { code: \"kan\", name: \"Kannada\" },\n { code: \"kaz\", name: \"Kazakh\" },\n { code: \"khm\", name: \"Khmer\" },\n { code: \"kor\", name: \"Korean\" },\n { code: \"kur\", name: \"Kurdish\" },\n { code: \"kir\", name: \"Kyrgyz\" },\n { code: \"lao\", name: \"Lao\" },\n { code: \"lav\", name: \"Latvian\" },\n { code: \"lin\", name: \"Lingala\" },\n { code: \"lit\", name: \"Lithuanian\" },\n { code: \"luo\", name: \"Luo\" },\n { code: \"ltz\", name: \"Luxembourgish\" },\n { code: \"mkd\", name: \"Macedonian\" },\n { code: \"msa\", name: \"Malay\" },\n { code: \"mal\", name: \"Malayalam\" },\n { code: \"mlt\", name: \"Maltese\" },\n { code: \"zho\", name: \"Mandarin Chinese\" },\n { code: \"mri\", name: \"Māori\" },\n { code: \"mar\", name: \"Marathi\" },\n { code: \"mon\", name: \"Mongolian\" },\n { code: \"nep\", name: \"Nepali\" },\n { code: \"nso\", name: \"Northern Sotho\" },\n { code: \"nor\", name: \"Norwegian\" },\n { code: \"oci\", name: \"Occitan\" },\n { code: \"ori\", name: \"Odia\" },\n { code: \"pus\", name: \"Pashto\" },\n { code: \"fas\", name: \"Persian\" },\n { code: \"pol\", name: \"Polish\" },\n { code: \"por\", name: \"Portuguese\" },\n { code: \"pan\", name: \"Punjabi\" },\n { code: \"ron\", name: \"Romanian\" },\n { code: \"rus\", name: \"Russian\" },\n { code: \"srp\", name: \"Serbian\" },\n { code: \"sna\", name: \"Shona\" },\n { code: \"snd\", name: \"Sindhi\" },\n { code: \"sin\", name: \"Sinhala\" },\n { code: \"slk\", name: \"Slovak\" },\n { code: \"slv\", name: \"Slovenian\" },\n { code: \"som\", name: \"Somali\" },\n { code: \"spa\", name: \"Spanish\" },\n { code: \"swa\", name: \"Swahili\" },\n { code: \"swe\", name: \"Swedish\" },\n { code: \"tam\", name: \"Tamil\" },\n { code: \"tgk\", name: \"Tajik\" },\n { code: \"tel\", name: \"Telugu\" },\n { code: \"tha\", name: \"Thai\" },\n { code: \"tur\", name: \"Turkish\" },\n { code: \"ukr\", name: \"Ukrainian\" },\n { code: \"umb\", name: \"Umbundu\" },\n { code: \"urd\", name: \"Urdu\" },\n { code: \"uzb\", name: \"Uzbek\" },\n { code: \"vie\", name: \"Vietnamese\" },\n { code: \"cym\", name: \"Welsh\" },\n { code: \"wol\", name: \"Wolof\" },\n { code: \"xho\", name: \"Xhosa\" },\n { code: \"zul\", name: \"Zulu\" },\n];\n\n/** MiniMax `language_boost` values that fit the canvas option format (\"auto\" is the unset default). */\nexport const MINIMAX_SPEECH_LANGUAGES: LanguageOption[] = [\n { code: \"Chinese\", name: \"Chinese\" },\n { code: \"English\", name: \"English\" },\n { code: \"Arabic\", name: \"Arabic\" },\n { code: \"Russian\", name: \"Russian\" },\n { code: \"Spanish\", name: \"Spanish\" },\n { code: \"French\", name: \"French\" },\n { code: \"Portuguese\", name: \"Portuguese\" },\n { code: \"German\", name: \"German\" },\n { code: \"Turkish\", name: \"Turkish\" },\n { code: \"Dutch\", name: \"Dutch\" },\n { code: \"Ukrainian\", name: \"Ukrainian\" },\n { code: \"Vietnamese\", name: \"Vietnamese\" },\n { code: \"Indonesian\", name: \"Indonesian\" },\n { code: \"Japanese\", name: \"Japanese\" },\n { code: \"Italian\", name: \"Italian\" },\n { code: \"Korean\", name: \"Korean\" },\n { code: \"Thai\", name: \"Thai\" },\n { code: \"Polish\", name: \"Polish\" },\n { code: \"Romanian\", name: \"Romanian\" },\n { code: \"Greek\", name: \"Greek\" },\n { code: \"Czech\", name: \"Czech\" },\n { code: \"Finnish\", name: \"Finnish\" },\n { code: \"Hindi\", name: \"Hindi\" },\n { code: \"Bulgarian\", name: \"Bulgarian\" },\n { code: \"Danish\", name: \"Danish\" },\n { code: \"Hebrew\", name: \"Hebrew\" },\n { code: \"Malay\", name: \"Malay\" },\n { code: \"Slovak\", name: \"Slovak\" },\n { code: \"Swedish\", name: \"Swedish\" },\n { code: \"Croatian\", name: \"Croatian\" },\n { code: \"Hungarian\", name: \"Hungarian\" },\n { code: \"Norwegian\", name: \"Norwegian\" },\n { code: \"Slovenian\", name: \"Slovenian\" },\n { code: \"Catalan\", name: \"Catalan\" },\n { code: \"Nynorsk\", name: \"Nynorsk\" },\n { code: \"Afrikaans\", name: \"Afrikaans\" },\n];\n","import type { VoiceOption } from \"../types.js\";\n\n// Data only. `id` is the name fal sends to ElevenLabs: the default and examples of the `voice`\n// field in fal's saved ElevenLabs schemas. Labels and previews are joined by name from\n// ElevenLabs' premade voice list (GET /v1/voices, 2026-10-20); a name it lacks has none.\nexport const ELEVENLABS_VOICES: VoiceOption[] = [\n { id: \"Rachel\", name: \"Rachel\" },\n { id: \"Aria\", name: \"Aria\" },\n {\n id: \"Roger\",\n name: \"Roger\",\n gender: \"male\",\n accent: \"american\",\n languages: [\"en\", \"fr\", \"de\", \"nl\", \"es\"],\n description: \"Easy going and perfect for casual conversations.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/CwhRBWXzGAHq8TQ4Fs17/58ee3ff5-f6f2-4628-93b8-e38eb31806b0.mp3\",\n },\n {\n id: \"Sarah\",\n name: \"Sarah\",\n gender: \"female\",\n accent: \"american\",\n languages: [\"en\", \"fr\", \"ar\", \"zh\", \"es\", \"hi\"],\n description:\n \"Young adult woman with a confident and warm, mature quality and a reassuring, professional tone.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/EXAVITQu4vr4xnSDxMaL/01a3e33c-6e99-4ee7-8543-ff2216a32186.mp3\",\n },\n {\n id: \"Laura\",\n name: \"Laura\",\n gender: \"female\",\n accent: \"american\",\n languages: [\"en\", \"fr\", \"ar\", \"zh\", \"de\"],\n description:\n \"This young adult female voice delivers sunny enthusiasm with a quirky attitude.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/FGY2WhTYpPnrIDTdsKH5/67341759-ad08-41a5-be6e-de12fe448618.mp3\",\n },\n {\n id: \"Charlie\",\n name: \"Charlie\",\n gender: \"male\",\n accent: \"australian\",\n languages: [\"en\", \"zh\", \"pt\", \"fil\", \"es\"],\n description: \"A young Australian male with a confident and energetic voice.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/IKne3meq5aSn9XLyUdCD/102de6f2-22ed-43e0-a1f1-111fa75c5481.mp3\",\n },\n {\n id: \"George\",\n name: \"George\",\n gender: \"male\",\n accent: \"british\",\n languages: [\"en\", \"fr\", \"ar\", \"ja\", \"cs\", \"fil\", \"es\", \"hi\"],\n description: \"Warm resonance that instantly captivates listeners.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/JBFqnCBsd6RMkjVDRZzb/e6206d1a-0721-4787-aafb-06a6e705cac5.mp3\",\n },\n {\n id: \"Callum\",\n name: \"Callum\",\n gender: \"male\",\n accent: \"american\",\n languages: [\"en\", \"fr\", \"hi\"],\n description: \"Deceptively gravelly, yet unsettling edge.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/N2lVS1w4EtoT3dr4eOWO/ac833bd8-ffda-4938-9ebc-b0f99ca25481.mp3\",\n },\n {\n id: \"River\",\n name: \"River\",\n gender: \"neutral\",\n accent: \"american\",\n languages: [\"en\", \"it\", \"fr\", \"pt\", \"zh\"],\n description: \"A relaxed, neutral voice ready for narrations or conversational projects.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/SAz9YHcvj6GT2YYXdXww/e6c95f0b-2227-491a-b3d7-2249240decb7.mp3\",\n },\n {\n id: \"Liam\",\n name: \"Liam\",\n gender: \"male\",\n accent: \"american\",\n languages: [\"en\", \"de\", \"pt\", \"cs\", \"pl\", \"tr\", \"hi\"],\n description: \"A young adult with energy and warmth - suitable for reels and shorts.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/TX3LPaxmHKxFdv7VOQHJ/63148076-6363-42db-aea8-31424308b92c.mp3\",\n },\n { id: \"Charlotte\", name: \"Charlotte\" },\n {\n id: \"Alice\",\n name: \"Alice\",\n gender: \"female\",\n accent: \"british\",\n languages: [\"en\", \"it\", \"fr\", \"ar\", \"ja\", \"pl\", \"hi\"],\n description:\n \"Clear and engaging, friendly woman with a British accent suitable for e-learning.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/Xb7hH8MSUJpSbSDYk0k2/d10f7534-11f6-41fe-a012-2de1e482d336.mp3\",\n },\n {\n id: \"Matilda\",\n name: \"Matilda\",\n gender: \"female\",\n accent: \"american\",\n languages: [\"en\", \"it\", \"fr\", \"de\", \"ar\", \"es\"],\n description:\n \"A professional woman with a pleasing alto pitch. Suitable for many use cases.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/XrExE9yKIg1WjnnlVkGX/b930e18d-6b4d-466e-bab2-0ae97c6d8535.mp3\",\n },\n {\n id: \"Will\",\n name: \"Will\",\n gender: \"male\",\n accent: \"american\",\n languages: [\"en\", \"fr\", \"de\", \"pt\", \"zh\", \"cs\", \"fil\", \"sk\", \"es\", \"sv\"],\n description: \"Conversational and laid back.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/bIHbv24MWmeRgasZH58o/8caf8f3d-ad29-4980-af41-53f20c72d7a4.mp3\",\n },\n {\n id: \"Jessica\",\n name: \"Jessica\",\n gender: \"female\",\n accent: \"american\",\n languages: [\"en\", \"fr\", \"ar\", \"ja\", \"zh\", \"de\", \"cs\", \"hi\"],\n description:\n \"Young and popular, this playful American female voice is perfect for trendy content.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/cgSgspJ2msm6clMCkdW9/56a97bf8-b69b-448f-846c-c3a11683d45a.mp3\",\n },\n {\n id: \"Eric\",\n name: \"Eric\",\n gender: \"male\",\n accent: \"american\",\n languages: [\"en\", \"fr\", \"pt\", \"de\", \"sk\", \"es\"],\n description: \"A smooth tenor pitch from a man in his 40s - perfect for agentic use cases.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/cjVigY5qzO86Huf0OWal/d098fda0-6456-4030-b3d8-63aa048c9070.mp3\",\n },\n {\n id: \"Chris\",\n name: \"Chris\",\n gender: \"male\",\n accent: \"american\",\n languages: [\"en\", \"fr\", \"ar\", \"pt\", \"sv\", \"hi\"],\n description: \"Natural and real, this down-to-earth voice is great across many use-cases.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/iP95p4xoKVk53GoZ742B/3f4bde72-cc48-40dd-829f-57fbf906f4d7.mp3\",\n },\n {\n id: \"Brian\",\n name: \"Brian\",\n gender: \"male\",\n accent: \"american\",\n languages: [\"en\", \"ar\", \"zh\", \"pt\", \"de\", \"nl\", \"sk\", \"ro\", \"hi\"],\n description:\n \"Middle-aged man with a resonant and comforting tone. Great for narrations and advertisements.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/nPczCjzI2devNBz1zQrb/2dd3e72c-4fd3-42f1-93ea-abc5d4e5aa1d.mp3\",\n },\n {\n id: \"Daniel\",\n name: \"Daniel\",\n gender: \"male\",\n accent: \"british\",\n languages: [\"en\", \"de\", \"tr\"],\n description:\n \"A strong voice perfect for delivering a professional broadcast or news story.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/onwK4e9ZLuTAKqWW03F9/7eee0236-1a72-4b86-b303-5dcadc007ba9.mp3\",\n },\n {\n id: \"Lily\",\n name: \"Lily\",\n gender: \"female\",\n accent: \"british\",\n languages: [\"en\", \"it\", \"de\", \"zh\", \"cs\", \"nl\", \"pl\"],\n description:\n \"Velvety British female voice delivers news and narrations with warmth and clarity.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/pFZP5JQG7iQjIQuC4Bku/89b68b35-b3dd-4348-a84a-a3c13a3c2b30.mp3\",\n },\n {\n id: \"Bill\",\n name: \"Bill\",\n gender: \"male\",\n accent: \"american\",\n languages: [\"en\", \"fr\", \"ar\", \"zh\", \"de\", \"cs\"],\n description: \"Friendly and comforting voice ready to narrate your stories.\",\n previewUrl:\n \"https://storage.googleapis.com/eleven-public-prod/premade/voices/pqHfZKP75CvOlQylNhV4/d782b3ff-84ba-4029-848c-acf01285524d.mp3\",\n },\n];\n\n// The direct API addresses a premade voice by its ElevenLabs voice id, not its name. The id is the\n// path segment after /premade/voices/ in each preview URL, so only voices with a preview are listed.\nconst PREMADE_ID = /\\/premade\\/voices\\/([A-Za-z0-9]+)\\//;\n\n/** The premade voices under their ElevenLabs voice ids, for the direct `elevenlabs` adapter. */\nexport const ELEVENLABS_DIRECT_VOICES: VoiceOption[] = ELEVENLABS_VOICES.flatMap((v) => {\n const id = v.previewUrl ? PREMADE_ID.exec(v.previewUrl)?.[1] : undefined;\n return id ? [{ ...v, id }] : [];\n});\n\n/** Sarah: a neutral, warm default with a preview. */\nexport const ELEVENLABS_DIRECT_DEFAULT_VOICE = \"EXAVITQu4vr4xnSDxMaL\";\n","import type { CatalogModel } from \"../types.js\";\nimport { ELEVENLABS_MP3_FORMATS } from \"./audio-formats.js\";\nimport { ELEVENLABS_V4_LANGUAGES } from \"./languages-audio.js\";\nimport { ELEVENLABS_DIRECT_DEFAULT_VOICE, ELEVENLABS_DIRECT_VOICES } from \"./voices-elevenlabs.js\";\n\n// Direct ElevenLabs rows (adapter `elevenlabs`, https://elevenlabs.io/docs/api-reference). Unlike\n// fal's ElevenLabs rows they run on our own ElevenLabs account, so they can speak voices cloned\n// there. Hidden (`exposure: []`) until priced in pro-backend: ENG-3400 ships nothing before it\n// is live, tested and priced.\n\nconst ELEVENLABS_LOGO =\n \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/elevenlabs.png\";\nconst PER_CALL = { unit: \"images\" } as const;\nconst PER_REQUEST = { unit: \"requests\" } as const;\n\nexport const ELEVENLABS_DIRECT_MODELS: CatalogModel[] = [\n {\n id: \"elevenlabs-v4-direct\",\n aliases: [],\n label: \"ElevenLabs v4 (direct)\",\n type: \"speech\",\n adapter: \"elevenlabs\",\n providerModelId: \"eleven_v4\",\n lifecycle: \"active\",\n exposure: [],\n constraints: {\n // Premade voices under their ElevenLabs ids (the direct API takes ids, not names).\n voices: ELEVENLABS_DIRECT_VOICES,\n languages: ELEVENLABS_V4_LANGUAGES,\n outputFormats: ELEVENLABS_MP3_FORMATS,\n supports: [],\n // ElevenLabs docs: 10,000 characters per request.\n prompt: { referenceSyntax: \"numbered\", maxChars: 10_000 },\n },\n defaults: { voice: ELEVENLABS_DIRECT_DEFAULT_VOICE, outputFormat: \"mp3_44100_128\" },\n usage: PER_CALL,\n pricingKind: \"flat\",\n display: {\n provider: \"elevenlabs\",\n logo: ELEVENLABS_LOGO,\n description:\n \"ElevenLabs v4 text to speech with audio tags, in a premade voice or your own cloned voice; up to 10,000 characters.\",\n },\n capabilities: { customVoices: true },\n },\n {\n id: \"elevenlabs-ivc\",\n aliases: [],\n label: \"ElevenLabs Instant Voice Clone\",\n type: \"voice-clone\",\n adapter: \"elevenlabs\",\n providerModelId: \"ivc\",\n lifecycle: \"active\",\n exposure: [],\n constraints: {\n // POST /v1/voices/add; ElevenLabs takes up to 25 samples and advises 1-2 minutes of\n // clean speech in total. Each clone uses a voice slot on our plan until deleted.\n references: { audios: 25, audioFormats: [\"mp3\", \"wav\", \"m4a\", \"webm\", \"ogg\"] },\n supports: [],\n },\n defaults: {},\n usage: PER_REQUEST,\n pricingKind: \"flat\",\n display: {\n provider: \"elevenlabs\",\n logo: ELEVENLABS_LOGO,\n description:\n \"Clone a private, reusable voice from one or more clean recordings, then speak with it on ElevenLabs v4 (direct).\",\n },\n capabilities: {},\n },\n];\n","import type { VoiceOption } from \"../types.js\";\n\n// Data only. `id` is the Fish voice model id sent as `reference_id`. Every voice is a\n// \"Fish Official\" library voice made with voice design (synthetic) or licensed from a voice\n// actor, so none clones a real public person. Picked from GET /model with Fish Official's\n// author_id (2026-10-27): the most used English voices, then a female and a male voice for the\n// other main languages. Name, gender, languages, description and the sample are Fish's.\nexport const FISH_VOICES: VoiceOption[] = [\n {\n id: \"933563129e564b19a115bedd57b7406a\",\n name: \"Sarah\",\n gender: \"female\",\n languages: [\"en\"],\n description: \"An engaged speaker.\",\n previewUrl: \"https://platform.r2.fish.audio/task/4e204945670c460c86fdab57512cb308.mp3\",\n },\n {\n id: \"bf322df2096a46f18c579d0baa36f41d\",\n name: \"Adrian\",\n gender: \"male\",\n languages: [\"en\"],\n description: \"A steady and reliable narrator.\",\n previewUrl: \"https://platform.r2.fish.audio/task/d730b09f4a484316a77ecc86137e85fb.mp3\",\n },\n {\n id: \"536d3a5e000945adb7038665781a4aca\",\n name: \"Ethan\",\n gender: \"male\",\n languages: [\"en\"],\n description: \"A curious explainer.\",\n previewUrl: \"https://platform.r2.fish.audio/task/bdd677ed767744fc91f166468786264b.mp3\",\n },\n {\n id: \"b347db033a6549378b48d00acb0d06cd\",\n name: \"Selene\",\n gender: \"female\",\n languages: [\"en\"],\n description: \"A meditative female voice.\",\n previewUrl: \"https://platform.r2.fish.audio/task/fcf629b4a0b343558f461338ba1b9da4.mp3\",\n },\n {\n id: \"9a9cf47702da476aa4629e2506d4a857\",\n name: \"Hannah\",\n gender: \"female\",\n languages: [\"en\"],\n description: \"A conversation specialist.\",\n previewUrl: \"https://platform.r2.fish.audio/task/08d658835feb427db808e37060b78eb0.mp3\",\n },\n {\n id: \"79d0bd3e4e5444b18f7b6d89b5927bf1\",\n name: \"Jordan\",\n gender: \"male\",\n languages: [\"en\"],\n description: \"A motivational speaker.\",\n previewUrl: \"https://platform.r2.fish.audio/task/edecbc0bdd4c46c39eda8520a0f729ef.mp3\",\n },\n {\n id: \"e3cd384158934cc9a01029cd7d278634\",\n name: \"Laura\",\n gender: \"female\",\n languages: [\"en\"],\n description: \"A confident female narrator.\",\n previewUrl: \"https://platform.r2.fish.audio/task/e821bef995344d519caa1c93d808db23.mp3\",\n },\n {\n id: \"f3a2b90078d54a65af4b95f63bc7798e\",\n name: \"Sheila\",\n gender: \"female\",\n accent: \"american\",\n languages: [\"en\"],\n description: \"A young American English woman's voice.\",\n previewUrl:\n \"https://platform.r2.fish.audio/tasks/2026-08-24/9bb9e1a1cf3f47f38700da1c5c0a678a.mp3\",\n },\n {\n id: \"0db6e93af420470b9d9b9a886dbaa954\",\n name: \"Kai\",\n gender: \"male\",\n languages: [\"en\"],\n description: \"A friendly English man's voice for companion apps and everyday conversation.\",\n previewUrl:\n \"https://platform.r2.fish.audio/tasks/2026-08-24/13306f1172544c3ba3106d1e363feaa6.mp3\",\n },\n {\n id: \"8abfa9ebd4c24a3399b68c3cdac8c7b5\",\n name: \"Freya\",\n gender: \"female\",\n accent: \"british\",\n languages: [\"en\"],\n description:\n \"A natural, professional British English voice with a brisk, conversational pace. Clear and easy to follow, suited to voice assistants, customer support and everyday narration.\",\n previewUrl:\n \"https://platform.r2.fish.audio/tasks/2026-08-25/07918705a56b42daaab149f65392cea7.mp3\",\n },\n {\n id: \"2f64e528a4f2406691925ab1e0ed5b7f\",\n name: \"Ananya\",\n gender: \"female\",\n languages: [\"hi\"],\n description:\n \"साफ़ और आत्मविश्वास भरी आवाज़, जो वॉइस असिस्टेंट, ग्राहक सेवा और प्रस्तुतियों के लिए उपयुक्त है।\",\n previewUrl:\n \"https://platform.r2.fish.audio/tasks/2026-08-25/a17a700668d8405f8316db120733145c.mp3\",\n },\n {\n id: \"cefd91a07b99468f9148e2580990082d\",\n name: \"Arjun\",\n gender: \"male\",\n languages: [\"hi\"],\n description:\n \"साफ़ और आत्मविश्वास भरी आवाज़, जो वॉइस असिस्टेंट, ग्राहक सेवा और प्रस्तुतियों के लिए उपयुक्त है।\",\n previewUrl:\n \"https://platform.r2.fish.audio/tasks/2026-08-24/a0c4a8eadb7841cdae8e5e68031a2dfb.mp3\",\n },\n {\n id: \"3f065d660212478a9c697fa965b4d098\",\n name: \"Carmen\",\n gender: \"female\",\n languages: [\"es\"],\n description:\n \"Una voz clara y segura para asistentes de voz, atención al cliente y presentaciones.\",\n previewUrl:\n \"https://platform.r2.fish.audio/tasks/2026-08-25/3421be48b6cb4c28bf829c25188e7e74.mp3\",\n },\n {\n id: \"ec0718028a2445fb9be8e8bfb56a0150\",\n name: \"Rodrigo\",\n gender: \"male\",\n languages: [\"es\"],\n description:\n \"Una voz clara y segura para asistentes de voz, atención al cliente y presentaciones.\",\n previewUrl:\n \"https://platform.r2.fish.audio/tasks/2026-08-25/5a77c32365604800ad5b4eb13c5585df.mp3\",\n },\n {\n id: \"10a3a20742114a4ea6dd441e7591850f\",\n name: \"Manon\",\n gender: \"female\",\n languages: [\"fr\"],\n description: \"Une voix claire et vive, adaptée aux assistants vocaux et au support client.\",\n previewUrl:\n \"https://platform.r2.fish.audio/tasks/2026-08-25/f7b75ee1fa524e48a8cefb003cf72952.mp3\",\n },\n {\n id: \"f69bca092b674168a8d02d61ca20943c\",\n name: \"Lucas\",\n gender: \"male\",\n languages: [\"fr\"],\n description:\n \"Une voix claire et assurée, adaptée aux assistants vocaux et au service client.\",\n previewUrl:\n \"https://platform.r2.fish.audio/tasks/2026-08-25/86fca3e56a014a3d8a11450854bb8311.mp3\",\n },\n {\n id: \"3937b44b604249f18b94913daef94043\",\n name: \"Lena\",\n gender: \"female\",\n languages: [\"de\"],\n description:\n \"Eine klare, souveräne Stimme für Sprachassistenten, Kundenservice und Präsentationen.\",\n previewUrl:\n \"https://platform.r2.fish.audio/tasks/2026-08-25/8659fec80b74442dab68a7755716a401.mp3\",\n },\n {\n id: \"c1e7cc926aa5469aa966c353094d4b0b\",\n name: \"Lukas\",\n gender: \"male\",\n languages: [\"de\"],\n description:\n \"Eine klare, souveräne Stimme für Sprachassistenten, Kundenservice und Präsentationen.\",\n previewUrl:\n \"https://platform.r2.fish.audio/tasks/2026-08-25/fb1d538126bb4fe38f8366250f6a2136.mp3\",\n },\n {\n id: \"b3c060cc41544a7da94a2c487647c902\",\n name: \"Letícia\",\n gender: \"female\",\n accent: \"brazilian\",\n languages: [\"pt\"],\n description:\n \"A Brazilian-accented Portuguese woman's voice, in her late twenties. Soft, warm, intimate. A freelance designer from Belo Horizonte who enjoys long walks in the park. Best suited to companion apps and casual everyday conversation.\",\n previewUrl:\n \"https://platform.r2.fish.audio/tasks/2026-10-12/13c6c0d96b5c4069951f89868ee15360.mp3\",\n },\n {\n id: \"add7bcb8d3c8423bbfa152ca232aad6e\",\n name: \"Ricardo\",\n gender: \"male\",\n accent: \"brazilian\",\n languages: [\"pt\"],\n description:\n \"A Brazilian-accented Portuguese man's voice, in his late forties. Clear, professional, monotone. A high school history teacher from Curitiba who loves classical music. Best suited to lessons, tutoring and explainer content.\",\n previewUrl:\n \"https://platform.r2.fish.audio/tasks/2026-10-12/67475fc717ae45cbb38e647a2dd37fe1.mp3\",\n },\n {\n id: \"b2d9d8db057042688a5e318b8f405bc2\",\n name: \"Kyoko\",\n gender: \"female\",\n languages: [\"ja\"],\n description: \"丁寧で落ち着いた話し方が特徴の女性の声。お客様対応や情報提供に最適。\",\n previewUrl: \"https://platform.r2.fish.audio/task/993b3ccb52124341aff79580f1ce5a5a.mp3\",\n },\n {\n id: \"297a6fd278df47c3b9da9bfdf55ac89a\",\n name: \"Satoru\",\n gender: \"male\",\n languages: [\"ja\"],\n description:\n \"若々しくも落ち着きのある男性の声。日常の語りやリラックスしたナレーションに最適。\",\n previewUrl: \"https://platform.r2.fish.audio/task/1b4712fb831f4c149eef6b0133157418.mp3\",\n },\n {\n id: \"0b14f34a13a94ed88fe6113193749bb0\",\n name: \"Fatima\",\n gender: \"female\",\n languages: [\"ar\"],\n description: \"صوت واضح وواثق يناسب المساعدات الصوتية وخدمة العملاء والعروض التقديمية.\",\n previewUrl:\n \"https://platform.r2.fish.audio/tasks/2026-08-24/93406e1b905a4c4994306e3421243390.mp3\",\n },\n {\n id: \"74c6aba5cbf94a15bbdc547ffce5cb38\",\n name: \"Yutong\",\n gender: \"female\",\n languages: [\"zh\"],\n description: \"声音清晰自然,表达利落,适合语音助手、客服和日常播报。\",\n previewUrl:\n \"https://platform.r2.fish.audio/tasks/2026-08-25/a48320f37fe44c4699549a1afc3778e8.mp3\",\n },\n];\n","import type { CatalogModel } from \"../types.js\";\nimport { FISH_VOICES } from \"./voices-fish.js\";\n\n// Fish Audio rows (adapter `fish`, https://docs.fish.audio/api-reference/introduction). TTS is\n// billed per UTF-8 byte of the script (s2.1-pro $15/M, drama-3 $50/M list, s2.1-pro-free $0),\n// voice design $0.01 per request, cloning nothing. Hidden (`exposure: []`) until priced in\n// pro-backend: ENG-3400 ships nothing before it is live, tested and priced.\n\nconst FISH_LOGO =\n \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/fishaudio.png\";\nconst PER_CALL = { unit: \"images\" } as const;\nconst PER_REQUEST = { unit: \"requests\" } as const;\n// Fish states no script limit (it chunks long text). Every speech row needs a cap so the\n// canvas per-1,000-character hold is bounded; this matches the other 10,000-character rows.\nconst TTS_MAX_CHARS = 10_000;\n\nfunction fishTts(\n id: string,\n label: string,\n providerModelId: string,\n description: string,\n): CatalogModel {\n return {\n id,\n aliases: [],\n label,\n type: \"speech\",\n adapter: \"fish\",\n providerModelId,\n lifecycle: \"active\",\n exposure: [],\n constraints: {\n voices: FISH_VOICES,\n outputFormats: [\"mp3\", \"wav\"],\n supports: [],\n prompt: { referenceSyntax: \"numbered\", maxChars: TTS_MAX_CHARS },\n },\n defaults: { voice: \"9a9cf47702da476aa4629e2506d4a857\", outputFormat: \"mp3\" },\n usage: PER_CALL,\n pricingKind: \"flat\",\n display: { provider: \"fishaudio\", logo: FISH_LOGO, description },\n capabilities: { customVoices: true },\n };\n}\n\nexport const FISH_MODELS: CatalogModel[] = [\n fishTts(\n \"fish-s2.1-pro\",\n \"Fish Audio S2.1 Pro\",\n \"s2.1-pro\",\n \"Fish Audio S2.1 Pro text to speech in 83 languages, with [bracket] directions and your own cloned voices.\",\n ),\n fishTts(\n \"fish-s2.1-pro-free\",\n \"Fish Audio S2.1 Pro Free\",\n \"s2.1-pro-free\",\n \"Fish Audio S2.1 Pro on the free developer tier: the same voices at no cost, without latency or data-processing guarantees.\",\n ),\n fishTts(\n \"fish-drama-3\",\n \"Fish Audio Drama 3\",\n \"drama-3\",\n \"Fish Audio Drama 3 text to speech you direct like an actor: [directions], sounds, pauses and per-word tags.\",\n ),\n {\n id: \"fish-voice-clone\",\n aliases: [],\n label: \"Fish Audio Voice Clone\",\n type: \"voice-clone\",\n adapter: \"fish\",\n providerModelId: \"voice-clone\",\n lifecycle: \"active\",\n exposure: [],\n constraints: {\n // POST /model takes 1-20 voice files; Fish advises 10 s or more of clean speech each.\n references: { audios: 20, audioFormats: [\"wav\", \"mp3\", \"m4a\", \"opus\"] },\n supports: [],\n },\n defaults: {},\n usage: PER_REQUEST,\n pricingKind: \"flat\",\n display: {\n provider: \"fishaudio\",\n logo: FISH_LOGO,\n description:\n \"Clone a private, reusable voice from one or more clean recordings, then speak with it on the Fish Audio speech models.\",\n },\n capabilities: {},\n },\n {\n id: \"fish-voice-design-1\",\n aliases: [],\n label: \"Fish Audio Voice Design\",\n type: \"voice-design\",\n adapter: \"fish\",\n providerModelId: \"voice-design-1\",\n lifecycle: \"active\",\n exposure: [],\n constraints: {\n voiceDesign: { maxCandidates: 4, previewMaxChars: 150 },\n supports: [],\n prompt: { referenceSyntax: \"numbered\", maxChars: 2000 },\n },\n defaults: {},\n usage: PER_REQUEST,\n pricingKind: \"flat\",\n display: {\n provider: \"fishaudio\",\n logo: FISH_LOGO,\n description:\n \"Describe a voice and get up to four short candidates; keep one as a cloned voice.\",\n },\n capabilities: {},\n },\n];\n","import type { VoiceOption } from \"../types.js\";\n\n// Data only. `id` is a value of the `voice` enum in fal's Gemini 3.8 TTS schemas. Labels are\n// joined by name from Google's voices list (2026-10-20), which covers only part of the enum.\nexport const GEMINI_TTS_VOICES: VoiceOption[] = [\n {\n id: \"Achernar\",\n name: \"Achernar\",\n gender: \"female\",\n accent: \"General American\",\n languages: [\"en-US\"],\n description:\n \"Soft, calm, and soothing voice with a higher pitch. Recommended for quiet or personal storytelling.\",\n },\n {\n id: \"Achird\",\n name: \"Achird\",\n gender: \"male\",\n accent: \"General American\",\n languages: [\"en-US\"],\n description:\n \"Friendly, approachable, and warm voice with a lower-middle pitch. Recommended for casual walkthroughs or vlogs.\",\n },\n {\n id: \"Algenib\",\n name: \"Algenib\",\n gender: \"male\",\n accent: \"General American\",\n languages: [\"en-US\"],\n description:\n \"Gravelly, grounded, and hard-hitting voice with a low pitch. Recommended for dramatic narration or intense stories.\",\n },\n {\n id: \"Algieba\",\n name: \"Algieba\",\n gender: \"male\",\n accent: \"General American\",\n languages: [\"en-US\"],\n description:\n \"Smooth, relaxed, and polished voice with a low pitch. Recommended for corporate videos or polished explainers.\",\n },\n {\n id: \"Alnilam\",\n name: \"Alnilam\",\n gender: \"male\",\n accent: \"General American\",\n languages: [\"en-US\"],\n description:\n \"Firm, direct, and commanding voice with a lower-middle pitch. Recommended for authoritative instructions or announcements.\",\n },\n {\n id: \"Aoede\",\n name: \"Aoede\",\n gender: \"female\",\n accent: \"General American\",\n languages: [\"en-US\"],\n description:\n \"Breezy, light, and relaxed voice with a medium pitch. Recommended for lifestyle or travel vlogs.\",\n },\n { id: \"Autonoe\", name: \"Autonoe\" },\n { id: \"Callirrhoe\", name: \"Callirrhoe\" },\n { id: \"Charon\", name: \"Charon\" },\n { id: \"Despina\", name: \"Despina\" },\n { id: \"Enceladus\", name: \"Enceladus\" },\n { id: \"Erinome\", name: \"Erinome\" },\n { id: \"Fenrir\", name: \"Fenrir\" },\n { id: \"Gacrux\", name: \"Gacrux\" },\n { id: \"Iapetus\", name: \"Iapetus\" },\n { id: \"Kore\", name: \"Kore\" },\n { id: \"Laomedeia\", name: \"Laomedeia\" },\n { id: \"Leda\", name: \"Leda\" },\n { id: \"Orus\", name: \"Orus\" },\n { id: \"Pulcherrima\", name: \"Pulcherrima\" },\n { id: \"Puck\", name: \"Puck\" },\n { id: \"Rasalgethi\", name: \"Rasalgethi\" },\n { id: \"Sadachbia\", name: \"Sadachbia\" },\n { id: \"Sadaltager\", name: \"Sadaltager\" },\n { id: \"Schedar\", name: \"Schedar\" },\n { id: \"Sulafat\", name: \"Sulafat\" },\n { id: \"Umbriel\", name: \"Umbriel\" },\n { id: \"Vindemiatrix\", name: \"Vindemiatrix\" },\n { id: \"Zephyr\", name: \"Zephyr\" },\n { id: \"Zubenelgenubi\", name: \"Zubenelgenubi\" },\n];\n","import type { VoiceOption } from \"../types.js\";\n\n// Data only. fal's MiniMax Speech `voice_id` takes any string. These are the default\n// (Wise_Woman) and examples of that field in fal's saved schema, then MiniMax's system voices\n// (get_voice, 2026-10-20) whose ids fit the canvas option format `^[A-Za-z0-9_.:-]{1,64}$`;\n// the rest (spaces, brackets) are left out.\nexport const MINIMAX_VOICES: VoiceOption[] = [\n { id: \"Wise_Woman\", name: \"Wise Woman\" },\n { id: \"Friendly_Person\", name: \"Friendly Person\" },\n { id: \"Inspirational_girl\", name: \"Inspirational girl\" },\n { id: \"Deep_Voice_Man\", name: \"Deep Voice Man\" },\n { id: \"Calm_Woman\", name: \"Calm Woman\" },\n { id: \"Casual_Guy\", name: \"Casual Guy\" },\n { id: \"Lively_Girl\", name: \"Lively Girl\" },\n { id: \"Patient_Man\", name: \"Patient Man\" },\n { id: \"Young_Knight\", name: \"Young Knight\" },\n { id: \"Determined_Man\", name: \"Determined Man\" },\n { id: \"Lovely_Girl\", name: \"Lovely Girl\" },\n { id: \"Decent_Boy\", name: \"Decent Boy\" },\n { id: \"Imposing_Manner\", name: \"Imposing Manner\" },\n { id: \"Elegant_Man\", name: \"Elegant Man\" },\n { id: \"Abbess\", name: \"Abbess\" },\n { id: \"Sweet_Girl_2\", name: \"Sweet Girl 2\" },\n { id: \"Exuberant_Girl\", name: \"Exuberant Girl\" },\n {\n id: \"English_expressive_narrator\",\n name: \"Expressive Narrator\",\n description:\n \"An expressive adult male voice with a British accent, perfect for engaging audiobook narration.\",\n },\n {\n id: \"English_radiant_girl\",\n name: \"Radiant Girl\",\n description:\n \"A radiant and lively young adult female voice with a general American accent, full of energy and brightness.\",\n },\n {\n id: \"English_magnetic_voiced_man\",\n name: \"Magnetic-voiced Male\",\n description:\n \"A magnetic and persuasive adult male voice with a general American accent, ideal for advertisements and promotions.\",\n },\n {\n id: \"English_compelling_lady1\",\n name: \"Compelling Lady\",\n description:\n \"A compelling adult female voice with a British accent, suitable for broadcast and formal announcements. Clear and authoritative.\",\n },\n {\n id: \"English_Aussie_Bloke\",\n name: \"Aussie Bloke\",\n description:\n \"A friendly, bright adult male voice with a distinct Australian accent, conveying a cheerful and approachable tone.\",\n },\n {\n id: \"English_captivating_female1\",\n name: \"Captivating Female\",\n description:\n \"A captivating adult female voice with a general American accent, ideal for news reporting and documentary narration.\",\n },\n {\n id: \"English_Upbeat_Woman\",\n name: \"Upbeat Woman\",\n description:\n \"An upbeat and bright adult female voice with a general American accent, perfect for energetic and positive messaging.\",\n },\n {\n id: \"English_Trustworth_Man\",\n name: \"Trustworthy Man\",\n description:\n \"A trustworthy and resonant adult male voice with a general American accent, conveying sincerity and reliability.\",\n },\n {\n id: \"English_CalmWoman\",\n name: \"Calm Woman\",\n description:\n \"A calm and soothing adult female voice with a general American accent, excellent for audiobooks and meditation guides.\",\n },\n {\n id: \"English_UpsetGirl\",\n name: \"Upset Girl\",\n description:\n \"A young adult female voice with a British accent, effectively conveying sadness and distress.\",\n },\n {\n id: \"English_Gentle-voiced_man\",\n name: \"Gentle-voiced Man\",\n description:\n \"A gentle and resonant adult male voice with a general American accent, warm and reassuring.\",\n },\n { id: \"English_Whispering_girl\", name: \"Whispering girl\" },\n {\n id: \"English_Diligent_Man\",\n name: \"Diligent Man\",\n description:\n \"A diligent and sincere adult male voice with an Indian accent, conveying honesty and hard work.\",\n },\n {\n id: \"English_Graceful_Lady\",\n name: \"Graceful Lady\",\n description:\n \"A graceful and elegant middle-aged female voice with a classic British accent, exuding sophistication.\",\n },\n {\n id: \"English_ReservedYoungMan\",\n name: \"Reserved Young Man\",\n description:\n \"A reserved and cold adult male voice with a general American accent, conveying distance and introspection.\",\n },\n {\n id: \"English_PlayfulGirl\",\n name: \"Playful Girl\",\n description:\n \"A playful female youth voice with a general American accent, ideal for cartoons and children's entertainment.\",\n },\n {\n id: \"English_ManWithDeepVoice\",\n name: \"Man With Deep Voice\",\n description:\n \"An adult male with a deep, commanding voice and a general American accent, projecting authority and strength.\",\n },\n {\n id: \"English_MaturePartner\",\n name: \"Mature Partner\",\n description:\n \"A mature, gentle middle-aged male voice with a British accent, suitable for a caring and supportive partner role.\",\n },\n {\n id: \"English_FriendlyPerson\",\n name: \"Friendly Guy\",\n description:\n \"A friendly and natural-sounding adult male voice with a general American accent, like an approachable guy-next-door.\",\n },\n {\n id: \"English_MatureBoss\",\n name: \"Bossy Lady\",\n description:\n \"A mature, middle-aged female voice with a general American accent, conveying authority and a commanding presence.\",\n },\n {\n id: \"English_Debator\",\n name: \"Male Debater\",\n description:\n \"A tough, middle-aged male voice with a general American accent, perfect for debates and assertive arguments.\",\n },\n {\n id: \"English_LovelyGirl\",\n name: \"Lovely Girl\",\n description:\n \"A lovely and sweet female youth voice with a British accent, full of charm and innocence.\",\n },\n {\n id: \"English_Steadymentor\",\n name: \"Reliable Man\",\n description:\n \"A young adult male voice with a general American accent, projecting an air of arrogant reliability.\",\n },\n {\n id: \"English_Deep-VoicedGentleman\",\n name: \"Deep-voiced Gentleman\",\n description:\n \"A deep-voiced and wise adult male gentleman with a classic British accent, sounding experienced and thoughtful.\",\n },\n {\n id: \"English_Wiselady\",\n name: \"Wise Lady\",\n description:\n \"A wise and genial middle-aged female voice with a British accent, offering kind and insightful words.\",\n },\n {\n id: \"English_CaptivatingStoryteller\",\n name: \"Captivating Storyteller\",\n description:\n \"A captivating senior male storyteller with a cold, detached tone and a general American accent.\",\n },\n {\n id: \"English_DecentYoungMan\",\n name: \"Decent Young Man\",\n description:\n \"A decent and respectable adult male voice with a British accent, sounding polite and well-mannered.\",\n },\n {\n id: \"English_SentimentalLady\",\n name: \"Sentimental Lady\",\n description:\n \"A sentimental and elegant middle-aged female voice with a British accent, perfect for nostalgic or emotional readings.\",\n },\n {\n id: \"English_ImposingManner\",\n name: \"Imposing Queen\",\n description:\n \"The imposing voice of an adult queen with a powerful British accent, commanding respect and authority.\",\n },\n {\n id: \"English_SadTeen\",\n name: \"Teen Boy\",\n description:\n \"A frustrated young adult male voice with a British accent, perfect for a teen character expressing annoyance.\",\n },\n {\n id: \"English_PassionateWarrior\",\n name: \"Passionate Warrior\",\n description:\n \"An energetic and passionate young adult male warrior voice with a general American accent, ready for battle.\",\n },\n {\n id: \"English_WiseScholar\",\n name: \"Wise Scholar\",\n description:\n \"A wise, conversational young adult scholar with a British accent, making complex topics accessible and engaging.\",\n },\n {\n id: \"English_Soft-spokenGirl\",\n name: \"Soft-Spoken Girl\",\n description:\n \"An adorable, soft-spoken female youth voice with a general American accent, gentle and sweet.\",\n },\n {\n id: \"English_SereneWoman\",\n name: \"Serene Woman\",\n description:\n \"A serene and friendly young adult female voice with a general American accent, calm and welcoming.\",\n },\n {\n id: \"English_ConfidentWoman\",\n name: \"Confident Woman\",\n description:\n \"A confident and firm young adult female voice with a general American accent, assertive and clear.\",\n },\n {\n id: \"English_PatientMan\",\n name: \"Patient Man\",\n description:\n \"A patient adult male voice with a British accent, speaking in a calm and understanding manner.\",\n },\n {\n id: \"English_Comedian\",\n name: \"Comedian\",\n description:\n \"A breezy young adult male comedian with a British accent, delivering lines with a light and humorous touch.\",\n },\n {\n id: \"English_BossyLeader\",\n name: \"Bossy Leader\",\n description:\n \"A bossy adult male leader with a general American accent, speaking unconcernedly with an air of command.\",\n },\n {\n id: \"English_Strong-WilledBoy\",\n name: \"Strong-Willed Boy\",\n description:\n \"A mature-sounding and strong-willed young adult male with a British accent, showing determination beyond his years.\",\n },\n {\n id: \"English_StressedLady\",\n name: \"Stressed Lady\",\n description:\n \"An unsure, stressed middle-aged female voice with a general American accent, conveying anxiety and uncertainty.\",\n },\n {\n id: \"English_AssertiveQueen\",\n name: \"Assertive Queen\",\n description:\n \"An assertive yet guarded young adult queen with a general American accent, projecting authority while remaining cautious.\",\n },\n {\n id: \"English_AnimeCharacter\",\n name: \"Female Narrator\",\n description:\n \"A sincere middle-aged female narrator with a British accent, perfect for trustworthy and heartfelt storytelling.\",\n },\n {\n id: \"English_Jovialman\",\n name: \"Jovial Man\",\n description:\n \"A jovial and mature middle-aged male voice with a general American accent, cheerful and good-natured.\",\n },\n {\n id: \"English_WhimsicalGirl\",\n name: \"Whimsical Girl\",\n description:\n \"A whimsical yet wary young adult female voice with a general American accent, combining playfulness with caution.\",\n },\n {\n id: \"English_Kind-heartedGirl\",\n name: \"Kind-Hearted Girl\",\n description:\n \"A kind-hearted and calm young adult female with a general American accent, speaking with gentle warmth.\",\n },\n {\n id: \"Arrogant_Miss\",\n name: \"Arrogant Miss\",\n description:\n \"An arrogant adult female voice in Standard Mandarin, projecting confidence and superiority.\",\n },\n {\n id: \"Robot_Armor\",\n name: \"Robot Armor\",\n description:\n \"An electronic, robotic adult male voice, suitable for sci-fi or futuristic content in Standard Mandarin.\",\n },\n {\n id: \"Japanese_IntellectualSenior\",\n name: \"Intellectual Senior\",\n description:\n \"A mature and intellectual young adult male voice in Japanese, sounding older than his age.\",\n },\n {\n id: \"Japanese_DecisivePrincess\",\n name: \"Decisive Princess\",\n description: \"A firm and decisive adult princess's voice in Japanese.\",\n },\n {\n id: \"Japanese_LoyalKnight\",\n name: \"Loyal Knight\",\n description: \"A youthful and loyal adult male knight's voice in Japanese.\",\n },\n {\n id: \"Japanese_DominantMan\",\n name: \"Dominant Man\",\n description: \"A mature and dominant middle-aged male voice in Japanese.\",\n },\n {\n id: \"Japanese_SeriousCommander\",\n name: \"Serious Commander\",\n description: \"A serious and reliable adult male commander's voice in Japanese.\",\n },\n {\n id: \"Japanese_ColdQueen\",\n name: \"Cold Queen\",\n description: \"A distant and cold adult queen's voice in Japanese.\",\n },\n {\n id: \"Japanese_DependableWoman\",\n name: \"Dependable Woman\",\n description: \"A steady and dependable adult female voice in Japanese.\",\n },\n {\n id: \"Japanese_GentleButler\",\n name: \"Gentle Butler\",\n description: \"A charming and gentle adult male butler's voice in Japanese.\",\n },\n {\n id: \"Japanese_KindLady\",\n name: \"Kind Lady\",\n description: \"A charming and kind adult female voice in Japanese.\",\n },\n {\n id: \"Japanese_CalmLady\",\n name: \"Calm Lady\",\n description: \"A calm and charming adult female voice in Japanese.\",\n },\n {\n id: \"Japanese_OptimisticYouth\",\n name: \"Optimistic Youth\",\n description: \"A cheerful and optimistic adult male youth's voice in Japanese.\",\n },\n {\n id: \"Japanese_GenerousIzakayaOwner\",\n name: \"Generous Izakaya Owner\",\n description:\n \"A playful and generous middle-aged male izakaya owner's voice in Standard Japanese.\",\n },\n {\n id: \"Japanese_SportyStudent\",\n name: \"Sporty Student\",\n description: \"An inviting and sporty adult male student's voice in Standard Japanese.\",\n },\n {\n id: \"Japanese_InnocentBoy\",\n name: \"Innocent Boy\",\n description: \"An inviting and innocent adult male voice in Standard Japanese.\",\n },\n {\n id: \"Japanese_GracefulMaiden\",\n name: \"Graceful Maiden\",\n description: \"A sweet and graceful adult maiden's voice in Standard Japanese.\",\n },\n {\n id: \"Cantonese_GentleLady\",\n name: \"Gentle Lady\",\n description: \"A calm and gentle adult female voice in Cantonese.\",\n },\n {\n id: \"Cantonese_PlayfulMan\",\n name: \"Playful Man\",\n description: \"A soulful and playful adult male voice in Cantonese.\",\n },\n {\n id: \"Cantonese_CuteGirl\",\n name: \"Cute Girl\",\n description: \"A soothing and cute young adult female voice in Cantonese.\",\n },\n {\n id: \"Cantonese_KindWoman\",\n name: \"Kind Woman\",\n description: \"A friendly and kind adult female voice in Cantonese.\",\n },\n {\n id: \"Korean_AirheadedGirl\",\n name: \"Airheaded Girl\",\n description:\n 'A cool and composed adult female voice, suitable for an \"airheaded\" character in Standard Korean.',\n },\n {\n id: \"Korean_AthleticGirl\",\n name: \"Athletic Girl\",\n description: \"A robust and athletic female youth's voice in Standard Korean.\",\n },\n {\n id: \"Korean_AthleticStudent\",\n name: \"Athletic Student\",\n description: \"An energetic young adult male athletic student's voice in Standard Korean.\",\n },\n {\n id: \"Korean_BraveAdventurer\",\n name: \"Brave Adventurer\",\n description:\n \"A playful and adventurous adult female brave adventurer's voice in Standard Korean.\",\n },\n {\n id: \"Korean_BraveFemaleWarrior\",\n name: \"Brave Female Warrior\",\n description: \"A resolute young adult brave female warrior's voice in Standard Korean.\",\n },\n {\n id: \"Korean_BraveYouth\",\n name: \"Brave Youth\",\n description: \"A powerful young adult brave male youth's voice in Standard Korean.\",\n },\n {\n id: \"Korean_CalmGentleman\",\n name: \"Calm Gentleman\",\n description: \"A composed and calm middle-aged gentleman's voice in Standard Korean.\",\n },\n {\n id: \"Korean_CalmLady\",\n name: \"Calm Lady\",\n description: \"A resilient and determined young adult female voice in Standard Korean.\",\n },\n {\n id: \"Korean_CaringWoman\",\n name: \"Caring Woman\",\n description: \"A lively and vibrant young adult caring woman's voice in Standard Korean.\",\n },\n {\n id: \"Korean_CharmingElderSister\",\n name: \"Charming Elder Sister\",\n description:\n 'A playful and mischievous middle-aged \"charming elder sister\" voice in Standard Korean.',\n },\n {\n id: \"Korean_CharmingSister\",\n name: \"Charming Sister\",\n description: 'A seductive middle-aged \"charming sister\" voice in Standard Korean.',\n },\n {\n id: \"Korean_CheerfulBoyfriend\",\n name: \"Cheerful Boyfriend\",\n description: \"A sharp and intense middle-aged male voice in Standard Korean.\",\n },\n {\n id: \"Korean_CheerfulCoolJunior\",\n name: \"Cheerful Cool Junior\",\n description:\n 'An energetic and spirited adult male \"cheerful cool junior\" voice in Standard Korean.',\n },\n {\n id: \"Korean_CheerfulLittleSister\",\n name: \"Cheerful Little Sister\",\n description:\n 'An energetic and lively adult female \"cheerful little sister\" voice in Standard Korean.',\n },\n {\n id: \"Korean_ChildhoodFriendGirl\",\n name: \"Childhood Friend Girl\",\n description:\n 'A polite and reserved young adult female \"childhood friend\" voice in Standard Korean.',\n },\n {\n id: \"Korean_CockyGuy\",\n name: \"Cocky Guy\",\n description: \"A playful and mischievous young adult cocky guy's voice in Standard Korean.\",\n },\n {\n id: \"Korean_ColdGirl\",\n name: \"Cold Girl\",\n description: \"An aloof and cold adult female voice in Standard Korean.\",\n },\n {\n id: \"Korean_ColdYoungMan\",\n name: \"Cold Young Man\",\n description: \"A cold and composed adult male voice in Standard Korean.\",\n },\n {\n id: \"Korean_ConfidentBoss\",\n name: \"Confident Boss\",\n description: \"A deep and commanding middle-aged confident boss's voice in Standard Korean.\",\n },\n {\n id: \"Korean_ConsiderateSenior\",\n name: \"Considerate Senior\",\n description:\n 'A gentle and mature young adult male \"considerate senior\" voice in Standard Korean.',\n },\n {\n id: \"Korean_DecisiveQueen\",\n name: \"Decisive Queen\",\n description: \"A sweet yet resolute young adult decisive queen's voice in Standard Korean.\",\n },\n {\n id: \"Korean_DominantMan\",\n name: \"Dominant Man\",\n description: \"A mature and authoritative dominant adult male voice in Standard Korean.\",\n },\n {\n id: \"Korean_ElegantPrincess\",\n name: \"Elegant Princess\",\n description: \"A graceful and refined adult princess voice in Standard Korean.\",\n },\n {\n id: \"Korean_EnchantingSister\",\n name: \"Enchanting Sister\",\n description:\n 'A desirable and charming young adult \"enchanting sister\" voice in Standard Korean.',\n },\n {\n id: \"Korean_EnthusiasticTeen\",\n name: \"Enthusiastic Teen\",\n description: \"A passionate and lively young adult male teen's voice in Standard Korean.\",\n },\n {\n id: \"Korean_FriendlyBigSister\",\n name: \"Friendly Big Sister\",\n description:\n 'A charismatic and alluring middle-aged \"friendly big sister\" voice in Standard Korean.',\n },\n {\n id: \"Korean_GentleBoss\",\n name: \"Gentle Boss\",\n description: 'A regal and refined middle-aged male \"gentle boss\" voice in Standard Korean.',\n },\n {\n id: \"Korean_GentleWoman\",\n name: \"Gentle Woman\",\n description: \"A strong-willed yet gentle young adult female voice in Standard Korean.\",\n },\n {\n id: \"Korean_HaughtyLady\",\n name: \"Haughty Lady\",\n description: \"A cold and distant young adult haughty lady's voice in Standard Korean.\",\n },\n {\n id: \"Korean_InnocentBoy\",\n name: \"Innocent Boy\",\n description: 'A naive and pure young adult male \"innocent boy\" voice in Standard Korean.',\n },\n {\n id: \"Korean_IntellectualMan\",\n name: \"Intellectual Man\",\n description: \"A combative middle-aged intellectual male voice in Standard Korean.\",\n },\n {\n id: \"Korean_IntellectualSenior\",\n name: \"Intellectual Senior\",\n description:\n \"A magnetic and intellectual young adult male voice with a senior quality in Standard Korean.\",\n },\n {\n id: \"Korean_LonelyWarrior\",\n name: \"Lonely Warrior\",\n description: 'A youthful and daring adult male \"lonely warrior\" voice in Standard Korean.',\n },\n {\n id: \"Korean_MatureLady\",\n name: \"Mature Lady\",\n description: \"A refined and elegant mature middle-aged lady's voice in Standard Korean.\",\n },\n {\n id: \"Korean_MysteriousGirl\",\n name: \"Mysterious Girl\",\n description:\n \"An energetic and lively female youth voice for a mysterious character in Standard Korean.\",\n },\n {\n id: \"Korean_OptimisticYouth\",\n name: \"Optimistic Youth\",\n description: \"A cheerful and optimistic young adult male youth's voice in Standard Korean.\",\n },\n {\n id: \"Korean_PlayboyCharmer\",\n name: \"Playboy Charmer\",\n description: 'A seductive young adult male \"playboy charmer\" voice in Standard Korean.',\n },\n {\n id: \"Korean_PossessiveMan\",\n name: \"Possessive Man\",\n description:\n \"A powerful and authoritative middle-aged possessive man's voice in Standard Korean.\",\n },\n {\n id: \"Korean_QuirkyGirl\",\n name: \"Quirky Girl\",\n description: \"An adorable and quirky female youth voice in Standard Korean.\",\n },\n {\n id: \"Korean_ReliableSister\",\n name: \"Reliable Sister\",\n description:\n 'A powerful and authoritative middle-aged \"reliable sister\" voice in Standard Korean.',\n },\n {\n id: \"Korean_ReliableYouth\",\n name: \"Reliable Youth\",\n description:\n \"A gentle and considerate young adult reliable male youth's voice in Standard Korean.\",\n },\n {\n id: \"Korean_SassyGirl\",\n name: \"Sassy Girl\",\n description: \"A Sassy female youth voice in Standard Korean.\",\n },\n {\n id: \"Korean_ShyGirl\",\n name: \"Shy Girl\",\n description: \"A timid and introverted young adult female voice in Standard Korean.\",\n },\n {\n id: \"Korean_SoothingLady\",\n name: \"Soothing Lady\",\n description: \"An alluring and soothing middle-aged female voice in Standard Korean.\",\n },\n {\n id: \"Korean_StrictBoss\",\n name: \"Strict Boss\",\n description: \"A stern middle-aged male boss's voice in Standard Korean.\",\n },\n {\n id: \"Korean_SweetGirl\",\n name: \"Sweet Girl\",\n description:\n \"A soothing and gentle middle-aged female voice in Standard Korean, sweet and calming.\",\n },\n {\n id: \"Korean_ThoughtfulWoman\",\n name: \"Thoughtful Woman\",\n description:\n \"A mature and contemplative young adult thoughtful woman's voice in Standard Korean.\",\n },\n {\n id: \"Korean_WiseElf\",\n name: \"Wise Elf\",\n description: 'A sweet and ethereal young adult female \"wise elf\" voice in Standard Korean.',\n },\n {\n id: \"Korean_WiseTeacher\",\n name: \"Wise Teacher\",\n description: \"A sagacious and wise middle-aged male teacher's voice in Standard Korean.\",\n },\n {\n id: \"Spanish_SereneWoman\",\n name: \"Serene Woman\",\n description: \"A soothing and serene young adult female voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_MaturePartner\",\n name: \"Mature Partner\",\n description: \"A warm and mature middle-aged male partner's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_CaptivatingStoryteller\",\n name: \"Captivating Storyteller\",\n description:\n \"A captivating middle-aged male narrator's voice in Standard Spanish, perfect for storytelling.\",\n },\n {\n id: \"Spanish_Narrator\",\n name: \"Narrator\",\n description:\n \"A middle-aged female narrator's voice in Standard Spanish, ideal for storytelling.\",\n },\n {\n id: \"Spanish_WiseScholar\",\n name: \"Wise Scholar\",\n description: \"A conversational young adult male wise scholar's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_Kind-heartedGirl\",\n name: \"Kind-hearted Girl\",\n description: \"A bright and kind-hearted young adult female voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_DeterminedManager\",\n name: \"Determined Manager\",\n description:\n \"A businesslike and determined middle-aged female manager's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_BossyLeader\",\n name: \"Bossy Leader\",\n description: \"A businesslike and bossy adult male leader's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_ReservedYoungMan\",\n name: \"Reserved Young Man\",\n description: \"A tranquil and reserved young adult male voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_ConfidentWoman\",\n name: \"Confident Woman\",\n description: \"A clear and firm young adult confident woman's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_ThoughtfulMan\",\n name: \"Thoughtful Man\",\n description: \"A sober and thoughtful young adult male voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_Strong-WilledBoy\",\n name: \"Strong-willed Boy\",\n description: \"A mature and strong-willed adult male voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_SophisticatedLady\",\n name: \"Sophisticated Lady\",\n description: \"A refined and sophisticated adult lady's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_RationalMan\",\n name: \"Rational Man\",\n description: \"A thoughtful and rational adult male voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_AnimeCharacter\",\n name: \"Anime Character\",\n description:\n \"An animated middle-aged female voice in Standard Spanish, suitable for anime characters.\",\n },\n {\n id: \"Spanish_Deep-tonedMan\",\n name: \"Deep-toned Man\",\n description: \"A charismatic, deep-toned middle-aged male voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_Fussyhostess\",\n name: \"Fussy hostess\",\n description: \"An intense and fussy middle-aged female hostess's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_SincereTeen\",\n name: \"Sincere Teen\",\n description: \"A heartfelt and sincere male teen's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_FrankLady\",\n name: \"Frank Lady\",\n description: \"An agitated and frank adult lady's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_Comedian\",\n name: \"Comedian\",\n description: \"A humorous young adult male comedian's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_Debator\",\n name: \"Debator\",\n description: \"A tough middle-aged male debater's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_ToughBoss\",\n name: \"Tough Boss\",\n description: \"A mature and tough middle-aged female boss's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_Wiselady\",\n name: \"Wise Lady\",\n description: \"A neutral and wise middle-aged lady's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_Steadymentor\",\n name: \"Steady Mentor\",\n description: \"An arrogant yet steady young adult male mentor's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_Jovialman\",\n name: \"Jovial Man\",\n description: \"A gravelly and jovial senior male voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_SantaClaus\",\n name: \"Santa Claus\",\n description: \"A joyful senior male Santa Claus voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_Rudolph\",\n name: \"Rudolph\",\n description: \"A naive young adult male voice in the style of Rudolph in Standard Spanish.\",\n },\n {\n id: \"Spanish_Intonategirl\",\n name: \"Intonate Girl\",\n description: \"A versatile young adult female voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_Arnold\",\n name: \"Arnold\",\n description: \"A steady adult male voice in the style of Arnold in Standard Spanish.\",\n },\n {\n id: \"Spanish_Ghost\",\n name: \"Ghost\",\n description: \"A raspy adult male ghost's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_HumorousElder\",\n name: \"Humorous Elder\",\n description: \"An eccentric and humorous senior male elder's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_EnergeticBoy\",\n name: \"Energetic Boy\",\n description: \"A cheerful and energetic young adult male voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_WhimsicalGirl\",\n name: \"Whimsical Girl\",\n description: \"A witty and whimsical young adult female voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_StrictBoss\",\n name: \"Strict Boss\",\n description: \"A commanding and strict young adult female boss's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_ReliableMan\",\n name: \"Reliable Man\",\n description: \"A steady and reliable adult male voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_SereneElder\",\n name: \"Serene Elder\",\n description: \"A reflective and serene senior male elder's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_AngryMan\",\n name: \"Angry Man\",\n description: \"An intense young adult male voice in Standard Spanish, conveying anger.\",\n },\n {\n id: \"Spanish_AssertiveQueen\",\n name: \"Assertive Queen\",\n description: \"A firm and assertive young adult queen's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_CaringGirlfriend\",\n name: \"Caring Girlfriend\",\n description: \"A dreamy adult female caring girlfriend's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_PowerfulSoldier\",\n name: \"Powerful Soldier\",\n description:\n \"A youthful and bold young adult male powerful soldier's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_PassionateWarrior\",\n name: \"Passionate Warrior\",\n description:\n \"An energetic and passionate young adult male warrior's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_ChattyGirl\",\n name: \"Chatty Girl\",\n description: \"A conversational and chatty young adult female voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_RomanticHusband\",\n name: \"Romantic Husband\",\n description: \"An emotional middle-aged male romantic husband's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_CompellingGirl\",\n name: \"Compelling Girl\",\n description: \"A persuasive and compelling young adult female voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_PowerfulVeteran\",\n name: \"Powerful Veteran\",\n description: \"A strong and powerful middle-aged male veteran's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_SensibleManager\",\n name: \"Sensible Manager\",\n description: \"A charismatic and sensible adult male manager's voice in Standard Spanish.\",\n },\n {\n id: \"Spanish_ThoughtfulLady\",\n name: \"Thoughtful Lady\",\n description: \"A worried and thoughtful adult lady's voice in Standard Spanish.\",\n },\n {\n id: \"Portuguese_SentimentalLady\",\n name: \"Sentimental Lady\",\n description: \"An elegant and sentimental young adult female voice in Portuguese.\",\n },\n {\n id: \"Portuguese_BossyLeader\",\n name: \"Bossy Leader\",\n description: \"A calm and formal adult male bossy leader's voice in Portuguese.\",\n },\n {\n id: \"Portuguese_Wiselady\",\n name: \"Wise lady\",\n description: \"A smooth and wise middle-aged lady's voice in Portuguese.\",\n },\n {\n id: \"Portuguese_Strong-WilledBoy\",\n name: \"Strong-willed Boy\",\n description: \"A mature and strong-willed young adult male voice in Portuguese.\",\n },\n {\n id: \"Portuguese_Deep-VoicedGentleman\",\n name: \"Deep-voiced Gentleman\",\n description: \"A deep-voiced adult gentleman in Portuguese.\",\n },\n {\n id: \"Portuguese_UpsetGirl\",\n name: \"Upset Girl\",\n description: \"A sad young adult female voice in Portuguese, conveying upset emotions.\",\n },\n {\n id: \"Portuguese_PassionateWarrior\",\n name: \"Passionate Warrior\",\n description: \"An energetic and passionate young adult male warrior's voice in Portuguese.\",\n },\n {\n id: \"Portuguese_AnimeCharacter\",\n name: \"Anime Character\",\n description:\n \"An animated middle-aged female voice in Portuguese, suitable for anime characters.\",\n },\n {\n id: \"Portuguese_ConfidentWoman\",\n name: \"Confident Woman\",\n description: \"A clear and firm young adult confident woman's voice in Portuguese.\",\n },\n {\n id: \"Portuguese_AngryMan\",\n name: \"Angry Man\",\n description: \"A serious young adult male voice in Portuguese, conveying anger.\",\n },\n {\n id: \"Portuguese_CaptivatingStoryteller\",\n name: \"Captivating Storyteller\",\n description:\n \"A captivating middle-aged male narrator's voice in Portuguese, ideal for storytelling.\",\n },\n {\n id: \"Portuguese_Godfather\",\n name: \"Godfather\",\n description:\n \"A serious middle-aged male godfather voice in Standard Portuguese, conveying authority.\",\n },\n {\n id: \"Portuguese_ReservedYoungMan\",\n name: \"Reserved Young Man\",\n description: \"A cold and calm reserved young adult male voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_SmartYoungGirl\",\n name: \"Smart Young Girl\",\n description:\n \"An intelligent young female girl's voice in Standard Portuguese, sharp and clear.\",\n },\n {\n id: \"Portuguese_Kind-heartedGirl\",\n name: \"Kind-hearted Girl\",\n description: \"A calm and kind-hearted young adult female voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_Pompouslady\",\n name: \"Pompous lady\",\n description:\n \"A pompous young adult female cartoon-style voice in Standard Portuguese, full of personality.\",\n },\n {\n id: \"Portuguese_Grinch\",\n name: \"Grinch\",\n description:\n \"A cunning adult male Grinch-like voice in Standard Portuguese, mischievous and sly.\",\n },\n {\n id: \"Portuguese_Debator\",\n name: \"Debator\",\n description:\n \"A tough middle-aged male debater's voice in Standard Portuguese, strong and assertive.\",\n },\n {\n id: \"Portuguese_SweetGirl\",\n name: \"Sweet Girl\",\n description: \"An adorable and sweet young adult female voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_AttractiveGirl\",\n name: \"Attractive Girl\",\n description: \"An alluring and attractive adult female voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_ThoughtfulMan\",\n name: \"Thoughtful Man\",\n description: \"A gentle and thoughtful young adult male voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_PlayfulGirl\",\n name: \"Playful Girl\",\n description: \"A cutesy and playful female youth voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_GorgeousLady\",\n name: \"Gorgeous Lady\",\n description:\n \"A playful and gorgeous adult female voice in Standard Portuguese, exuding confidence.\",\n },\n {\n id: \"Portuguese_LovelyLady\",\n name: \"Lovely Lady\",\n description: \"A charismatic and lovely adult female voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_SereneWoman\",\n name: \"Serene Woman\",\n description:\n \"A calm and serene young adult female voice in Standard Portuguese, peaceful and composed.\",\n },\n {\n id: \"Portuguese_SadTeen\",\n name: \"Sad Teen\",\n description: \"A frustrated and sad male teen's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_MaturePartner\",\n name: \"Mature Partner\",\n description:\n \"A mature middle-aged male partner's voice in Standard Portuguese, dependable and warm.\",\n },\n {\n id: \"Portuguese_Comedian\",\n name: \"Comedian\",\n description: \"A humorous young adult male comedian's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_NaughtySchoolgirl\",\n name: \"Naughty Schoolgirl\",\n description:\n \"An inviting and naughty young adult female schoolgirl's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_Narrator\",\n name: \"Narrator\",\n description:\n \"A middle-aged female narrator's voice in Standard Portuguese, perfect for storytelling.\",\n },\n {\n id: \"Portuguese_ToughBoss\",\n name: \"Tough Boss\",\n description: \"A mature and tough middle-aged female boss's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_Fussyhostess\",\n name: \"Fussy hostess\",\n description:\n \"An intense and fussy middle-aged female hostess's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_Dramatist\",\n name: \"Dramatist\",\n description: \"A quirky middle-aged male dramatist's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_Steadymentor\",\n name: \"Steady Mentor\",\n description:\n \"An arrogant yet steady young adult male mentor's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_Jovialman\",\n name: \"Jovial Man\",\n description: \"A jovial and laughing middle-aged male voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_CharmingQueen\",\n name: \"Charming Queen\",\n description: \"A bewitching and charming adult queen's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_SantaClaus\",\n name: \"Santa Claus\",\n description:\n \"A joyful middle-aged male Santa Claus voice in Standard Portuguese, full of holiday cheer.\",\n },\n {\n id: \"Portuguese_Rudolph\",\n name: \"Rudolph\",\n description:\n \"A naive young adult female voice in the style of Rudolph in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_Arnold\",\n name: \"Arnold\",\n description:\n \"A steady adult male voice in the style of Arnold in Standard Portuguese, strong and firm.\",\n },\n {\n id: \"Portuguese_CharmingSanta\",\n name: \"Charming Santa\",\n description:\n \"An attractive and charming middle-aged male Santa voice in Standard Portuguese.\",\n },\n { id: \"Portuguese_CharmingLady\", name: \"Charming Lady\" },\n {\n id: \"Portuguese_Ghost\",\n name: \"Ghost\",\n description:\n \"A sensual adult male ghost's voice in Standard Portuguese, mysterious and alluring.\",\n },\n {\n id: \"Portuguese_HumorousElder\",\n name: \"Humorous Elder\",\n description: \"A wacky and humorous middle-aged male elder's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_CalmLeader\",\n name: \"Calm Leader\",\n description: \"A composed and calm middle-aged male leader's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_GentleTeacher\",\n name: \"Gentle Teacher\",\n description: \"A mild and gentle adult male teacher's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_EnergeticBoy\",\n name: \"Energetic Boy\",\n description: \"A cheerful and energetic young adult male voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_ReliableMan\",\n name: \"Reliable Man\",\n description: \"A steady and reliable adult male voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_SereneElder\",\n name: \"Serene Elder\",\n description:\n \"A reflective and serene middle-aged male elder's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_GrimReaper\",\n name: \"Grim Reaper\",\n description:\n \"A sinister adult male Grim Reaper's voice in Standard Portuguese, dark and ominous.\",\n },\n {\n id: \"Portuguese_AssertiveQueen\",\n name: \"Assertive Queen\",\n description: \"A firm and assertive young adult queen's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_WhimsicalGirl\",\n name: \"Whimsical Girl\",\n description: \"A lovely and whimsical young adult female voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_StressedLady\",\n name: \"Stressed Lady\",\n description: \"An unsure and stressed middle-aged lady's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_FriendlyNeighbor\",\n name: \"Friendly Neighbor\",\n description:\n \"An energetic and friendly young adult female neighbor's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_CaringGirlfriend\",\n name: \"Caring Girlfriend\",\n description:\n \"A dreamy middle-aged female caring girlfriend's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_PowerfulSoldier\",\n name: \"Powerful Soldier\",\n description:\n \"A youthful and bold young adult male powerful soldier's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_FascinatingBoy\",\n name: \"Fascinating Boy\",\n description:\n \"An approachable and fascinating young adult male voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_RomanticHusband\",\n name: \"Romantic Husband\",\n description:\n \"An emotional middle-aged male romantic husband's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_StrictBoss\",\n name: \"Strict Boss\",\n description: \"A robotic and strict young adult female boss's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_InspiringLady\",\n name: \"Inspiring Lady\",\n description: \"A commanding and inspiring young adult female voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_PlayfulSpirit\",\n name: \"Playful Spirit\",\n description:\n \"An animated and playful young adult female spirit's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_ElegantGirl\",\n name: \"Elegant Girl\",\n description: \"A dramatic and elegant young adult female voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_CompellingGirl\",\n name: \"Compelling Girl\",\n description: \"A persuasive and compelling young adult female voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_PowerfulVeteran\",\n name: \"Powerful Veteran\",\n description:\n \"A strong and powerful middle-aged male veteran's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_SensibleManager\",\n name: \"Sensible Manager\",\n description:\n \"A charismatic and sensible middle-aged male manager's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_ThoughtfulLady\",\n name: \"Thoughtful Lady\",\n description: \"A worried and thoughtful middle-aged lady's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_TheatricalActor\",\n name: \"Theatrical Actor\",\n description:\n \"An animated middle-aged male theatrical actor's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_FragileBoy\",\n name: \"Fragile Boy\",\n description: \"A gentle and fragile young adult male voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_ChattyGirl\",\n name: \"Chatty Girl\",\n description: \"A conversational and chatty young adult female voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_Conscientiousinstructor\",\n name: \"Conscientious Instructor\",\n description:\n \"A youthful and conscientious young adult female instructor's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_RationalMan\",\n name: \"Rational Man\",\n description: \"A thoughtful and rational adult male voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_WiseScholar\",\n name: \"Wise Scholar\",\n description:\n \"A conversational young adult male wise scholar's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_FrankLady\",\n name: \"Frank Lady\",\n description: \"An agitated and frank middle-aged lady's voice in Standard Portuguese.\",\n },\n {\n id: \"Portuguese_DeterminedManager\",\n name: \"Determined Manager\",\n description:\n \"A middle-aged female manager's voice with attitude and determination in Standard Portuguese.\",\n },\n {\n id: \"French_Male_Speech_New\",\n name: \"Level-Headed Man\",\n description: \"A level-headed and composed adult male voice in French.\",\n },\n {\n id: \"French_CasualMan\",\n name: \"Casual Man\",\n description: \"A casual and relaxed middle-aged male voice in French.\",\n },\n {\n id: \"French_MovieLeadFemale\",\n name: \"Movie Lead Female\",\n description: \"A cinematic young adult female lead voice in French, perfect for film.\",\n },\n {\n id: \"French_FemaleAnchor\",\n name: \"Female Anchor\",\n description: \"A professional adult female anchor voice in French, authoritative and clear.\",\n },\n {\n id: \"French_MaleNarrator\",\n name: \"Male Narrator\",\n description: \"A classic adult male narrator voice in French, ideal for storytelling.\",\n },\n {\n id: \"Indonesian_SweetGirl\",\n name: \"Sweet Girl\",\n description: \"A cute and sweet young adult female voice in Indonesian.\",\n },\n {\n id: \"Indonesian_ReservedYoungMan\",\n name: \"Reserved Young Man\",\n description: \"A cold and reserved young adult male voice in Indonesian.\",\n },\n {\n id: \"Indonesian_CharmingGirl\",\n name: \"Charming Girl\",\n description: \"An alluring and charming adult female voice in Indonesian.\",\n },\n {\n id: \"Indonesian_CalmWoman\",\n name: \"Calm Woman\",\n description: \"A serene and calm young adult female voice in Indonesian.\",\n },\n {\n id: \"Indonesian_ConfidentWoman\",\n name: \"Confident Woman\",\n description: \"An assertive and confident young adult female voice in Indonesian.\",\n },\n {\n id: \"Indonesian_CaringMan\",\n name: \"Caring Man\",\n description: \"A compassionate and caring young adult male voice in Indonesian.\",\n },\n {\n id: \"Indonesian_BossyLeader\",\n name: \"Bossy Leader\",\n description: \"A calm, authoritative, and bossy adult male leader's voice in Indonesian.\",\n },\n {\n id: \"Indonesian_DeterminedBoy\",\n name: \"Determined Boy\",\n description:\n \"A mature and resolute young adult male voice in Indonesian, conveying determination.\",\n },\n {\n id: \"Indonesian_GentleGirl\",\n name: \"Gentle Girl\",\n description: \"A soft-spoken and gentle young adult female voice in Indonesian.\",\n },\n {\n id: \"German_FriendlyMan\",\n name: \"Friendly Man\",\n description: \"A sincere and friendly middle-aged male voice in German.\",\n },\n {\n id: \"German_SweetLady\",\n name: \"Sweet Lady\",\n description: \"An animated and sweet adult female voice in German.\",\n },\n {\n id: \"German_PlayfulMan\",\n name: \"Playful Man\",\n description: \"A lively and spirited adult male voice in German, full of energy.\",\n },\n {\n id: \"Russian_HandsomeChildhoodFriend\",\n name: \"Handsome Childhood Friend\",\n description:\n \"An aggressive female youth's voice for a handsome childhood friend character in Standard Russian.\",\n },\n {\n id: \"Russian_BrightHeroine\",\n name: \"Bright Queen\",\n description: \"An arrogant and bright adult queen's voice in Standard Russian.\",\n },\n {\n id: \"Russian_AmbitiousWoman\",\n name: \"Ambitious Woman\",\n description: \"A demanding and ambitious adult woman's voice in Standard Russian.\",\n },\n {\n id: \"Russian_ReliableMan\",\n name: \"Reliable Man\",\n description: \"A steady and reliable middle-aged man's voice in Standard Russian.\",\n },\n {\n id: \"Russian_CrazyQueen\",\n name: \"Crazy Girl\",\n description:\n 'An energetic adult female \"crazy girl\" voice in Standard Russian, wild and unpredictable.',\n },\n {\n id: \"Russian_PessimisticGirl\",\n name: \"Pessimistic Girl\",\n description: 'A compassionate adult female \"pessimistic girl\" voice in Standard Russian.',\n },\n {\n id: \"Russian_AttractiveGuy\",\n name: \"Attractive Guy\",\n description: \"A deep-voiced and attractive adult guy's voice in Standard Russian.\",\n },\n {\n id: \"Russian_Bad-temperedBoy\",\n name: \"Bad-tempered Boy\",\n description: 'A charming adult male \"bad-tempered boy\" voice in Standard Russian.',\n },\n {\n id: \"Italian_BraveHeroine\",\n name: \"Brave Heroine\",\n description: \"A calm and brave middle-aged female heroine's voice in Italian.\",\n },\n {\n id: \"Italian_Narrator\",\n name: \"Narrator\",\n description: \"A classic middle-aged male narrator voice in Italian.\",\n },\n {\n id: \"Italian_WanderingSorcerer\",\n name: \"Wandering Sorcerer\",\n description: \"A ruthless adult female wandering sorcerer's voice in Italian.\",\n },\n {\n id: \"Italian_DiligentLeader\",\n name: \"Diligent Leader\",\n description: \"A calm and diligent adult female leader's voice in Italian.\",\n },\n {\n id: \"Dutch_kindhearted_girl\",\n name: \"Kind-hearted girl\",\n description: \"A warm and kind-hearted young adult female voice in Dutch.\",\n },\n {\n id: \"Dutch_bossy_leader\",\n name: \"Bossy leader\",\n description: \"A serious and bossy adult male leader's voice in Dutch.\",\n },\n {\n id: \"Vietnamese_kindhearted_girl\",\n name: \"Kind-hearted girl\",\n description: \"A warm and kind-hearted young adult female voice in Vietnamese.\",\n },\n {\n id: \"Arabic_CalmWoman\",\n name: \"Calm Woman\",\n description: \"A calm adult female Arabic voice, ideal for audiobooks and serene narration.\",\n },\n {\n id: \"Arabic_FriendlyGuy\",\n name: \"Friendly Guy\",\n description: \"A natural and friendly adult male Arabic voice.\",\n },\n {\n id: \"Turkish_CalmWoman\",\n name: \"Calm Woman\",\n description: \"A calm adult female Turkish voice, ideal for audiobooks.\",\n },\n {\n id: \"Turkish_Trustworthyman\",\n name: \"Trustworthy man\",\n description: \"A resonant and trustworthy adult male Turkish voice.\",\n },\n {\n id: \"Ukrainian_CalmWoman\",\n name: \"Calm Woman\",\n description: \"A calm adult female Ukrainian voice, ideal for audiobooks.\",\n },\n {\n id: \"Ukrainian_WiseScholar\",\n name: \"Wise Scholar\",\n description: \"A conversational young adult male wise scholar's voice in Ukrainian.\",\n },\n {\n id: \"Thai_male_1_sample8\",\n name: \"Serene Man\",\n description: \"A magnetic and serene adult male voice in Thai.\",\n },\n {\n id: \"Thai_male_2_sample2\",\n name: \"Friendly Man\",\n description: \"A lively and friendly adult male voice in Thai.\",\n },\n {\n id: \"Thai_female_1_sample1\",\n name: \"Confident Woman\",\n description: \"A neutral and confident adult female voice in Thai.\",\n },\n {\n id: \"Thai_female_2_sample2\",\n name: \"Energetic Woman\",\n description: \"An energetic adult female voice in Thai.\",\n },\n {\n id: \"Polish_male_1_sample4\",\n name: \"Male Narrator\",\n description: \"A mature adult male narrator's voice in Polish.\",\n },\n {\n id: \"Polish_male_2_sample3\",\n name: \"Male Anchor\",\n description: \"An adult male broadcast anchor's voice in Polish.\",\n },\n {\n id: \"Polish_female_1_sample1\",\n name: \"Calm Woman\",\n description: \"A calm adult female voice in Polish.\",\n },\n {\n id: \"Polish_female_2_sample3\",\n name: \"Casual Woman\",\n description: \"A neutral and casual adult female voice in Polish.\",\n },\n {\n id: \"Romanian_male_1_sample2\",\n name: \"Reliable Man\",\n description: \"A neutral and reliable adult male voice in Romanian.\",\n },\n {\n id: \"Romanian_male_2_sample1\",\n name: \"Energetic Youth\",\n description: \"An energetic adult male youth's voice in Romanian.\",\n },\n {\n id: \"Romanian_female_1_sample4\",\n name: \"Optimistic Youth\",\n description: \"A cheerful and optimistic adult female youth's voice in Romanian.\",\n },\n {\n id: \"Romanian_female_2_sample1\",\n name: \"Gentle Woman\",\n description: \"A gentle adult female voice in Romanian.\",\n },\n {\n id: \"greek_male_1a_v1\",\n name: \"Thoughtful Mentor\",\n description: \"An intellectual and thoughtful adult male mentor's voice in Greek.\",\n },\n {\n id: \"Greek_female_1_sample1\",\n name: \"Gentle Lady\",\n description: \"A gentle adult lady's voice in Greek.\",\n },\n {\n id: \"Greek_female_2_sample3\",\n name: \"Girl Next Door\",\n description: 'A cheerful young adult \"girl next door\" voice in Greek.',\n },\n {\n id: \"czech_male_1_v1\",\n name: \"Assured Presenter\",\n description: \"A serious and assured young adult male presenter's voice in Czech.\",\n },\n {\n id: \"czech_female_5_v7\",\n name: \"Steadfast Narrator\",\n description: \"A steadfast adult female broadcast narrator's voice in Czech.\",\n },\n {\n id: \"czech_female_2_v2\",\n name: \"Elegant Lady\",\n description: \"A graceful and elegant adult lady's voice in Czech.\",\n },\n {\n id: \"finnish_male_3_v1\",\n name: \"Upbeat Man\",\n description: \"An energetic and upbeat young adult female voice in Finnish.\",\n },\n {\n id: \"finnish_male_1_v2\",\n name: \"Friendly Boy\",\n description: \"A deep and friendly young adult male voice in Finnish.\",\n },\n {\n id: \"finnish_female_4_v1\",\n name: \"Assetive Woman\",\n description: \"A determined and assertive adult female voice in Finnish.\",\n },\n {\n id: \"hindi_male_1_v2\",\n name: \"Trustworthy Advisor\",\n description: \"A magnetic and trustworthy adult male advisor's voice in Hindi.\",\n },\n {\n id: \"hindi_female_2_v1\",\n name: \"Tranquil Woman\",\n description: \"A gentle and tranquil adult female voice in Hindi.\",\n },\n {\n id: \"hindi_female_1_v2\",\n name: \"News Anchor\",\n description: \"A calm adult female news anchor's voice in Hindi.\",\n },\n];\n","import type { CatalogModel, LanguageOption } from \"../types.js\";\nimport { ELEVENLABS_MP3_FORMATS } from \"./audio-formats.js\";\nimport { SAM_3_IMAGE } from \"./canvas-tools.js\";\nimport { ELEVENLABS_DIRECT_MODELS } from \"./speech-elevenlabs-direct.js\";\nimport { FISH_MODELS } from \"./speech-fish.js\";\nimport {\n ELEVENLABS_DUBBING_LANGUAGES,\n ELEVENLABS_MULTILINGUAL_V2_LANGUAGES,\n ELEVENLABS_V4_LANGUAGES,\n MINIMAX_SPEECH_LANGUAGES,\n SCRIBE_V2_LANGUAGES,\n} from \"./languages-audio.js\";\nimport { ELEVENLABS_VOICES } from \"./voices-elevenlabs.js\";\nimport { GEMINI_TTS_VOICES } from \"./voices-gemini.js\";\nimport { MINIMAX_VOICES } from \"./voices-minimax.js\";\n\n// Rows for the single-purpose canvas nodes: text to speech, voice changer, dubbing, lipsync,\n// speech to text and auto mask (VEED background removal is a video tool, in video-tools.ts).\n// Schemas: fal's queue OpenAPI per endpoint id (saved under adapters/__fixtures__/fal). The\n// flat rows are priced at a capped input; `references.audioSeconds.max` is that cap where the\n// node reads it (lipsync, voice changer), so the flat price covers the provider bill.\n\nconst ELEVENLABS_LOGO =\n \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/elevenlabs.png\";\nconst GOOGLE_LOGO =\n \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png\";\nconst MINIMAX_LOGO =\n \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/f4c2e906-28b7-4a4a-b491-df8fef7808ed.png\";\nconst SYNC_LOGO = \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/sync.png\";\n\nconst PER_CALL = { unit: \"images\" } as const;\nconst EXPOSURE: CatalogModel[\"exposure\"] = [\"cowork\", \"space_builder\"];\n/** The flat lipsync prices assume at most 30 s of speech (LIPSYNC_MAX_AUDIO_SECONDS). */\nconst LIPSYNC_AUDIO = { audioSeconds: { max: 30 } };\n\ninterface ElevenLabsTts {\n id: string;\n label: string;\n providerModelId: string;\n languages: LanguageOption[];\n /** multilingual-v2's schema has no `output_format`. */\n formats: boolean;\n maxChars: number;\n description: string;\n}\n\nfunction elevenLabsTts(tts: ElevenLabsTts): CatalogModel {\n return {\n id: tts.id,\n aliases: [tts.providerModelId],\n label: tts.label,\n type: \"speech\",\n adapter: \"fal\",\n providerModelId: tts.providerModelId,\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n voices: ELEVENLABS_VOICES,\n languages: tts.languages,\n ...(tts.formats && { outputFormats: ELEVENLABS_MP3_FORMATS }),\n supports: [],\n prompt: { referenceSyntax: \"numbered\", maxChars: tts.maxChars },\n },\n defaults: { voice: \"Rachel\", ...(tts.formats && { outputFormat: \"mp3_44100_128\" }) },\n usage: PER_CALL,\n pricingKind: \"flat\",\n display: { provider: \"elevenlabs\", logo: ELEVENLABS_LOGO, description: tts.description },\n capabilities: {},\n };\n}\n\nfunction geminiTts(id: string, label: string, description: string): CatalogModel {\n const providerModelId = `google/${id}`;\n return {\n id,\n aliases: [providerModelId],\n label,\n type: \"speech\",\n adapter: \"fal\",\n providerModelId,\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n voices: GEMINI_TTS_VOICES,\n supports: [\"style\"],\n // fal: the whole input is limited to 8,192 tokens; a token is at least one character.\n prompt: { referenceSyntax: \"numbered\", maxChars: 8192 },\n },\n defaults: { voice: \"Kore\" },\n usage: PER_CALL,\n pricingKind: \"flat\",\n display: { provider: \"google\", logo: GOOGLE_LOGO, description },\n capabilities: {},\n };\n}\n\nfunction syncLipsync(\n id: string,\n label: string,\n providerModelId: string,\n syncModel: string | undefined,\n description: string,\n): CatalogModel {\n return {\n id,\n aliases: [],\n label,\n type: \"lipsync\",\n adapter: \"fal\",\n providerModelId,\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n requires: [\"sourceVideo\", \"sourceAudio\"],\n references: LIPSYNC_AUDIO,\n supports: [],\n },\n defaults: {},\n ...(syncModel !== undefined && { providerOptions: { fal: { model: syncModel } } }),\n usage: PER_CALL,\n pricingKind: \"flat\",\n display: { provider: \"sync\", logo: SYNC_LOGO, description },\n capabilities: { acceptsSourceVideo: true },\n };\n}\n\nexport const MEDIA_NODE_MODELS: CatalogModel[] = [\n elevenLabsTts({\n id: \"elevenlabs-v4\",\n label: \"ElevenLabs v4\",\n providerModelId: \"elevenlabs/tts/eleven-v4\",\n languages: ELEVENLABS_V4_LANGUAGES,\n formats: true,\n maxChars: 5000,\n description:\n \"ElevenLabs v4 text to speech; expressive narration with audio tags, up to 5,000 characters.\",\n }),\n elevenLabsTts({\n id: \"elevenlabs-v4-turbo\",\n label: \"ElevenLabs v4 Turbo\",\n providerModelId: \"elevenlabs/tts/eleven-v4-turbo\",\n languages: ELEVENLABS_V4_LANGUAGES,\n formats: true,\n maxChars: 5000,\n description:\n \"ElevenLabs v4 Turbo text to speech; faster and cheaper v4 voices, up to 5,000 characters.\",\n }),\n elevenLabsTts({\n id: \"elevenlabs-multilingual-v2\",\n label: \"ElevenLabs Multilingual v2\",\n providerModelId: \"fal-ai/elevenlabs/tts/multilingual-v2\",\n languages: ELEVENLABS_MULTILINGUAL_V2_LANGUAGES,\n formats: false,\n // fal's schema states no limit; ElevenLabs documents 10,000 characters per request.\n maxChars: 10_000,\n description:\n \"ElevenLabs Multilingual v2 text to speech in 29 languages; the voice the canvas TTS node has always used.\",\n }),\n geminiTts(\n \"gemini-3.8-flash-tts\",\n \"Gemini 3.8 Flash TTS\",\n \"Google Gemini 3.8 Flash text to speech with 30 prebuilt voices and separate style instructions.\",\n ),\n geminiTts(\n \"gemini-3.8-flash-lite-tts\",\n \"Gemini 3.8 Flash Lite TTS\",\n \"Google Gemini 3.8 Flash Lite text to speech; the low-cost tier with the same 30 voices.\",\n ),\n {\n id: \"minimax-speech-2.8-hd\",\n aliases: [\"fal-ai/minimax/speech-2.8-hd\"],\n label: \"MiniMax Speech 2.8 HD\",\n type: \"speech\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/minimax/speech-2.8-hd\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n voices: MINIMAX_VOICES,\n languages: MINIMAX_SPEECH_LANGUAGES,\n supports: [],\n prompt: { referenceSyntax: \"numbered\", maxChars: 10_000 },\n },\n defaults: { voice: \"Wise_Woman\" },\n usage: PER_CALL,\n pricingKind: \"flat\",\n display: {\n provider: \"minimax\",\n logo: MINIMAX_LOGO,\n description:\n \"MiniMax Speech 2.8 HD text to speech; studio-quality narration in over 300 voices, with pause and interjection tags.\",\n },\n capabilities: {},\n },\n {\n id: \"elevenlabs-voice-changer\",\n aliases: [\"fal-ai/elevenlabs/voice-changer\"],\n label: \"ElevenLabs Voice Changer\",\n type: \"voice-change\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/elevenlabs/voice-changer\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n requires: [\"sourceAudio\"],\n // The flat price assumes at most a minute of speech.\n references: { audioSeconds: { max: 60 } },\n voices: ELEVENLABS_VOICES,\n outputFormats: ELEVENLABS_MP3_FORMATS,\n supports: [],\n },\n defaults: { voice: \"Rachel\", outputFormat: \"mp3_44100_128\" },\n usage: PER_CALL,\n pricingKind: \"flat\",\n display: {\n provider: \"elevenlabs\",\n logo: ELEVENLABS_LOGO,\n description:\n \"ElevenLabs speech to speech; re-voices a recording in another voice and keeps its timing and delivery.\",\n },\n capabilities: {},\n },\n {\n id: \"elevenlabs-dubbing\",\n aliases: [\"fal-ai/elevenlabs/dubbing\"],\n label: \"ElevenLabs Dubbing\",\n type: \"dubbing\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/elevenlabs/dubbing\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n requiresOneOf: [\"sourceVideo\", \"sourceAudio\"],\n // The flat price covers 60 s of source.\n sourceVideoSeconds: { max: 60 },\n references: { audioSeconds: { max: 60 } },\n languages: ELEVENLABS_DUBBING_LANGUAGES,\n supports: [],\n },\n defaults: {},\n usage: PER_CALL,\n pricingKind: \"flat\",\n display: {\n provider: \"elevenlabs\",\n logo: ELEVENLABS_LOGO,\n description:\n \"ElevenLabs dubbing; translates the speech in a video or audio file into another language in the original voices.\",\n },\n capabilities: { acceptsSourceVideo: true },\n },\n syncLipsync(\n \"lipsync-2\",\n \"Sync Lipsync 2\",\n \"fal-ai/sync-lipsync/v2\",\n \"lipsync-2\",\n \"Sync Lipsync 2 re-times the mouth in a video to new speech; the canvas Lipsync node's original model.\",\n ),\n syncLipsync(\n \"lipsync-2-pro\",\n \"Sync Lipsync 2 Pro\",\n \"fal-ai/sync-lipsync/v2\",\n \"lipsync-2-pro\",\n \"Sync Lipsync 2 Pro; higher-fidelity mouth detail and teeth than Lipsync 2.\",\n ),\n syncLipsync(\n \"lipsync-3\",\n \"Sync Lipsync 3\",\n \"fal-ai/sync-lipsync/v3\",\n undefined,\n \"Sync Lipsync 3 (sync-3) re-times a video's lips, face and head to new speech.\",\n ),\n {\n id: \"veed-lipsync-v2\",\n aliases: [\"veed/lipsync/v2\"],\n label: \"VEED Lipsync v2\",\n type: \"lipsync\",\n adapter: \"fal\",\n providerModelId: \"veed/lipsync/v2\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n requires: [\"sourceVideo\", \"sourceAudio\"],\n references: LIPSYNC_AUDIO,\n // VEED bills per output second; the flat price covers 30 s.\n sourceVideoSeconds: { max: 30 },\n supports: [],\n },\n defaults: {},\n usage: PER_CALL,\n pricingKind: \"flat\",\n display: {\n provider: \"veed\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/d540d2bb-0022-4371-8889-48aefaf46bbe.png\",\n description:\n \"VEED Lipsync v2 re-times the mouth in a video to a new audio track; billed per second of output.\",\n },\n capabilities: { acceptsSourceVideo: true },\n },\n {\n id: \"minimax-h3-max-lipsync\",\n aliases: [\"minimax/h3-max/lip-sync/image-to-video\"],\n label: \"MiniMax H3 Max Lip Sync\",\n type: \"lipsync\",\n adapter: \"fal\",\n providerModelId: \"minimax/h3-max/lip-sync/image-to-video\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n requires: [\"firstFrame\", \"sourceAudio\"],\n resolutions: [\"480p\", \"768p\", \"1080p\", \"2k\"],\n // fal: the audio must be at least 5 s and at most 15 minutes; priced per second.\n references: { audioSeconds: { min: 5, max: 900 } },\n supports: [],\n },\n defaults: { resolution: \"768p\" },\n usage: { unit: \"seconds\" },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n logo: MINIMAX_LOGO,\n description:\n \"MiniMax H3 Max lip sync; animates a portrait image into a talking video as long as the speech, up to 2K.\",\n },\n capabilities: {},\n },\n {\n id: \"elevenlabs-scribe-v2\",\n aliases: [\"fal-ai/elevenlabs/speech-to-text/scribe-v2\"],\n label: \"ElevenLabs Scribe v2\",\n type: \"transcription\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/elevenlabs/speech-to-text/scribe-v2\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n requires: [\"sourceAudio\"],\n // The flat price covers 10 minutes of audio.\n references: { audioSeconds: { max: 600 } },\n languages: SCRIBE_V2_LANGUAGES,\n supports: [],\n },\n defaults: {},\n usage: PER_CALL,\n pricingKind: \"flat\",\n display: {\n provider: \"elevenlabs\",\n logo: ELEVENLABS_LOGO,\n description:\n \"ElevenLabs Scribe v2 speech to text with word timings, speaker labels and audio-event tags.\",\n },\n capabilities: {},\n },\n SAM_3_IMAGE,\n ...FISH_MODELS,\n ...ELEVENLABS_DIRECT_MODELS,\n];\n","import type { CatalogModel, Model3dConstraints } from \"../types.js\";\n\n// One flat-priced job per request (its SKU), whatever the output.\nconst REQUEST_USAGE = { unit: \"requests\" } as const;\n\nfunction row(\n id: string,\n label: string,\n spec: Model3dConstraints,\n display: { provider: string; description: string; sortOrder: number },\n): CatalogModel {\n return {\n id,\n aliases: [],\n label,\n type: \"model3d\",\n adapter: \"fal\",\n // The single-image endpoint; the adapter picks the endpoint a request needs.\n providerModelId: spec.endpoints.image ?? id,\n lifecycle: \"active\",\n exposure: [\"space_builder\"],\n constraints: { supports: [], model3d: spec },\n defaults: {},\n usage: REQUEST_USAGE,\n pricingKind: \"flat\",\n display,\n };\n}\n\n/**\n * 3D generation on fal: the newest model of each 3D family. A request's price depends on\n * its options (texture, PBR, views, resolution), so each row bills one flat price per\n * option combination: `model3dSkus(row)` lists them and pro-backend keeps a\n * credit_pricing_flat row for each.\n */\nexport const MODEL3D_MODELS: CatalogModel[] = [\n row(\n \"trellis-2\",\n \"Trellis 2\",\n {\n family: \"trellis\",\n endpoints: { image: \"fal-ai/trellis-2\" },\n text: false,\n imageRequired: true,\n views: \"none\",\n maxImages: 1,\n texture: [],\n pbr: false,\n textureRef: false,\n seed: true,\n resolutions: { label: \"Resolution\", options: [\"512\", \"1024\", \"1536\"], default: \"1024\" },\n },\n {\n provider: \"microsoft\",\n description: \"One photo to a detailed textured model. Fast and the best value.\",\n sortOrder: 70,\n },\n ),\n row(\n \"hunyuan3d-3.1-pro\",\n \"Hunyuan3D 3.1 Pro\",\n {\n family: \"hunyuan\",\n endpoints: {\n text: \"fal-ai/hunyuan-3d/v3.1/pro/text-to-3d\",\n image: \"fal-ai/hunyuan-3d/v3.1/pro/image-to-3d\",\n },\n text: true,\n imageRequired: false,\n views: \"named\",\n maxImages: 4,\n texture: [\"none\", \"standard\"],\n pbr: true,\n textureRef: false,\n seed: false,\n },\n {\n provider: \"tencent\",\n description:\n \"Photo-faithful models from a prompt, a photo, or a photo with back and side views.\",\n sortOrder: 60,\n },\n ),\n row(\n \"tripo-h3.1\",\n \"Tripo H3.1\",\n {\n family: \"tripo\",\n endpoints: {\n text: \"tripo3d/h3.1/text-to-3d\",\n image: \"tripo3d/h3.1/image-to-3d\",\n multiImage: \"tripo3d/h3.1/multiview-to-3d\",\n },\n text: true,\n imageRequired: false,\n views: \"ordered\",\n maxImages: 4,\n texture: [\"none\", \"standard\", \"detailed\"],\n pbr: true,\n textureRef: false,\n seed: true,\n },\n {\n provider: \"tripo\",\n description: \"Clean, game-ready models from a prompt, a photo or four views.\",\n sortOrder: 50,\n },\n ),\n row(\n \"rodin-gen-2.5\",\n \"Rodin Gen-2.5\",\n {\n family: \"rodin\",\n endpoints: {\n text: \"fal-ai/hyper3d/rodin/v2.5/text-to-3d\",\n image: \"fal-ai/hyper3d/rodin/v2.5\",\n },\n text: true,\n imageRequired: false,\n views: \"unordered\",\n maxImages: 5,\n texture: [],\n pbr: false,\n textureRef: false,\n seed: true,\n seedMax: 65535,\n },\n {\n provider: \"hyper3d\",\n description: \"Detailed PBR models from a prompt or up to five photos.\",\n sortOrder: 40,\n },\n ),\n row(\n \"meshy-7.1\",\n \"Meshy 7.1\",\n {\n family: \"meshy\",\n endpoints: {\n text: \"meshy/v7.1/text-to-3d\",\n image: \"meshy/v7.1/image-to-3d\",\n multiImage: \"meshy/v7.1/multi-image-to-3d\",\n },\n text: true,\n imageRequired: false,\n views: \"unordered\",\n maxImages: 4,\n texture: [\"none\", \"standard\"],\n pbr: true,\n textureRef: true,\n seed: true,\n },\n {\n provider: \"meshy\",\n description:\n \"Models from a prompt or photos, with a texture prompt or texture image to restyle.\",\n sortOrder: 30,\n },\n ),\n row(\n \"hi3d-3.0\",\n \"Hi3D 3.0\",\n {\n family: \"hi3d\",\n endpoints: {\n image: \"hitem3d/hi3d/v3.0/image-to-3d\",\n multiImage: \"hitem3d/hi3d/v3.0/multi-view-to-3d\",\n },\n text: false,\n imageRequired: true,\n views: \"named\",\n maxImages: 4,\n texture: [\"none\", \"standard\"],\n pbr: true,\n textureRef: false,\n seed: false,\n resolutions: { label: \"Quality\", options: [\"quality\", \"master\"], default: \"quality\" },\n },\n {\n provider: \"hitem3d\",\n description: \"Highest-fidelity product models from a photo or four views. Slowest.\",\n sortOrder: 20,\n },\n ),\n row(\n \"sam-3d-objects\",\n \"SAM 3D Objects\",\n {\n family: \"sam\",\n endpoints: { image: \"fal-ai/sam-3/3d-objects\" },\n text: true,\n imageRequired: true,\n promptRequired: true,\n views: \"none\",\n maxImages: 1,\n texture: [],\n pbr: false,\n textureRef: false,\n seed: true,\n },\n {\n provider: \"meta\",\n description: \"Lifts one named object out of a real photo into a 3D model.\",\n sortOrder: 10,\n },\n ),\n];\n","import type { CatalogModel } from \"../types.js\";\nimport {\n ELEVENLABS_MP3_FORMATS,\n ELEVENLABS_MUSIC_FORMATS,\n MIRELO_FORMATS,\n} from \"./audio-formats.js\";\n\nconst GOOGLE_LOGO =\n \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png\";\nconst ELEVENLABS_LOGO =\n \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/elevenlabs.png\";\nconst MINIMAX_LOGO =\n \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/f4c2e906-28b7-4a4a-b491-df8fef7808ed.png\";\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 exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n durations: [30],\n references: { images: 10 },\n supports: [],\n },\n defaults: {},\n usage: { unit: \"images\" },\n pricingKind: \"flat\",\n display: {\n provider: \"google\",\n logo: GOOGLE_LOGO,\n description:\n \"Google Lyria 3 Clip short music clips, loops, and previews; takes text and up to 10 image prompts and returns a fixed 30-second MP3 plus lyrics.\",\n },\n capabilities: {},\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 exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n references: { images: 10 },\n supports: [],\n },\n defaults: {},\n usage: { unit: \"images\" },\n pricingKind: \"flat\",\n display: {\n provider: \"google\",\n logo: GOOGLE_LOGO,\n description:\n \"Google Lyria 3 Pro flagship music model for full-length songs with verses, choruses, and bridges; takes text and up to 10 image prompts and returns MP3 plus lyrics.\",\n },\n capabilities: {},\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 exposure: [],\n constraints: {\n durations: [30],\n supports: [\"seed\", \"negativePrompt\"],\n },\n defaults: {},\n usage: { unit: \"compute_seconds\" },\n pricingKind: \"flat\",\n display: {\n provider: \"google\",\n description:\n \"Lyria 2 music generation on Replicate; produces 30 seconds of 48 kHz stereo audio from a text prompt.\",\n },\n capabilities: {},\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 exposure: [\"cowork\", \"space_builder\"],\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\" },\n pricingKind: \"flat\",\n display: {\n provider: \"mmaudio\",\n description:\n \"MMAudio V2 video-to-audio model on Replicate; takes a source video and prompt and synthesizes synchronized environmental, action, and speech-like audio.\",\n },\n capabilities: {},\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 exposure: [],\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\" },\n pricingKind: \"flat\",\n display: {\n provider: \"elevenlabs\",\n description:\n \"ElevenLabs Music text-to-music on Replicate; generates full songs, instrumental or with vocals, up to 5 minutes long at up to 44.1 kHz.\",\n },\n capabilities: {},\n },\n {\n // https://ai.google.dev/gemini-api/docs/music-generation (Interactions API)\n id: \"lyria-3.5\",\n aliases: [],\n label: \"Lyria 3.5\",\n type: \"audio\",\n adapter: \"google-genai\",\n providerModelId: \"lyria-3.5\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n references: { images: 10 },\n supports: [],\n },\n defaults: {},\n usage: { unit: \"images\" },\n pricingKind: \"flat\",\n display: {\n provider: \"google\",\n logo: GOOGLE_LOGO,\n description:\n \"Google Lyria 3.5 full-length songs with verses, choruses and bridges; takes text and up to 10 image prompts and returns 44.1 kHz stereo MP3 plus lyrics.\",\n },\n capabilities: {},\n },\n {\n // https://fal.ai/models/elevenlabs/music/v2.5/api\n id: \"elevenlabs-music-v2.5\",\n aliases: [\"elevenlabs/music/v2.5\"],\n label: \"ElevenLabs Music v2.5\",\n type: \"audio\",\n adapter: \"fal\",\n providerModelId: \"elevenlabs/music/v2.5\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n // fal allows 3-600 s; capped at the 60 s the flat price covers.\n durations: { min: 3, max: 60 },\n durationPresets: [15, 30, 60],\n supports: [\"instrumental\", \"seed\"],\n outputFormats: ELEVENLABS_MUSIC_FORMATS,\n prompt: { referenceSyntax: \"numbered\", maxChars: 4100 },\n },\n defaults: { durationSeconds: 30, outputFormat: \"mp3_48000_192\" },\n usage: { unit: \"seconds\" },\n pricingKind: \"flat\",\n display: {\n provider: \"elevenlabs\",\n logo: ELEVENLABS_LOGO,\n description:\n \"ElevenLabs Music v2.5 text-to-music; full songs or instrumentals from 3 seconds to 1 minute.\",\n },\n capabilities: {},\n },\n {\n // https://fal.ai/models/minimax/music-3/api\n id: \"minimax-music-3\",\n aliases: [\"minimax/music-3\"],\n label: \"MiniMax Music 3\",\n type: \"audio\",\n adapter: \"fal\",\n providerModelId: \"minimax/music-3\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n durations: { min: 1, max: 300 },\n durationPresets: [30, 60, 120],\n supports: [\"lyrics\", \"instrumental\", \"seed\"],\n },\n defaults: { durationSeconds: 60 },\n usage: { unit: \"seconds\" },\n pricingKind: \"flat\",\n display: {\n provider: \"minimax\",\n logo: MINIMAX_LOGO,\n description:\n \"MiniMax Music 3 songs from a style prompt and your lyrics (or instrumental), up to 5 minutes.\",\n },\n capabilities: {},\n },\n {\n // https://fal.ai/models/fal-ai/elevenlabs/sound-effects/v2/api\n id: \"elevenlabs-sound-effects-v2\",\n aliases: [\"fal-ai/elevenlabs/sound-effects/v2\"],\n label: \"ElevenLabs Sound Effects v2\",\n type: \"sound-effect\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/elevenlabs/sound-effects/v2\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n durations: { min: 0.5, max: 22 },\n durationPresets: [2, 5, 10, 22],\n supports: [],\n outputFormats: ELEVENLABS_MP3_FORMATS,\n prompt: { referenceSyntax: \"numbered\", maxChars: 450 },\n },\n defaults: { durationSeconds: 5, outputFormat: \"mp3_44100_128\" },\n usage: { unit: \"seconds\" },\n pricingKind: \"flat\",\n display: {\n provider: \"elevenlabs\",\n logo: ELEVENLABS_LOGO,\n description:\n \"ElevenLabs Sound Effects v2; a sound effect from a text description, up to 22 seconds.\",\n },\n capabilities: {},\n },\n {\n // https://fal.ai/models/mirelo-ai/sfx2.0/text-to-audio/api\n id: \"mirelo-sfx-2.0\",\n aliases: [\"mirelo-ai/sfx2.0/text-to-audio\"],\n label: \"Mirelo SFX 2.0\",\n type: \"sound-effect\",\n adapter: \"fal\",\n providerModelId: \"mirelo-ai/sfx2.0/text-to-audio\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n // fal allows 1-600 s; capped at the 30 s the flat price covers.\n durations: { min: 1, max: 30 },\n durationPresets: [5, 10, 30],\n supports: [\"seed\", \"negativePrompt\"],\n outputFormats: MIRELO_FORMATS,\n prompt: { referenceSyntax: \"numbered\", maxChars: 2000 },\n },\n defaults: { durationSeconds: 10, outputFormat: \"wav\" },\n usage: { unit: \"seconds\" },\n pricingKind: \"flat\",\n display: {\n provider: \"mirelo\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/c9d92a87-3029-433e-bd94-c7d2bde165fa.png\",\n description: \"Mirelo SFX 2.0 sound effects from a text description.\",\n },\n capabilities: {},\n },\n {\n // https://fal.ai/models/mirelo-ai/sfx2.0/video-to-audio/api. Its own row so the\n // video-to-sound picker lists it by `requires`; the text mode is mirelo-sfx-2.0.\n id: \"mirelo-sfx-2.0-video\",\n aliases: [\"mirelo-ai/sfx2.0/video-to-audio\"],\n label: \"Mirelo SFX 2.0 (video)\",\n type: \"sound-effect\",\n adapter: \"fal\",\n providerModelId: \"mirelo-ai/sfx2.0/video-to-audio\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n // fal allows 1-600 s; capped at the 30 s the flat price covers.\n durations: { min: 1, max: 30 },\n durationPresets: [5, 10, 30],\n requires: [\"sourceVideo\"],\n supports: [\"seed\", \"negativePrompt\"],\n outputFormats: MIRELO_FORMATS,\n sourceVideoSeconds: { min: 1 },\n prompt: { referenceSyntax: \"numbered\", maxChars: 2000 },\n },\n defaults: { durationSeconds: 10, outputFormat: \"wav\" },\n usage: { unit: \"seconds\" },\n pricingKind: \"flat\",\n display: {\n provider: \"mirelo\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/c9d92a87-3029-433e-bd94-c7d2bde165fa.png\",\n description:\n \"Mirelo SFX 2.0 scores a video: sound effects synced to the picture, keeping its speech.\",\n },\n capabilities: { acceptsSourceVideo: true },\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 exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n references: { images: 1 },\n requires: [\"references\"],\n supports: [\"scaleFactor\", \"outputFormat\", \"upscale\"],\n },\n defaults: { scaleFactor: 2, outputFormat: \"png\" },\n usage: { unit: \"compute_seconds\" },\n pricingKind: \"flat\",\n display: {\n provider: \"topaz\",\n logo: \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/topazlabs.png\",\n description:\n \"Topaz Labs AI image upscaling on Replicate; takes one input image and upscales up to 6x with selectable enhancement models and optional face enhancement.\",\n },\n },\n {\n // fal-ai/seedvr/upscale/image in factor mode. fal takes 1-10x and bills $0.001 per\n // output megapixel; the row offers 2x and 4x, priced flat at $0.067 per image.\n id: \"seedvr2-upscale\",\n aliases: [],\n label: \"SeedVR2 Upscale\",\n type: \"upscale\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/seedvr/upscale/image\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n references: { images: 1 },\n requires: [\"references\"],\n supports: [\"scaleFactor\", \"outputFormat\", \"seed\"],\n scaleFactors: [2, 4],\n },\n defaults: { scaleFactor: 2, outputFormat: \"png\" },\n usage: { unit: \"images\" },\n pricingKind: \"flat\",\n display: {\n provider: \"bytedance\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/3bba5d81-4e57-4e71-911b-cdfa05acca2c_compressed.png\",\n description:\n \"ByteDance SeedVR2 one-step image upscaling and restoration on fal; takes one input image and upscales it 2x or 4x with sharp, faithful detail.\",\n },\n },\n {\n id: \"bg-remove\",\n // Task ids the two emitters report on usage events (trigger-workflows,\n // vibe-triggers); the usage price lookup resolves them to this row.\n aliases: [\"prodia-background-remover\", \"prodia-remove-background\"],\n label: \"Background Remover\",\n type: \"bg-remove\",\n adapter: \"prodia\",\n providerModelId: \"inference.remove-background.v1\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n references: { images: 1 },\n requires: [\"references\"],\n supports: [],\n },\n defaults: {},\n usage: { unit: \"images\" },\n pricingKind: \"flat\",\n display: {\n provider: \"prodia\",\n description:\n \"Prodia background removal; takes one input image and returns a PNG cut-out of the subject plus an optional black-and-white mask.\",\n },\n },\n];\n","import type { CatalogModel } from \"../types.js\";\n\nconst TEXT_USAGE = { unit: \"tokens\" } as const;\n\nconst CDN = \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image\";\n/** One vendor mark per text provider; the chat pickers group rows by provider. */\nconst PROVIDER_LOGOS: Record<string, string> = {\n anthropic: `${CDN}/25fad392-188c-4829-a3d0-c4fa02d1c8cd.png`,\n openai: `${CDN}/1204b494-8962-4f7f-af5e-699a8bdc98e3.png`,\n google: `${CDN}/192485d2-a76a-4657-9c06-930b2c70badd.png`,\n deepseek: `${CDN}/9b7406d2-a696-4558-ab79-90a37e3f4574.png`,\n xai: `${CDN}/858b7fcc-9bd5-411d-aea1-a7b35ecfffab.png`,\n moonshot: `${CDN}/5a1e2eae-3474-4fac-9c74-a93f41ee6f67.png`,\n minimax: `${CDN}/f4c2e906-28b7-4a4a-b491-df8fef7808ed.png`,\n};\n\nfunction text(\n id: string,\n label: string,\n providerModelId: string,\n extra?: Partial<CatalogModel>,\n): CatalogModel {\n const display = extra?.display;\n const logo = display && !display.logo ? PROVIDER_LOGOS[display.provider] : undefined;\n return {\n id,\n aliases: [],\n label,\n type: \"text\",\n adapter: \"ai-sdk-text\",\n providerModelId,\n lifecycle: \"active\",\n exposure: [],\n constraints: { supports: [] },\n defaults: {},\n usage: { ...TEXT_USAGE },\n pricingKind: \"token\",\n ...extra,\n ...(display && logo ? { display: { ...display, logo } } : {}),\n };\n}\n\n// Chat-surface stream tuning per row (AI SDK provider-option shape), carried as\n// display data so the kit never merges it into a call.\n// Haiku 4.5 still takes a thinking budget; every 4.6+ Anthropic row uses adaptive\n// summarised thinking (budget_tokens is deprecated on 4.6 and rejected on 4.7+).\n// GPT-5.6 asks for reasoning summaries; DeepSeek enables thinking. Kimi rows\n// sample at temperature 1 (K3 reasons by default).\nconst ANTHROPIC_THINKING = {\n anthropic: { thinking: { type: \"enabled\", budgetTokens: 4000 }, sendReasoning: true },\n};\nconst ANTHROPIC_ADAPTIVE = {\n anthropic: { thinking: { type: \"adaptive\", display: \"summarized\" }, sendReasoning: true },\n};\nconst OPENAI_REASONING = { openai: { reasoningEffort: \"medium\", reasoningSummary: \"auto\" } };\nconst DEEPSEEK_THINKING = { deepseek: { thinking: { type: \"enabled\" } } };\n\nexport const TEXT_MODELS: CatalogModel[] = [\n text(\"gpt-4o\", \"GPT-4o\", \"gpt-4o\", {\n exposure: [],\n display: {\n provider: \"openai\",\n costTier: 2,\n description:\n \"OpenAI GPT-4o flagship multimodal model; text and image input, 128K-token context.\",\n },\n capabilities: { vision: true, contextWindow: 128_000 },\n }),\n text(\"gpt-4o-mini\", \"GPT-4o mini\", \"gpt-4o-mini\", {\n exposure: [],\n display: {\n provider: \"openai\",\n costTier: 1,\n description:\n \"OpenAI GPT-4o mini fast, low-cost multimodal model; text and image input, 128K-token context.\",\n },\n capabilities: { vision: true, contextWindow: 128_000 },\n }),\n text(\"gpt-5.1\", \"GPT-5.1\", \"gpt-5.1\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n provider: \"openai\",\n costTier: 3,\n description:\n \"OpenAI GPT-5.1 reasoning model for coding and agentic tasks; text and image input, 400K-token context.\",\n },\n capabilities: { vision: true, contextWindow: 400_000 },\n }),\n text(\"gpt-5.2\", \"GPT-5.2\", \"gpt-5.2\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n provider: \"openai\",\n costTier: 3,\n description:\n \"OpenAI GPT-5.2 reasoning model for complex professional work; text and image input, 400K-token context.\",\n },\n capabilities: { vision: true, contextWindow: 400_000 },\n }),\n // 1.05M-token context: https://platform.openai.com/docs/models/gpt-5.4\n text(\"gpt-5.4\", \"GPT-5.4\", \"gpt-5.4\", {\n exposure: [],\n display: {\n provider: \"openai\",\n costTier: 3,\n description:\n \"OpenAI GPT-5.4 flagship reasoning model; text and image input, 1.05M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_050_000,\n },\n }),\n // OpenAI never shipped gpt-5.1-mini or gpt-5.2-mini; callers that still send them get 5.4 mini.\n text(\"gpt-5.4-mini\", \"GPT-5.4 mini\", \"gpt-5.4-mini\", {\n exposure: [\"cowork\", \"space_builder\"],\n aliases: [\"gpt-5.1-mini\", \"gpt-5.2-mini\"],\n display: {\n provider: \"openai\",\n costTier: 1,\n description:\n \"OpenAI GPT-5.4 mini efficient reasoning model for high-volume workloads; text and image input, 400K-token context.\",\n },\n capabilities: { vision: true, contextWindow: 400_000 },\n }),\n text(\"gpt-5.5\", \"GPT-5.5\", \"gpt-5.5\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n provider: \"openai\",\n costTier: 3,\n description:\n \"OpenAI GPT-5.5 flagship reasoning model for the most complex professional and coding work; text and image input, 1.05M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_050_000,\n },\n }),\n text(\"gpt-5.6-luna\", \"GPT-5.6 Luna\", \"gpt-5.6-luna\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n chat: { providerOptions: OPENAI_REASONING },\n provider: \"openai\",\n costTier: 1,\n description:\n \"OpenAI GPT-5.6 Luna cost-optimized tier of the GPT-5.6 reasoning family; text and image input, 1.05M-token context.\",\n },\n capabilities: {\n reasoning: true,\n vision: true,\n\n contextWindow: 1_050_000,\n },\n }),\n text(\"gpt-5.6-terra\", \"GPT-5.6 Terra\", \"gpt-5.6-terra\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n chat: { providerOptions: OPENAI_REASONING },\n provider: \"openai\",\n costTier: 2,\n description:\n \"OpenAI GPT-5.6 Terra balanced tier of the GPT-5.6 reasoning family; text and image input, 1.05M-token context.\",\n },\n capabilities: {\n reasoning: true,\n vision: true,\n\n contextWindow: 1_050_000,\n },\n }),\n text(\"gpt-5.6-sol\", \"GPT-5.6 Sol\", \"gpt-5.6-sol\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n chat: { providerOptions: OPENAI_REASONING },\n provider: \"openai\",\n costTier: 3,\n description:\n \"OpenAI GPT-5.6 Sol flagship tier of the GPT-5.6 reasoning family; text and image input, 1.05M-token context.\",\n },\n capabilities: {\n reasoning: true,\n vision: true,\n\n contextWindow: 1_050_000,\n },\n }),\n // Library key \"claude-sonnet-4.5\" maps to the SDK id \"claude-sonnet-4-5\".\n text(\"claude-sonnet-4-5\", \"Claude Sonnet 4.5\", \"claude-sonnet-4-5\", {\n exposure: [],\n aliases: [\"claude-sonnet-4.5\", \"claude-sonnet-4-5-20250929\"],\n display: {\n provider: \"anthropic\",\n costTier: 2,\n description:\n \"Anthropic Claude Sonnet 4.5 (legacy) balanced model; text and image input, 200K-token context.\",\n },\n capabilities: { vision: true, contextWindow: 200_000 },\n }),\n // Anthropic retired the dated 4.0 ids; callers that still send them get 4.6.\n text(\"claude-sonnet-4-6\", \"Claude Sonnet 4.6\", \"claude-sonnet-4-6\", {\n exposure: [\"cowork\", \"space_builder\"],\n aliases: [\n \"claude-sonnet-4.6\",\n \"claude-sonnet-4\",\n \"claude-sonnet-4.0\",\n \"claude-sonnet-4-20250514\",\n ],\n display: {\n chat: { providerOptions: ANTHROPIC_ADAPTIVE },\n provider: \"anthropic\",\n costTier: 2,\n description:\n \"Anthropic Claude Sonnet 4.6 (legacy) balanced model; text and image input, 1M-token context.\",\n },\n capabilities: {\n reasoning: true,\n vision: true,\n\n contextWindow: 1_000_000,\n },\n }),\n text(\"claude-sonnet-5\", \"Claude Sonnet 5\", \"claude-sonnet-5\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n chat: { providerOptions: ANTHROPIC_ADAPTIVE },\n provider: \"anthropic\",\n costTier: 3,\n description:\n \"Anthropic Claude Sonnet 5 current balanced model; text and image input, 1M-token context.\",\n },\n capabilities: {\n reasoning: true,\n vision: true,\n\n contextWindow: 1_000_000,\n },\n }),\n text(\"claude-opus-4-8\", \"Claude Opus 4.8\", \"claude-opus-4-8\", {\n exposure: [\"cowork\", \"space_builder\"],\n aliases: [\"claude-opus-4.8\", \"claude-opus-4\", \"claude-opus-4.0\", \"claude-opus-4-20250514\"],\n display: {\n chat: { providerOptions: ANTHROPIC_ADAPTIVE },\n provider: \"anthropic\",\n costTier: 3,\n description:\n \"Anthropic Claude Opus 4.8 (legacy) frontier model; text and image input, 1M-token context.\",\n },\n capabilities: {\n reasoning: true,\n vision: true,\n\n contextWindow: 1_000_000,\n },\n }),\n text(\"claude-haiku-4-5\", \"Claude Haiku 4.5\", \"claude-haiku-4-5\", {\n exposure: [\"cowork\", \"space_builder\"],\n aliases: [\"claude-haiku-4.5\", \"claude-haiku-4-5-20251001\", \"claude-haiku-4\"],\n display: {\n chat: { providerOptions: ANTHROPIC_THINKING },\n provider: \"anthropic\",\n costTier: 1,\n description:\n \"Anthropic Claude Haiku 4.5 fast model with near-frontier intelligence; text and image input, 200K-token context.\",\n },\n capabilities: {\n reasoning: true,\n vision: true,\n\n contextWindow: 200_000,\n },\n }),\n text(\"claude-opus-5\", \"Claude Opus 5\", \"claude-opus-5\", {\n exposure: [],\n aliases: [\"claude-opus-5.0\"],\n display: {\n provider: \"anthropic\",\n costTier: 3,\n description:\n \"Anthropic Claude Opus 5 current frontier model for agentic coding and enterprise work; text and image input, 1M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_000_000,\n },\n }),\n text(\"claude-fable-5\", \"Claude Fable 5\", \"claude-fable-5\", {\n exposure: [],\n display: {\n provider: \"anthropic\",\n costTier: 3,\n description:\n \"Anthropic Claude Fable 5 (legacy) model for demanding reasoning and long-horizon agentic work; text and image input, 1M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_000_000,\n },\n }),\n text(\"gemini-2.5-flash\", \"Gemini 2.5 Flash\", \"gemini-2.5-flash\", {\n exposure: [],\n display: {\n provider: \"google\",\n costTier: 1,\n description:\n \"Google Gemini 2.5 Flash low-latency multimodal model for high-volume reasoning over text, images, video, and audio; 1M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_048_576,\n },\n }),\n text(\"gemini-2.5-pro\", \"Gemini 2.5 Pro\", \"gemini-2.5-pro\", {\n exposure: [],\n display: {\n provider: \"google\",\n costTier: 2,\n description:\n \"Google Gemini 2.5 Pro thinking model for complex reasoning over code, math, and documents; text, image, video, audio, and PDF input, 1M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_048_576,\n },\n }),\n text(\"gemini-3.1-pro-preview\", \"Gemini 3.1 Pro (preview)\", \"gemini-3.1-pro-preview\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n provider: \"google\",\n costTier: 2,\n description:\n \"Google Gemini 3.1 Pro preview reasoning model for software engineering, tool use, and reliable agentic workflows; 1M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_048_576,\n },\n }),\n text(\"gemini-3.5-flash\", \"Gemini 3.5 Flash\", \"gemini-3.5-flash\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n provider: \"google\",\n costTier: 1,\n description:\n \"Google Gemini 3.5 Flash high-throughput model for frontier-level agentic tasks; text, image, video, audio, and PDF input, 1M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_048_576,\n },\n }),\n text(\"gemini-3.6-flash\", \"Gemini 3.6 Flash\", \"gemini-3.6-flash\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n provider: \"google\",\n costTier: 1,\n description:\n \"Google Gemini 3.6 Flash general-purpose multimodal agentic model balancing speed and capability; 1M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_048_576,\n },\n }),\n text(\"gemini-3.7-flash\", \"Gemini 3.7 Flash\", \"gemini-3.7-flash\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n provider: \"google\",\n costTier: 1,\n recommended: true,\n description:\n \"Google Gemini 3.7 Flash natively multimodal reasoning model for coding, agentic workflows, and multi-step execution; 1M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_048_576,\n },\n }),\n text(\"gemini-3.8-flash\", \"Gemini 3.8 Flash\", \"gemini-3.8-flash\", {\n exposure: [],\n display: {\n provider: \"google\",\n costTier: 1,\n description:\n \"Google Gemini 3.8 Flash frontier model for long-horizon software engineering, autonomous agents, and enterprise workflows; 1M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_048_576,\n },\n }),\n // Renamed to gemini-3.6-flash in vibe-shared model-migration.ts.\n text(\"gemini-3-flash-preview\", \"Gemini 3 Flash (preview)\", \"gemini-3-flash-preview\", {\n exposure: [],\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 exposure: [],\n display: {\n provider: \"google\",\n costTier: 1,\n description:\n \"Google Gemini 3.1 Flash-Lite low-latency multimodal model for high-volume agentic, translation, and data-extraction tasks; 1M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_048_576,\n },\n }),\n // Perplexity stopped serving Sonar Chat Completions on 2026-09-27; @ai-sdk/perplexity 3.1\n // speaks the Agent API, which rejects the bare `sonar*` ids. Its migration guide maps Sonar\n // and Sonar Pro to the `fast` preset and Sonar Reasoning Pro to `low`\n // (docs.perplexity.ai/docs/agent-api/migrate-from-sonar/overview).\n text(\"sonar\", \"Sonar\", \"sonar\", {\n lifecycle: \"deprecated\",\n replacedBy: \"perplexity/sonar\",\n exposure: [],\n display: {\n provider: \"perplexity\",\n costTier: 1,\n description:\n \"Perplexity Sonar on Chat Completions, which Perplexity stopped serving on 2026-09-27; calls now fail.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 128_000,\n },\n }),\n text(\"sonar-pro\", \"Sonar Pro\", \"sonar-pro\", {\n lifecycle: \"deprecated\",\n replacedBy: \"perplexity/fast\",\n exposure: [],\n display: {\n provider: \"perplexity\",\n costTier: 2,\n description:\n \"Perplexity Sonar Pro on Chat Completions, which Perplexity stopped serving on 2026-09-27; calls now fail.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 200_000,\n },\n }),\n text(\"sonar-reasoning-pro\", \"Sonar Reasoning Pro\", \"sonar-reasoning-pro\", {\n lifecycle: \"deprecated\",\n replacedBy: \"perplexity/fast\",\n exposure: [],\n display: {\n provider: \"perplexity\",\n costTier: 2,\n description:\n \"Perplexity Sonar Reasoning Pro on Chat Completions, which Perplexity stopped serving on 2026-09-27; calls now fail.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 128_000,\n },\n }),\n // Sonar as an Agent API model. A bare model searches only when given the web_search\n // tool, so the row sends it on every call; the answer's sources come from its results.\n text(\"perplexity/sonar\", \"Perplexity Sonar\", \"perplexity/sonar\", {\n exposure: [],\n providerOptions: {\n modelkit: { provider: \"perplexity\" },\n perplexity: { tools: [{ type: \"web_search\" }] },\n },\n display: {\n provider: \"perplexity\",\n costTier: 1,\n description:\n \"Perplexity Sonar on the Agent API with web search, returning answers grounded in cited sources.\",\n },\n // Perplexity publishes no Agent API context window; Sonar's own is 128K.\n capabilities: {\n vision: true,\n contextWindow: 128_000,\n },\n }),\n // The Agent API `fast` preset: openai/gpt-5.6-luna with one web search, Perplexity's\n // recommended replacement for Sonar and Sonar Pro.\n text(\"perplexity/fast\", \"Perplexity Fast\", \"fast\", {\n exposure: [],\n providerOptions: { modelkit: { provider: \"perplexity\" } },\n display: {\n provider: \"perplexity\",\n costTier: 1,\n description:\n \"Perplexity Agent API fast preset: a quick web-grounded answer from one search.\",\n },\n // No published preset window; Sonar's 128K, the size the preset replaces.\n capabilities: {\n vision: true,\n contextWindow: 128_000,\n },\n }),\n // DeepSeek retired V4 Flash upstream and routes the old id to V4.1 Flash at\n // Flash rates (https://api-docs.deepseek.com/news/news260910/); the old id\n // stays an alias so stored selections keep resolving.\n text(\"deepseek-flash\", \"DeepSeek V4.1 Flash\", \"deepseek-flash\", {\n aliases: [\"deepseek-v4-flash\"],\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n chat: { providerOptions: DEEPSEEK_THINKING },\n provider: \"deepseek\",\n costTier: 1,\n recommended: true,\n description:\n \"DeepSeek V4.1 Flash thinking/non-thinking model with vision, tool calls, and JSON output; 1M-token context and up to 384K output tokens.\",\n },\n capabilities: {\n reasoning: true,\n vision: true,\n\n contextWindow: 1_000_000,\n },\n }),\n text(\"deepseek-v4-pro\", \"DeepSeek V4 Pro\", \"deepseek-v4-pro\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n chat: { providerOptions: DEEPSEEK_THINKING },\n provider: \"deepseek\",\n costTier: 2,\n description:\n \"DeepSeek V4 Pro thinking/non-thinking text model with tool calls and JSON output (no vision); 1M-token context and up to 384K output tokens.\",\n },\n capabilities: {\n reasoning: true,\n vision: false,\n\n contextWindow: 1_000_000,\n },\n }),\n // 1M-token context: https://docs.x.ai/docs/models/grok-4.3\n text(\"grok-4.3\", \"Grok 4.3\", \"grok-4.3\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n provider: \"xai\",\n costTier: 2,\n description:\n \"xAI Grok 4.3 reasoning model with tool calling and structured outputs; text and image input, 1M-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 1_000_000,\n },\n }),\n // Moonshot retired kimi-k2.5 on 2026-08-31 and no longer publishes its specs.\n text(\"kimi-k2.5\", \"Kimi K2.5\", \"kimi-k2.5\", {\n lifecycle: \"deprecated\",\n replacedBy: \"kimi-k3\",\n exposure: [],\n display: {\n chat: { temperature: 1 },\n provider: \"moonshot\",\n costTier: 2,\n description:\n \"Moonshot Kimi K2.5; the provider retired the model on 2026-08-31 and calls now return a model-not-found error.\",\n },\n capabilities: {},\n }),\n text(\"kimi-k3\", \"Kimi K3\", \"kimi-k3\", {\n exposure: [\"cowork\", \"space_builder\"],\n display: {\n chat: { temperature: 1 },\n provider: \"moonshot\",\n costTier: 2,\n description:\n \"Moonshot Kimi K3 flagship model with native visual understanding and always-on thinking; text, image, and video input, 1M-token context.\",\n },\n capabilities: {\n reasoning: true,\n vision: true,\n\n contextWindow: 1_000_000,\n },\n }),\n // Cowork calls the provider \"MiniMax-M3\"; the pricing key is lowercase.\n // 1M-token context: https://platform.minimax.io/docs/api-reference/text-openai-api\n text(\"minimax-m3\", \"MiniMax M3\", \"MiniMax-M3\", {\n exposure: [\"cowork\", \"space_builder\"],\n aliases: [\"MiniMax-M3\"],\n display: {\n provider: \"minimax\",\n costTier: 2,\n description:\n \"MiniMax M3 frontier multimodal model for agentic reasoning, tool use, and coding; text, image, and video input, 1M-token context.\",\n },\n capabilities: { vision: true, contextWindow: 1_000_000 },\n }),\n];\n","import type { AspectRatio, CatalogModel, PromptConventions, ReferenceLimits } from \"../types.js\";\n\n// ENG-3271 video rows. Every limit below comes from the endpoint's published schema (fal\n// queue OpenAPI, docs.x.ai), saved as test fixtures next to the adapters.\n\nconst VIDEO_USAGE = { unit: \"seconds\" } as const;\nconst MB = 1024 * 1024;\n\nconst KLING_LOGO =\n \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/kling-color.png\";\nconst MINIMAX_LOGO =\n \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/f4c2e906-28b7-4a4a-b491-df8fef7808ed.png\";\nconst BYTEDANCE_LOGO =\n \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/3bba5d81-4e57-4e71-911b-cdfa05acca2c_compressed.png\";\nconst XAI_LOGO =\n \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/858b7fcc-9bd5-411d-aea1-a7b35ecfffab_compressed.png\";\n\nconst H3_RATIOS: AspectRatio[] = [\"21:9\", \"16:9\", \"4:3\", \"1:1\", \"3:4\", \"9:16\"];\nconst HAPPY_HORSE_RATIOS: AspectRatio[] = [\n \"16:9\",\n \"9:16\",\n \"1:1\",\n \"4:3\",\n \"3:4\",\n \"21:9\",\n \"9:21\",\n \"5:4\",\n \"4:5\",\n];\n// xAI also takes 5:2, which the kit has no spelling for.\nconst GROK_15_RATIOS: AspectRatio[] = [\"1:1\", \"16:9\", \"9:16\", \"4:3\", \"3:4\", \"3:2\", \"2:3\", \"21:9\"];\n\nfunction range(min: number, max: number): number[] {\n return Array.from({ length: max - min + 1 }, (_, i) => min + i);\n}\n\nconst KLING_PROMPT: PromptConventions = { referenceSyntax: \"numbered\", maxChars: 2500 };\nconst H3_PROMPT: PromptConventions = { referenceSyntax: \"numbered\", maxChars: 50000 };\n// Kling 4.0 prompts name inputs by kind and position with no space: @Image1, @Image2 for the\n// reference images in order, @Video1, @Video2 for the reference videos (on an edit, @Video1\n// is the source). The kit sends no elements, so @Element1 never applies.\nconst KLING_V4_PROMPT: PromptConventions = { referenceSyntax: \"numbered\", maxChars: 2500 };\n// fal's Kling 4.0 endpoints have no sound field.\nconst KLING_V4_AUDIO = \"always\" as const;\n\n// Explicit zeros: the resolver trims a reference kind the endpoint has no field for,\n// instead of letting it reach the adapter.\nconst NO_REFERENCES: ReferenceLimits = { images: 0, videos: 0, audios: 0 };\n\n// Motion control: one character image plus one motion clip (fal: 3-30.05 s with \"video\"\n// orientation, which the adapter sends). The output runs as long as the motion clip.\nfunction klingMotionControl(tier: \"pro\" | \"standard\"): CatalogModel {\n const label = tier === \"pro\" ? \"Pro\" : \"Standard\";\n return {\n // https://fal.ai/models/fal-ai/kling-video/v3/pro/motion-control/api\n id: `kling-3.0-motion-control-${tier}`,\n aliases: [],\n label: `Kling 3.0 Motion Control ${label}`,\n type: \"video\",\n adapter: \"fal\",\n providerModelId: `fal-ai/kling-video/v3/${tier}/motion-control`,\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n references: {\n images: 1,\n videos: 1,\n audios: 0,\n videoSeconds: { min: 3, max: 30.05 },\n min: { images: 1, videos: 1 },\n },\n requires: [\"references\"],\n // generateAudio keeps (true) or drops (false) the motion clip's soundtrack.\n supports: [\"generateAudio\"],\n prompt: { referenceSyntax: \"descriptive\", maxChars: 2500 },\n audio: \"optional\",\n },\n defaults: { generateAudio: true },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"kuaishou\",\n logo: KLING_LOGO,\n description: `Kuaishou Kling 3.0 Motion Control (${label}): a character image performs the motion of a 3-30 second reference video, keeping its timing and sound.`,\n },\n capabilities: {},\n };\n}\n\nexport const VIDEO_FAMILY_MODELS: CatalogModel[] = [\n klingMotionControl(\"pro\"),\n klingMotionControl(\"standard\"),\n {\n // https://fal.ai/models/fal-ai/kling-video/o3/pro/reference-to-video/api\n // Text, start/end frames and up to 7 reference images (frames count toward the 7).\n id: \"kling-o3\",\n aliases: [\"kling-o3-pro\", \"kling-o3-reference\"],\n label: \"Kling O3\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/kling-video/o3/pro/reference-to-video\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [\"16:9\", \"9:16\", \"1:1\"],\n durations: range(3, 15),\n references: { ...NO_REFERENCES, images: 7 },\n supports: [\"generateAudio\", \"lastFrame\"],\n prompt: KLING_PROMPT,\n audio: \"optional\",\n },\n defaults: { durationSeconds: 5, aspectRatio: \"16:9\", generateAudio: true },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"kuaishou\",\n logo: KLING_LOGO,\n description:\n \"Kuaishou Kling O3 Pro: text, start/end frames and up to 7 reference images in one 3-15 second clip with consistent characters and optional native audio.\",\n },\n capabilities: { lastFrameRequiresFirstFrame: true },\n },\n {\n // https://fal.ai/models/fal-ai/kling-video/o3/pro/video-to-video/edit/api\n // Source: mp4/mov, 3-15.05 s, 720-3840 px; reference images up to 4 with a video.\n id: \"kling-o3-edit\",\n aliases: [\"kling-o3-pro-edit\"],\n label: \"Kling O3 Edit\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/kling-video/o3/pro/video-to-video/edit\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n references: { ...NO_REFERENCES, images: 4 },\n requires: [\"sourceVideo\"],\n sourceVideoSeconds: { min: 3, max: 15.05 },\n // generateAudio keeps (true) or drops (false) the source soundtrack.\n supports: [\"generateAudio\"],\n prompt: KLING_PROMPT,\n audio: \"optional\",\n },\n defaults: { generateAudio: true },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"kuaishou\",\n logo: KLING_LOGO,\n description:\n \"Kuaishou Kling O3 Pro video edit: change a 3-15 second clip with a prompt and up to 4 reference images while keeping its motion and timing.\",\n },\n capabilities: { acceptsSourceVideo: true, videoEdit: true },\n },\n {\n // https://fal.ai/models/kling/v4/reference-to-video/api (+ /text-to-video,\n // /image-to-video): one row; references (images or videos) go to reference-to-video,\n // else a start frame to image-to-video, else text-to-video. Reference images: 10, the\n // start frame included (fal: \"counts toward the image reference limit\"), 300 px min.\n // Reference videos: 5, 3-30.05 s each and 30 s combined, 700 px min, 23.9-60.05 fps.\n // The prompt names references as @Image1, @Video1 (no space; @Element1 for elements,\n // which the kit does not send). No sound switch on any endpoint.\n id: \"kling-4.0\",\n aliases: [\"kling-4\", \"kling-v4\"],\n label: \"Kling 4.0\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"kling/v4\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [\"adaptive\", \"16:9\", \"9:16\", \"1:1\", \"21:9\"],\n resolutions: [\"720p\", \"1080p\"],\n durations: { min: 3, max: 30 },\n durationPresets: [5, 10, 15, 30],\n references: {\n ...NO_REFERENCES,\n images: 10,\n videos: 5,\n videoSeconds: { min: 3, max: 30.05, total: 30 },\n },\n supports: [\"lastFrame\"],\n prompt: KLING_V4_PROMPT,\n audio: KLING_V4_AUDIO,\n },\n defaults: { durationSeconds: 5, resolution: \"1080p\", aspectRatio: \"16:9\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"kuaishou\",\n logo: KLING_LOGO,\n description:\n \"Kuaishou Kling 4.0: text-to-video, start/end frames, or reference-to-video from up to 10 images and 5 videos (30 seconds combined), 3-30 seconds at 720p or 1080p. Prompts name references @Image1, @Video1.\",\n },\n capabilities: { lastFrameRequiresFirstFrame: true },\n },\n {\n // https://fal.ai/models/kling/v4/video-to-video/edit/api: source 3-30.05 s (700 px\n // min, 23.9-60.05 fps), up to 10 reference images. duration 3-30, or left out for the\n // source's length. The prompt names the source @Video1 and images @Image1, @Image2.\n id: \"kling-4.0-edit\",\n aliases: [\"kling-4-edit\", \"kling-v4-edit\"],\n label: \"Kling 4.0 Edit\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"kling/v4/video-to-video/edit\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n resolutions: [\"720p\", \"1080p\"],\n durations: { min: 3, max: 30 },\n references: { ...NO_REFERENCES, images: 10 },\n requires: [\"sourceVideo\"],\n sourceVideoSeconds: { min: 3, max: 30.05 },\n supports: [],\n prompt: KLING_V4_PROMPT,\n audio: KLING_V4_AUDIO,\n },\n defaults: { resolution: \"1080p\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"kuaishou\",\n logo: KLING_LOGO,\n description:\n \"Kuaishou Kling 4.0 video edit: change a 3-30 second clip with a prompt and up to 10 reference images, at 720p or 1080p, as long as the source or a set 3-30 seconds. Prompts name the source @Video1 and images @Image1.\",\n },\n capabilities: { acceptsSourceVideo: true, videoEdit: true },\n },\n {\n // https://fal.ai/models/minimax/h3-max-turbo/text-to-video/api (+ /image-to-video).\n // image-to-video takes a start frame, an end frame, or both, and no aspect_ratio.\n id: \"minimax-h3-max-turbo\",\n aliases: [],\n label: \"MiniMax H3 Max Turbo\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"minimax/h3-max-turbo\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...H3_RATIOS],\n resolutions: [\"480p\", \"768p\", \"1080p\"],\n durations: { min: 1, max: 15 },\n durationPresets: [5, 10, 15],\n ratioIgnoredWith: [\"firstFrame\"],\n // One soundtrack clip (target_audio_url): at least 2 s, at most 15 MB.\n references: {\n ...NO_REFERENCES,\n audios: 1,\n audioSeconds: { min: 2 },\n audioMaxBytes: 15 * MB,\n },\n supports: [\"seed\", \"promptExpansion\", \"lastFrame\", \"safetyChecker\"],\n prompt: H3_PROMPT,\n audio: \"always\",\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"768p\",\n aspectRatio: \"16:9\",\n promptExpansion: \"balanced\",\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n logo: MINIMAX_LOGO,\n description:\n \"The fast tier of MiniMax H3 Max: text-to-video and start/end-frame image-to-video with native audio and an optional soundtrack clip, up to 15 seconds at 1080p.\",\n },\n capabilities: {},\n },\n {\n // https://fal.ai/models/minimax/h3-max/insert-video/api: a 5-13 s scene between\n // start_time (1.625-60 s) and resume_time (over 1.625, up to 60 s); only the scene is billed.\n id: \"minimax-h3-max-insert\",\n aliases: [],\n label: \"MiniMax H3 Max Insert\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"minimax/h3-max/insert-video\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n resolutions: [\"480p\", \"768p\"],\n durations: { min: 5, max: 13 },\n references: { images: 9, videos: 3, audios: 0 },\n requires: [\"sourceVideo\"],\n supports: [\"seed\", \"insertWindow\"],\n prompt: H3_PROMPT,\n audio: \"always\",\n },\n defaults: { durationSeconds: 5, resolution: \"768p\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n logo: MINIMAX_LOGO,\n description:\n \"MiniMax H3 Max Insert: generates a new 5-13 second scene inside an existing video from a prompt, reference images or videos, then returns to the original footage.\",\n },\n capabilities: { acceptsSourceVideo: true, videoEdit: true },\n },\n {\n // https://fal.ai/models/minimax/h3-max/recast/api: source 5-30 s, 1-4 people photos.\n id: \"minimax-h3-max-recast\",\n aliases: [],\n label: \"MiniMax H3 Max Recast\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"minimax/h3-max/recast\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n resolutions: [\"768p\", \"1080p\"],\n references: { ...NO_REFERENCES, images: 4, min: { images: 1 } },\n requires: [\"sourceVideo\", \"references\"],\n sourceVideoSeconds: { min: 5, max: 30 },\n supports: [\"seed\", \"safetyChecker\"],\n prompt: { referenceSyntax: \"descriptive\", maxChars: 2000 },\n audio: \"always\",\n },\n defaults: { resolution: \"1080p\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n logo: MINIMAX_LOGO,\n description:\n \"MiniMax H3 Max Recast: replaces the people in a 5-30 second video with up to 4 reference photos, keeping the motion, camera, cuts and soundtrack.\",\n },\n capabilities: { acceptsSourceVideo: true, videoEdit: true },\n },\n {\n // https://fal.ai/models/minimax/h3-max/relight/api: source up to 15 s and at least\n // 56 frames at 24 fps; one sphere render sets the light; no prompt field.\n id: \"minimax-h3-max-relight\",\n aliases: [],\n label: \"MiniMax H3 Max Relight\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"minimax/h3-max/relight\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [\"adaptive\", ...H3_RATIOS],\n resolutions: [\"480p\", \"768p\", \"1080p\", \"2k\"],\n references: { ...NO_REFERENCES, images: 1, min: { images: 1 } },\n noPrompt: true,\n requires: [\"sourceVideo\", \"references\"],\n sourceVideoSeconds: { min: 2.34, max: 15 },\n supports: [\"seed\", \"safetyChecker\"],\n audio: \"always\",\n },\n defaults: { resolution: \"768p\", aspectRatio: \"adaptive\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n logo: MINIMAX_LOGO,\n description:\n \"MiniMax H3 Max Relight: relights a video of up to 15 seconds from a lighting sphere image, keeping the subjects, motion, camera and audio.\",\n },\n capabilities: { acceptsSourceVideo: true, videoEdit: true },\n },\n {\n // https://fal.ai/models/alibaba/happy-horse/v1.1/text-to-video/api (+ /image-to-video,\n // /reference-to-video): one row; references, else a start frame, else text.\n id: \"happy-horse-1.1\",\n aliases: [\"happy-horse\"],\n label: \"Happy Horse 1.1\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"alibaba/happy-horse/v1.1\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...HAPPY_HORSE_RATIOS],\n resolutions: [\"720p\", \"1080p\"],\n durations: range(3, 15),\n ratioIgnoredWith: [\"firstFrame\"],\n references: { ...NO_REFERENCES, images: 9 },\n supports: [\"seed\", \"safetyChecker\"],\n prompt: { referenceSyntax: \"numbered\", maxChars: 2500 },\n audio: \"always\",\n },\n defaults: { durationSeconds: 5, resolution: \"1080p\", aspectRatio: \"16:9\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"alibaba\",\n logo: \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/happyhorse.png\",\n description:\n \"Alibaba Happy Horse 1.1: text-to-video, image-to-video and reference-to-video from up to 9 images, with native audio and lip-sync, 3-15 seconds at up to 1080p.\",\n },\n capabilities: { framesExcludeReferences: true },\n },\n {\n // https://fal.ai/models/alibaba/happy-horse/video-edit/api: up to 5 reference images;\n // the output keeps the source aspect ratio. fal takes a 3-60 s source but cuts the\n // output (and the edit) to the first 15 s, so a longer source is refused, not trimmed.\n id: \"happy-horse-video-edit\",\n aliases: [],\n label: \"Happy Horse Video Edit\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"alibaba/happy-horse/video-edit\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n resolutions: [\"720p\", \"1080p\"],\n references: { ...NO_REFERENCES, images: 5 },\n requires: [\"sourceVideo\"],\n sourceVideoSeconds: { min: 3, max: 15 },\n supports: [\"seed\", \"safetyChecker\"],\n prompt: { referenceSyntax: \"numbered\", maxChars: 2500 },\n audio: \"always\",\n },\n defaults: { resolution: \"1080p\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"alibaba\",\n logo: \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/happyhorse.png\",\n description:\n \"Alibaba Happy Horse video edit: changes a 3-15 second clip from a prompt and up to 5 reference images, keeping its framing.\",\n },\n capabilities: { acceptsSourceVideo: true, videoEdit: true },\n },\n {\n // https://fal.ai/models/fal-ai/vidu/q4/reference-to-video/api (+ /image-to-video).\n // There is no Q4 text-to-video endpoint. 540p exists too; the kit has no spelling for it.\n id: \"vidu-q4\",\n aliases: [],\n label: \"Vidu Q4\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/vidu/q4\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [\"16:9\", \"9:16\", \"4:3\", \"3:4\", \"1:1\"],\n resolutions: [\"720p\", \"1080p\", \"2k\", \"4k\"],\n durations: range(3, 16),\n ratioIgnoredWith: [\"firstFrame\"],\n requiresOneOf: [\"firstFrame\", \"references\"],\n references: {\n images: 12,\n videos: 0,\n audios: 3,\n audioOnly: false,\n audioSeconds: { min: 3, max: 12 },\n audioFormats: [\"mp3\"],\n audioMaxBytes: 50 * MB,\n },\n // Sound (dialogue and effects) is a reference-to-video option; image-to-video is silent.\n supports: [\"seed\", \"generateAudio\", \"safetyChecker\"],\n prompt: { referenceSyntax: \"numbered\", maxChars: 5000 },\n audio: \"optional\",\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"720p\",\n aspectRatio: \"16:9\",\n generateAudio: true,\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"shengshu\",\n logo: \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/vidu-color.png\",\n description:\n \"Vidu Q4: animates a start image or builds a 3-16 second clip from up to 12 reference images and 3 voice clips, at up to 4K.\",\n },\n capabilities: { framesExcludeReferences: true },\n },\n {\n // https://fal.ai/models/bytedance/omnihuman/v2/api: one image plus one wav/mp3 clip\n // of 4-300 s (15 MB); the output is as long as the audio.\n id: \"omnihuman-2\",\n aliases: [\"omnihuman-v2\"],\n label: \"OmniHuman 2\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"bytedance/omnihuman/v2\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n references: {\n images: 1,\n videos: 0,\n audios: 1,\n audioOnly: false,\n audioSeconds: { min: 4, max: 300 },\n audioFormats: [\"wav\", \"mp3\"],\n audioMaxBytes: 15 * MB,\n min: { images: 1, audios: 1 },\n },\n requires: [\"references\"],\n supports: [],\n prompt: { referenceSyntax: \"descriptive\" },\n audio: \"always\",\n },\n defaults: {},\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"bytedance\",\n logo: BYTEDANCE_LOGO,\n description:\n \"ByteDance OmniHuman 2: turns one portrait image and a 4-300 second audio clip into a talking, gesturing video as long as the audio.\",\n },\n capabilities: {},\n },\n {\n // https://docs.x.ai/developers/model-capabilities/video/overview: 1-15 s, 480p-1080p\n // (720p at most with references or a last frame), up to 14 reference images, and a\n // pinned last frame that combines with a start frame and references.\n id: \"grok-imagine-1.5\",\n aliases: [\"grok-imagine-video-1.5\"],\n label: \"Grok Imagine 1.5\",\n type: \"video\",\n adapter: \"xai-video\",\n providerModelId: \"grok-imagine-video-1.5\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...GROK_15_RATIOS],\n resolutions: [\"480p\", \"720p\", \"1080p\"],\n durations: { min: 1, max: 15 },\n durationPresets: [4, 6, 8, 10, 15],\n // xAI: image-to-video \"always matches the still's aspect ratio\".\n ratioIgnoredWith: [\"firstFrame\"],\n references: { ...NO_REFERENCES, images: 14 },\n supports: [\"lastFrame\"],\n prompt: { referenceSyntax: \"numbered\" },\n audio: \"always\",\n },\n defaults: { durationSeconds: 8, aspectRatio: \"16:9\" },\n usage: { unit: \"reported_cost_usd\" },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"xai\",\n logo: XAI_LOGO,\n description:\n \"xAI Grok Imagine 1.5: text- and image-to-video at native 1080p with lip-synced audio, or up to 14 reference images and pinned first and last frames at 720p, 1-15 seconds.\",\n },\n capabilities: {},\n },\n];\n","import type { AspectRatio, CatalogModel, VideoResolution } from \"../types.js\";\n\n// Luma video rows (Agents API ray-3.2). Every limit below is from the verified\n// request shapes in the ENG-3272 work order (docs.agents.lumalabs.ai). All\n// three rows share providerModelId \"ray-3.2\"; the adapter routes by catalog id.\n\nconst VIDEO_USAGE = { unit: \"seconds\" } as const;\nconst EXPOSURE: CatalogModel[\"exposure\"] = [\"cowork\", \"space_builder\"];\nconst LUMA_LOGO =\n \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/luma-color.png\";\n\nconst RAY_RATIOS: AspectRatio[] = [\"9:16\", \"3:4\", \"1:1\", \"4:3\", \"16:9\", \"21:9\"];\n// Ray also renders 540p, which the kit has no spelling for (vidu-q4 precedent); it is omitted.\nconst RAY_RESOLUTIONS: VideoResolution[] = [\"360p\", \"720p\", \"1080p\"];\nconst RAY_PROMPT = { referenceSyntax: \"numbered\", maxChars: 6000 } as const;\n\nexport const LUMA_VIDEO_MODELS: CatalogModel[] = [\n {\n // https://docs.agents.lumalabs.ai: type \"video\" with a 5 s or 10 s duration;\n // firstFrame and lastFrame ride as start_frame and end_frame. Luma bills a\n // 10 s clip at 3x the 5 s price; pro-backend prices it that way, so this row\n // must not offer 10 s before that pricing is deployed (ENG-3324).\n id: \"ray-3.2\",\n aliases: [],\n label: \"Ray 3.2\",\n type: \"video\",\n adapter: \"luma\",\n providerModelId: \"ray-3.2\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n aspectRatios: [\"adaptive\", ...RAY_RATIOS],\n resolutions: [...RAY_RESOLUTIONS],\n durations: [5, 10],\n supports: [\"lastFrame\"],\n prompt: { ...RAY_PROMPT },\n audio: \"never\",\n },\n defaults: { durationSeconds: 5, resolution: \"720p\", aspectRatio: \"adaptive\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"luma\",\n description:\n \"Luma Ray 3.2 text- and image-to-video with optional first and last frames, 5- or 10-second clips at up to 1080p.\",\n logo: LUMA_LOGO,\n },\n capabilities: {},\n },\n {\n // https://docs.agents.lumalabs.ai: type \"video_edit\" with a source video of\n // up to 18 s; the output keeps the source length, so there is no durations\n // knob, no aspect_ratio and no end frame. Luma bills its 5 s price for any\n // source (live, 2026-10-21) and the row is priced per source second, so a\n // source under 5 s is refused: it would be billed below Luma's charge.\n id: \"ray-3.2-edit\",\n aliases: [],\n label: \"Ray 3.2 Edit\",\n type: \"video\",\n adapter: \"luma\",\n providerModelId: \"ray-3.2\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n resolutions: [...RAY_RESOLUTIONS],\n requires: [\"sourceVideo\"],\n sourceVideoSeconds: { min: 5, max: 18 },\n supports: [],\n prompt: { ...RAY_PROMPT },\n audio: \"never\",\n },\n defaults: { resolution: \"720p\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"luma\",\n description:\n \"Luma Ray 3.2 video edit: changes a 5-18 second clip from a prompt, keeping its length.\",\n logo: LUMA_LOGO,\n },\n capabilities: { acceptsSourceVideo: true, videoEdit: true },\n },\n {\n // https://docs.agents.lumalabs.ai: type \"video_reframe\" with a required\n // target aspect_ratio; the source is up to 10 s and the output keeps its\n // length whatever video.duration says, while Luma bills that duration\n // (live, 2026-10-21). So there is no durations knob, and a source under\n // 5 s is refused, as on ray-3.2-edit. 1080p is not offered for the\n // vertical targets 9:16 and 3:4.\n id: \"ray-3.2-reframe\",\n aliases: [],\n label: \"Ray 3.2 Reframe\",\n type: \"video\",\n adapter: \"luma\",\n providerModelId: \"ray-3.2\",\n lifecycle: \"active\",\n exposure: EXPOSURE,\n constraints: {\n aspectRatios: [...RAY_RATIOS],\n resolutions: [...RAY_RESOLUTIONS],\n requires: [\"sourceVideo\"],\n sourceVideoSeconds: { min: 5, max: 10 },\n supports: [],\n prompt: { ...RAY_PROMPT },\n audio: \"never\",\n },\n defaults: { resolution: \"720p\", aspectRatio: \"16:9\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"luma\",\n description:\n \"Luma Ray 3.2 Reframe: changes a 5-10 second clip to a new aspect ratio and fills the new area from the prompt.\",\n logo: LUMA_LOGO,\n },\n capabilities: { acceptsSourceVideo: true, videoEdit: true },\n },\n];\n","import type { AspectRatio, CatalogModel } from \"../types.js\";\nimport { VIDEO_FAMILY_MODELS } from \"./video-families.js\";\nimport { LUMA_VIDEO_MODELS } from \"./video-luma.js\";\n\nconst VIDEO_USAGE = { unit: \"seconds\" } as const;\n\nconst SEEDANCE_RATIOS: AspectRatio[] = [\"21:9\", \"16:9\", \"4:3\", \"1:1\", \"3:4\", \"9:16\", \"adaptive\"];\nconst KLING_RATIOS: AspectRatio[] = [\"16:9\", \"9:16\", \"1:1\", \"adaptive\"];\n// fal's Kling O3 aspect_ratio enum has no adaptive.\nconst KLING_OMNI_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];\nconst WAN_RATIOS: AspectRatio[] = [\"adaptive\", \"16:9\", \"4:3\", \"1:1\", \"3:4\", \"9:16\"];\n\nconst NEGATIVE_PROMPT = \"blur, distort, and low quality\";\n\n// Seedance, Grok, Veo and the frame-driven MiniMax rows route first/last frames\n// and reference images to different inputs; the Omni, reference-only MiniMax,\n// Kling Omni and Kling video-to-video rows can combine them.\nconst FRAMES_EXCLUDE_REFERENCES = { framesExcludeReferences: true } as const;\n\n// Kling's prompt limit: Higgsfield 3.0 and Replicate's Omni document 2,500 characters;\n// Higgsfield 2.5 documents none, but the same model on fal and Kling's own API caps it at 2,500.\nconst KLING_PROMPT = { referenceSyntax: \"numbered\", maxChars: 2500 } as const;\n// BytePlus caps a Seedance 2.x prompt at 10,000 tokens; 30,000 characters assumes English text.\nconst SEEDANCE_PROMPT = { referenceSyntax: \"numbered\", maxChars: 30000 } as const;\n\n// BytePlus (Seedance 2.0 and 2.0 Fast): 2-15 s per audio clip, 15 s in all, wav/mp3, 15 MB each.\nconst SEEDANCE_2_AUDIO = {\n audioSeconds: { min: 2, max: 15, total: 15 },\n audioFormats: [\"wav\", \"mp3\"],\n audioMaxBytes: 15 * 1024 * 1024,\n};\n// fal's MiniMax H3 schemas give the prompt a maxLength of 50,000.\nconst H3_PROMPT = { referenceSyntax: \"numbered\", maxChars: 50000 } as const;\n// fal's Wan 3.0 image- and reference-to-video schemas give the prompt a maxLength of 20,000; its\n// guide addresses references by position (\"the subject in Image 1 walks past Video 1\").\nconst WAN_PROMPT = { referenceSyntax: \"numbered\", maxChars: 20000 } as const;\n// generateOmniVideo sends MediaRef.label as a text part beside each image. The token budget is far\n// above this; 50,000 matches cowork's global prompt ceiling.\nconst OMNI_PROMPT = { referenceSyntax: \"caption\", maxChars: 50000 } as const;\n\nconst BYTEDANCE_LOGO =\n \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/3bba5d81-4e57-4e71-911b-cdfa05acca2c_compressed.png\";\nconst GOOGLE_LOGO =\n \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png\";\n\nexport const VIDEO_MODELS: CatalogModel[] = [\n // Google shuts down the Veo 3.1 previews and Omni Flash 1.0 on 2026-10-22.\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: \"deprecated\",\n replacedBy: \"gemini-omni-1.1-flash\",\n exposure: [],\n constraints: {\n aspectRatios: [...OMNI_RATIOS],\n resolutions: [\"720p\", \"1080p\", \"4k\"],\n // Veo also takes 4 and 6, but must be 8 at 1080p/4k or with reference images;\n // [8] until the kit has a rule that forces it there (CHANGELOG 0.2.21).\n durations: [8],\n references: { images: 3 },\n supports: [\"lastFrame\", \"seed\"],\n // 1,024 text tokens; 3,000 characters assumes ~2.9 characters per token.\n prompt: { referenceSyntax: \"numbered\", maxChars: 3000 },\n audio: \"always\",\n },\n defaults: { durationSeconds: 8, resolution: \"720p\", aspectRatio: \"16:9\" },\n usage: { ...VIDEO_USAGE, slug: \"veo\" },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"google\",\n description:\n \"Google's highest-quality video generation model. Supports up to 4K resolution and 8-second clips with reference image conditioning.\",\n logo: GOOGLE_LOGO,\n },\n // Veo's lastFrame \"must be used in combination with the image parameter\".\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES, lastFrameRequiresFirstFrame: true },\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: \"deprecated\",\n replacedBy: \"gemini-omni-1.1-flash\",\n exposure: [],\n constraints: {\n aspectRatios: [...OMNI_RATIOS],\n resolutions: [\"720p\", \"1080p\", \"4k\"],\n durations: [4, 6, 8],\n references: { images: 3 },\n supports: [\"lastFrame\", \"seed\"],\n audio: \"always\",\n },\n defaults: { durationSeconds: 8, resolution: \"720p\", aspectRatio: \"16:9\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"google\",\n description:\n \"Faster variant of Google Veo 3.1; text- and image-to-video with natively generated audio at 4 or 8 seconds.\",\n },\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n id: \"veo-3.1-lite\",\n aliases: [\n \"veo-3.1-lite-generate-001\",\n \"veo-3.1-lite-generate-preview\",\n \"veo-3.1-lite-generate-001-frame-specific\",\n ],\n label: \"Veo 3.1 Lite\",\n type: \"video\",\n adapter: \"google-genai\",\n providerModelId: \"veo-3.1-lite-generate-preview\",\n lifecycle: \"deprecated\",\n replacedBy: \"gemini-omni-1.1-flash\",\n exposure: [],\n constraints: {\n aspectRatios: [...OMNI_RATIOS],\n resolutions: [\"720p\", \"1080p\"],\n durations: [4, 6, 8],\n supports: [\"lastFrame\", \"seed\"],\n audio: \"always\",\n },\n defaults: { durationSeconds: 8, resolution: \"720p\", aspectRatio: \"16:9\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"google\",\n description:\n \"Efficiency-focused Google Veo 3.1 Lite for high-volume video generation and editing; text and image input, with no 4K output or video extension.\",\n },\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n id: \"gemini-omni-flash\",\n aliases: [\n \"gemini-omni-flash-preview\",\n \"geminiOmniFlash\",\n \"gemini-omni-video\",\n \"gemini-omni-reference\",\n \"gemini-omni-edit\",\n ],\n label: \"Gemini Omni Flash\",\n type: \"video\",\n adapter: \"google-genai\",\n providerModelId: \"gemini-omni-flash-preview\",\n lifecycle: \"deprecated\",\n replacedBy: \"gemini-omni-1.1-flash\",\n exposure: [],\n constraints: {\n // 1.0 rejects `resolution`; it renders 720p. No defaults: the adapter\n // sends ratio and duration only when the caller set them, so a\n // reference clip keeps its own framing.\n aspectRatios: [...OMNI_RATIOS],\n durations: [3, 4, 5, 6, 7, 8, 9, 10],\n references: { images: 6, videos: 1, videoSeconds: { max: 10 } },\n sourceVideoSeconds: { max: 10 },\n supports: [],\n prompt: OMNI_PROMPT,\n audio: \"always\",\n },\n defaults: {},\n usage: { ...VIDEO_USAGE, slug: \"gemini_omni\" },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"google\",\n description:\n \"Google's conversational video model with native audio, human support, and natural language editing. Aspect ratio only — resolution and duration are model-determined.\",\n logo: GOOGLE_LOGO,\n },\n capabilities: { acceptsSourceVideo: true, videoEdit: true },\n },\n {\n id: \"gemini-omni-1.1-flash\",\n aliases: [\"gemini-omni-1.1-video\", \"gemini-omni-1.1-reference\", \"gemini-omni-1.1-edit\"],\n label: \"Gemini Omni 1.1 Flash\",\n type: \"video\",\n adapter: \"google-genai\",\n providerModelId: \"gemini-omni-1.1-flash\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\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, videoSeconds: { max: 10 } },\n sourceVideoSeconds: { max: 10 },\n // Extension (probe 2026-09-24, 360p): each `taskType: \"extend\"` call\n // renders `durationSeconds` more and returns the FULL cumulative clip\n // (3 s -> 6 s -> 9 s); the provider caps the clip at 40 s. A first\n // extension can upload a <= 10 s source with task \"extend\"; later ones\n // chain by `previousInteractionId` (the API rejects the id together\n // with a video task, so those calls carry the prompt alone).\n // First-to-last-frame interpolation: `<LAST_FRAME>` goes with `<FIRST_FRAME>`.\n supports: [\"videoExtension\", \"lastFrame\"],\n extension: { segmentSeconds: 10, maxTotalSeconds: 40, returns: \"joined\" },\n prompt: OMNI_PROMPT,\n audio: \"always\",\n },\n defaults: {},\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"google\",\n logo: GOOGLE_LOGO,\n description:\n \"Google Gemini Omni Flash 1.1 conversational video generation, editing and extension; text, image, and up to 10-second video input, 3-10 second output at up to 4K and 24 FPS, extendable to 40 seconds.\",\n },\n capabilities: {\n acceptsSourceVideo: true,\n videoEdit: true,\n lastFrameRequiresFirstFrame: true,\n },\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 exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...SEEDANCE_RATIOS],\n resolutions: [\"480p\", \"720p\", \"1080p\", \"4k\"],\n durations: { min: 4, max: 15 },\n durationPresets: [4, 6, 8, 10, 12, 15],\n references: {\n images: 9,\n videos: 3,\n audios: 3,\n audioOnly: false,\n videoSeconds: { min: 2, max: 15, total: 15 },\n ...SEEDANCE_2_AUDIO,\n },\n sourceVideoSeconds: { min: 2, max: 15, inReferenceTotal: true },\n ratioIgnoredWith: [\"firstFrame\", \"sourceVideo\"],\n // No seed: 2.x echoes it but does not honour it (two seeded runs differed, 2026-10-01).\n supports: [\"generateAudio\", \"lastFrame\", \"watermark\"],\n prompt: SEEDANCE_PROMPT,\n audio: \"optional\",\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"720p\",\n aspectRatio: \"16:9\",\n generateAudio: true,\n },\n usage: { ...VIDEO_USAGE, slug: \"seedance2\", providerLabel: \"byteplus\" },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"bytedance\",\n description:\n \"High-quality AI video generation with reference image conditioning. Supports 4-15 second clips with human preprocessing.\",\n logo: BYTEDANCE_LOGO,\n },\n capabilities: { acceptsSourceVideo: true, videoEdit: false, ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n id: \"seedance-2.0-fast\",\n aliases: [\"seedance-2-0-fast\", \"dreamina-seedance-2-0-fast-260128\"],\n label: \"Seedance 2.0 Fast\",\n type: \"video\",\n adapter: \"ark\",\n providerModelId: \"dreamina-seedance-2-0-fast-260128\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...SEEDANCE_RATIOS],\n resolutions: [\"480p\", \"720p\"],\n durations: { min: 4, max: 15 },\n references: {\n images: 9,\n videos: 3,\n audios: 3,\n audioOnly: false,\n videoSeconds: { min: 2, max: 15, total: 15 },\n ...SEEDANCE_2_AUDIO,\n },\n sourceVideoSeconds: { min: 2, max: 15, inReferenceTotal: true },\n ratioIgnoredWith: [\"firstFrame\", \"sourceVideo\"],\n // No seed: 2.x echoes it but does not honour it (two seeded runs differed, 2026-10-01).\n supports: [\"generateAudio\", \"lastFrame\", \"watermark\"],\n prompt: SEEDANCE_PROMPT,\n audio: \"optional\",\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"720p\",\n aspectRatio: \"16:9\",\n generateAudio: true,\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"bytedance\",\n logo: BYTEDANCE_LOGO,\n description:\n \"Speed- and cost-optimized ByteDance Seedance 2.0 Fast; text plus image, video, and audio references to generate or edit 4-15 second clips.\",\n },\n capabilities: { acceptsSourceVideo: true, videoEdit: false, ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n // omni_reference_task_type edit/extend: adaptive ratio, edit sends duration -1.\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 exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...SEEDANCE_RATIOS],\n resolutions: [\"480p\", \"720p\", \"1080p\"],\n durations: { min: 4, max: 30 },\n references: {\n images: 30,\n videos: 10,\n audios: 10,\n videoSeconds: { min: 2, max: 30, total: 30, editMin: 4 },\n // BytePlus: 2-30 s per clip, 30 s in all, wav/mp3, 15 MB each.\n audioSeconds: { min: 2, max: 30, total: 30 },\n audioFormats: [\"wav\", \"mp3\"],\n audioMaxBytes: 15 * 1024 * 1024,\n },\n sourceVideoSeconds: { min: 2, max: 30, editMin: 4, inReferenceTotal: true },\n ratioIgnoredWith: [\"firstFrame\", \"sourceVideo\"],\n // No seed: 2.x echoes it but does not honour it (two seeded runs differed, 2026-10-01).\n supports: [\"generateAudio\", \"lastFrame\", \"watermark\", \"taskType\", \"videoExtension\"],\n // Extend (probe 2026-10-02, 480p): returns ONLY the added footage, continuing from\n // the source's last frame at the source's framing and fps but at the requested\n // resolution, so the caller joins the clips. Forward only in practice.\n extension: { segmentSeconds: 30, maxTotalSeconds: 60, returns: \"new\" },\n prompt: SEEDANCE_PROMPT,\n audio: \"optional\",\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"720p\",\n aspectRatio: \"16:9\",\n generateAudio: true,\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"bytedance\",\n logo: BYTEDANCE_LOGO,\n description:\n \"ByteDance Seedance 2.5 for long-form storytelling and omni-reference generation/editing; up to 50 reference assets and 4-30 second clips at up to 1080p.\",\n },\n capabilities: { acceptsSourceVideo: true, videoEdit: true, ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\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 exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...GROK_RATIOS],\n resolutions: [\"480p\", \"720p\"],\n durations: { min: 1, max: 15 },\n durationPresets: [4, 6, 8, 10],\n // xAI: \"A maximum of 7 reference images can be provided per request.\"\n references: { images: 7 },\n supports: [],\n // xAI can switch sound off (generate_audio); xai-video.ts never sends it.\n audio: \"always\",\n },\n // No resolution default: xAI picks its own unless the caller asks.\n defaults: { durationSeconds: 8, aspectRatio: \"16:9\" },\n usage: { unit: \"reported_cost_usd\", slug: \"grok\" },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"xai\",\n description:\n \"xAI's reference-to-video model. Generates short clips conditioned on up to 5 reference images with flexible aspect ratios.\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/858b7fcc-9bd5-411d-aea1-a7b35ecfffab_compressed.png\",\n },\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n id: \"kling-2.5\",\n aliases: [\"kling-v2.5-turbo-pro\", \"kling-2.5-turbo-pro\", \"kling-v2.5\"],\n label: \"Kling 2.5\",\n type: \"video\",\n adapter: \"higgsfield\",\n providerModelId: \"kling-video/v2.5-turbo/pro/image-to-video\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n // The endpoint has no aspect_ratio or last_image_url: the start image sets the framing.\n constraints: {\n durations: [5, 10],\n requires: [\"firstFrame\"],\n supports: [\"cfgScale\", \"negativePrompt\"],\n prompt: KLING_PROMPT,\n audio: \"never\",\n },\n defaults: {\n durationSeconds: 5,\n cfgScale: 0.5,\n negativePrompt: NEGATIVE_PROMPT,\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"kuaishou\",\n logo: \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/kling-color.png\",\n description:\n \"Kuaishou Kling 2.5 Turbo Pro image-to-video; animates a single input image from a text prompt, 5- or 10-second clips.\",\n },\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n // trigger-workflows validates 5/10 only; Space Builder allows 3-15s (Kling30Input).\n id: \"kling-3.0\",\n aliases: [\"kling-v3.0-pro\", \"kling-v3.0\", \"kling-3.0-pro\"],\n label: \"Kling 3.0\",\n type: \"video\",\n adapter: \"higgsfield\",\n providerModelId: \"kling-video/v3.0/pro/image-to-video\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n // The endpoint has no aspect_ratio or negative_prompt; sound is \"on\"/\"off\" (default on).\n constraints: {\n durations: { min: 3, max: 15 },\n requires: [\"firstFrame\"],\n supports: [\"cfgScale\", \"lastFrame\", \"generateAudio\"],\n prompt: KLING_PROMPT,\n audio: \"optional\",\n },\n defaults: {\n durationSeconds: 5,\n cfgScale: 0.5,\n generateAudio: true,\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"kuaishou\",\n logo: \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/kling-color.png\",\n description:\n \"Kuaishou Kling 3.0 Pro image-to-video; a required start image plus a text prompt (or multi-shot prompts) with optional end image and native audio, 3-15 second clips.\",\n },\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n // fal Kling O3 (adapters/fal-kling-omni.ts): mode standard/pro/4k selects 720p/1080p/4K\n // in the endpoint path. Moved off Replicate kwaivgi/kling-v3-omni-video, which fal sells\n // at half the price; the id and inputs stay. The Replicate mapper stays for deployed\n // model_catalog rows not yet switched. Frames and reference images share fal's cap of 7.\n // Reference video, multi-shot and keep-sound were never wired, so stay off.\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: \"fal\",\n providerModelId: \"fal-ai/kling-video/o3\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...KLING_OMNI_RATIOS],\n resolutions: [\"720p\", \"1080p\", \"4k\"],\n durations: { min: 3, max: 15 },\n references: { images: 7, videos: 0, audios: 0 },\n supports: [\"generateAudio\", \"lastFrame\"],\n prompt: KLING_PROMPT,\n audio: \"optional\",\n },\n defaults: { durationSeconds: 5, aspectRatio: \"16:9\", generateAudio: true, mode: \"pro\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"kuaishou\",\n logo: \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/kling-color.png\",\n description:\n \"Kuaishou Kling Video 3.0 Omni generation from text, start/end images and up to 7 reference images, with optional native audio; up to 15 seconds at up to 4K.\",\n },\n // No lastFrameRequiresFirstFrame: fal image-to-video needs a start frame, so the adapter\n // sends a lone end frame as the start frame, as the Replicate model took it.\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 exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...H3_RATIOS],\n resolutions: [\"480p\", \"768p\", \"2k\", \"4k\"],\n durations: { min: 5, max: 15 },\n // fal's image-to-video endpoint has no aspect_ratio; the frame sets it.\n ratioIgnoredWith: [\"firstFrame\"],\n supports: [\"seed\", \"promptExpansion\", \"lastFrame\", \"safetyChecker\"],\n prompt: H3_PROMPT,\n audio: \"always\",\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"2k\",\n aspectRatio: \"16:9\",\n promptExpansion: \"balanced\",\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/f4c2e906-28b7-4a4a-b491-df8fef7808ed.png\",\n description:\n \"MiniMax H3 multimodal video model for text-to-video, image-to-video (first/last frame), and reference-to-video with native audio, up to 2K.\",\n },\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n id: \"minimax-h3-max\",\n aliases: [],\n label: \"MiniMax H3 Max\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"minimax/h3-max\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...H3_RATIOS],\n resolutions: [\"480p\", \"768p\", \"1080p\"],\n durations: { min: 5, max: 15 },\n // fal's image-to-video endpoint has no aspect_ratio; the frame sets it.\n ratioIgnoredWith: [\"firstFrame\"],\n supports: [\"seed\", \"promptExpansion\", \"lastFrame\", \"safetyChecker\"],\n prompt: H3_PROMPT,\n audio: \"always\",\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"768p\",\n aspectRatio: \"16:9\",\n promptExpansion: \"balanced\",\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/f4c2e906-28b7-4a4a-b491-df8fef7808ed.png\",\n description:\n \"High-speed MiniMax H3 Max variant for text-to-video and image-to-video (first/last frame) only, up to 1080p.\",\n },\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n id: \"minimax-h3-reference\",\n aliases: [],\n label: \"MiniMax H3 Reference\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"minimax/h3/reference-to-video\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...H3_REFERENCE_RATIOS],\n resolutions: [\"480p\", \"768p\", \"2k\", \"4k\"],\n durations: { min: 5, max: 15 },\n // A start frame routes to image-to-video, which has no aspect_ratio.\n ratioIgnoredWith: [\"firstFrame\"],\n references: {\n images: 9,\n videos: 3,\n audios: 3,\n total: 12,\n audioOnly: false,\n videoSeconds: { min: 2, max: 15, total: 15 },\n },\n supports: [\"seed\", \"promptExpansion\", \"safetyChecker\"],\n prompt: H3_PROMPT,\n audio: \"always\",\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"2k\",\n aspectRatio: \"adaptive\",\n promptExpansion: \"balanced\",\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/f4c2e906-28b7-4a4a-b491-df8fef7808ed.png\",\n description:\n \"MiniMax H3 reference-to-video mode guided by up to 9 reference images, 3 reference videos, and 3 audio clips; reference and image-to-video inputs cannot be mixed.\",\n },\n // fal's reference-to-video endpoint never reads a frame; the resolver must drop the\n // references instead of the adapter silently dropping the frame.\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\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 exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...H3_REFERENCE_RATIOS],\n resolutions: [\"480p\", \"768p\", \"1080p\"],\n durations: { min: 5, max: 15 },\n // A start frame routes to image-to-video, which has no aspect_ratio.\n ratioIgnoredWith: [\"firstFrame\"],\n references: {\n images: 9,\n videos: 3,\n audios: 3,\n total: 12,\n audioOnly: false,\n videoSeconds: { min: 2, max: 15, total: 15 },\n },\n supports: [\"seed\", \"promptExpansion\", \"safetyChecker\"],\n prompt: H3_PROMPT,\n audio: \"always\",\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"768p\",\n aspectRatio: \"adaptive\",\n promptExpansion: \"balanced\",\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/f4c2e906-28b7-4a4a-b491-df8fef7808ed.png\",\n description:\n \"MiniMax H3 Max reference-to-video on fal; conditions on reference images, videos, and audio. MiniMax's own docs do not list a reference mode for H3 Max.\",\n },\n // fal's reference-to-video endpoint never reads a frame; the resolver must drop the\n // references instead of the adapter silently dropping the frame.\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES },\n },\n {\n // One row for fal's three Wan 3.0 endpoints; the adapter picks text-, image- or\n // reference-to-video from the inputs. Each takes aspect_ratio, so none is ignored.\n // https://fal.ai/models/alibaba/wan-3.0/reference-to-video/api\n id: \"wan-3.0\",\n aliases: [\"wan-3\", \"wan3\"],\n label: \"Wan 3\",\n type: \"video\",\n adapter: \"fal\",\n providerModelId: \"alibaba/wan-3.0\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n aspectRatios: [...WAN_RATIOS],\n resolutions: [\"480p\", \"720p\", \"1080p\"],\n durations: { min: 2, max: 30 },\n durationPresets: [5, 10, 15, 30],\n references: {\n images: 10,\n videos: 5,\n audios: 5,\n videoSeconds: { total: 15 },\n audioSeconds: { total: 15 },\n },\n supports: [\"seed\", \"lastFrame\", \"generateAudio\", \"safetyChecker\"],\n prompt: WAN_PROMPT,\n audio: \"optional\",\n },\n defaults: {\n durationSeconds: 5,\n resolution: \"1080p\",\n aspectRatio: \"adaptive\",\n generateAudio: true,\n },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"alibaba\",\n description:\n \"Alibaba Wan 3 video model for text-to-video, image-to-video (start/end frame), and reference-to-video from up to 10 images, 5 videos and 5 audio clips, with native audio; 2-30 seconds at up to 1080p.\",\n },\n capabilities: { ...FRAMES_EXCLUDE_REFERENCES, lastFrameRequiresFirstFrame: true },\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 exposure: [],\n constraints: {\n aspectRatios: [...KLING_RATIOS],\n durations: { min: 3, max: 10 },\n requires: [\"sourceVideo\"],\n sourceVideoSeconds: { min: 3, max: 10.05 },\n supports: [],\n audio: \"never\",\n },\n defaults: { durationSeconds: 5, aspectRatio: \"16:9\" },\n usage: { ...VIDEO_USAGE },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"kuaishou\",\n logo: \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/kling-color.png\",\n description:\n \"Kuaishou Kling O1 Reference Video-to-Video; a prompt plus a 3-10 second reference video (optional reference images) generates 3-10 second clips preserving motion and camera language.\",\n },\n capabilities: { acceptsSourceVideo: true },\n },\n {\n id: \"hailuo-02\",\n aliases: [],\n label: \"Hailuo 02\",\n type: \"video\",\n adapter: \"replicate\",\n providerModelId: \"minimax/hailuo-02\",\n lifecycle: \"active\",\n exposure: [],\n constraints: {\n resolutions: [\"768p\"],\n durations: [6, 10],\n supports: [\"lastFrame\"],\n audio: \"never\",\n },\n defaults: { durationSeconds: 6, resolution: \"768p\" },\n usage: { unit: \"compute_seconds\" },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"minimax\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/f4c2e906-28b7-4a4a-b491-df8fef7808ed.png\",\n description:\n \"MiniMax Hailuo 02 text-to-video and image-to-video model with realistic physics and strong prompt following; outputs 768p at 6 or 10 seconds.\",\n },\n capabilities: {},\n },\n {\n id: \"higgsfield-dop-preview\",\n aliases: [],\n label: \"Higgsfield DOP Preview\",\n type: \"video\",\n adapter: \"higgsfield\",\n providerModelId: \"dop-preview\",\n lifecycle: \"active\",\n exposure: [],\n constraints: {\n requires: [\"firstFrame\"],\n supports: [\"seed\", \"lastFrame\"],\n audio: \"never\",\n },\n defaults: {},\n usage: { ...VIDEO_USAGE },\n // Higgsfield bills DoP per generation: a fixed-length clip with no duration knob.\n pricingKind: \"flat\",\n display: {\n provider: \"higgsfield\",\n description:\n \"Higgsfield DOP image-to-video model; animates a required first-frame image from a text prompt with an optional last-frame image and motion controls.\",\n },\n capabilities: {},\n },\n ...VIDEO_FAMILY_MODELS,\n ...LUMA_VIDEO_MODELS,\n];\n","import type { CatalogModel } from \"../types.js\";\nimport { VEED_SUBTITLES } from \"./canvas-tools.js\";\n\nconst TOPAZ_LOGO =\n \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/topazlabs.png\";\n\nconst FLUX_LOGO = \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/flux.png\";\n\n// fal caps every Topaz video endpoint at a 5-minute source.\nconst TOPAZ_SOURCE_SECONDS = { max: 300 };\n\nconst SECONDS_USAGE = { unit: \"seconds\" } as const;\n\n// fal's FLUX video upscale takes up to 20 seconds and 50 MB of source.\nconst FLUX_SOURCE_SECONDS = { max: 20 };\n\nconst FLUX_UPSCALE_TOOL = {\n kind: \"upscale\",\n upscaleFactor: { min: 1.5, max: 3 },\n maxOutputLongEdge: 3840,\n prompt: true,\n} as const;\n\n/**\n * Topaz Labs video tools on fal. `providerOptions.fal.model` names the Topaz model the\n * endpoint runs; the adapter sends it as `model`. Precision and Starlight are also listed in\n * Space Builder's video upscale node.\n *\n * FLUX video upscale on fal: one endpoint, two rows, because fal prices its `creativity`\n * modes differently and pricing is keyed by model. `providerOptions.fal.input` fixes the mode.\n */\nexport const VIDEO_TOOL_MODELS: CatalogModel[] = [\n {\n id: \"topaz-precision\",\n aliases: [],\n label: \"Topaz Precision\",\n type: \"video-tool\",\n adapter: \"fal\",\n providerModelId: \"topaz/upscale/video/precision\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n supports: [],\n sourceVideoSeconds: TOPAZ_SOURCE_SECONDS,\n tool: { kind: \"upscale\", upscaleFactor: { min: 1, max: 4 }, maxOutputLongEdge: 3840 },\n },\n defaults: {},\n providerOptions: { fal: { model: \"Proteus\" } },\n usage: SECONDS_USAGE,\n pricingKind: \"video_per_second\",\n display: {\n provider: \"topaz\",\n logo: TOPAZ_LOGO,\n description:\n \"Topaz Proteus upscaling: sharper, cleaner footage up to 4K while staying faithful to the source.\",\n sortOrder: 20,\n },\n },\n {\n id: \"topaz-starlight\",\n aliases: [],\n label: \"Topaz Starlight\",\n type: \"video-tool\",\n adapter: \"fal\",\n providerModelId: \"topaz/upscale/video/generative\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n supports: [],\n sourceVideoSeconds: TOPAZ_SOURCE_SECONDS,\n tool: { kind: \"upscale\", upscaleFactor: { min: 1, max: 4 }, maxOutputLongEdge: 3840 },\n },\n defaults: {},\n providerOptions: { fal: { model: \"Starlight Precise 2.6\" } },\n usage: SECONDS_USAGE,\n pricingKind: \"video_per_second\",\n display: {\n provider: \"topaz\",\n logo: TOPAZ_LOGO,\n description:\n \"Topaz Starlight Precise 2.6: generative upscaling that rebuilds fine detail, up to 4K. Slower and costlier than Precision.\",\n sortOrder: 10,\n },\n },\n {\n id: \"topaz-apollo\",\n aliases: [],\n label: \"Topaz Apollo\",\n type: \"video-tool\",\n adapter: \"fal\",\n providerModelId: \"topaz/interpolate/video\",\n lifecycle: \"active\",\n exposure: [\"cowork\"],\n constraints: {\n supports: [],\n sourceVideoSeconds: TOPAZ_SOURCE_SECONDS,\n tool: { kind: \"interpolate\", fps: { min: 16, max: 120 } },\n },\n defaults: {},\n providerOptions: { fal: { model: \"Apollo\" } },\n usage: SECONDS_USAGE,\n pricingKind: \"video_per_second\",\n display: {\n provider: \"topaz\",\n logo: TOPAZ_LOGO,\n description:\n \"Topaz Apollo frame interpolation: smoother motion at up to 120 fps, same length as the source.\",\n },\n },\n {\n id: \"topaz-hyperion-2.5\",\n aliases: [],\n label: \"Topaz Hyperion 2.5\",\n type: \"video-tool\",\n adapter: \"fal\",\n providerModelId: \"topaz/sdr-to-hdr/video\",\n lifecycle: \"active\",\n exposure: [\"cowork\"],\n constraints: {\n supports: [],\n sourceVideoSeconds: TOPAZ_SOURCE_SECONDS,\n tool: { kind: \"hdr\", outputFormats: [\"h265\", \"prores\"] },\n },\n defaults: {},\n usage: SECONDS_USAGE,\n pricingKind: \"video_per_second\",\n display: {\n provider: \"topaz\",\n logo: TOPAZ_LOGO,\n description:\n \"Topaz Hyperion 2.5 SDR to HDR: a 10-bit HDR master in H.265 (HDR10) or ProRes 422 HQ, at the source's size and frame rate.\",\n },\n },\n {\n id: \"flux-video-upscale-precise\",\n aliases: [],\n label: \"FLUX Upscale Precise\",\n type: \"video-tool\",\n adapter: \"fal\",\n providerModelId: \"blackforestlabs/flux-video-upscale\",\n lifecycle: \"active\",\n exposure: [\"space_builder\"],\n constraints: {\n supports: [],\n sourceVideoSeconds: FLUX_SOURCE_SECONDS,\n tool: FLUX_UPSCALE_TOOL,\n },\n defaults: {},\n providerOptions: { fal: { input: { creativity: 0 } } },\n usage: SECONDS_USAGE,\n pricingKind: \"video_per_second\",\n display: {\n provider: \"black-forest-labs\",\n logo: FLUX_LOGO,\n description:\n \"FLUX 3 super-resolution, source-faithful: 1.5x to 3x, up to 4K, for clips up to 20 seconds.\",\n sortOrder: 30,\n },\n },\n {\n id: \"flux-video-upscale-creative\",\n aliases: [],\n label: \"FLUX Upscale Creative\",\n type: \"video-tool\",\n adapter: \"fal\",\n providerModelId: \"blackforestlabs/flux-video-upscale\",\n lifecycle: \"active\",\n exposure: [\"space_builder\"],\n constraints: {\n supports: [],\n sourceVideoSeconds: FLUX_SOURCE_SECONDS,\n tool: FLUX_UPSCALE_TOOL,\n },\n defaults: {},\n providerOptions: { fal: { input: { creativity: 1 } } },\n usage: SECONDS_USAGE,\n pricingKind: \"video_per_second\",\n display: {\n provider: \"black-forest-labs\",\n logo: FLUX_LOGO,\n description:\n \"FLUX 3 super-resolution that adds fine detail, optionally guided by a prompt: 1.5x to 3x, up to 4K, for clips up to 20 seconds. Costs more than Precise.\",\n sortOrder: 40,\n },\n },\n {\n // https://fal.ai/models/fal-ai/flashvsr/upscale/video/api: upscale_factor 1-4, X264 MP4\n // by default; fal bills $0.0005 per output megapixel-frame (width x height x frames).\n // Retired (ENG-3314): the price rows tier by short edge, which under-prices square, wide\n // and above-4k outputs.\n id: \"flashvsr\",\n aliases: [\"flashvsr-upscale\"],\n label: \"FlashVSR\",\n type: \"video-tool\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/flashvsr/upscale/video\",\n lifecycle: \"retired\",\n replacedBy: \"flux-video-upscale-precise\",\n exposure: [],\n constraints: {\n supports: [],\n tool: { kind: \"upscale\", upscaleFactor: { min: 1, max: 4 } },\n },\n defaults: {},\n // fal drops the source soundtrack unless asked to copy it.\n providerOptions: { fal: { input: { preserve_audio: true } } },\n usage: SECONDS_USAGE,\n pricingKind: \"video_per_second\",\n display: {\n provider: \"flashvsr\",\n description:\n \"FlashVSR one-step diffusion video super-resolution: fast 1x to 4x upscaling that keeps the source's motion and sound.\",\n },\n },\n {\n // https://fal.ai/models/fal-ai/ltx-2.3-quality/hdr/api: a prompt is required; the output\n // is a ZIP of 16-bit EXR frames plus an MP4 preview, at most ~720p (short edge 704 px)\n // and 481 frames at up to 60 fps. fal bills $0.0027075 per output megapixel-frame.\n id: \"ltx-2.3-hdr\",\n aliases: [],\n label: \"LTX 2.3 HDR\",\n type: \"video-tool\",\n adapter: \"fal\",\n providerModelId: \"fal-ai/ltx-2.3-quality/hdr\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: {\n supports: [],\n tool: {\n kind: \"hdr\",\n outputFormats: [\"exr\"],\n prompt: true,\n maxOutputShortEdge: 704,\n minOutputFrames: 9,\n maxOutputFrames: 481,\n maxOutputFps: 60,\n },\n },\n defaults: {},\n usage: SECONDS_USAGE,\n pricingKind: \"video_per_second\",\n display: {\n provider: \"lightricks\",\n logo: \"https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.97.0/light/lightricks.png\",\n description:\n \"LTX 2.3 SDR to HDR: lifts a clip of up to 20 seconds into 16-bit EXR HDR frames at up to 720p, with an MP4 preview.\",\n },\n },\n {\n id: \"veed-video-background-removal\",\n aliases: [\"veed/video-background-removal/fast\"],\n label: \"VEED Video Background Removal\",\n type: \"video-tool\",\n adapter: \"fal\",\n providerModelId: \"veed/video-background-removal/fast\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\n constraints: { supports: [], tool: { kind: \"bg-remove\" } },\n defaults: {},\n usage: { unit: \"seconds\" },\n pricingKind: \"video_per_second\",\n display: {\n provider: \"veed\",\n logo: \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/d540d2bb-0022-4371-8889-48aefaf46bbe.png\",\n description:\n \"VEED video background removal; cuts the subject out of a clip and returns a transparent VP9 WebM.\",\n },\n },\n VEED_SUBTITLES,\n];\n","import type { CatalogModel } from \"../types.js\";\nimport { IMAGE_MODELS } from \"./image.js\";\nimport { MEDIA_NODE_MODELS } from \"./media-nodes.js\";\nimport { MODEL3D_MODELS } from \"./model3d.js\";\nimport { OTHER_MODELS } from \"./other.js\";\nimport { TEXT_MODELS } from \"./text.js\";\nimport { VIDEO_MODELS } from \"./video.js\";\nimport { VIDEO_TOOL_MODELS } from \"./video-tools.js\";\n\n/**\n * Every row, aggregated from the exported per-type collections only, so a row added anywhere\n * else never reaches MODELS without its collection. Seeded from Cowork, Space Builder and\n * trigger-workflows. See catalog/*.ts.\n */\nexport const MODELS: CatalogModel[] = [\n ...TEXT_MODELS,\n ...IMAGE_MODELS,\n ...VIDEO_MODELS,\n ...VIDEO_TOOL_MODELS,\n ...MODEL3D_MODELS,\n ...OTHER_MODELS,\n ...MEDIA_NODE_MODELS,\n];\n","import { z } from \"zod\";\nimport { isPixel, isPixelBox } from \"../resolve-provider-rules.js\";\nimport type { AdapterId, CatalogModel, ProviderOptionValue, Surface } from \"../types.js\";\nimport { collisionIssues } from \"./collisions.js\";\nimport { AudioOutputSchema, normaliseConventions, PromptConventionsSchema } from \"./conventions.js\";\nimport { normalizeExposure } from \"./exposure.js\";\nimport { model3dSpecIssues } from \"./model3d-spec.js\";\nimport { validateInputSpec } from \"./input-spec.js\";\nimport { optionListIssues } from \"./option-lists.js\";\n\nexport const ADAPTER_IDS = [\n \"ai-sdk-text\",\n \"google-image\",\n \"openai-image\",\n \"google-genai\",\n \"ark\",\n \"fal\",\n \"replicate\",\n \"prodia\",\n \"higgsfield\",\n \"xai-video\",\n \"luma\",\n \"fish\",\n \"elevenlabs\",\n] as const;\n\ntype MissingAdapterIds = Exclude<AdapterId, (typeof ADAPTER_IDS)[number]>;\ntype ExtraAdapterIds = Exclude<(typeof ADAPTER_IDS)[number], AdapterId>;\nconst adapterIdsMatchUnion: [MissingAdapterIds | ExtraAdapterIds] extends [never]\n ? true\n : MissingAdapterIds | ExtraAdapterIds = true;\nvoid adapterIdsMatchUnion;\n\nconst ModelTypeSchema = z.enum([\n \"text\",\n \"image\",\n \"video\",\n \"audio\",\n \"sound-effect\",\n \"upscale\",\n \"bg-remove\",\n \"mask\",\n \"video-tool\",\n \"speech\",\n \"voice-change\",\n \"dubbing\",\n \"lipsync\",\n \"transcription\",\n \"voice-clone\",\n \"voice-design\",\n \"model3d\",\n]);\nconst LifecycleSchema = z.enum([\"active\", \"deprecated\", \"retired\"]);\nexport const SurfaceSchema = z.enum([\"cowork\", \"space_builder\"]);\nexport const SURFACES = SurfaceSchema.options;\nexport const ExposureSchema: z.ZodType<Surface[], unknown> = z.preprocess(\n normalizeExposure,\n z.array(SurfaceSchema),\n) as z.ZodType<Surface[], unknown>;\nconst AdapterSchema = z.enum(ADAPTER_IDS);\nconst AspectRatioSchema = z.enum([\n \"1:1\",\n \"16:9\",\n \"9:16\",\n \"4:3\",\n \"3:4\",\n \"3:2\",\n \"2:3\",\n \"4:5\",\n \"5:4\",\n \"21:9\",\n \"9:21\",\n \"97:30\",\n \"1:4\",\n \"4:1\",\n \"1:8\",\n \"8:1\",\n \"adaptive\",\n]);\nconst ImageSizeSchema = z.enum([\"512\", \"1K\", \"2K\", \"4K\"]);\nexport const VideoResolutionSchema = z.enum([\"360p\", \"480p\", \"720p\", \"768p\", \"1080p\", \"2k\", \"4k\"]);\nconst ImageQualitySchema = z.enum([\"auto\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"]);\nconst OutputFormatSchema = z.enum([\"png\", \"jpeg\", \"webp\"]);\nconst RequiredInputSchema = z.enum([\"firstFrame\", \"sourceVideo\", \"references\", \"sourceAudio\"]);\nconst SupportedOptionSchema = z.enum([\n \"seed\",\n \"quality\",\n \"negativePrompt\",\n \"cfgScale\",\n \"generateAudio\",\n \"promptExpansion\",\n \"lastFrame\",\n \"count\",\n \"outputFormat\",\n \"scaleFactor\",\n \"safetySettings\",\n \"temperature\",\n \"upscale\",\n \"watermark\",\n \"safetyChecker\",\n \"taskType\",\n \"videoExtension\",\n \"instrumental\",\n \"lyrics\",\n \"style\",\n \"insertWindow\",\n \"points\",\n \"boxes\",\n]);\nconst UsageUnitSchema = z.enum([\n \"tokens\",\n \"images\",\n \"seconds\",\n \"reported_cost_usd\",\n \"compute_seconds\",\n \"requests\",\n]);\nconst PricingKindSchema = z.enum([\"token\", \"image_size\", \"video_per_second\", \"flat\"]);\n\nconst ProviderOptionValueSchema: z.ZodType<ProviderOptionValue> = z.lazy(() =>\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.array(ProviderOptionValueSchema),\n z.record(z.string(), ProviderOptionValueSchema),\n ]),\n);\nconst ProviderOptionsSchema = z.record(z.string(), z.record(z.string(), ProviderOptionValueSchema));\n\nconst VideoSecondsLimitsSchema = z.looseObject({\n min: z.number().optional(),\n max: z.number().optional(),\n total: z.number().optional(),\n editMin: z.number().optional(),\n});\n\nconst ReferenceLimitsSchema = z.looseObject({\n images: z.number().optional(),\n imagesWithVideo: z.number().optional(),\n videos: z.number().optional(),\n audios: z.number().optional(),\n total: z.number().optional(),\n audioOnly: z.boolean().optional(),\n videoSeconds: VideoSecondsLimitsSchema.optional(),\n audioSeconds: z\n .looseObject({\n min: z.number().optional(),\n max: z.number().optional(),\n total: z.number().optional(),\n })\n .optional(),\n audioFormats: z.array(z.string()).optional(),\n audioMaxBytes: z.number().positive().optional(),\n min: z\n .looseObject({\n images: z.number().int().nonnegative().optional(),\n videos: z.number().int().nonnegative().optional(),\n audios: z.number().int().nonnegative().optional(),\n })\n .optional(),\n});\n\nconst RangeSchema = z.looseObject({ min: z.number(), max: z.number() });\n\nconst VoiceOptionSchema = z.looseObject({\n id: z.string().min(1),\n name: z.string().min(1),\n gender: z.enum([\"male\", \"female\", \"neutral\"]).optional(),\n accent: z.string().optional(),\n languages: z.array(z.string().min(1)).optional(),\n description: z.string().optional(),\n previewUrl: z.url({ protocol: /^https$/ }).optional(),\n});\n\nconst LanguageOptionSchema = z.looseObject({\n code: z.string().min(1),\n name: z.string().min(1),\n});\nconst VideoToolConstraintsSchema = z.looseObject({\n kind: z.enum([\"upscale\", \"interpolate\", \"hdr\", \"bg-remove\", \"subtitles\"]),\n upscaleFactor: RangeSchema.optional(),\n maxOutputLongEdge: z.number().positive().optional(),\n prompt: z.boolean().optional(),\n fps: RangeSchema.optional(),\n outputFormats: z\n .array(z.enum([\"h265\", \"prores\", \"exr\"]))\n .min(1)\n .optional(),\n maxOutputShortEdge: z.number().positive().optional(),\n maxOutputFrames: z.number().positive().optional(),\n minOutputFrames: z.number().positive().optional(),\n maxOutputFps: z.number().positive().optional(),\n presets: z.array(z.string().min(1)).min(1).optional(),\n languages: z.array(z.string().min(1)).min(1).optional(),\n translationLanguages: z.array(z.string().min(1)).min(1).optional(),\n maxSecondsAbove1080p: z.number().positive().optional(),\n});\n\nconst Model3dTextureSchema = z.enum([\"none\", \"standard\", \"detailed\"]);\n\nconst Model3dConstraintsSchema = z.looseObject({\n family: z.enum([\"trellis\", \"hunyuan\", \"tripo\", \"rodin\", \"meshy\", \"hi3d\", \"sam\"]),\n endpoints: z.looseObject({\n text: z.string().min(1).optional(),\n image: z.string().min(1).optional(),\n multiImage: z.string().min(1).optional(),\n }),\n text: z.boolean(),\n imageRequired: z.boolean(),\n promptRequired: z.boolean().optional(),\n views: z.enum([\"none\", \"unordered\", \"ordered\", \"named\"]),\n maxImages: z.number().int().positive(),\n texture: z.array(Model3dTextureSchema),\n pbr: z.boolean(),\n textureRef: z.boolean(),\n seed: z.boolean(),\n seedMax: z.number().int().positive().optional(),\n resolutions: z\n .looseObject({\n label: z.string().min(1),\n options: z.array(z.string().min(1)).min(1),\n default: z.string().min(1),\n })\n .optional(),\n});\n\nconst ModelConstraintsSchema = z.looseObject({\n aspectRatios: z.array(AspectRatioSchema).optional(),\n sizes: z.array(ImageSizeSchema).optional(),\n resolutions: z.array(VideoResolutionSchema).optional(),\n durations: z\n .union([z.looseObject({ min: z.number(), max: z.number() }), z.array(z.number())])\n .optional(),\n durationPresets: z.array(z.number()).optional(),\n qualityOptions: z.array(z.string()).optional(),\n scaleFactors: z.array(z.number().positive()).min(1).optional(),\n exactSizes: z.record(z.string(), z.string()).optional(),\n references: ReferenceLimitsSchema.optional(),\n requires: z.array(RequiredInputSchema).optional(),\n requiresOneOf: z.array(RequiredInputSchema).min(2).optional(),\n noPrompt: z.boolean().optional(),\n supports: z.array(SupportedOptionSchema).optional(),\n ratioIgnoredWith: z.array(z.enum([\"firstFrame\", \"sourceVideo\"])).optional(),\n voices: z.array(VoiceOptionSchema).optional(),\n voiceDesign: z\n .object({\n maxCandidates: z.number().int().positive(),\n previewMaxChars: z.number().int().positive(),\n })\n .optional(),\n languages: z.array(LanguageOptionSchema).optional(),\n outputFormats: z.array(z.string().min(1)).min(1).optional(),\n sourceVideoSeconds: VideoSecondsLimitsSchema.omit({ total: true })\n .extend({ inReferenceTotal: z.boolean().optional() })\n .optional(),\n // segmentSeconds/maxTotalSeconds stay required: a kit before 0.3.0 drops a row whose\n // extension lacks them, so every extension block keeps them.\n extension: z\n .looseObject({\n segmentSeconds: z.number(),\n maxTotalSeconds: z.number(),\n returns: z.enum([\"new\", \"joined\"]).optional(),\n })\n .optional(),\n tool: VideoToolConstraintsSchema.optional(),\n model3d: Model3dConstraintsSchema.optional(),\n // Loose on purpose: the read path keeps a row whose value is invalid (the accessors in\n // conventions.ts read it as \"not set\"); CatalogModelSchema below rejects it on write.\n audio: z.unknown().optional(),\n prompt: z.unknown().optional(),\n});\n\nconst MediaRefSchema = z.union([\n z.looseObject({\n url: z.string(),\n label: z.string().optional(),\n durationSeconds: z.number().optional(),\n }),\n z.looseObject({\n bytes: z.instanceof(Uint8Array),\n mime: z.string(),\n label: z.string().optional(),\n durationSeconds: z.number().optional(),\n }),\n]);\n\nconst ImageSafetySettingSchema = z.looseObject({ category: z.string(), threshold: z.string() });\n\nconst UpscaleOptionsSchema = z.looseObject({\n enhanceModel: z.string().optional(),\n subjectDetection: z.string().optional(),\n faceEnhancement: z.boolean().optional(),\n faceEnhancementCreativity: z.number().optional(),\n faceEnhancementStrength: z.number().optional(),\n});\n\n// The request path's own rules: a default the SAM 3 resolver would refuse on every call is\n// rejected here instead of failing each request.\nconst PixelSchema = z.number().refine(isPixel, \"must be a whole, non-negative pixel\");\n\nconst MaskPointSchema = z.looseObject({\n x: PixelSchema,\n y: PixelSchema,\n label: z.enum([\"foreground\", \"background\"]).optional(),\n});\n\nconst MaskBoxSchema = z\n .looseObject({ xMin: PixelSchema, yMin: PixelSchema, xMax: PixelSchema, yMax: PixelSchema })\n .refine(isPixelBox, \"a box needs xMax > xMin and yMax > yMin\");\n\n// Shape only: the window's bounds belong to the endpoint (checkInsertWindow), not to the row.\nconst InsertWindowSchema = z.looseObject({ startSeconds: z.number(), resumeSeconds: z.number() });\n\nconst DefaultsSchema = z.looseObject({\n references: z.array(MediaRefSchema).optional(),\n aspectRatio: AspectRatioSchema.optional(),\n size: ImageSizeSchema.optional(),\n exactSize: z.string().optional(),\n quality: ImageQualitySchema.optional(),\n seed: z.number().optional(),\n count: z.number().optional(),\n // Image rows take OutputFormatSchema; audio rows one of constraints.outputFormats (checked on write).\n outputFormat: z.union([OutputFormatSchema, z.string().min(1)]).optional(),\n scaleFactor: z.number().optional(),\n safetySettings: z.array(ImageSafetySettingSchema).optional(),\n temperature: z.number().optional(),\n upscale: UpscaleOptionsSchema.optional(),\n points: z.array(MaskPointSchema).optional(),\n boxes: z.array(MaskBoxSchema).optional(),\n firstFrame: MediaRefSchema.optional(),\n lastFrame: MediaRefSchema.optional(),\n sourceVideo: MediaRefSchema.optional(),\n referenceImages: z.array(MediaRefSchema).optional(),\n referenceVideos: z.array(MediaRefSchema).optional(),\n referenceAudios: z.array(MediaRefSchema).optional(),\n resolution: VideoResolutionSchema.optional(),\n durationSeconds: z.number().optional(),\n generateAudio: z.boolean().optional(),\n negativePrompt: z.string().optional(),\n cfgScale: z.number().optional(),\n promptExpansion: z.enum([\"fast\", \"balanced\", \"quality\"]).optional(),\n watermark: z.boolean().optional(),\n safetyChecker: z.boolean().optional(),\n insertWindow: InsertWindowSchema.optional(),\n taskType: z.enum([\"reference\", \"edit\", \"extend\"]).optional(),\n mode: z.enum([\"standard\", \"pro\"]).optional(),\n instrumental: z.boolean().optional(),\n lyrics: z.string().optional(),\n voice: z.string().optional(),\n language: z.string().optional(),\n});\n\nconst CatalogDisplaySchema = z.looseObject({\n provider: z.string(),\n description: z.string(),\n logo: z.string().optional(),\n costTier: z.union([z.literal(1), z.literal(2), z.literal(3)]).optional(),\n recommended: z.boolean().optional(),\n sortOrder: z.number().optional(),\n chat: z\n .looseObject({\n providerOptions: ProviderOptionsSchema.optional(),\n temperature: z.number().optional(),\n })\n .optional(),\n});\n\nconst CatalogCapabilitiesSchema = z.looseObject({\n acceptsSourceVideo: z.boolean().optional(),\n customVoices: z.boolean().optional(),\n videoEdit: z.boolean().optional(),\n framesExcludeReferences: z.boolean().optional(),\n sourceVideoExcludesFrames: z.boolean().optional(),\n lastFrameRequiresFirstFrame: z.boolean().optional(),\n reasoning: z.boolean().optional(),\n vision: z.boolean().optional(),\n contextWindow: z.number().optional(),\n});\n\nexport const CatalogModelSchemaBase = z\n .looseObject({\n id: z.string().min(1),\n aliases: z.array(z.string()).default([]),\n label: z.string().min(1),\n type: ModelTypeSchema,\n adapter: AdapterSchema,\n providerModelId: z.string().min(1),\n lifecycle: LifecycleSchema,\n replacedBy: z.string().optional(),\n exposure: ExposureSchema,\n constraints: ModelConstraintsSchema,\n defaults: DefaultsSchema,\n providerOptions: ProviderOptionsSchema.optional(),\n usage: z.looseObject({\n unit: UsageUnitSchema,\n slug: z.string().optional(),\n providerLabel: z.string().optional(),\n }),\n pricingKind: PricingKindSchema,\n display: CatalogDisplaySchema.optional(),\n capabilities: CatalogCapabilitiesSchema.optional(),\n })\n .superRefine((row, ctx) => {\n if (row.lifecycle === \"active\" && !row.display) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"display\"],\n message: \"active rows need display\",\n });\n }\n if (row.lifecycle === \"active\" && row.type === \"text\" && !row.capabilities?.contextWindow) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"capabilities\", \"contextWindow\"],\n message: \"active text rows need contextWindow\",\n });\n }\n if (row.type === \"video-tool\" && row.constraints.tool === undefined) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"constraints\", \"tool\"],\n message: \"video-tool rows need constraints.tool\",\n });\n }\n if (row.type === \"model3d\") {\n const spec = row.constraints.model3d;\n if (spec === undefined) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"constraints\", \"model3d\"],\n message: \"model3d rows need constraints.model3d\",\n });\n } else {\n for (const issue of model3dSpecIssues(spec)) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"constraints\", \"model3d\", ...issue.path],\n message: issue.message,\n });\n }\n }\n }\n if (row.replacedBy !== undefined && row.replacedBy === row.id) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"replacedBy\"],\n message: \"replacedBy must not equal id\",\n });\n }\n });\n\n// Zod infers `prop?: T | undefined` for optional fields while CatalogModel\n// declares them `prop?: T`; the shapes match at runtime and the UNKNOWN-keys\n// tolerance of looseObject is intentional, so the contract type is asserted.\n// SAFETY: zod output matches CatalogModel at runtime; only optional undefined variance differs.\n// The write path (pro-backend validates every admin edit with this schema) also rejects an\n// unknown transport, an invalid inputSpec, and an invalid `constraints.audio` or\n// `constraints.prompt`. The read path (the per-row base parse in load.ts quarantine) stays tolerant on purpose: a value a newer kit adds must not make an\n// older kit reject the whole catalog. A row whose providerOptions.modelkit.inputSpec is\n// present but invalid is kept with one warning; calls fail loudly at call time until it is fixed.\nexport const CatalogModelSchema: z.ZodType<CatalogModel> = CatalogModelSchemaBase.superRefine(\n (row, ctx) => {\n const transport = row.providerOptions?.[\"modelkit\"]?.[\"transport\"];\n if (transport !== undefined && transport !== \"direct\" && transport !== \"bedrock\") {\n ctx.addIssue({\n code: \"custom\",\n path: [\"providerOptions\", \"modelkit\", \"transport\"],\n message: 'transport must be \"direct\" or \"bedrock\"',\n });\n }\n const inputSpecRaw = row.providerOptions?.[\"modelkit\"]?.[\"inputSpec\"];\n if (inputSpecRaw !== undefined) {\n const result = validateInputSpec(inputSpecRaw, row);\n if (!result.ok) {\n for (const issue of result.issues) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"providerOptions\", \"modelkit\", \"inputSpec\", ...issue.path],\n message: issue.message,\n });\n }\n }\n }\n const audio = row.constraints.audio;\n if (audio !== undefined && !AudioOutputSchema.safeParse(audio).success) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"constraints\", \"audio\"],\n message: 'audio must be \"always\", \"optional\" or \"never\"',\n });\n }\n const refs = row.constraints.references;\n for (const kind of [\"images\", \"videos\", \"audios\"] as const) {\n const least = refs?.min?.[kind];\n const most = refs?.[kind];\n if (least !== undefined && most !== undefined && least > most) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"constraints\", \"references\", \"min\", kind],\n message: `references.min.${kind} ${least} is over references.${kind} ${most}`,\n });\n }\n }\n for (const issue of optionListIssues(row)) {\n ctx.addIssue({ code: \"custom\", path: issue.path, message: issue.message });\n }\n const prompt = row.constraints.prompt;\n if (prompt !== undefined) {\n const parsed = PromptConventionsSchema.safeParse(prompt);\n if (!parsed.success) {\n for (const issue of parsed.error.issues) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"constraints\", \"prompt\", ...issue.path.map(String)],\n message: issue.message,\n });\n }\n }\n }\n },\n) as z.ZodType<CatalogModel>;\n\n// SAFETY: array items match CatalogModel at runtime; only optional undefined variance differs.\nexport const CatalogSchema: z.ZodType<CatalogModel[]> = z\n .array(CatalogModelSchemaBase.transform((row) => normaliseConventions(row).row))\n .superRefine((rows, ctx) => {\n for (const issue of collisionIssues(rows)) {\n ctx.addIssue({\n code: \"custom\",\n path: [issue.index, ...issue.path],\n message: issue.message,\n });\n }\n }) as z.ZodType<CatalogModel[]>;\n","import { ModelKitError } from \"./errors.js\";\nimport type { OnUnsupported } from \"./resolve-options.js\";\nimport type {\n AudioRequest,\n CatalogModel,\n ImageRequest,\n MaskBox,\n VideoRequest,\n Warning,\n} from \"./types.js\";\n\n// Acceptance rules of single provider endpoints that the row schema cannot express. The\n// resolvers apply them, so `resolveOptions` refuses or coerces exactly what the client would;\n// the adapters re-check the same rules defensively for callers that skip the resolver.\n\ntype Row = Pick<CatalogModel, \"id\" | \"label\">;\n\n/** A rule's refusal, worded as the fal planners word it: \"<row label>: <message>\". */\nexport function ruleRefusal(row: Row, message: string, code: RuleProblem[\"code\"]) {\n return new ModelKitError({\n code,\n message: `${row.label}: ${message}`,\n model: row.id,\n retryable: false,\n });\n}\n\n/** Request fields a SAM 3 mask cannot take: it returns masks at the source size. */\nexport const MASK_SIZE_FIELDS = [\"aspectRatio\", \"size\", \"exactSize\"] as const;\n\n/** SAM 3 takes points and box corners in whole, non-negative source pixels. */\nexport function isPixel(n: number): boolean {\n return Number.isInteger(n) && n >= 0;\n}\n\n/** A box in pixel corners with positive width and height. */\nexport function isPixelBox(b: MaskBox): boolean {\n return [b.xMin, b.yMin, b.xMax, b.yMax].every(isPixel) && b.xMax > b.xMin && b.yMax > b.yMin;\n}\n\nexport interface RuleProblem {\n code: \"missing_input\" | \"unsupported_option\";\n message: string;\n}\n\nfunction geometryProblem(req: Pick<ImageRequest, \"points\" | \"boxes\">): string | undefined {\n if ((req.points ?? []).some((p) => !isPixel(p.x) || !isPixel(p.y))) {\n return \"points take whole, non-negative pixel coordinates\";\n }\n if (!(req.boxes ?? []).every(isPixelBox)) {\n return \"boxes take whole, non-negative pixel corners with xMax > xMin and yMax > yMin\";\n }\n return undefined;\n}\n\nfunction sizeMessage(field: string): string {\n return `returns masks at the source size and takes no ${field}`;\n}\n\n/** Why SAM 3 (`mask` rows) cannot take this request, or undefined when it can. */\nexport function maskProblem(req: ImageRequest): RuleProblem | undefined {\n // SAM 3's prompt defaults to \"wheel\", so a request without one would mask the wrong thing.\n if (req.prompt.trim().length === 0) {\n return { code: \"missing_input\", message: \"needs a prompt naming what to mask\" };\n }\n const sized = MASK_SIZE_FIELDS.find((field) => req[field] !== undefined);\n if (sized !== undefined) return { code: \"unsupported_option\", message: sizeMessage(sized) };\n const geometry = geometryProblem(req);\n return geometry === undefined ? undefined : { code: \"unsupported_option\", message: geometry };\n}\n\n/** `mask` rows: under `coerce` sizing fields drop with a warning; anything else is refused. */\nexport function applyMaskRules(\n model: CatalogModel,\n req: ImageRequest,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): void {\n if (onUnsupported === \"coerce\" && req.prompt.trim().length > 0) {\n for (const field of MASK_SIZE_FIELDS) {\n if (req[field] === undefined) continue;\n warnings.push({\n code: \"option_ignored\",\n field,\n from: req[field],\n message: `${model.id} ${sizeMessage(field)}; ignored`,\n });\n delete req[field];\n }\n }\n const problem = maskProblem(req);\n if (problem !== undefined) throw ruleRefusal(model, problem.message, problem.code);\n}\n\n/** fal's MiniMax Music 3 endpoint: its `lyrics` field is required. */\nexport const MINIMAX_MUSIC_3 = \"minimax/music-3\";\n\n/** MiniMax Music 3 sings lyrics or plays an instrumental; it has no default for either. */\nexport function musicLyricsProblem(\n endpoint: string,\n req: Pick<AudioRequest, \"lyrics\" | \"instrumental\">,\n): string | undefined {\n if (endpoint !== MINIMAX_MUSIC_3) return undefined;\n if ((req.lyrics ?? \"\").trim().length > 0 || req.instrumental === true) return undefined;\n return \"needs lyrics, or instrumental: true\";\n}\n\n/** fal's music and sound-effect endpoints that `generateAudio` maps (adapters/fal-audio-plan.ts). */\nexport const FAL_AUDIO = {\n elevenLabsMusic: \"elevenlabs/music/v2.5\",\n minimaxMusic: MINIMAX_MUSIC_3,\n elevenLabsSfx: \"fal-ai/elevenlabs/sound-effects/v2\",\n mireloText: \"mirelo-ai/sfx2.0/text-to-audio\",\n mireloVideo: \"mirelo-ai/sfx2.0/video-to-audio\",\n} as const;\n\nconst FAL_AUDIO_ENDPOINTS: ReadonlySet<string> = new Set(Object.values(FAL_AUDIO));\n\n/** Why a fal music or sound-effect endpoint cannot take this request, or undefined. */\nexport function falAudioProblem(endpoint: string, req: AudioRequest): RuleProblem | undefined {\n if (!FAL_AUDIO_ENDPOINTS.has(endpoint)) return undefined;\n // None of these endpoints has a field for an image or a second media input.\n if ((req.references ?? []).length > 0) {\n return { code: \"unsupported_option\", message: \"does not take references\" };\n }\n if (endpoint === FAL_AUDIO.mireloVideo) {\n return req.sourceVideo === undefined\n ? { code: \"missing_input\", message: \"needs sourceVideo\" }\n : undefined;\n }\n if (req.sourceVideo !== undefined) {\n return { code: \"unsupported_option\", message: \"does not take sourceVideo\" };\n }\n const lyrics = musicLyricsProblem(endpoint, req);\n if (lyrics !== undefined) return { code: \"missing_input\", message: lyrics };\n return req.prompt.trim().length === 0\n ? { code: \"missing_input\", message: \"needs a prompt\" }\n : undefined;\n}\n\n/** fal music and sound-effect rows: what the endpoint cannot take is refused in both modes. */\nexport function applyFalAudioRules(model: CatalogModel, req: AudioRequest): void {\n if (model.adapter !== \"fal\") return;\n const problem = falAudioProblem(model.providerModelId, withPromptForResolve(req));\n if (problem !== undefined) throw ruleRefusal(model, problem.message, problem.code);\n}\n\n/**\n * Resolution runs on drafts and config checks that carry no prompt yet (cowork resolves a\n * model config with `prompt: \"\"`), as it does for every older row. A blank prompt is still\n * refused by the adapter before any provider call; every other rule runs as written.\n */\nexport function withPromptForResolve<T extends { prompt: string }>(req: T): T {\n return req.prompt.trim().length > 0 ? req : { ...req, prompt: \"prompt\" };\n}\n\n/** xAI renders reference-to-video (references, or a pinned last frame) at up to 720p. */\nexport const XAI_REFERENCE_MAX_RESOLUTION = \"720p\";\n\nexport function xaiReferenceResolutionMessage(modelId: string): string {\n return `${modelId} renders reference images and a last frame at up to ${XAI_REFERENCE_MAX_RESOLUTION}`;\n}\n\n/** Whether the xai-video adapter sends this request in its reference mode. */\nexport function xaiReferenceMode(\n model: Pick<CatalogModel, \"constraints\">,\n req: Pick<VideoRequest, \"referenceImages\" | \"lastFrame\">,\n): boolean {\n const takesLastFrame = (model.constraints.supports ?? []).includes(\"lastFrame\");\n return (\n (req.referenceImages ?? []).length > 0 || (takesLastFrame && req.lastFrame !== undefined)\n );\n}\n\n/**\n * The resolution an xai-video request is lowered to, or undefined when it stands: 1080p in\n * reference mode is refused under \"error\" and lowered to 720p with a warning under \"coerce\".\n * The resolver and the adapter both apply it; only the adapter names itself on the error.\n */\nexport function xaiReferenceResolution(\n model: Pick<CatalogModel, \"id\" | \"constraints\">,\n req: Pick<VideoRequest, \"resolution\" | \"referenceImages\" | \"lastFrame\">,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n provider?: \"xai-video\",\n): typeof XAI_REFERENCE_MAX_RESOLUTION | undefined {\n if (req.resolution !== \"1080p\" || !xaiReferenceMode(model, req)) return undefined;\n const message = xaiReferenceResolutionMessage(model.id);\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message,\n ...(provider === undefined ? {} : { provider }),\n model: model.id,\n retryable: false,\n });\n }\n warnings.push({\n code: \"resolution_coerced\",\n field: \"resolution\",\n from: req.resolution,\n to: XAI_REFERENCE_MAX_RESOLUTION,\n message,\n });\n return XAI_REFERENCE_MAX_RESOLUTION;\n}\n\n/** xai-video rows: 1080p with references or a last frame is refused, or lowered to 720p. */\nexport function applyXaiVideoRules(\n model: CatalogModel,\n req: VideoRequest,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): void {\n if (model.adapter !== \"xai-video\") return;\n const lowered = xaiReferenceResolution(model, req, onUnsupported, warnings);\n if (lowered !== undefined) req.resolution = lowered;\n}\n\n/**\n * A row whose aspect ratio is the frame it renders its source into (Ray 3.2 Reframe): it\n * requires a source video and lists ratios without \"adaptive\", so the ratio is a target. Every\n * other edit row keeps the source's framing.\n */\nexport function takesTargetAspectRatio(model: Pick<CatalogModel, \"constraints\">): boolean {\n const ratios = model.constraints.aspectRatios ?? [];\n return (\n (model.constraints.requires ?? []).includes(\"sourceVideo\") &&\n ratios.length > 0 &&\n !ratios.includes(\"adaptive\")\n );\n}\n\n/** Luma renders 9:16 and 3:4 reframes at up to 720p. */\nexport const LUMA_REFRAME_VERTICAL_MAX_RESOLUTION = \"720p\";\n\n/** Whether a Luma reframe asks for a vertical target at 1080p, which Luma does not render. */\nexport function lumaReframeTooTall(req: Pick<VideoRequest, \"aspectRatio\" | \"resolution\">): boolean {\n const vertical = req.aspectRatio === \"9:16\" || req.aspectRatio === \"3:4\";\n return vertical && req.resolution === \"1080p\";\n}\n\n/**\n * luma rows that reframe a source: the target ratio must be a real ratio (an \"adaptive\" one\n * would fail at Luma after the hold), and a vertical 1080p target renders at 720p, so it is\n * refused or lowered here, where the quote reads it too.\n */\nexport function applyLumaVideoRules(\n model: CatalogModel,\n req: VideoRequest,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): void {\n if (model.adapter !== \"luma\" || !takesTargetAspectRatio(model)) return;\n if (req.aspectRatio === undefined || req.aspectRatio === \"adaptive\") {\n const listed = model.constraints.aspectRatios ?? [];\n const fallback =\n model.defaults.aspectRatio !== undefined && model.defaults.aspectRatio !== \"adaptive\"\n ? model.defaults.aspectRatio\n : listed[0];\n const message = `${model.id} needs a target aspect ratio: ${listed.join(\", \")}`;\n if (onUnsupported === \"error\" || fallback === undefined) {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message,\n model: model.id,\n retryable: false,\n });\n }\n warnings.push({\n code: \"ratio_coerced\",\n field: \"aspectRatio\",\n from: req.aspectRatio ?? \"adaptive\",\n to: fallback,\n message,\n });\n req.aspectRatio = fallback;\n }\n if (!lumaReframeTooTall(req)) return;\n const message = `${model.id} renders 9:16 and 3:4 reframes at up to ${LUMA_REFRAME_VERTICAL_MAX_RESOLUTION}`;\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message,\n model: model.id,\n retryable: false,\n });\n }\n warnings.push({\n code: \"resolution_coerced\",\n field: \"resolution\",\n from: req.resolution,\n to: LUMA_REFRAME_VERTICAL_MAX_RESOLUTION,\n message,\n });\n req.resolution = LUMA_REFRAME_VERTICAL_MAX_RESOLUTION;\n}\n\n/** fal's MiniMax H3 Max Insert endpoint. */\nexport const MINIMAX_H3_INSERT = \"minimax/h3-max/insert-video\";\n// fal schema: start_time minimum 1.625, resume_time exclusiveMinimum 1.625, both maximum 60.\nconst INSERT_MIN = 1.625;\nconst INSERT_MAX = 60;\n\nexport type InsertWindowCheck =\n | { ok: true; startSeconds: number; resumeSeconds: number }\n | ({ ok: false } & RuleProblem);\n\n/** Where H3 Max Insert starts its scene and resumes the source, within the fal schema's bounds. */\nexport function checkInsertWindow(\n req: Pick<VideoRequest, \"insertWindow\" | \"sourceVideo\">,\n): InsertWindowCheck {\n const window = req.insertWindow;\n if (window === undefined) {\n return {\n ok: false,\n code: \"missing_input\",\n message: \"needs an insert window (start and resume times)\",\n };\n }\n const { startSeconds, resumeSeconds } = window;\n const startOk = startSeconds >= INSERT_MIN && startSeconds <= INSERT_MAX;\n const resumeOk = resumeSeconds > INSERT_MIN && resumeSeconds <= INSERT_MAX;\n if (!startOk || !resumeOk) {\n return {\n ok: false,\n code: \"unsupported_option\",\n message: `starts the scene at ${INSERT_MIN}-${INSERT_MAX} s and resumes after ${INSERT_MIN} s, by ${INSERT_MAX} s`,\n };\n }\n if (resumeSeconds < startSeconds) {\n return {\n ok: false,\n code: \"unsupported_option\",\n message: \"resumes the source at or after the insert start\",\n };\n }\n const sourceSeconds = req.sourceVideo?.durationSeconds;\n if (sourceSeconds !== undefined && resumeSeconds > sourceSeconds) {\n return {\n ok: false,\n code: \"unsupported_option\",\n message: `resumes at ${resumeSeconds} s, past the ${sourceSeconds} s source`,\n };\n }\n return { ok: true, startSeconds, resumeSeconds };\n}\n","export interface CollisionRow {\n id: string;\n aliases: readonly string[];\n}\n\nexport interface CollisionIssue {\n index: number;\n path: (string | number)[];\n message: string;\n}\n\nexport function collisionIssues(rows: readonly CollisionRow[]): CollisionIssue[] {\n const issues: CollisionIssue[] = [];\n const seenIds = new Map<string, number>();\n const seenAliases = new Map<string, { index: number; aliasIndex: number }>();\n rows.forEach((row, index) => {\n if (seenIds.has(row.id)) {\n issues.push({\n index,\n path: [\"id\"],\n message: `Duplicate model id \"${row.id}\"`,\n });\n } else {\n // A canonical id wins over an earlier row's alias: the alias owner\n // is the row at fault, so the read path drops it, not the model.\n const aliasOwner = seenAliases.get(row.id);\n if (aliasOwner !== undefined) {\n issues.push({\n index: aliasOwner.index,\n path: [\"aliases\", aliasOwner.aliasIndex],\n message: `Alias \"${row.id}\" collides with a model id`,\n });\n }\n seenIds.set(row.id, index);\n }\n const local = new Set<string>();\n for (const [aliasIndex, alias] of row.aliases.entries()) {\n if (alias === row.id || seenIds.has(alias)) {\n issues.push({\n index,\n path: [\"aliases\", aliasIndex],\n message: `Alias \"${alias}\" collides with a model id`,\n });\n } else if (local.has(alias) || seenAliases.has(alias)) {\n issues.push({\n index,\n path: [\"aliases\", aliasIndex],\n message: `Duplicate alias \"${alias}\"`,\n });\n }\n local.add(alias);\n if (!seenAliases.has(alias)) seenAliases.set(alias, { index, aliasIndex });\n }\n });\n return issues;\n}\n","import { z } from \"zod\";\nimport type { AudioOutput, PromptConventions } from \"../types.js\";\n\nexport const AudioOutputSchema = z.enum([\"always\", \"optional\", \"never\"]);\nexport const ReferenceSyntaxSchema = z.enum([\"numbered\", \"caption\", \"descriptive\"]);\nconst MaxCharsSchema = z.number().int().positive();\n\n/** Write-path shape of `constraints.prompt`; the read path below tolerates bad data instead. */\nexport const PromptConventionsSchema = z.strictObject({\n referenceSyntax: ReferenceSyntaxSchema,\n maxChars: MaxCharsSchema.optional(),\n});\n\nexport const AUDIO_OUTPUTS = AudioOutputSchema.options;\nexport const REFERENCE_SYNTAXES = ReferenceSyntaxSchema.options;\n\n// Live rows are edited in pro-admin; a value an older kit wrote, or a typo that slipped past an\n// older pro-backend, reads as \"not set\" rather than failing the row.\nconst ConstraintsReadView = z.looseObject({\n audio: AudioOutputSchema.optional().catch(undefined),\n prompt: z\n .looseObject({\n referenceSyntax: ReferenceSyntaxSchema.catch(\"numbered\"),\n maxChars: MaxCharsSchema.optional().catch(undefined),\n })\n .optional()\n .catch(undefined),\n});\n\nconst DEFAULT_CONVENTIONS: PromptConventions = { referenceSyntax: \"numbered\" };\n\nexport function outputAudio(row: { constraints: unknown }): AudioOutput | undefined {\n const view = ConstraintsReadView.safeParse(row.constraints);\n return view.success ? view.data.audio : undefined;\n}\n\nconst DefaultsReadView = z.looseObject({\n generateAudio: z.boolean().optional().catch(undefined),\n});\n\n/**\n * Whether a video request is billed as having sound. `always` rows are true and `never` rows\n * false; an `optional` row takes the request's `generateAudio`, then the row's default, then\n * true. A row with no declared audio is true. Every fallback is true because the base video\n * price is the sound-on price: a guess must never pick the cheaper silent rate. Pass the same\n * `requested` value the request dispatches with, so the billed and generated sound agree.\n */\nexport function billedAudio(\n row: { constraints: unknown; defaults?: unknown },\n requested?: boolean,\n): boolean {\n const audio = outputAudio(row);\n if (audio === \"never\") return false;\n if (audio !== \"optional\") return true;\n if (requested !== undefined) return requested;\n const defaults = DefaultsReadView.safeParse(row.defaults);\n return (defaults.success ? defaults.data.generateAudio : undefined) ?? true;\n}\n\nexport function promptConventions(row: { constraints: unknown }): PromptConventions {\n const view = ConstraintsReadView.safeParse(row.constraints);\n const prompt = view.success ? view.data.prompt : undefined;\n if (prompt === undefined) return { ...DEFAULT_CONVENTIONS };\n const result: PromptConventions = { referenceSyntax: prompt.referenceSyntax };\n if (prompt.maxChars !== undefined) result.maxChars = prompt.maxChars;\n return result;\n}\n\n/**\n * Pure read-side cleanup for the two convention keys. The tolerant base schema lets any value\n * through so one bad key does not cost the row; this removes an invalid `audio` and replaces an\n * invalid `prompt` with its tolerant read. Returns the same row and `[]` when nothing changed;\n * never mutates the input.\n */\nexport interface NormalisedConventions<T> {\n row: T;\n invalidKeys: string[];\n}\n\nconst RawConventionsView = z.looseObject({\n audio: z.unknown().optional(),\n prompt: z.unknown().optional(),\n});\n\nexport function normaliseConventions<T extends { constraints: object }>(\n row: T,\n): NormalisedConventions<T> {\n const view = RawConventionsView.safeParse(row.constraints);\n if (!view.success) return { row, invalidKeys: [] };\n const { audio, prompt } = view.data;\n const badAudio = audio !== undefined && !AudioOutputSchema.safeParse(audio).success;\n const badPrompt = prompt !== undefined && !PromptConventionsSchema.safeParse(prompt).success;\n if (!badAudio && !badPrompt) return { row, invalidKeys: [] };\n const invalidKeys: string[] = [];\n if (badAudio) invalidKeys.push(\"constraints.audio\");\n if (badPrompt) invalidKeys.push(\"constraints.prompt\");\n const entries = Object.entries(row.constraints).flatMap(([key, value]) => {\n if (key === \"audio\" && badAudio) return [];\n if (key === \"prompt\" && badPrompt) return [[key, promptConventions(row)]];\n return [[key, value]];\n });\n return { row: { ...row, constraints: Object.fromEntries(entries) }, invalidKeys };\n}\n","import type {\n CatalogModel,\n Model3dConstraints,\n Model3dFamily,\n Model3dTexture,\n Model3dViews,\n} from \"../types.js\";\n\n/** A `model3d` row's spec, or undefined for any other row. */\nexport function model3dConstraints(row: CatalogModel): Model3dConstraints | undefined {\n if (row.type !== \"model3d\") return undefined;\n return row.constraints.model3d;\n}\n\n/** Which inputs a request carries (or a canvas node has wired). */\nexport interface Model3dWired {\n prompt: boolean;\n image: boolean;\n back: boolean;\n left: boolean;\n right: boolean;\n /** The fifth photo (`views.top`); only `unordered` rows read it. */\n top?: boolean;\n}\n\n/**\n * The image slots the fal adapter's request mapping (`model3dCall`) fills for each kind of\n * views, in the order it sends them. A row's `maxImages` may not exceed its kind's count.\n */\nexport const MODEL3D_IMAGE_SLOTS = {\n none: [\"image\"],\n named: [\"image\", \"back\", \"left\", \"right\"],\n ordered: [\"image\", \"left\", \"back\", \"right\"],\n unordered: [\"image\", \"back\", \"left\", \"right\", \"top\"],\n} as const satisfies Record<Model3dViews, readonly string[]>;\n\ninterface Model3dFamilyRules {\n /** Has a prompt-only endpoint; without one a text row must also require an image. */\n textPath: boolean;\n views: readonly Model3dViews[];\n /** Sends a request with views to `endpoints.multiImage`. */\n multiImage: boolean;\n /** The value the request mapping sends for each texture option; null when it has no texture switch. */\n texture: null | Readonly<Partial<Record<Model3dTexture, string | boolean | null>>>;\n pbr: boolean;\n seed: boolean;\n textureRef: boolean;\n /** null: no resolution option. \"integer\": sent as a number. Else the value sent for each option. */\n resolutions: null | \"integer\" | Readonly<Record<string, string>>;\n}\n\n/**\n * What the fal adapter's request mapping (fal-model3d.ts `model3dCall`) and the pricing SKUs\n * read for each family. A row may offer only what its family reads, and must carry every\n * endpoint and option that mapping needs, so that every request `model3dInputRefusal` lets\n * through can be submitted and priced. The texture and resolution maps are both the options a\n * row may offer and the provider values the mapping sends for them, so an option cannot be\n * offered without a value to send.\n */\nexport const MODEL3D_FAMILY_RULES = {\n trellis: {\n textPath: false,\n views: [\"none\"],\n multiImage: false,\n texture: null,\n pbr: false,\n seed: true,\n textureRef: false,\n resolutions: \"integer\",\n },\n hunyuan: {\n textPath: true,\n views: [\"none\", \"named\"],\n multiImage: false,\n // generate_type\n texture: { none: \"Geometry\", standard: \"Normal\" },\n pbr: true,\n seed: false,\n textureRef: false,\n resolutions: null,\n },\n tripo: {\n textPath: true,\n views: [\"none\", \"ordered\"],\n multiImage: true,\n // texture_quality; null sends an untextured model.\n texture: { none: null, standard: \"standard\", detailed: \"detailed\" },\n pbr: true,\n seed: true,\n textureRef: false,\n resolutions: null,\n },\n rodin: {\n textPath: true,\n views: [\"none\", \"unordered\"],\n multiImage: false,\n texture: null,\n pbr: false,\n seed: true,\n textureRef: false,\n resolutions: null,\n },\n meshy: {\n textPath: true,\n views: [\"none\", \"unordered\"],\n multiImage: true,\n // The text endpoint's mode; the image endpoints take should_texture.\n texture: { none: \"preview\", standard: \"full\" },\n pbr: true,\n seed: true,\n textureRef: true,\n resolutions: null,\n },\n hi3d: {\n textPath: false,\n views: [\"none\", \"named\"],\n multiImage: true,\n // enable_texture\n texture: { none: false, standard: true },\n pbr: true,\n seed: false,\n textureRef: false,\n resolutions: { quality: \"2048quality\", master: \"2048master\" },\n },\n sam: {\n textPath: false,\n views: [\"none\"],\n multiImage: false,\n texture: null,\n pbr: false,\n seed: true,\n textureRef: false,\n resolutions: null,\n },\n} as const satisfies Record<Model3dFamily, Model3dFamilyRules>;\n\n/** The fields of a `model3d` spec the write-path checks read, as the catalog schema parses them. */\nexport interface Model3dSpecCheckInput {\n family: Model3dFamily;\n endpoints: {\n text?: string | undefined;\n image?: string | undefined;\n multiImage?: string | undefined;\n };\n text: boolean;\n imageRequired: boolean;\n views: Model3dViews;\n maxImages: number;\n texture: readonly Model3dTexture[];\n pbr: boolean;\n textureRef: boolean;\n seed: boolean;\n seedMax?: number | undefined;\n resolutions?: { options: readonly string[]; default: string } | undefined;\n}\n\n/** Rules a `model3d` spec must hold for the adapter to serve every request it accepts. */\nexport function model3dSpecIssues(\n spec: Model3dSpecCheckInput,\n): { path: string[]; message: string }[] {\n const issues: { path: string[]; message: string }[] = [];\n const add = (path: string[], message: string) => issues.push({ path, message });\n const rules: Model3dFamilyRules = MODEL3D_FAMILY_RULES[spec.family];\n const promptOnly = spec.text && !spec.imageRequired;\n\n if (spec.endpoints.image === undefined)\n add([\"endpoints\", \"image\"], \"every row needs an image endpoint\");\n if (promptOnly && !rules.textPath) {\n add(\n [\"imageRequired\"],\n `${spec.family} has no text-to-3D endpoint; a text row needs an image`,\n );\n }\n if (promptOnly && spec.endpoints.text === undefined) {\n add([\"endpoints\", \"text\"], \"a text row needs a text endpoint\");\n }\n\n if (!rules.views.includes(spec.views)) {\n add([\"views\"], `${spec.family} takes views ${rules.views.join(\" or \")}`);\n }\n if (spec.views === \"none\" && spec.maxImages !== 1) {\n add([\"maxImages\"], \"a row without views takes 1 image\");\n }\n if (spec.views === \"unordered\" && spec.maxImages < 2) {\n add([\"maxImages\"], \"a row with views takes at least 2 images\");\n }\n // The request mapping fills a fixed set of image slots per views kind; a row may not\n // promise more images than it sends.\n const slots = MODEL3D_IMAGE_SLOTS[spec.views].length;\n if (spec.views !== \"none\" && spec.maxImages > slots) {\n add([\"maxImages\"], `a row with ${spec.views} views sends at most ${slots} images`);\n }\n // One slot per side; named and ordered rows send every slot set.\n if ((spec.views === \"named\" || spec.views === \"ordered\") && spec.maxImages < slots) {\n add(\n [\"maxImages\"],\n `a row with ${spec.views} views takes ${slots} images (front and three sides)`,\n );\n }\n if (spec.views !== \"none\" && rules.multiImage && spec.endpoints.multiImage === undefined) {\n add([\"endpoints\", \"multiImage\"], `${spec.family} sends views to a multi-image endpoint`);\n }\n\n if (rules.texture === null) {\n if (spec.texture.length > 0) add([\"texture\"], `${spec.family} has no texture switch`);\n } else {\n const allowed = rules.texture;\n if (spec.texture.length === 0) add([\"texture\"], `${spec.family} needs its texture options`);\n if (new Set(spec.texture).size !== spec.texture.length)\n add([\"texture\"], \"texture options repeat\");\n for (const t of spec.texture) {\n if (!Object.hasOwn(allowed, t))\n add([\"texture\"], `${spec.family} has no \"${t}\" texture`);\n }\n }\n if (spec.pbr && !rules.pbr) add([\"pbr\"], `${spec.family} has no PBR switch`);\n if (spec.pbr && !spec.texture.some((t) => t !== \"none\")) {\n add([\"pbr\"], \"PBR needs a textured option\");\n }\n if (spec.seed && !rules.seed) add([\"seed\"], `${spec.family} takes no seed`);\n if (spec.seedMax !== undefined && !spec.seed) add([\"seedMax\"], \"seedMax needs seed\");\n if (spec.textureRef && !rules.textureRef)\n add([\"textureRef\"], `${spec.family} takes no texture reference`);\n\n const res = spec.resolutions;\n if (rules.resolutions === null) {\n if (res !== undefined) add([\"resolutions\"], `${spec.family} has no resolution option`);\n } else if (res === undefined) {\n add([\"resolutions\"], `${spec.family} needs its resolution options`);\n } else {\n if (!res.options.includes(res.default)) {\n add([\"resolutions\", \"default\"], \"default must be an option\");\n }\n if (new Set(res.options).size !== res.options.length) {\n add([\"resolutions\", \"options\"], \"resolution options repeat\");\n }\n const allowed = rules.resolutions;\n for (const option of res.options) {\n const ok =\n allowed === \"integer\"\n ? /^[1-9][0-9]*$/.test(option)\n : Object.hasOwn(allowed, option);\n if (!ok)\n add([\"resolutions\", \"options\"], `${spec.family} has no \"${option}\" resolution`);\n }\n }\n return issues;\n}\n\nexport type Model3dInputRefusal =\n | \"model3d_needs_image\"\n | \"model3d_needs_prompt\"\n | \"model3d_needs_input\"\n | \"model3d_views_need_image\"\n | \"model3d_views_out_of_order\";\n\n/** Why a row cannot run with these inputs, or null when it can. */\nexport function model3dInputRefusal(\n spec: Model3dConstraints,\n wired: Model3dWired,\n): Model3dInputRefusal | null {\n const top = spec.views === \"unordered\" && wired.top === true;\n const anyView = spec.views !== \"none\" && (wired.back || wired.left || wired.right || top);\n if (anyView && !wired.image) return \"model3d_views_need_image\";\n if (spec.imageRequired && !wired.image) return \"model3d_needs_image\";\n if (spec.promptRequired && !wired.prompt) return \"model3d_needs_prompt\";\n if (!wired.image && !(spec.text && wired.prompt)) return \"model3d_needs_input\";\n if (spec.views === \"ordered\") {\n // Tripo reads views as front, left, back, right with no gaps.\n if ((wired.back || wired.right) && !wired.left) return \"model3d_views_out_of_order\";\n if (wired.right && !wired.back) return \"model3d_views_out_of_order\";\n }\n return null;\n}\n\n/** Whether the row's provider takes this seed: a non-negative integer up to its `seedMax`. */\nexport function model3dSeedFits(spec: Model3dConstraints, seed: number): boolean {\n return (\n Number.isSafeInteger(seed) && seed >= 0 && seed <= (spec.seedMax ?? Number.MAX_SAFE_INTEGER)\n );\n}\n\n/** The texture a request gets: its own when the row offers it, else the row's default. */\nexport function model3dTexture(\n spec: Model3dConstraints,\n requested: Model3dTexture | undefined,\n): Model3dTexture {\n if (requested !== undefined && spec.texture.includes(requested)) return requested;\n return spec.texture.includes(\"standard\") ? \"standard\" : (spec.texture[0] ?? \"standard\");\n}\n\n/** The resolution a request gets: its own when the row offers it, else the row's default. */\nexport function model3dResolution(\n spec: Model3dConstraints,\n requested: string | undefined,\n): string | undefined {\n const res = spec.resolutions;\n if (res === undefined) return undefined;\n return requested !== undefined && res.options.includes(requested) ? requested : res.default;\n}\n\n/** The options a request sets that change its price. */\nexport interface Model3dPricedOptions {\n texture?: Model3dTexture;\n pbr?: boolean;\n resolution?: string;\n}\n\n/**\n * What the request carries that changes its price: an image (Tripo prices text lower)\n * and side views (Hunyuan adds for them). A quote that cannot tell passes both true.\n */\nexport interface Model3dPricedInputs {\n image: boolean;\n views: boolean;\n}\n\n/** The pro-backend credit_pricing_flat key one request bills under. */\nexport function model3dPricingSku(\n row: CatalogModel,\n options: Model3dPricedOptions,\n inputs: Model3dPricedInputs,\n): string {\n const spec = model3dConstraints(row);\n if (spec === undefined) throw new Error(`${row.id} is not a 3D model`);\n const texture = model3dTexture(spec, options.texture);\n const textured = spec.texture.length > 0 && texture !== \"none\";\n const pbr = spec.pbr && textured && options.pbr === true;\n const resolution = model3dResolution(spec, options.resolution);\n switch (spec.family) {\n case \"meshy\":\n return `${row.id}__${textured ? \"textured\" : \"untextured\"}`;\n case \"tripo\":\n return `${row.id}__${inputs.image ? \"image\" : \"text\"}__${texture}`;\n case \"hunyuan\":\n return `${row.id}${pbr ? \"__pbr\" : \"\"}${inputs.views ? \"__views\" : \"\"}`;\n case \"trellis\":\n return `${row.id}__${resolution}`;\n case \"hi3d\":\n return `${row.id}__${resolution}__${\n textured ? (pbr ? \"texture-pbr\" : \"texture\") : \"geometry\"\n }`;\n case \"rodin\":\n case \"sam\":\n return row.id;\n }\n}\n\n/** Every SKU a row can bill under; pro-backend needs a price for each. */\nexport function model3dSkus(row: CatalogModel): string[] {\n const spec = model3dConstraints(row);\n if (spec === undefined) return [];\n const textures: (Model3dTexture | undefined)[] =\n spec.texture.length > 0 ? spec.texture : [undefined];\n const pbrs = spec.pbr ? [false, true] : [false];\n const resolutions: (string | undefined)[] = spec.resolutions?.options ?? [undefined];\n const images = spec.text && !spec.imageRequired ? [true, false] : [true];\n const views = spec.views === \"none\" ? [false] : [false, true];\n const skus = new Set<string>();\n for (const texture of textures)\n for (const pbr of pbrs)\n for (const resolution of resolutions)\n for (const image of images)\n for (const view of views) {\n if (view && !image) continue;\n skus.add(\n model3dPricingSku(\n row,\n {\n ...(texture !== undefined && { texture }),\n pbr,\n ...(resolution !== undefined && { resolution }),\n },\n { image, views: view },\n ),\n );\n }\n return [...skus].sort();\n}\n","import { z } from \"zod\";\nimport type { ProviderOptionValue, SupportedOption } from \"../types.js\";\n\nexport const VIDEO_INPUT_SPEC_KEYS = [\n \"prompt\",\n \"durationSeconds\",\n \"aspectRatio\",\n \"resolution\",\n \"firstFrame\",\n \"lastFrame\",\n \"seed\",\n \"negativePrompt\",\n \"generateAudio\",\n \"cfgScale\",\n \"promptExpansion\",\n \"referenceImages\",\n \"sourceVideo\",\n] as const;\n\nexport const IMAGE_INPUT_SPEC_KEYS = [\n \"prompt\",\n \"references\",\n \"aspectRatio\",\n \"size\",\n \"outputFormat\",\n \"seed\",\n] as const;\n\nexport const AUDIO_INPUT_SPEC_KEYS = [\n \"prompt\",\n \"durationSeconds\",\n \"seed\",\n \"negativePrompt\",\n \"references\",\n \"sourceVideo\",\n \"instrumental\",\n] as const;\n\n/** Image inputs that `inputSpec.arrays` can join into one provider array field. */\nexport const ARRAY_INPUT_SPEC_KEYS = [\n \"firstFrame\",\n \"referenceImages\",\n \"lastFrame\",\n \"references\",\n] as const;\n\nexport type ArrayInputSpecKey = (typeof ARRAY_INPUT_SPEC_KEYS)[number];\n\nexport type InputSpecKey =\n | (typeof VIDEO_INPUT_SPEC_KEYS)[number]\n | (typeof IMAGE_INPUT_SPEC_KEYS)[number]\n | (typeof AUDIO_INPUT_SPEC_KEYS)[number];\n\nexport const INPUT_SPEC_SUPPORTS_KEYS: readonly SupportedOption[] = [\n \"lastFrame\",\n \"seed\",\n \"negativePrompt\",\n \"generateAudio\",\n \"cfgScale\",\n \"promptExpansion\",\n \"outputFormat\",\n \"instrumental\",\n];\n\nconst VIDEO_KEY_SET: ReadonlySet<string> = new Set(VIDEO_INPUT_SPEC_KEYS);\nconst IMAGE_KEY_SET: ReadonlySet<string> = new Set(IMAGE_INPUT_SPEC_KEYS);\nconst AUDIO_KEY_SET: ReadonlySet<string> = new Set(AUDIO_INPUT_SPEC_KEYS);\nconst ARRAY_KEY_SET: ReadonlySet<string> = new Set(ARRAY_INPUT_SPEC_KEYS);\nconst ALL_KEY_SET: ReadonlySet<string> = new Set([\n ...VIDEO_INPUT_SPEC_KEYS,\n ...IMAGE_INPUT_SPEC_KEYS,\n ...AUDIO_INPUT_SPEC_KEYS,\n]);\n\nconst TYPES_BY_ADAPTER = new Map([\n [\"replicate\", [\"video\", \"image\", \"audio\"]],\n [\"fal\", [\"image\"]],\n]);\n\nconst ALLOWED_KEYS_BY_TYPE = new Map([\n [\"video\", VIDEO_KEY_SET],\n [\"image\", IMAGE_KEY_SET],\n [\"audio\", AUDIO_KEY_SET],\n]);\n\nconst ProviderScalarSchema = z.union([z.string(), z.number(), z.boolean()]);\n\nconst FieldsSchema = z.record(z.string(), z.string().min(1)).superRefine((fields, ctx) => {\n const keys = Object.keys(fields);\n if (keys.length === 0) {\n ctx.addIssue({\n code: \"custom\",\n message: \"inputSpec.fields must name at least one field\",\n });\n return;\n }\n for (const key of keys) {\n if (!ALL_KEY_SET.has(key)) {\n ctx.addIssue({\n code: \"custom\",\n message: `inputSpec.fields has unknown canonical key \"${key}\"`,\n });\n }\n }\n});\n\nconst ValuesSchema = z\n .record(z.string(), z.record(z.string(), ProviderScalarSchema))\n .superRefine((values, ctx) => {\n for (const key of Object.keys(values)) {\n if (!ALL_KEY_SET.has(key)) {\n ctx.addIssue({\n code: \"custom\",\n message: `inputSpec.values has unknown canonical key \"${key}\"`,\n });\n }\n }\n });\n\nconst StaticSchema = z.record(z.string(), ProviderScalarSchema);\n\nconst ArraysSchema = z\n .record(z.string().min(1), z.array(z.string()).min(1))\n .superRefine((arrays, ctx) => {\n for (const [name, keys] of Object.entries(arrays)) {\n for (const key of keys) {\n if (!ARRAY_KEY_SET.has(key)) {\n ctx.addIssue({\n code: \"custom\",\n path: [name],\n message: `inputSpec.arrays \"${name}\" has unknown image key \"${key}\"`,\n });\n }\n }\n }\n });\n\n/**\n * Sends `{ width, height }` in one provider field, computed from the request's\n * aspect ratio and size. `areas` is the target pixel count per size tier; the\n * long side is capped at `maxSide` and both sides round down to `multipleOf`.\n */\nconst DimensionsSchema = z.strictObject({\n field: z.string().min(1),\n areas: z\n .record(z.string(), z.number().int().positive())\n .refine((a) => Object.keys(a).length > 0, {\n message: \"inputSpec.dimensions.areas must name at least one size\",\n }),\n maxSide: z.number().int().positive().optional(),\n multipleOf: z.number().int().positive().optional(),\n});\n\nexport type InputSpecDimensions = z.infer<typeof DimensionsSchema>;\n\nexport const InputSpecSchema = z\n .strictObject({\n fields: FieldsSchema,\n values: ValuesSchema.optional(),\n static: StaticSchema.optional(),\n arrays: ArraysSchema.optional(),\n editEndpoint: z.string().min(1).optional(),\n dimensions: DimensionsSchema.optional(),\n })\n .superRefine((spec, ctx) => {\n const mappedNames = new Set([\n ...Object.values(spec.fields),\n ...Object.keys(spec.arrays ?? {}),\n ...(spec.dimensions ? [spec.dimensions.field] : []),\n ]);\n for (const key of Object.keys(spec.static ?? {})) {\n if (mappedNames.has(key)) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"static\", key],\n message: `inputSpec.static \"${key}\" collides with a mapped field name`,\n });\n }\n }\n });\n\nexport type InputSpec = z.infer<typeof InputSpecSchema>;\n\nexport interface InputSpecIssue {\n path: PropertyKey[];\n message: string;\n}\n\ninterface ValidateRow {\n type: string;\n adapter: string;\n constraints: { supports?: readonly SupportedOption[] | undefined };\n}\n\nexport function isInputSpecKey(key: string): key is InputSpecKey {\n return ALL_KEY_SET.has(key);\n}\n\nexport function isArrayInputSpecKey(key: string): key is ArrayInputSpecKey {\n return ARRAY_KEY_SET.has(key);\n}\n\nexport function validateInputSpec(\n raw: ProviderOptionValue,\n row: ValidateRow,\n): { ok: true; spec: InputSpec } | { ok: false; issues: InputSpecIssue[] } {\n const parsed = InputSpecSchema.safeParse(raw);\n if (!parsed.success) {\n return {\n ok: false,\n issues: parsed.error.issues.map((issue) => ({\n path: issue.path,\n message: issue.message,\n })),\n };\n }\n const spec = parsed.data;\n const supportedTypes = TYPES_BY_ADAPTER.get(row.adapter);\n if (supportedTypes === undefined) {\n return {\n ok: false,\n issues: [\n {\n path: [],\n message: \"inputSpec is only supported on replicate and fal rows\",\n },\n ],\n };\n }\n const issues: InputSpecIssue[] = [];\n const allowed = ALLOWED_KEYS_BY_TYPE.get(row.type);\n if (allowed === undefined || !supportedTypes.includes(row.type)) {\n issues.push({\n path: [],\n message:\n row.adapter === \"fal\"\n ? `inputSpec on fal rows is only supported for image rows, not \"${row.type}\"`\n : `inputSpec is not supported for \"${row.type}\" rows`,\n });\n } else {\n for (const key of Object.keys(spec.fields)) {\n if (!allowed.has(key)) {\n issues.push({\n path: [\"fields\", key],\n message: `inputSpec.fields \"${key}\" is not supported for ${row.type} rows`,\n });\n }\n }\n for (const key of Object.keys(spec.values ?? {})) {\n if (!allowed.has(key)) {\n issues.push({\n path: [\"values\", key],\n message: `inputSpec.values \"${key}\" is not supported for ${row.type} rows`,\n });\n }\n }\n }\n if (spec.editEndpoint !== undefined) {\n if (row.adapter !== \"fal\") {\n issues.push({\n path: [\"editEndpoint\"],\n message: \"inputSpec.editEndpoint is only supported on fal rows\",\n });\n } else if (!(\"references\" in spec.fields)) {\n issues.push({\n path: [\"editEndpoint\"],\n message: 'inputSpec.editEndpoint needs a \"references\" entry in inputSpec.fields',\n });\n }\n }\n const seenNames = new Map<string, string>();\n for (const [key, name] of Object.entries(spec.fields)) {\n const first = seenNames.get(name);\n if (first === undefined) seenNames.set(name, key);\n else {\n issues.push({\n path: [\"fields\", key],\n message: `inputSpec.fields \"${first}\" and \"${key}\" both map to \"${name}\"`,\n });\n }\n }\n for (const key of Object.keys(spec.values ?? {})) {\n if (!(key in spec.fields)) {\n issues.push({\n path: [\"values\", key],\n message: `inputSpec.values \"${key}\" has no matching fields entry`,\n });\n }\n }\n const arrayOwner = new Map<string, string>();\n for (const [name, keys] of Object.entries(spec.arrays ?? {})) {\n const fieldKey = seenNames.get(name);\n if (fieldKey !== undefined) {\n issues.push({\n path: [\"arrays\", name],\n message: `inputSpec.arrays \"${name}\" is also the provider field of inputSpec.fields \"${fieldKey}\"`,\n });\n }\n for (const key of keys) {\n if (allowed !== undefined && !allowed.has(key)) {\n issues.push({\n path: [\"arrays\", name],\n message: `inputSpec.arrays \"${key}\" is not supported for ${row.type} rows`,\n });\n }\n if (key in spec.fields) {\n issues.push({\n path: [\"arrays\", name],\n message: `inputSpec.arrays \"${key}\" is already mapped in inputSpec.fields`,\n });\n }\n const owner = arrayOwner.get(key);\n if (owner === undefined) arrayOwner.set(key, name);\n else {\n issues.push({\n path: [\"arrays\", name],\n message:\n owner === name\n ? `inputSpec.arrays \"${name}\" lists \"${key}\" twice`\n : `inputSpec.arrays \"${owner}\" and \"${name}\" both take \"${key}\"`,\n });\n }\n }\n }\n if (spec.dimensions !== undefined) {\n if (row.type !== \"image\") {\n issues.push({\n path: [\"dimensions\"],\n message: \"inputSpec.dimensions is only supported on image rows\",\n });\n }\n for (const key of [\"aspectRatio\", \"size\"] as const) {\n if (key in spec.fields) {\n issues.push({\n path: [\"fields\", key],\n message: `inputSpec.fields \"${key}\" cannot be set with inputSpec.dimensions, which sends it`,\n });\n }\n }\n const owner = seenNames.get(spec.dimensions.field);\n if (owner !== undefined || spec.dimensions.field in (spec.arrays ?? {})) {\n issues.push({\n path: [\"dimensions\", \"field\"],\n message: `inputSpec.dimensions.field \"${spec.dimensions.field}\" is already a mapped provider field`,\n });\n }\n }\n const supports = row.constraints.supports ?? [];\n for (const key of INPUT_SPEC_SUPPORTS_KEYS) {\n if (supports.includes(key)) continue;\n if (key in spec.fields) {\n issues.push({\n path: [\"fields\", key],\n message: `inputSpec.fields \"${key}\" needs \"${key}\" in constraints.supports`,\n });\n }\n const arrayName = arrayOwner.get(key);\n if (arrayName !== undefined) {\n issues.push({\n path: [\"arrays\", arrayName],\n message: `inputSpec.arrays \"${key}\" needs \"${key}\" in constraints.supports`,\n });\n }\n }\n if (issues.length > 0) return { ok: false, issues };\n return { ok: true, spec };\n}\n","// Write-path checks for the voice, language and output-format lists a row carries: the\n// defaults must name an entry, and an id names one entry only.\n\nexport interface OptionListRow {\n constraints: {\n voices?: readonly { id: string }[] | undefined;\n languages?: readonly { code: string }[] | undefined;\n outputFormats?: readonly string[] | undefined;\n };\n defaults: {\n voice?: string | undefined;\n language?: string | undefined;\n outputFormat?: string | undefined;\n };\n}\n\nexport interface OptionListIssue {\n path: string[];\n message: string;\n}\n\nconst IMAGE_FORMATS: ReadonlySet<string> = new Set([\"png\", \"jpeg\", \"webp\"]);\n\nfunction duplicate(values: readonly string[]): string | undefined {\n const seen = new Set<string>();\n for (const value of values) {\n if (seen.has(value)) return value;\n seen.add(value);\n }\n return undefined;\n}\n\nfunction listIssues(\n name: \"voices\" | \"languages\" | \"outputFormats\",\n values: readonly string[] | undefined,\n fallback: string | undefined,\n defaultKey: \"voice\" | \"language\" | \"outputFormat\",\n): OptionListIssue[] {\n const issues: OptionListIssue[] = [];\n const repeated = values === undefined ? undefined : duplicate(values);\n if (repeated !== undefined) {\n issues.push({ path: [\"constraints\", name], message: `\"${repeated}\" is listed twice` });\n }\n if (fallback !== undefined && values !== undefined && !values.includes(fallback)) {\n issues.push({\n path: [\"defaults\", defaultKey],\n message: `defaults.${defaultKey} \"${fallback}\" is not in constraints.${name}`,\n });\n }\n return issues;\n}\n\nexport function optionListIssues(row: OptionListRow): OptionListIssue[] {\n const { constraints, defaults } = row;\n const issues = [\n ...listIssues(\n \"voices\",\n constraints.voices?.map((v) => v.id),\n defaults.voice,\n \"voice\",\n ),\n ...listIssues(\n \"languages\",\n constraints.languages?.map((l) => l.code),\n defaults.language,\n \"language\",\n ),\n ...listIssues(\n \"outputFormats\",\n constraints.outputFormats,\n defaults.outputFormat,\n \"outputFormat\",\n ),\n ];\n const format = defaults.outputFormat;\n if (\n format !== undefined &&\n constraints.outputFormats === undefined &&\n !IMAGE_FORMATS.has(format)\n ) {\n issues.push({\n path: [\"defaults\", \"outputFormat\"],\n message: `defaults.outputFormat \"${format}\" needs constraints.outputFormats or an image format`,\n });\n }\n return issues;\n}\n","import { Catalog } from \"./registry.js\";\nimport { MODELS } from \"./models.js\";\n\n// The package ships two bundles (root and ./catalog). Module state would be\n// duplicated per bundle, so the live catalog and the prime state live on\n// globalThis and every bundle in the process shares them.\nexport type CatalogOrigin = \"remote\" | \"last-good\" | \"snapshot\";\n\nexport interface PrimeCatalogResult {\n origin: CatalogOrigin;\n rowCount: number;\n revision?: string;\n error?: string;\n droppedRows?: number;\n}\n\nconst KEY = Symbol.for(\"@shop-os/modelkit/live-catalog\");\n\nexport interface LiveCatalogState {\n catalog: Catalog;\n memo: Promise<PrimeCatalogResult> | undefined;\n timer: (ReturnType<typeof setInterval> & { unref?: () => void }) | undefined;\n revision: string | undefined;\n origin: CatalogOrigin;\n}\n\n// SAFETY: Symbol-keyed live catalog slot is owned by modelkit and has no declared global type.\nconst store = globalThis as typeof globalThis & Record<symbol, LiveCatalogState | undefined>;\nexport const liveState: LiveCatalogState = (store[KEY] ??= {\n catalog: new Catalog(MODELS),\n memo: undefined,\n timer: undefined,\n revision: undefined,\n origin: \"snapshot\",\n});\n\nexport const liveCatalog: Catalog = liveState.catalog;\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 { liveCatalog, liveState } from \"./live.js\";\nimport { MODELS } from \"./models.js\";\nimport { collisionIssues } from \"./collisions.js\";\nimport { validateInputSpec } from \"./input-spec.js\";\nimport { CatalogModelSchemaBase } from \"./schema.js\";\nimport { normaliseConventions } from \"./conventions.js\";\nimport type { CatalogModel, JsonValue } from \"../types.js\";\nimport { JsonValueSchema } from \"../json.js\";\nimport { z } from \"zod\";\n\nexport interface CatalogCache {\n get(): Promise<string | null>;\n set(json: string): Promise<void>;\n}\n\nexport type CatalogAuth = { bearer: string } | { apiKey: string };\n\nexport interface CatalogSource {\n baseUrl: string;\n auth: CatalogAuth;\n ttlMs?: number;\n /** Abort a fetch after this many ms. Default 10 s. */\n timeoutMs?: number;\n cache?: CatalogCache;\n fetch?: typeof fetch;\n logger?: Pick<Console, \"debug\" | \"info\" | \"warn\" | \"error\">;\n}\n\nimport type { CatalogOrigin, PrimeCatalogResult } from \"./live.js\";\nexport type { CatalogOrigin, PrimeCatalogResult };\n\ntype Logger = NonNullable<CatalogSource[\"logger\"]>;\n\nfunction rowCount(): number {\n return liveCatalog.list({ lifecycle: [\"active\", \"deprecated\", \"retired\"] }).length;\n}\n\nfunction authHeaders(auth: CatalogAuth): Record<string, string> {\n return \"bearer\" in auth\n ? { Authorization: `Bearer ${auth.bearer}` }\n : { \"x-api-key\": auth.apiKey };\n}\n\nconst EnvelopeSchema = z.object({\n rows: z.array(JsonValueSchema),\n revision: z.string().optional(),\n});\n\nexport interface CatalogEnvelope {\n rows: CatalogModel[];\n revision?: string;\n}\n\nexport interface QuarantineResult {\n rows: CatalogModel[];\n dropped: number;\n}\n\nfunction dropReason(path: PropertyKey[], message: string): string {\n return path.length === 0 ? message : `${path.map((part) => String(part)).join(\".\")} ${message}`;\n}\n\nfunction rowId(raw: JsonValue): string {\n const parsed = z\n .object({ id: z.string().min(1) })\n .loose()\n .safeParse(raw);\n if (!parsed.success) return \"?\";\n return parsed.data.id;\n}\n\nfunction quarantine(rawRows: JsonValue[], logger: Logger): QuarantineResult {\n const valid: CatalogModel[] = [];\n let dropped = 0;\n for (const raw of rawRows) {\n const parsed = CatalogModelSchemaBase.safeParse(raw);\n if (!parsed.success) {\n const first = parsed.error.issues[0];\n const reason = first ? dropReason(first.path, first.message) : \"invalid row\";\n logger.warn(`[modelkit] catalog row dropped id=${rowId(raw)} reason=${reason}`);\n dropped += 1;\n continue;\n }\n // SAFETY: zod output matches CatalogModel at runtime; only optional undefined variance differs.\n const row = parsed.data as CatalogModel;\n const inputSpecRaw = row.providerOptions?.[\"modelkit\"]?.[\"inputSpec\"];\n if (inputSpecRaw !== undefined) {\n const result = validateInputSpec(inputSpecRaw, row);\n if (!result.ok) {\n const first = result.issues[0];\n const detail = first ? dropReason(first.path, first.message) : \"invalid inputSpec\";\n logger.warn(\n `[modelkit] catalog row ${row.id} has an invalid providerOptions.modelkit.inputSpec: ${detail}; calls fail until it is fixed`,\n );\n }\n }\n const normalised = normaliseConventions(row);\n if (normalised.invalidKeys.length > 0) {\n logger.warn(\n `[modelkit] catalog row ${row.id} has an invalid ${normalised.invalidKeys.join(\", \")}; read as not set`,\n );\n }\n valid.push(normalised.row);\n }\n let kept = valid;\n for (;;) {\n const issues = collisionIssues(kept);\n if (issues.length === 0) break;\n const firstByIndex = new Map<number, (typeof issues)[number]>();\n for (const issue of issues) {\n if (!firstByIndex.has(issue.index)) firstByIndex.set(issue.index, issue);\n }\n for (const [index, issue] of [...firstByIndex.entries()].sort((a, b) => a[0] - b[0])) {\n const row = kept[index];\n if (!row) continue;\n logger.warn(\n `[modelkit] catalog row dropped id=${row.id} reason=${String(issue.path[0] ?? \"\")} ${issue.message}`,\n );\n }\n const dropSet = new Set(firstByIndex.keys());\n kept = kept.filter((_, index) => !dropSet.has(index));\n dropped += dropSet.size;\n }\n return { rows: kept, dropped };\n}\n\nfunction toEnvelope(\n data: { rows: JsonValue[]; revision?: string | undefined },\n logger: Logger,\n): CatalogEnvelope & { dropped: number } {\n const { rows, dropped } = quarantine(data.rows, logger);\n if (rows.length === 0) throw new Error(\"invalid catalog response: no rows\");\n const envelope: CatalogEnvelope & { dropped: number } = { rows, dropped };\n if (data.revision !== undefined) envelope.revision = data.revision;\n return envelope;\n}\n\n/** One string per line: pino-style loggers drop a trailing object argument. */\nfunction describeError(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n}\n\nfunction logPrimed(logger: Logger, result: PrimeCatalogResult): void {\n const revision = result.revision === undefined ? \"\" : ` revision=${result.revision}`;\n logger.info(\n `[modelkit] catalog primed origin=${result.origin} rowCount=${result.rowCount}${revision}`,\n );\n}\n\nasync function fetchRemote(\n source: CatalogSource,\n logger: Logger,\n): Promise<\n { rows: CatalogModel[]; revision?: string; fromCache: false; dropped: number } | { kept: true }\n> {\n const fetchImpl = source.fetch ?? globalThis.fetch;\n const headers: Record<string, string> = authHeaders(source.auth);\n if (liveState.revision !== undefined) headers[\"If-None-Match\"] = `\"${liveState.revision}\"`;\n const res = await fetchImpl(`${source.baseUrl}/models/catalog`, {\n headers,\n signal: AbortSignal.timeout(source.timeoutMs ?? 10_000),\n });\n if (res.status === 304) return { kept: true };\n if (!res.ok) throw new Error(`catalog fetch failed with status ${res.status}`);\n const json: unknown = await res.json();\n const parsed = EnvelopeSchema.safeParse(json);\n if (!parsed.success) throw new Error(\"invalid catalog response: missing rows\");\n const { rows, revision: rev, dropped } = toEnvelope(parsed.data, logger);\n if (rev === undefined) return { rows, fromCache: false, dropped };\n return { rows, revision: rev, fromCache: false, dropped };\n}\n\n/** A cache write failure must not demote a successful remote load. */\nasync function writeCache(\n source: CatalogSource,\n logger: Logger,\n rows: CatalogModel[],\n rev: string | undefined,\n): Promise<void> {\n if (!source.cache) return;\n try {\n await source.cache.set(JSON.stringify({ rows, revision: rev }));\n } catch (err) {\n logger.warn(`[modelkit] catalog cache write failed: ${describeError(err)}`);\n }\n}\n\nasync function prime(source: CatalogSource, logger: Logger): Promise<PrimeCatalogResult> {\n try {\n const fetched = await fetchRemote(source, logger);\n if (\"kept\" in fetched) {\n const result: PrimeCatalogResult = { origin: liveState.origin, rowCount: rowCount() };\n if (liveState.revision !== undefined) result.revision = liveState.revision;\n logPrimed(logger, result);\n return result;\n }\n liveCatalog.replace(fetched.rows);\n liveState.origin = \"remote\";\n liveState.revision = fetched.revision;\n await writeCache(source, logger, fetched.rows, fetched.revision);\n const result: PrimeCatalogResult = { origin: liveState.origin, rowCount: rowCount() };\n if (fetched.revision !== undefined) result.revision = fetched.revision;\n if (fetched.dropped > 0) result.droppedRows = fetched.dropped;\n logPrimed(logger, result);\n return result;\n } catch (err) {\n logger.warn(`[modelkit] catalog remote failed, trying cache: ${describeError(err)}`);\n const error = describeError(err);\n try {\n const cached = await source.cache?.get();\n if (!cached) throw new Error(\"no cached catalog\");\n const cachedParsed = EnvelopeSchema.safeParse(JSON.parse(cached));\n if (!cachedParsed.success) throw new Error(\"invalid catalog response: missing rows\");\n const { rows, revision: rev, dropped } = toEnvelope(cachedParsed.data, logger);\n liveCatalog.replace(rows);\n liveState.origin = \"last-good\";\n liveState.revision = rev;\n const result: PrimeCatalogResult = {\n origin: liveState.origin,\n rowCount: rowCount(),\n error,\n };\n if (rev !== undefined) result.revision = rev;\n if (dropped > 0) result.droppedRows = dropped;\n logPrimed(logger, result);\n return result;\n } catch (cacheErr) {\n logger.warn(\n `[modelkit] catalog cache failed, using snapshot: ${describeError(cacheErr)}`,\n );\n liveCatalog.replace([...MODELS]);\n liveState.origin = \"snapshot\";\n liveState.revision = undefined;\n const result: PrimeCatalogResult = {\n origin: liveState.origin,\n rowCount: rowCount(),\n error,\n };\n logPrimed(logger, result);\n return result;\n }\n }\n}\n\nasync function refresh(source: CatalogSource, logger: Logger): Promise<void> {\n try {\n const fetched = await fetchRemote(source, logger);\n if (\"kept\" in fetched) return;\n liveCatalog.replace(fetched.rows);\n liveState.origin = \"remote\";\n liveState.revision = fetched.revision;\n await writeCache(source, logger, fetched.rows, fetched.revision);\n } catch (err) {\n logger.warn(\n `[modelkit] catalog refresh failed, keeping current rows: ${describeError(err)}`,\n );\n }\n}\n\n/** Fetch, validate, swap into liveCatalog. Never throws. Second call returns the same promise. */\nexport function primeCatalog(source: CatalogSource): Promise<PrimeCatalogResult> {\n if (liveState.memo) return liveState.memo;\n const logger = source.logger ?? console;\n const pending = prime(source, logger).then((result) => {\n const ttlMs = source.ttlMs ?? 300_000;\n if (ttlMs > 0 && liveState.timer === undefined) {\n liveState.timer = setInterval(() => void refresh(source, logger), ttlMs);\n liveState.timer.unref?.();\n }\n return result;\n });\n liveState.memo = pending;\n return pending;\n}\n\n/** Test seam: stop the refresh timer, reset liveCatalog to MODELS and clear the memo. */\nexport function resetLiveCatalog(): void {\n if (liveState.timer !== undefined) {\n clearInterval(liveState.timer);\n liveState.timer = undefined;\n }\n liveState.memo = undefined;\n liveState.revision = undefined;\n liveState.origin = \"snapshot\";\n liveCatalog.replace([...MODELS]);\n}\n","import { z } from \"zod\";\nimport type {\n CatalogModel,\n VideoResolution,\n VideoToolConstraints,\n VideoToolOutputSpec,\n VideoToolRequest,\n} from \"../types.js\";\nimport { overMax } from \"../video-length.js\";\nimport { subtitleProblem } from \"./subtitles-spec.js\";\n\nconst RangeSchema = z.object({ min: z.number(), max: z.number() });\nconst ToolSchema = z.object({\n kind: z.enum([\"upscale\", \"interpolate\", \"hdr\", \"bg-remove\", \"subtitles\"]),\n upscaleFactor: RangeSchema.optional(),\n maxOutputLongEdge: z.number().positive().optional(),\n prompt: z.boolean().optional(),\n fps: RangeSchema.optional(),\n outputFormats: z\n .array(z.enum([\"h265\", \"prores\", \"exr\"]))\n .min(1)\n .optional(),\n maxOutputShortEdge: z.number().positive().optional(),\n maxOutputFrames: z.number().positive().optional(),\n minOutputFrames: z.number().positive().optional(),\n maxOutputFps: z.number().positive().optional(),\n presets: z.array(z.string().min(1)).min(1).optional(),\n languages: z.array(z.string().min(1)).min(1).optional(),\n translationLanguages: z.array(z.string().min(1)).min(1).optional(),\n maxSecondsAbove1080p: z.number().positive().optional(),\n});\n\n/** A video-tool row's constraints, or undefined when the row has none or they are invalid. */\nexport function videoToolConstraints(row: CatalogModel): VideoToolConstraints | undefined {\n if (row.type !== \"video-tool\") return undefined;\n const parsed = ToolSchema.safeParse(row.constraints.tool);\n if (!parsed.success) return undefined;\n const {\n kind,\n upscaleFactor,\n maxOutputLongEdge,\n prompt,\n fps,\n outputFormats,\n maxOutputShortEdge,\n maxOutputFrames,\n minOutputFrames,\n maxOutputFps,\n presets,\n languages,\n translationLanguages,\n maxSecondsAbove1080p,\n } = parsed.data;\n return {\n kind,\n ...(upscaleFactor !== undefined && { upscaleFactor }),\n ...(maxOutputLongEdge !== undefined && { maxOutputLongEdge }),\n ...(prompt !== undefined && { prompt }),\n ...(fps !== undefined && { fps }),\n ...(outputFormats !== undefined && { outputFormats }),\n ...(maxOutputShortEdge !== undefined && { maxOutputShortEdge }),\n ...(maxOutputFrames !== undefined && { maxOutputFrames }),\n ...(minOutputFrames !== undefined && { minOutputFrames }),\n ...(maxOutputFps !== undefined && { maxOutputFps }),\n ...(presets !== undefined && { presets }),\n ...(languages !== undefined && { languages }),\n ...(translationLanguages !== undefined && { translationLanguages }),\n ...(maxSecondsAbove1080p !== undefined && { maxSecondsAbove1080p }),\n };\n}\n\n/** The pricing tier a frame lands in, by its short edge. */\nexport function resolutionTier(width: number, height: number): VideoResolution {\n const shortEdge = Math.min(width, height);\n if (shortEdge <= 360) return \"360p\";\n if (shortEdge <= 480) return \"480p\";\n if (shortEdge <= 720) return \"720p\";\n if (shortEdge <= 1080) return \"1080p\";\n if (shortEdge <= 1440) return \"2k\";\n return \"4k\";\n}\n\nexport type VideoToolPlan =\n | { ok: true; output: VideoToolOutputSpec }\n | { ok: false; error: string };\n\nfunction fail(error: string): VideoToolPlan {\n return { ok: false, error };\n}\n\n/**\n * What a video-tool request produces, checked against the row. Pure: callers use it to\n * validate and price before submitting, and the adapter uses it to build the usage event.\n */\nexport function planVideoTool(\n row: CatalogModel,\n req: Omit<VideoToolRequest, \"model\">,\n): VideoToolPlan {\n const tool = videoToolConstraints(row);\n if (!tool) return fail(`${row.id} is not a video tool`);\n const { width, height, durationSeconds, fps } = req.source;\n if (!(width > 0 && height > 0 && durationSeconds > 0)) {\n return fail(\"The source video's width, height and duration are required\");\n }\n const maxSeconds = row.constraints.sourceVideoSeconds?.max;\n if (maxSeconds !== undefined && overMax(durationSeconds, maxSeconds)) {\n return fail(`${row.label} takes source videos up to ${maxSeconds} seconds.`);\n }\n const base = {\n durationSeconds,\n ...(fps !== undefined && { fps }),\n };\n if (tool.kind === \"upscale\") {\n const factor = req.upscaleFactor;\n if (factor === undefined) return fail(\"An upscale factor is required\");\n const range = tool.upscaleFactor;\n if (range && (factor < range.min || factor > range.max)) {\n return fail(`${row.label} upscales by ${range.min}x to ${range.max}x.`);\n }\n const outWidth = Math.round(width * factor);\n const outHeight = Math.round(height * factor);\n const limit = tool.maxOutputLongEdge;\n if (limit !== undefined && Math.max(outWidth, outHeight) > limit) {\n return fail(\n `A ${factor}x upscale of a ${width}x${height} video passes the ${limit}px limit.`,\n );\n }\n return {\n ok: true,\n output: {\n ...base,\n width: outWidth,\n height: outHeight,\n resolution: resolutionTier(outWidth, outHeight),\n format: \"h264\",\n },\n };\n }\n if (tool.kind === \"interpolate\") {\n const target = req.targetFps;\n if (target === undefined || !Number.isInteger(target)) {\n return fail(\"A whole-number target frame rate is required\");\n }\n const range = tool.fps;\n if (range && (target < range.min || target > range.max)) {\n return fail(`${row.label} outputs ${range.min} to ${range.max} fps.`);\n }\n return {\n ok: true,\n output: {\n durationSeconds,\n fps: target,\n width,\n height,\n resolution: resolutionTier(width, height),\n format: \"h264\",\n },\n };\n }\n if (tool.kind === \"bg-remove\") {\n return {\n ok: true,\n output: {\n ...base,\n width,\n height,\n resolution: resolutionTier(width, height),\n format: \"vp9\",\n },\n };\n }\n if (tool.kind === \"subtitles\") {\n const resolution = resolutionTier(width, height);\n const problem = subtitleProblem(\n row.label,\n tool,\n req.subtitles,\n resolution,\n durationSeconds,\n );\n if (problem !== undefined) return fail(problem);\n return { ok: true, output: { ...base, width, height, resolution, format: \"h264\" } };\n }\n const formats = tool.outputFormats ?? [\"h265\"];\n const format = req.outputFormat ?? formats[0] ?? \"h265\";\n if (!formats.includes(format)) {\n return fail(`${row.label} writes ${formats.join(\" or \")}.`);\n }\n const timing = renderedTiming(row, tool, durationSeconds, fps);\n if (!timing.ok) return fail(timing.error);\n const out = shrinkToShortEdge(width, height, tool.maxOutputShortEdge);\n return {\n ok: true,\n output: {\n durationSeconds: timing.durationSeconds ?? durationSeconds,\n ...(timing.fps !== undefined && { fps: timing.fps }),\n ...(timing.frames !== undefined && { frames: timing.frames }),\n ...out,\n resolution: resolutionTier(out.width, out.height),\n format,\n },\n };\n}\n\ntype RenderedTiming =\n | { ok: true; fps?: number; frames?: number; durationSeconds?: number }\n | { ok: false; error: string };\n\n// fal's default rate for frame-counted tools, used when the caller did not measure the source.\nconst DEFAULT_FPS = 24;\n\n/**\n * The rate, frame count and resulting length a frame-counted row renders (its rate cap and\n * frame bounds applied), or why it cannot. The length is frames / fps, so rounding and the\n * minimum-frame padding reach the output metadata and the billed seconds. A row without\n * frame limits keeps the source rate and length.\n */\nfunction renderedTiming(\n row: CatalogModel,\n tool: VideoToolConstraints,\n durationSeconds: number,\n fps: number | undefined,\n): RenderedTiming {\n const { maxOutputFps, minOutputFrames, maxOutputFrames } = tool;\n if (\n maxOutputFps === undefined &&\n minOutputFrames === undefined &&\n maxOutputFrames === undefined\n ) {\n return fps !== undefined ? { ok: true, fps } : { ok: true };\n }\n const rate = Math.min(fps ?? DEFAULT_FPS, maxOutputFps ?? Infinity);\n const frames = Math.max(minOutputFrames ?? 1, Math.round(durationSeconds * rate));\n if (maxOutputFrames !== undefined && frames > maxOutputFrames) {\n const limit = `${maxOutputFrames} frames (${seconds(maxOutputFrames, rate)})`;\n return { ok: false, error: `${row.label} renders up to ${limit}.` };\n }\n return { ok: true, fps: rate, frames, durationSeconds: frames / rate };\n}\n\nfunction seconds(frames: number, rate: number): string {\n return `${Math.floor((frames / rate) * 10) / 10} s at ${rate} fps`;\n}\n\ninterface FrameSize {\n width: number;\n height: number;\n}\n\nfunction shrinkToShortEdge(width: number, height: number, limit: number | undefined): FrameSize {\n const shortEdge = Math.min(width, height);\n if (limit === undefined || shortEdge <= limit) return { width, height };\n const scale = limit / shortEdge;\n return { width: Math.round(width * scale), height: Math.round(height * scale) };\n}\n","/** A measured video length at the tenth of a second. */\nexport function tenths(seconds: number): number {\n return Math.round(seconds * 10) / 10;\n}\n\n/**\n * Whether a measured length is over a maximum. ffprobe reads a clip at its container length (a\n * 10 s clip reads 10.04 s), so a clip is over only when its tenth is over too. Never stricter than\n * the raw comparison, so a limit that is not a whole tenth (10.05 s) still takes a clip at it.\n * Minimums stay raw: the over-read makes a clip that reads short shorter still.\n */\nexport function overMax(seconds: number, max: number): boolean {\n return seconds > max && tenths(seconds) > max;\n}\n\n/** Whether measured lengths add up past a total: each clip's over-read is forgiven once. */\nexport function overTotal(lengths: readonly number[], total: number): boolean {\n const sum = (values: readonly number[]) => values.reduce((acc, len) => acc + len, 0);\n return sum(lengths) > total && tenths(sum(lengths.map(tenths))) > total;\n}\n","import type {\n SubtitleOptions,\n SubtitleTextStyle,\n VideoResolution,\n VideoToolConstraints,\n} from \"../types.js\";\nimport { overMax } from \"../video-length.js\";\n\nconst HEX_COLOR = /^#([0-9A-Fa-f]{3}){1,2}$/;\n\nfunction textStyleProblem(tier: string, style: SubtitleTextStyle | undefined): string | undefined {\n if (style === undefined) return undefined;\n if (style.font !== undefined && style.font.trim() === \"\") {\n return `The ${tier} subtitle font is empty.`;\n }\n const { weight, color } = style;\n if (weight !== undefined && !(Number.isInteger(weight) && weight >= 100 && weight <= 900)) {\n return `The ${tier} subtitle weight must be a whole number from 100 to 900; got ${weight}.`;\n }\n if (color !== undefined && !HEX_COLOR.test(color)) {\n return `The ${tier} subtitle color must be #rgb or #rrggbb; got \"${color}\".`;\n }\n return undefined;\n}\n\nfunction listed(value: string | undefined, allowed: string[] | undefined): boolean {\n return value === undefined || allowed === undefined || allowed.includes(value);\n}\n\n/** The preset a subtitles request renders: the caller's, else the row's first. */\nexport function subtitlePreset(\n tool: VideoToolConstraints,\n options: SubtitleOptions | undefined,\n): string | undefined {\n return options?.preset ?? tool.presets?.[0];\n}\n\n/** Why the row cannot caption this source with these options, or undefined when it can. */\nexport function subtitleProblem(\n label: string,\n tool: VideoToolConstraints,\n options: SubtitleOptions | undefined,\n resolution: VideoResolution,\n durationSeconds: number,\n): string | undefined {\n const preset = subtitlePreset(tool, options);\n if (preset === undefined) return `${label} needs a subtitle preset.`;\n if (!listed(preset, tool.presets)) return `${label} has no subtitle preset \"${preset}\".`;\n if (!listed(options?.language, tool.languages)) {\n return `${label} does not transcribe language \"${options?.language}\".`;\n }\n // Translation is billed extra by the provider, so a row without a list refuses it.\n const translation = options?.translationLanguage;\n if (translation !== undefined && !(tool.translationLanguages ?? []).includes(translation)) {\n return `${label} does not translate into \"${options?.translationLanguage}\".`;\n }\n const aboveFullHd = resolution === \"2k\" || resolution === \"4k\";\n const cap = tool.maxSecondsAbove1080p;\n if (aboveFullHd && cap !== undefined && overMax(durationSeconds, cap)) {\n return `${label} takes source videos above 1080p up to ${cap} seconds.`;\n }\n return (\n textStyleProblem(\"baseline\", options?.baseline) ??\n textStyleProblem(\"highlighted\", options?.highlighted)\n );\n}\n","import { ModelKitError } from \"./errors.js\";\nimport type { OnUnsupported } from \"./resolve-options.js\";\nimport type { CatalogModel, Warning } from \"./types.js\";\n\n// A request value that must be one of a row's listed ids: a voice, a language, an output\n// format. Shared by the music resolver and the media-node resolvers.\n\nexport interface ListedChoice {\n /** The request field, as warnings and errors name it. */\n field: string;\n value: string | undefined;\n /** The ids the row lists; undefined when the row offers no choice. */\n listed: readonly string[] | undefined;\n /** The row default, used when the value is unset (and, coercing, when it is unknown). */\n fallback: string | undefined;\n /** A required value has no provider default to fall back to. */\n required?: boolean;\n}\n\nfunction preview(listed: readonly string[]): string {\n const shown = listed.slice(0, 12).join(\", \");\n return listed.length > 12 ? `${shown}, ... (${listed.length} in all)` : shown;\n}\n\n/** The value to send, or undefined to send none (the provider default). */\nexport function resolveListed(\n model: CatalogModel,\n choice: ListedChoice,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): string | undefined {\n const { field, listed, required } = choice;\n const value = choice.value?.trim() || undefined;\n if (value === undefined) {\n const fallback = listed === undefined ? undefined : choice.fallback;\n if (fallback === undefined && required) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} needs ${field}`,\n model: model.id,\n });\n }\n return fallback;\n }\n if (listed === undefined) {\n if (required) return value;\n warnings.push({\n code: \"option_ignored\",\n field,\n from: value,\n message: `${model.id} does not support ${field}; ignored`,\n });\n return undefined;\n }\n if (listed.includes(value)) return value;\n const fallback = required ? undefined : choice.fallback;\n if (onUnsupported === \"error\" || required) {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} has no ${field} \"${value}\". Supported: ${preview(listed)}.`,\n model: model.id,\n });\n }\n warnings.push({\n code: \"option_ignored\",\n field,\n from: value,\n ...(fallback !== undefined && { to: fallback }),\n message:\n fallback === undefined\n ? `${field} ${value} dropped for ${model.id}`\n : `${field} ${value} replaced by ${fallback} for ${model.id}`,\n });\n return fallback;\n}\n\n/** An output format the row lists, else its default; none when the row lists none. */\nexport function resolveOutputFormat(\n model: CatalogModel,\n format: string | undefined,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): string | undefined {\n const listed = model.constraints.outputFormats;\n const choice = {\n field: \"outputFormat\",\n value: format,\n listed,\n fallback: model.defaults.outputFormat,\n };\n return resolveListed(model, choice, onUnsupported, warnings);\n}\n","import { ModelKitError } from \"./errors.js\";\nimport { withPromptForResolve, type RuleProblem } from \"./resolve-provider-rules.js\";\nimport type {\n AspectRatio,\n CatalogModel,\n ImageQuality,\n ImageRequest,\n ImageSize,\n OutputFormat,\n Warning,\n} from \"./types.js\";\n\n// What each fal image family's endpoints accept, read from their queue OpenAPI schemas\n// (adapters/__fixtures__/fal). The resolver and the fal-image planner check a request against\n// the same spec, so `resolveOptions` refuses exactly what execution would.\n\n/** The custom `image_size` limits a fal endpoint's schema documents. */\nexport interface ExactSizeBounds {\n minSide: number;\n maxSide: number;\n minArea: number;\n maxArea: number;\n multipleOf: number;\n}\n\nexport interface FalImageSpec {\n label: string;\n /** The edit-only family (upscale): a source image is the input. */\n referencesRequired?: boolean;\n maxReferences: number;\n /** Images per call; 1 means the endpoint has no count field. */\n maxCount: number;\n outputFormats: readonly OutputFormat[];\n /** Provider prompt maxLength; absent means the endpoint takes no prompt or sets none. */\n promptMax?: number;\n promptRequired: boolean;\n /** Ratios the endpoints take; absent means the family sends none. */\n aspectRatios?: readonly AspectRatio[];\n qualities?: readonly ImageQuality[];\n /** Present when the endpoints take a custom `{ width, height }`. */\n exactSize?: ExactSizeBounds;\n}\n\nconst WIDE_RATIOS: readonly AspectRatio[] = [\n \"1:1\",\n \"16:9\",\n \"9:16\",\n \"4:3\",\n \"3:4\",\n \"3:2\",\n \"2:3\",\n \"4:5\",\n \"5:4\",\n \"21:9\",\n \"9:21\",\n];\n\nconst KLING_RATIOS: readonly AspectRatio[] = [\n \"16:9\",\n \"9:16\",\n \"1:1\",\n \"4:3\",\n \"3:4\",\n \"3:2\",\n \"2:3\",\n \"21:9\",\n];\n\n// \"adaptive\" where the edit endpoint keeps the source ratio (\"auto\") and text-to-image omits it.\nconst GROK_RATIOS: readonly AspectRatio[] = [\n \"16:9\",\n \"4:3\",\n \"3:2\",\n \"1:1\",\n \"2:3\",\n \"3:4\",\n \"9:16\",\n \"adaptive\",\n];\n\n// Recraft's canvas sizes (fal's named sizes plus custom 3:2 and 5:4 pairs).\nconst RECRAFT_RATIOS: readonly AspectRatio[] = [\n \"1:1\",\n \"4:3\",\n \"3:4\",\n \"16:9\",\n \"9:16\",\n \"3:2\",\n \"2:3\",\n \"5:4\",\n \"4:5\",\n];\n\nconst ALL_FORMATS: readonly OutputFormat[] = [\"png\", \"jpeg\", \"webp\"];\n\n// The schema's x-fal limits. fal rounds other sides up to 16, so only multiples are exact.\nconst KREA_EXACT: ExactSizeBounds = {\n minSide: 256,\n maxSide: 3200,\n minArea: 256 * 256,\n maxArea: 4_220_160,\n multipleOf: 16,\n};\n\n// The schema's ImageSize sides (integers up to 14142) and its 512² to 2048² total.\nconst QWEN_EXACT: ExactSizeBounds = {\n minSide: 1,\n maxSide: 14142,\n minArea: 512 * 512,\n maxArea: 2048 * 2048,\n multipleOf: 1,\n};\n\n/** fal image families by the row's `providerModelId` (the text-to-image or upscale id). */\nexport const FAL_IMAGE_SPECS = new Map<string, FalImageSpec>([\n [\n \"krea/v3/text-to-image\",\n {\n label: \"Krea 3\",\n maxReferences: 8,\n maxCount: 1,\n outputFormats: [\"png\", \"jpeg\"],\n promptMax: 5000,\n promptRequired: true,\n aspectRatios: WIDE_RATIOS,\n exactSize: KREA_EXACT,\n },\n ],\n // Neither the text-to-image nor the edit schema has an image_size field.\n [\n \"xai/grok-imagine-image/v2.0/text-to-image\",\n {\n label: \"Grok Imagine Image 2.0\",\n maxReferences: 5,\n maxCount: 4,\n outputFormats: [\"jpeg\", \"png\", \"webp\"],\n promptMax: 8000,\n promptRequired: true,\n aspectRatios: GROK_RATIOS,\n qualities: [\"auto\", \"low\", \"medium\"],\n },\n ],\n [\n \"alibaba/qwen-image-3/text-to-image\",\n {\n label: \"Qwen Image 3\",\n maxReferences: 3,\n maxCount: 6,\n outputFormats: ALL_FORMATS,\n promptMax: 5000,\n promptRequired: true,\n aspectRatios: WIDE_RATIOS,\n exactSize: QWEN_EXACT,\n },\n ],\n [\n \"fal-ai/kling-image/o3/text-to-image\",\n {\n label: \"Kling Image O3\",\n maxReferences: 10,\n maxCount: 9,\n outputFormats: ALL_FORMATS,\n promptMax: 2500,\n promptRequired: true,\n aspectRatios: [...KLING_RATIOS, \"adaptive\"],\n },\n ],\n [\n \"fal-ai/kling-image/v3/text-to-image\",\n {\n label: \"Kling Image 3.0\",\n maxReferences: 1,\n maxCount: 9,\n outputFormats: ALL_FORMATS,\n promptMax: 2500,\n promptRequired: true,\n aspectRatios: KLING_RATIOS,\n },\n ],\n [\n \"recraft/v4.1/flash/text-to-image\",\n {\n label: \"Recraft V4.1 Flash\",\n maxReferences: 0,\n maxCount: 1,\n outputFormats: [],\n promptMax: 10000,\n promptRequired: true,\n aspectRatios: RECRAFT_RATIOS,\n },\n ],\n [\n \"fal-ai/sensenova-u1-infographic\",\n {\n label: \"SenseNova U1 Infographic\",\n maxReferences: 0,\n maxCount: 1,\n outputFormats: [\"jpeg\", \"png\"],\n promptRequired: true,\n aspectRatios: [\"1:1\", \"16:9\", \"9:16\", \"3:2\", \"2:3\", \"4:3\", \"3:4\"],\n },\n ],\n [\n \"fal-ai/seedvr/upscale/image\",\n {\n label: \"SeedVR2 Upscale\",\n referencesRequired: true,\n maxReferences: 1,\n maxCount: 1,\n outputFormats: ALL_FORMATS,\n promptRequired: false,\n },\n ],\n]);\n\nexport function falImageSpec(providerModelId: string): FalImageSpec | undefined {\n return FAL_IMAGE_SPECS.get(providerModelId.toLowerCase());\n}\n\nconst AREA_1K = 1024 * 1024;\n\n/** An exact size the endpoint renders, and the tier it bills at. */\nexport interface ExactSize {\n width: number;\n height: number;\n tier: ImageSize;\n}\n\nexport type ExactSizeCheck = { ok: true; size: ExactSize } | { ok: false; message: string };\n\n/** Whether `exact` is within the bounds; it bills at the smallest tier whose area holds it. */\nexport function checkExactSize(exact: string, b: ExactSizeBounds): ExactSizeCheck {\n const match = /^(\\d+)x(\\d+)$/.exec(exact);\n if (match === null) {\n return { ok: false, message: `takes exactSize as WIDTHxHEIGHT in pixels; got \"${exact}\"` };\n }\n const width = Number(match[1]);\n const height = Number(match[2]);\n const area = width * height;\n const sideOk = [width, height].every(\n (side) => side >= b.minSide && side <= b.maxSide && side % b.multipleOf === 0,\n );\n if (!sideOk || area < b.minArea || area > b.maxArea) {\n const step = b.multipleOf > 1 ? `, multiples of ${b.multipleOf}` : \"\";\n return {\n ok: false,\n message: `takes an exactSize with sides of ${b.minSide} to ${b.maxSide} px${step} and ${b.minArea} to ${b.maxArea} px in total; got ${exact}`,\n };\n }\n return { ok: true, size: { width, height, tier: area <= AREA_1K ? \"1K\" : \"2K\" } };\n}\n\nfunction unsupported(message: string): RuleProblem {\n return { code: \"unsupported_option\", message };\n}\n\nfunction notListed(\n spec: FalImageSpec,\n field: string,\n value: string,\n listed: readonly string[],\n): RuleProblem | undefined {\n if (listed.includes(value)) return undefined;\n return unsupported(\n `${spec.label} does not support ${field} \"${value}\". Supported: ${listed.join(\", \") || \"none\"}.`,\n );\n}\n\nfunction sizeProblem(spec: FalImageSpec, req: ImageRequest): RuleProblem | undefined {\n if (req.exactSize !== undefined) {\n if (spec.exactSize === undefined) {\n return unsupported(\n `${spec.label} takes a size tier and aspect ratio, not an exactSize`,\n );\n }\n const check = checkExactSize(req.exactSize, spec.exactSize);\n // An exact size sets the canvas, so the ratio is not sent.\n return check.ok ? undefined : unsupported(`${spec.label}: ${check.message}`);\n }\n if (req.aspectRatio === undefined || spec.aspectRatios === undefined) return undefined;\n return notListed(spec, \"aspectRatio\", req.aspectRatio, spec.aspectRatios);\n}\n\n/** Why the family's endpoints cannot take this request, or undefined when they can. */\nexport function falImageProblem(spec: FalImageSpec, req: ImageRequest): RuleProblem | undefined {\n const refs = (req.references ?? []).length;\n if (refs === 0 && spec.referencesRequired) {\n return { code: \"missing_input\", message: `${spec.label} requires a source image` };\n }\n if (refs > 0 && spec.maxReferences === 0) {\n return unsupported(`${spec.label} generates from a prompt only and takes no images`);\n }\n if (refs > spec.maxReferences) {\n return unsupported(\n `${spec.label} takes at most ${spec.maxReferences} image(s); got ${refs}`,\n );\n }\n const count = req.count ?? 1;\n if (!Number.isInteger(count) || count < 1 || count > spec.maxCount) {\n return unsupported(`${spec.label} makes 1 to ${spec.maxCount} image(s) per call`);\n }\n if (req.outputFormat !== undefined) {\n const problem = notListed(spec, \"outputFormat\", req.outputFormat, spec.outputFormats);\n if (problem !== undefined) return problem;\n }\n if (spec.promptRequired && req.prompt.trim().length === 0) {\n return { code: \"missing_input\", message: `${spec.label} needs a prompt` };\n }\n if (spec.promptMax !== undefined && req.prompt.length > spec.promptMax) {\n return unsupported(`${spec.label} takes a prompt of at most ${spec.promptMax} characters`);\n }\n const size = sizeProblem(spec, req);\n if (size !== undefined) return size;\n if (req.quality !== undefined && spec.qualities !== undefined) {\n return notListed(spec, \"quality\", req.quality, spec.qualities);\n }\n return undefined;\n}\n\n/** The checked exact size of a request the spec accepts, or undefined when it sets none. */\nexport function falExactSize(spec: FalImageSpec, req: ImageRequest): ExactSize | undefined {\n if (req.exactSize === undefined || spec.exactSize === undefined) return undefined;\n const check = checkExactSize(req.exactSize, spec.exactSize);\n return check.ok ? check.size : undefined;\n}\n\n/**\n * fal image family rows: a request the endpoints cannot take is refused in both modes, and\n * an exact size sets `size` to the tier it bills at, so the resolved request carries it.\n * `callerSize` is the caller's own (resolved) size, undefined when only the row default set\n * it; only a caller's size that differs warns.\n */\nexport function applyFalImageRules(\n model: CatalogModel,\n req: ImageRequest,\n callerSize: ImageSize | undefined,\n warnings: Warning[],\n): void {\n if (model.adapter !== \"fal\") return;\n const spec = falImageSpec(model.providerModelId);\n if (spec === undefined) return;\n const problem = falImageProblem(spec, withPromptForResolve(req));\n if (problem !== undefined) {\n throw new ModelKitError({\n code: problem.code,\n message: problem.message,\n model: model.id,\n retryable: false,\n });\n }\n const exact = falExactSize(spec, req);\n if (exact === undefined) return;\n if (callerSize !== undefined && callerSize !== exact.tier) {\n warnings.push({\n code: \"size_coerced\",\n field: \"size\",\n from: callerSize,\n to: exact.tier,\n message: `${model.id} bills exactSize ${req.exactSize} at ${exact.tier}`,\n });\n }\n req.size = exact.tier;\n}\n","import type { VideoRequest, VideoResolution } from \"./types.js\";\n\n// Kept free of the Replicate SDK: the resolver, which the browser-safe catalog entry\n// reaches, reads the Kling tier too.\n\n/** Drop a \":version\" suffix so a pinned prediction routes by its base model id. */\nexport function replicateBaseModelId(providerModelId: string): string {\n const colon = providerModelId.indexOf(\":\");\n return colon === -1 ? providerModelId : providerModelId.slice(0, colon);\n}\n\nexport type ReplicateVideoKind = \"kling\" | \"kling-omni\" | \"hailuo\";\n\nconst REPLICATE_VIDEO_KINDS = new Map<string, ReplicateVideoKind>([\n [\"kling-video/v2.5-turbo/pro/image-to-video\", \"kling\"],\n [\"kling-video/v3.0/pro/image-to-video\", \"kling\"],\n [\"kwaivgi/kling-v3-video\", \"kling\"],\n [\"kwaivgi/kling-v3-omni-video\", \"kling-omni\"],\n [\"minimax/hailuo-02\", \"hailuo\"],\n]);\n\nexport function videoKind(providerModelId: string): ReplicateVideoKind | undefined {\n return REPLICATE_VIDEO_KINDS.get(replicateBaseModelId(providerModelId));\n}\n\nconst KLING_TIERS = [\n { mode: \"standard\", resolution: \"720p\" },\n { mode: \"pro\", resolution: \"1080p\" },\n { mode: \"4k\", resolution: \"4k\" },\n] as const satisfies readonly { mode: string; resolution: VideoResolution }[];\n\nexport type KlingTier = (typeof KLING_TIERS)[number];\n\n/** fal's Kling O3 endpoints, `<id>/<mode>/<task>`; the kling-v3-omni-video row runs here. */\nexport const KLING_O3_OMNI = \"fal-ai/kling-video/o3\";\n\n// The Replicate Kling V3 models have no resolution field: their mode enum selects\n// 720p (standard), 1080p (pro) or 4K (\"4k\"). fal's Kling O3 spells the same tiers in its\n// endpoint path. A resolution wins over an explicit mode.\nexport function klingTier(req: VideoRequest): KlingTier {\n return (\n KLING_TIERS.find((tier) => tier.resolution === req.resolution) ??\n KLING_TIERS.find((tier) => tier.mode === req.mode) ??\n KLING_TIERS[0]\n );\n}\n","import {\n checkInsertWindow,\n MINIMAX_H3_INSERT,\n ruleRefusal,\n withPromptForResolve,\n type RuleProblem,\n} from \"./resolve-provider-rules.js\";\nimport { KLING_O3_OMNI, klingTier, videoKind } from \"./replicate-video-kinds.js\";\nimport type { CatalogModel, MediaRef, VideoRequest, Warning } from \"./types.js\";\n\n// What the fal video family endpoints accept beyond what a row's constraints say: inputs that\n// must come together, inputs an endpoint has no field for, a required prompt, and limits on\n// one input that depend on another. The resolver and the family planners (adapters/fal-*.ts)\n// both check them, so `resolveOptions` refuses, in both modes, exactly what execution would.\n\ntype Problem = RuleProblem | undefined;\n\nconst MOTION_PRO = \"fal-ai/kling-video/v3/pro/motion-control\";\nconst MOTION_STANDARD = \"fal-ai/kling-video/v3/standard/motion-control\";\nconst O3_REFERENCE = \"fal-ai/kling-video/o3/pro/reference-to-video\";\nconst O3_EDIT = \"fal-ai/kling-video/o3/pro/video-to-video/edit\";\nconst KLING_V4 = \"kling/v4\";\nconst KLING_V4_EDIT = \"kling/v4/video-to-video/edit\";\nconst H3_TURBO = \"minimax/h3-max-turbo\";\nconst H3_RECAST = \"minimax/h3-max/recast\";\nconst H3_RELIGHT = \"minimax/h3-max/relight\";\nconst HAPPY_HORSE = \"alibaba/happy-horse/v1.1\";\nconst HAPPY_HORSE_EDIT = \"alibaba/happy-horse/video-edit\";\nconst VIDU_Q4 = \"fal-ai/vidu/q4\";\nconst OMNIHUMAN_V2 = \"bytedance/omnihuman/v2\";\n\n// Kling counts start/end frames and reference images against one cap of 7 per request.\nconst KLING_O3_IMAGE_CAP = 7;\n// Kling 4.0 reference-to-video: image_urls holds 10, and a start frame counts toward them.\nconst KLING_V4_IMAGE_CAP = 10;\n// fal: target_audio_url needs a clip of at least 2 s and a video of at least 2 s.\nconst TURBO_AUDIO_MIN_SECONDS = 2;\n// fal: wav or mp3, 4 to 300 seconds; the output runs as long as the audio.\nconst OMNIHUMAN_AUDIO_SECONDS = { min: 4, max: 300 };\n\nfunction missing(message: string): RuleProblem {\n return { code: \"missing_input\", message };\n}\n\nfunction unsupported(message: string): RuleProblem {\n return { code: \"unsupported_option\", message };\n}\n\nfunction count(refs: MediaRef[] | undefined): number {\n return (refs ?? []).length;\n}\n\nfunction noFrames(req: VideoRequest): Problem {\n if (req.firstFrame === undefined && req.lastFrame === undefined) return undefined;\n return unsupported(\"takes no start or end frame\");\n}\n\nfunction needsPrompt(req: VideoRequest): Problem {\n return req.prompt.trim().length === 0 ? missing(\"needs a prompt\") : undefined;\n}\n\nfunction needsSource(req: VideoRequest): Problem {\n return (\n noFrames(req) ??\n (req.sourceVideo === undefined ? missing(\"needs a source video\") : undefined)\n );\n}\n\n/** A limit fal documents on an input whose length the caller measured. */\nfunction inputSeconds(\n what: string,\n ref: MediaRef | undefined,\n limits: { min?: number; max?: number },\n): Problem {\n const length = ref?.durationSeconds;\n if (length === undefined) return undefined;\n if (limits.min !== undefined && length < limits.min) {\n return unsupported(`takes ${what} of at least ${limits.min} s; this one is ${length} s`);\n }\n if (limits.max !== undefined && length > limits.max) {\n return unsupported(`takes ${what} up to ${limits.max} s; this one is ${length} s`);\n }\n return undefined;\n}\n\nfunction motionControl(req: VideoRequest): Problem {\n const frames = noFrames(req);\n if (frames !== undefined) return frames;\n const images = count(req.referenceImages);\n const videos = count(req.referenceVideos);\n if (images === 0 || videos === 0) {\n return missing(\"needs one character image and one motion video\");\n }\n if (images > 1 || videos > 1) {\n return unsupported(\"takes exactly one character image and one motion video\");\n }\n return undefined;\n}\n\nfunction o3Reference(req: VideoRequest): Problem {\n const images = count(req.referenceImages);\n const frames = [req.firstFrame, req.lastFrame].filter((f) => f !== undefined).length;\n if (images + frames > KLING_O3_IMAGE_CAP) {\n return unsupported(\n `takes up to ${KLING_O3_IMAGE_CAP} images in all, frames included; this request has ${images + frames}`,\n );\n }\n return needsPrompt(req);\n}\n\nfunction hasReferences(req: VideoRequest): boolean {\n return count(req.referenceImages) + count(req.referenceVideos) > 0;\n}\n\n/** References route to reference-to-video, which has a start frame but no end frame. */\nfunction klingV4(req: VideoRequest): Problem {\n if (hasReferences(req)) {\n if (req.lastFrame !== undefined) {\n return unsupported(\"takes an end frame only without reference images or videos\");\n }\n const images = count(req.referenceImages) + (req.firstFrame === undefined ? 0 : 1);\n if (images > KLING_V4_IMAGE_CAP) {\n return unsupported(\n `takes up to ${KLING_V4_IMAGE_CAP} images in all, the start frame included; this request has ${images}`,\n );\n }\n }\n return needsPrompt(req);\n}\n\nfunction h3Turbo(req: VideoRequest): Problem {\n if (count(req.referenceImages) + count(req.referenceVideos) > 0) {\n return unsupported(\"takes no reference images or videos\");\n }\n const [audio, ...extra] = req.referenceAudios ?? [];\n if (extra.length > 0) return unsupported(\"takes one soundtrack audio clip\");\n if (audio !== undefined && (req.durationSeconds ?? 5) < TURBO_AUDIO_MIN_SECONDS) {\n return unsupported(\n `needs at least ${TURBO_AUDIO_MIN_SECONDS} s of video with a soundtrack`,\n );\n }\n return (\n inputSeconds(\"a soundtrack\", audio, { min: TURBO_AUDIO_MIN_SECONDS }) ?? needsPrompt(req)\n );\n}\n\nfunction h3Insert(req: VideoRequest): Problem {\n const source = needsSource(req);\n if (source !== undefined) return source;\n const window = checkInsertWindow(req);\n return window.ok ? undefined : { code: window.code, message: window.message };\n}\n\nfunction h3Recast(req: VideoRequest): Problem {\n const source = needsSource(req);\n if (source !== undefined) return source;\n return count(req.referenceImages) === 0\n ? missing(\"needs a photo of each new person\")\n : undefined;\n}\n\nfunction h3Relight(req: VideoRequest): Problem {\n const source = needsSource(req);\n if (source !== undefined) return source;\n const spheres = count(req.referenceImages);\n if (spheres === 0) return missing(\"needs a lighting sphere image\");\n return spheres > 1 ? unsupported(\"takes one lighting sphere image\") : undefined;\n}\n\n/** References route to reference-to-video, a start frame to image-to-video, else text. */\nfunction happyHorse(req: VideoRequest): Problem {\n if (req.lastFrame !== undefined) return unsupported(\"takes no end frame\");\n if (count(req.referenceVideos) + count(req.referenceAudios) > 0) {\n return unsupported(\"takes reference images only\");\n }\n const images = count(req.referenceImages);\n if (images > 0 && req.firstFrame !== undefined) {\n return unsupported(\"takes a start frame or reference images, not both\");\n }\n // image-to-video's prompt is optional; the other two endpoints require one.\n return images > 0 || req.firstFrame === undefined ? needsPrompt(req) : undefined;\n}\n\nfunction happyHorseEdit(req: VideoRequest): Problem {\n return needsSource(req) ?? needsPrompt(req);\n}\n\n/** fal has no Q4 text-to-video: references or a start frame are required. */\nfunction viduQ4(req: VideoRequest): Problem {\n if (req.lastFrame !== undefined) return unsupported(\"takes no end frame\");\n if (count(req.referenceVideos) > 0) return unsupported(\"takes no reference videos\");\n const images = count(req.referenceImages);\n if (images + count(req.referenceAudios) > 0) {\n if (req.firstFrame !== undefined) {\n return unsupported(\"takes a start frame or references, not both\");\n }\n if (images === 0) return missing(\"needs a reference image with reference audio\");\n return needsPrompt(req);\n }\n return req.firstFrame === undefined\n ? missing(\"needs a start frame or reference images\")\n : undefined;\n}\n\nfunction omnihuman(req: VideoRequest): Problem {\n const frames = noFrames(req);\n if (frames !== undefined) return frames;\n if (count(req.referenceVideos) > 0) return unsupported(\"takes no reference videos\");\n const [image, ...extraImages] = req.referenceImages ?? [];\n const [audio, ...extraAudios] = req.referenceAudios ?? [];\n if (image === undefined || audio === undefined) {\n return missing(\"needs one portrait image and one audio clip\");\n }\n if (extraImages.length > 0 || extraAudios.length > 0) {\n return unsupported(\"takes exactly one image and one audio clip\");\n }\n return inputSeconds(\"audio\", audio, OMNIHUMAN_AUDIO_SECONDS);\n}\n\nconst RULES: ReadonlyMap<string, (req: VideoRequest) => Problem> = new Map([\n [MOTION_PRO, motionControl],\n [MOTION_STANDARD, motionControl],\n [O3_REFERENCE, o3Reference],\n [KLING_O3_OMNI, o3Reference],\n [O3_EDIT, (req: VideoRequest) => needsSource(req) ?? needsPrompt(req)],\n [KLING_V4, klingV4],\n [KLING_V4_EDIT, (req: VideoRequest) => needsSource(req) ?? needsPrompt(req)],\n [H3_TURBO, h3Turbo],\n [MINIMAX_H3_INSERT, h3Insert],\n [H3_RECAST, h3Recast],\n [H3_RELIGHT, h3Relight],\n [HAPPY_HORSE, happyHorse],\n [HAPPY_HORSE_EDIT, happyHorseEdit],\n [VIDU_Q4, viduQ4],\n [OMNIHUMAN_V2, omnihuman],\n]);\n\n/** Why a fal family endpoint cannot take this request, or undefined when it can. */\nexport function falVideoProblem(providerModelId: string, req: VideoRequest): Problem {\n return RULES.get(providerModelId.toLowerCase())?.(req);\n}\n\n/** Vidu Q4 image-to-video renders no sound; sound is a reference-to-video option. */\nexport function viduSilentWarning(model: Pick<CatalogModel, \"id\">): Warning {\n return {\n code: \"option_ignored\",\n field: \"generateAudio\",\n from: true,\n message: `${model.id} image-to-video is silent; generateAudio applies to reference-to-video only`,\n };\n}\n\n/** H3 Max Turbo image-to-video has no aspect_ratio: an end frame alone sets the framing. */\nexport function h3EndFrameRatioWarning(\n model: Pick<CatalogModel, \"id\">,\n ratio: VideoRequest[\"aspectRatio\"],\n): Warning {\n return {\n code: \"ratio_dropped\",\n field: \"aspectRatio\",\n from: ratio,\n message: `${model.id} follows the end frame's aspect ratio`,\n };\n}\n\n/**\n * Kling rows that pick 720p/1080p/4K with `mode` (Replicate Kling V3, fal Kling O3 Omni), where\n * a resolution wins over it. The resolved request keeps only the resolution that renders, so a\n * stored request never pairs `resolution: \"720p\"` with the row's `mode: \"pro\"` default.\n */\nexport function takesKlingMode(model: CatalogModel): boolean {\n if (model.adapter === \"fal\") return model.providerModelId.toLowerCase() === KLING_O3_OMNI;\n if (model.adapter !== \"replicate\") return false;\n const kind = videoKind(model.providerModelId);\n return kind === \"kling\" || kind === \"kling-omni\";\n}\n\n/** Before the resolution check, so a resolution taken from `mode` is checked like any other. */\nexport function fillKlingModeResolution(model: CatalogModel, req: VideoRequest): void {\n if (takesKlingMode(model) && req.resolution === undefined) {\n req.resolution = klingTier(req).resolution;\n }\n}\n\n/**\n * fal video family rows: what the endpoint cannot take is refused in both modes. Two inputs\n * switch an option off, with a warning when the caller set it: a Vidu Q4 start frame runs\n * the silent image-to-video, and an H3 Max Turbo end frame alone sets the framing.\n */\nexport function applyFalVideoRules(\n model: CatalogModel,\n req: VideoRequest,\n callerRatio: VideoRequest[\"aspectRatio\"],\n warnings: Warning[],\n): void {\n if (model.adapter !== \"fal\") return;\n const problem = falVideoProblem(model.providerModelId, withPromptForResolve(req));\n if (problem !== undefined) throw ruleRefusal(model, problem.message, problem.code);\n const id = model.providerModelId.toLowerCase();\n const references = count(req.referenceImages) + count(req.referenceAudios);\n if (id === VIDU_Q4 && references === 0 && req.generateAudio === true) {\n warnings.push(viduSilentWarning(model));\n req.generateAudio = false;\n }\n // Kling 4.0 image-to-video takes no aspect_ratio: the start frame sets the framing.\n if (id === KLING_V4 && req.firstFrame !== undefined && !hasReferences(req)) {\n if (req.aspectRatio !== undefined) {\n if (callerRatio !== undefined) {\n warnings.push({\n code: \"ratio_dropped\",\n field: \"aspectRatio\",\n from: req.aspectRatio,\n message: `${model.id} follows the start frame's aspect ratio`,\n });\n }\n delete req.aspectRatio;\n }\n }\n const endFrameOnly = req.lastFrame !== undefined && req.firstFrame === undefined;\n if (id === H3_TURBO && endFrameOnly && req.aspectRatio !== undefined) {\n if (callerRatio !== undefined && callerRatio !== \"adaptive\") {\n warnings.push(h3EndFrameRatioWarning(model, req.aspectRatio));\n }\n delete req.aspectRatio;\n }\n}\n","import { ModelKitError } from \"./errors.js\";\nimport { resolveOutputFormat } from \"./resolve-lists.js\";\nimport { applyFalImageRules } from \"./resolve-image-rules.js\";\nimport {\n applyFalAudioRules,\n applyLumaVideoRules,\n applyMaskRules,\n applyXaiVideoRules,\n} from \"./resolve-provider-rules.js\";\nimport {\n applyFalVideoRules,\n fillKlingModeResolution,\n takesKlingMode,\n} from \"./resolve-video-rules.js\";\nimport { overMax, overTotal } from \"./video-length.js\";\nimport type {\n AspectRatio,\n AudioRequest,\n CatalogModel,\n ImageRequest,\n ImageSize,\n MediaRef,\n OutputFormat,\n RequiredInput,\n VideoRequest,\n VideoResolution,\n Warning,\n} from \"./types.js\";\n\nexport type OnUnsupported = \"error\" | \"coerce\";\n\nexport interface ResolveResult<T> {\n request: T;\n warnings: Warning[];\n}\n\nconst SIZE_ORDER: ImageSize[] = [\"512\", \"1K\", \"2K\", \"4K\"];\nconst RESOLUTION_ORDER: VideoResolution[] = [\"360p\", \"480p\", \"720p\", \"768p\", \"1080p\", \"2k\", \"4k\"];\n\nfunction ratioValue(r: AspectRatio): number {\n if (r === \"adaptive\") return 1;\n // SAFETY: every non-adaptive AspectRatio literal is \"<int>:<int>\", so the split has two numbers.\n const [w, h] = r.split(\":\").map(Number) as [number, number];\n return w / h;\n}\n\ntype Orientation = \"landscape\" | \"portrait\" | \"square\";\nfunction orientation(r: AspectRatio): Orientation {\n const v = ratioValue(r);\n return v > 1 ? \"landscape\" : v < 1 ? \"portrait\" : \"square\";\n}\n\n/** Nearest supported ratio in the same orientation bucket, else nearest overall, by log distance. */\nexport function nearestAspectRatio(requested: AspectRatio, supported: AspectRatio[]): AspectRatio {\n if (supported.includes(requested)) return requested;\n const target = requested === \"adaptive\" ? \"1:1\" : requested;\n const sameBucket = supported.filter(\n (s) => s !== \"adaptive\" && orientation(s) === orientation(target),\n );\n const pool = sameBucket.length > 0 ? sameBucket : supported.filter((s) => s !== \"adaptive\");\n const fallback = pool[0] ?? supported[0];\n if (!fallback) return target;\n const dist = (s: AspectRatio) =>\n Math.abs(Math.log(ratioValue(s)) - Math.log(ratioValue(target)));\n return pool.reduce((best, s) => (dist(s) < dist(best) ? s : best), fallback);\n}\n\nfunction nearestLowerTier<T extends string>(requested: T, supported: T[], order: T[]): T {\n const idx = order.indexOf(requested);\n for (let i = idx; i >= 0; i--) {\n const candidate = order[i];\n if (candidate !== undefined && supported.includes(candidate)) return candidate;\n }\n for (let i = idx + 1; i < order.length; i++) {\n const candidate = order[i];\n if (candidate !== undefined && supported.includes(candidate)) return candidate;\n }\n return requested;\n}\n\nfunction resolveTier<T extends string>(\n field: string,\n code: Warning[\"code\"],\n requested: T | undefined,\n supported: T[] | undefined,\n order: T[],\n model: CatalogModel,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): T | undefined {\n if (requested === undefined || !supported || supported.includes(requested)) return requested;\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} does not support ${field} \"${requested}\". Supported: ${supported.join(\", \")}.`,\n model: model.id,\n });\n }\n const to = nearestLowerTier(requested, supported, order);\n warnings.push({\n code,\n field,\n from: requested,\n to,\n message: `${field} ${requested} coerced to ${to} for ${model.id}`,\n });\n return to;\n}\n\n/**\n * A video resolution the row renders: unchanged when supported, else refused, or coerced to\n * the nearest supported lower tier (the nearest higher one when the row has none lower).\n */\nexport function resolveVideoResolution(\n requested: VideoResolution | undefined,\n model: CatalogModel,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): VideoResolution | undefined {\n return resolveTier(\n \"resolution\",\n \"resolution_coerced\",\n requested,\n model.constraints.resolutions,\n RESOLUTION_ORDER,\n model,\n onUnsupported,\n warnings,\n );\n}\n\nfunction resolveDuration(\n requested: number | undefined,\n durations: CatalogModel[\"constraints\"][\"durations\"],\n model: CatalogModel,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): number | undefined {\n if (requested === undefined || !durations) return requested;\n const inSet = Array.isArray(durations)\n ? durations.includes(requested)\n : requested >= durations.min && requested <= durations.max;\n if (inSet) return requested;\n if (onUnsupported === \"error\") {\n const supported = Array.isArray(durations)\n ? `Supported: ${durations.join(\", \")}.`\n : `Supported range: ${durations.min}-${durations.max}.`;\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} does not support durationSeconds ${requested}. ${supported}`,\n model: model.id,\n });\n }\n const to = Array.isArray(durations)\n ? durations.reduce(\n (best, d) => (Math.abs(d - requested) < Math.abs(best - requested) ? d : best),\n durations[0] ?? requested,\n )\n : Math.min(Math.max(requested, durations.min), durations.max);\n warnings.push({\n code: \"duration_coerced\",\n field: \"durationSeconds\",\n from: requested,\n to,\n message: `duration ${requested}s coerced to ${to}s for ${model.id}`,\n });\n return to;\n}\n\n/** An unsupported ratio errors under \"error\"; under \"coerce\" it snaps with a warning. */\nfunction resolveAspectRatio(\n requested: AspectRatio | undefined,\n supported: AspectRatio[] | undefined,\n model: CatalogModel,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): AspectRatio | undefined {\n if (requested === undefined || requested === \"adaptive\" || !supported) return requested;\n if (supported.includes(requested)) return requested;\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} does not support aspectRatio \"${requested}\". Supported: ${supported.join(\", \")}.`,\n model: model.id,\n });\n }\n const to = nearestAspectRatio(requested, supported);\n warnings.push({\n code: \"ratio_coerced\",\n field: \"aspectRatio\",\n from: requested,\n to,\n message: `aspect ratio ${requested} coerced to ${to} for ${model.id}`,\n });\n return to;\n}\n\nfunction compact(refs: MediaRef[] | undefined): MediaRef[] {\n return (refs ?? []).filter((r): r is MediaRef => Boolean(r));\n}\n\nfunction trim(\n field: string,\n refs: MediaRef[],\n limit: number | undefined,\n model: CatalogModel,\n warnings: Warning[],\n): MediaRef[] {\n if (limit === undefined || refs.length <= limit) return refs;\n warnings.push({\n code: \"references_trimmed\",\n field,\n from: refs.length,\n to: limit,\n message: `${field} trimmed from ${refs.length} to ${limit} for ${model.id}`,\n });\n return refs.slice(0, limit);\n}\n\nfunction knownLength(value: number | undefined): number | undefined {\n return value !== undefined && Number.isFinite(value) ? value : undefined;\n}\n\n/** One decimal, or more when rounding would make the length read as equal to the limit. */\nfunction seconds(len: number, limit: number): string {\n let digits = 1;\n while (digits < 3 && Number(len.toFixed(digits)) === limit) digits++;\n return len.toFixed(digits);\n}\n\nfunction effectiveMin(\n limits: { min?: number; editMin?: number } | undefined,\n taskType: string | undefined,\n): number | undefined {\n if (taskType !== \"edit\" || limits?.editMin === undefined) return limits?.min;\n return Math.max(limits.min ?? 0, limits.editMin);\n}\n\n/** First length violation for the videos a request sends, as a user-facing message. */\nexport function videoLengthViolation(\n model: CatalogModel,\n input: {\n referenceVideos?: (number | undefined)[];\n sourceVideo?: number;\n taskType?: VideoRequest[\"taskType\"];\n },\n): string | undefined {\n const limits = model.constraints.references?.videoSeconds;\n const refMin = effectiveMin(limits, input.taskType);\n const lengths = (input.referenceVideos ?? []).map(knownLength);\n if (limits?.max !== undefined) {\n const max = limits.max;\n const i = lengths.findIndex((len) => len !== undefined && overMax(len, max));\n if (i >= 0)\n return `${model.label} takes reference videos up to ${String(max)} s each; video ${i + 1} is ${seconds(lengths[i]!, max)} s.`;\n }\n if (refMin !== undefined) {\n const i = lengths.findIndex((len) => len !== undefined && len < refMin);\n if (i >= 0)\n return `${model.label} takes reference videos of at least ${String(refMin)} s each; video ${i + 1} is ${seconds(lengths[i]!, refMin)} s.`;\n }\n const source = knownLength(input.sourceVideo);\n const sourceLimits = model.constraints.sourceVideoSeconds;\n if (limits?.total !== undefined) {\n const counted = [\n ...lengths.filter((len): len is number => len !== undefined),\n ...(sourceLimits?.inReferenceTotal && source !== undefined ? [source] : []),\n ];\n const sum = counted.reduce((acc, len) => acc + len, 0);\n if (overTotal(counted, limits.total))\n return `${model.label} takes reference videos up to ${String(limits.total)} s combined; these add up to ${seconds(sum, limits.total)} s.`;\n }\n if (source === undefined) return undefined;\n const sourceMin = effectiveMin(sourceLimits, input.taskType);\n if (sourceLimits?.max !== undefined && overMax(source, sourceLimits.max))\n return `${model.label} takes a source video up to ${String(sourceLimits.max)} s; this one is ${seconds(source, sourceLimits.max)} s.`;\n if (sourceMin !== undefined && source < sourceMin)\n return `${model.label} takes a source video of at least ${String(sourceMin)} s; this one is ${seconds(source, sourceMin)} s.`;\n return undefined;\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 { outputFormat: defaultFormat, ...defaults } = model.defaults;\n const merged: ImageRequest = {\n ...defaults,\n ...(isImageFormat(defaultFormat) && { outputFormat: defaultFormat }),\n ...stripUndefined(request),\n model: model.id,\n };\n\n const aspectRatio = resolveAspectRatio(\n merged.aspectRatio,\n c.aspectRatios,\n model,\n onUnsupported,\n warnings,\n );\n if (aspectRatio !== undefined) merged.aspectRatio = aspectRatio;\n const 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 referenceLimit = c.references?.images ?? c.references?.total;\n const given = compact(merged.references);\n if (referenceLimit === 0 && given.length > 0 && onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} takes no images; it generates from the prompt alone`,\n model: model.id,\n });\n }\n const references = trim(\"references\", given, referenceLimit, model, warnings);\n if (references.length > 0) merged.references = references;\n else delete merged.references;\n if (c.requires?.includes(\"references\") && references.length === 0) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} requires at least one reference image`,\n model: model.id,\n });\n }\n dropUnsupported(merged, model, warnings, [\n \"seed\",\n \"quality\",\n \"count\",\n \"outputFormat\",\n \"scaleFactor\",\n \"safetySettings\",\n \"temperature\",\n \"upscale\",\n \"points\",\n \"boxes\",\n ]);\n const factor = merged.scaleFactor;\n if (factor !== undefined && c.scaleFactors && !c.scaleFactors.includes(factor)) {\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} does not offer scaleFactor ${factor}. Supported: ${c.scaleFactors.join(\", \")}.`,\n model: model.id,\n });\n }\n warnings.push({\n code: \"option_ignored\",\n field: \"scaleFactor\",\n from: factor,\n message: `${model.id} does not offer ${factor}x; the row default applies`,\n });\n delete merged.scaleFactor;\n const fallback = model.defaults?.scaleFactor;\n if (fallback !== undefined && c.scaleFactors.includes(fallback)) {\n merged.scaleFactor = fallback;\n }\n }\n if (model.type === \"mask\") applyMaskRules(model, merged, onUnsupported, warnings);\n applyFalImageRules(\n model,\n merged,\n request.size === undefined ? undefined : merged.size,\n warnings,\n );\n return { request: merged, warnings };\n}\n\nexport function resolveVideoOptions(\n model: CatalogModel,\n request: VideoRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<VideoRequest> {\n const warnings: Warning[] = [];\n const c = model.constraints;\n const merged: VideoRequest = { ...model.defaults, ...stripUndefined(request), model: model.id };\n\n // Dropped in both modes: the endpoint has no prompt field, so there is nothing to refuse.\n if (c.noPrompt) {\n const prompt = (merged.prompt ?? \"\").trim();\n if (prompt.length > 0) {\n warnings.push({\n code: \"option_ignored\",\n field: \"prompt\",\n message: `${model.id} takes no prompt; ignored`,\n });\n }\n merged.prompt = \"\";\n }\n\n // Conditioning compatibility: a source video only where the row takes\n // one, and frames never next to references where the row treats them\n // as exclusive. \"error\" refuses; \"coerce\" drops the losing input.\n if (merged.sourceVideo !== undefined && !model.capabilities?.acceptsSourceVideo) {\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} does not take a source video`,\n model: model.id,\n });\n }\n warnings.push({\n code: \"option_ignored\",\n field: \"sourceVideo\",\n message: `${model.id} does not take a source video; dropped`,\n });\n delete merged.sourceVideo;\n }\n const imageInputs = ([\"firstFrame\", \"lastFrame\", \"referenceImages\"] as const).filter((field) =>\n field === \"referenceImages\"\n ? compact(merged.referenceImages).length > 0\n : merged[field] !== undefined,\n );\n if (\n merged.sourceVideo !== undefined &&\n imageInputs.length > 0 &&\n model.capabilities?.sourceVideoExcludesFrames\n ) {\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} takes a source video or images, not both`,\n model: model.id,\n });\n }\n for (const field of imageInputs) {\n warnings.push({\n code: \"option_ignored\",\n field,\n message: `${model.id} takes a source video or images, not both; ${field} dropped`,\n });\n delete merged[field];\n }\n }\n // A row that takes an end frame only with a start frame: \"error\" refuses a lone\n // end frame; \"coerce\" sends it as the start frame, as callers got before the flag.\n if (\n merged.lastFrame !== undefined &&\n merged.firstFrame === undefined &&\n model.capabilities?.lastFrameRequiresFirstFrame\n ) {\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} takes an end frame only together with a start frame`,\n model: model.id,\n retryable: false,\n });\n }\n warnings.push({\n code: \"option_ignored\",\n field: \"lastFrame\",\n to: \"firstFrame\",\n message: `end frame used as start frame: ${model.id} needs a start frame with an end frame`,\n });\n merged.firstFrame = merged.lastFrame;\n delete merged.lastFrame;\n }\n const hasFrames = merged.firstFrame !== undefined || merged.lastFrame !== undefined;\n const hasRefs =\n compact(merged.referenceImages).length +\n compact(merged.referenceVideos).length +\n compact(merged.referenceAudios).length >\n 0;\n if (hasFrames && hasRefs && model.capabilities?.framesExcludeReferences) {\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} takes frames or references, not both`,\n model: model.id,\n });\n }\n warnings.push({\n code: \"option_ignored\",\n field: \"referenceImages\",\n message: `${model.id} takes frames or references, not both; references dropped`,\n });\n delete merged.referenceImages;\n delete merged.referenceVideos;\n delete merged.referenceAudios;\n }\n\n for (const input of c.ratioIgnoredWith ?? []) {\n if (merged[input] !== undefined && merged.aspectRatio !== undefined) {\n // Only the caller's own ratio deserves a warning; a catalog default dropping is expected.\n if (request.aspectRatio !== undefined) {\n warnings.push({\n code: \"ratio_dropped\",\n field: \"aspectRatio\",\n from: merged.aspectRatio,\n message: `${model.id} ignores aspectRatio when ${input} is set`,\n });\n }\n delete merged.aspectRatio;\n }\n }\n const aspectRatio = resolveAspectRatio(\n merged.aspectRatio,\n c.aspectRatios,\n model,\n onUnsupported,\n warnings,\n );\n if (aspectRatio !== undefined) merged.aspectRatio = aspectRatio;\n fillKlingModeResolution(model, merged);\n const resolution = resolveVideoResolution(merged.resolution, model, onUnsupported, warnings);\n if (resolution !== undefined) merged.resolution = resolution;\n if (takesKlingMode(model)) delete merged.mode;\n const duration = resolveDuration(\n merged.durationSeconds,\n c.durations,\n model,\n onUnsupported,\n warnings,\n );\n if (duration !== undefined) merged.durationSeconds = duration;\n\n const limits = c.references ?? {};\n let images = trim(\n \"referenceImages\",\n compact(merged.referenceImages),\n limits.images,\n model,\n warnings,\n );\n let videos = trim(\n \"referenceVideos\",\n compact(merged.referenceVideos),\n limits.videos,\n model,\n warnings,\n );\n let audios = trim(\n \"referenceAudios\",\n compact(merged.referenceAudios),\n limits.audios,\n model,\n warnings,\n );\n // Dormant on rows that accept no reference video: the adapter would drop\n // the clip and the lower cap would apply for nothing.\n if (\n limits.imagesWithVideo !== undefined &&\n (limits.videos ?? 0) > 0 &&\n videos.length > 0 &&\n images.length > limits.imagesWithVideo\n ) {\n images = trim(\"referenceImages\", images, limits.imagesWithVideo, model, 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 const lengthViolation = videoLengthViolation(model, {\n referenceVideos: videos.map((v) => v.durationSeconds),\n taskType: merged.taskType,\n ...(merged.sourceVideo?.durationSeconds !== undefined && {\n sourceVideo: merged.sourceVideo.durationSeconds,\n }),\n });\n if (lengthViolation !== undefined) {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: lengthViolation,\n model: model.id,\n retryable: false,\n });\n }\n setOrDelete(merged, \"referenceImages\", images);\n setOrDelete(merged, \"referenceVideos\", videos);\n setOrDelete(merged, \"referenceAudios\", audios);\n\n // `taskType` rides on \"taskType\" (Seedance's subtask hint); an extension row\n // accepts exactly `extend` without offering the other subtasks.\n const keepExtend =\n merged.taskType === \"extend\" &&\n (model.constraints.supports ?? []).includes(\"videoExtension\");\n dropUnsupported(merged, model, warnings, [\n \"seed\",\n \"negativePrompt\",\n \"cfgScale\",\n \"generateAudio\",\n \"promptExpansion\",\n \"lastFrame\",\n \"watermark\",\n \"safetyChecker\",\n \"insertWindow\",\n ...(keepExtend ? [] : ([\"taskType\"] as const)),\n ]);\n if (merged.previousInteractionId !== undefined && !keepExtend) {\n warnings.push({\n code: \"option_ignored\",\n field: \"previousInteractionId\",\n from: merged.previousInteractionId,\n message: `${model.id} does not support previousInteractionId; ignored`,\n });\n delete merged.previousInteractionId;\n }\n applyXaiVideoRules(model, merged, onUnsupported, warnings);\n applyLumaVideoRules(model, merged, onUnsupported, warnings);\n // Last, so an input that the trimming or coercion above removed cannot satisfy it.\n checkVideoRequired(model, merged);\n applyFalVideoRules(model, merged, request.aspectRatio, warnings);\n return { request: merged, warnings };\n}\n\nfunction checkVideoRequired(model: CatalogModel, req: VideoRequest): void {\n const c = model.constraints;\n const present = (input: RequiredInput): boolean =>\n input === \"references\"\n ? compact(req.referenceImages).length +\n compact(req.referenceVideos).length +\n compact(req.referenceAudios).length >\n 0\n : input !== \"sourceAudio\" && req[input] !== undefined;\n for (const input of c.requires ?? []) {\n if (!present(input))\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} requires ${input}`,\n model: model.id,\n });\n }\n if (c.requiresOneOf && !c.requiresOneOf.some(present)) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} requires one of: ${c.requiresOneOf.join(\", \")}`,\n model: model.id,\n });\n }\n const least = c.references?.min;\n const given = {\n images: compact(req.referenceImages).length,\n videos: compact(req.referenceVideos).length,\n audios: compact(req.referenceAudios).length,\n };\n for (const kind of [\"images\", \"videos\", \"audios\"] as const) {\n const needed = least?.[kind] ?? 0;\n if (given[kind] < needed) {\n const noun = kind.slice(0, -1);\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} requires at least ${needed} reference ${noun}${needed > 1 ? \"s\" : \"\"}`,\n model: model.id,\n });\n }\n }\n}\n\nexport function resolveAudioOptions(\n model: CatalogModel,\n request: AudioRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<AudioRequest> {\n const warnings: Warning[] = [];\n const c = model.constraints;\n const { voice: _voice, language: _language, ...defaults } = model.defaults;\n const merged: AudioRequest = { ...defaults, ...stripUndefined(request), model: model.id };\n\n const duration = resolveDuration(\n merged.durationSeconds,\n c.durations,\n model,\n onUnsupported,\n warnings,\n );\n if (duration !== undefined) merged.durationSeconds = duration;\n\n const references = trim(\n \"references\",\n compact(merged.references),\n c.references?.images ?? c.references?.total,\n model,\n warnings,\n );\n if (references.length > 0) merged.references = references;\n else delete merged.references;\n for (const input of c.requires ?? []) {\n const present =\n input === \"references\"\n ? references.length > 0\n : input === \"sourceVideo\" && merged.sourceVideo !== undefined;\n if (!present)\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} requires ${input}`,\n model: model.id,\n });\n }\n\n dropUnsupported(merged, model, warnings, [\"seed\", \"negativePrompt\", \"instrumental\", \"lyrics\"]);\n applyFalAudioRules(model, merged);\n const format = resolveOutputFormat(model, request.outputFormat, onUnsupported, warnings);\n if (format !== undefined) merged.outputFormat = format;\n else delete merged.outputFormat;\n return { request: merged, warnings };\n}\n\nfunction dropUnsupported<T extends object>(\n req: T,\n model: CatalogModel,\n warnings: Warning[],\n fields: (keyof T & string)[],\n): void {\n const supports = model.constraints.supports ?? [];\n for (const field of fields) {\n // SAFETY: `fields` are a subset of SupportedOption; the cast only bridges the generic key type.\n if (req[field] !== undefined && !supports.includes(field as never)) {\n warnings.push({\n code: \"option_ignored\",\n field,\n from: req[field],\n message: `${model.id} does not support ${field}; ignored`,\n });\n delete req[field];\n }\n }\n}\n\nfunction setOrDelete(\n req: VideoRequest,\n field: \"referenceImages\" | \"referenceVideos\" | \"referenceAudios\",\n refs: MediaRef[],\n): void {\n if (refs.length > 0) req[field] = refs;\n else delete req[field];\n}\n\nfunction isImageFormat(format: string | undefined): format is OutputFormat {\n return format === \"png\" || format === \"jpeg\" || format === \"webp\";\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 { promptConventions } from \"./catalog/conventions.js\";\nimport { ModelKitError } from \"./errors.js\";\nimport { resolveListed, resolveOutputFormat } from \"./resolve-lists.js\";\nimport {\n resolveVideoResolution,\n type OnUnsupported,\n type ResolveResult,\n} from \"./resolve-options.js\";\nimport type {\n CatalogModel,\n DubbingRequest,\n LipsyncRequest,\n MediaRef,\n RequiredInput,\n SpeechRequest,\n TranscriptionRequest,\n VoiceChangeRequest,\n Warning,\n} from \"./types.js\";\n\n// Resolvers for the speech, voice-change, lipsync, dubbing and transcription rows: the row's\n// required inputs and length limits are checked, a voice, language or format must be one the\n// row lists, and an option the row does not take is dropped with a warning.\n\ntype Present = Partial<Record<RequiredInput, boolean>>;\n\nfunction missing(model: CatalogModel, what: string): ModelKitError {\n return new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} requires ${what}`,\n model: model.id,\n });\n}\n\nfunction unsupported(model: CatalogModel, message: string): ModelKitError {\n return new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.label} ${message}`,\n model: model.id,\n });\n}\n\nfunction checkRequired(model: CatalogModel, present: Present): void {\n for (const input of model.constraints.requires ?? []) {\n if (present[input] !== true) throw missing(model, input);\n }\n const oneOf = model.constraints.requiresOneOf;\n if (oneOf !== undefined && !oneOf.some((input) => present[input] === true)) {\n throw missing(model, `one of ${oneOf.join(\", \")}`);\n }\n}\n\nfunction checkLength(\n model: CatalogModel,\n field: string,\n ref: MediaRef | undefined,\n limits: { min?: number; max?: number } | undefined,\n): void {\n const length = ref?.durationSeconds;\n if (length === undefined || limits === undefined) return;\n const tooShort = limits.min !== undefined && length < limits.min;\n const tooLong = limits.max !== undefined && length > limits.max;\n if (!tooShort && !tooLong) return;\n const range = `${limits.min ?? 0}-${limits.max ?? \"any\"} s`;\n throw unsupported(model, `takes ${field} of ${range}; got ${length} s`);\n}\n\nfunction ignored(\n warnings: Warning[],\n model: CatalogModel,\n field: string,\n from: string | undefined,\n): void {\n warnings.push({\n code: \"option_ignored\",\n field,\n from,\n message: `${model.id} does not support ${field}; ignored`,\n });\n}\n\nfunction voiceIds(model: CatalogModel): string[] | undefined {\n return model.constraints.voices?.map((v) => v.id);\n}\n\nfunction languageCodes(model: CatalogModel): string[] | undefined {\n return model.constraints.languages?.map((l) => l.code);\n}\n\nfunction resolveVoice(\n model: CatalogModel,\n voice: string | undefined,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): string | undefined {\n const choice = {\n field: \"voice\",\n value: voice,\n listed: voiceIds(model),\n fallback: model.defaults.voice,\n };\n return resolveListed(model, choice, onUnsupported, warnings);\n}\n\nfunction checkScript(model: CatalogModel, script: string): void {\n const text = script.trim();\n if (!text) throw missing(model, \"text\");\n const max = promptConventions(model).maxChars;\n if (max !== undefined && text.length > max) {\n throw unsupported(model, `takes up to ${max} characters; got ${text.length}`);\n }\n}\n\n/** `generateSpeech` on a `speech` row. */\nexport function resolveSpeechOptions(\n model: CatalogModel,\n request: SpeechRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<SpeechRequest> {\n const warnings: Warning[] = [];\n checkScript(model, request.text);\n const resolved: SpeechRequest = { model: model.id, text: request.text };\n const customVoice = request.customVoice?.trim();\n if (customVoice) {\n if (model.capabilities?.customVoices !== true) {\n throw unsupported(model, \"does not take a custom voice\");\n }\n if (request.voice?.trim()) throw unsupported(model, \"takes voice or customVoice, not both\");\n resolved.customVoice = customVoice;\n } else {\n const voice = resolveVoice(model, request.voice, onUnsupported, warnings);\n if (voice !== undefined) resolved.voice = voice;\n }\n const language = resolveListed(\n model,\n {\n field: \"language\",\n value: request.language,\n listed: languageCodes(model),\n fallback: model.defaults.language,\n },\n onUnsupported,\n warnings,\n );\n if (language !== undefined) resolved.language = language;\n const style = request.style?.trim();\n if (style && !(model.constraints.supports ?? []).includes(\"style\")) {\n ignored(warnings, model, \"style\", style);\n } else if (style) resolved.style = style;\n const format = resolveOutputFormat(model, request.outputFormat, onUnsupported, warnings);\n if (format !== undefined) resolved.outputFormat = format;\n return { request: resolved, warnings };\n}\n\n/** `changeVoice` on a `voice-change` row. */\nexport function resolveVoiceChangeOptions(\n model: CatalogModel,\n request: VoiceChangeRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<VoiceChangeRequest> {\n const warnings: Warning[] = [];\n checkRequired(model, { sourceAudio: true });\n checkLength(\n model,\n \"sourceAudio\",\n request.sourceAudio,\n model.constraints.references?.audioSeconds,\n );\n const resolved: VoiceChangeRequest = { model: model.id, sourceAudio: request.sourceAudio };\n const voice = resolveVoice(model, request.voice, onUnsupported, warnings);\n if (voice !== undefined) resolved.voice = voice;\n const format = resolveOutputFormat(model, request.outputFormat, onUnsupported, warnings);\n if (format !== undefined) resolved.outputFormat = format;\n return { request: resolved, warnings };\n}\n\n/** `lipsync` on a `lipsync` row: the face input is the one its `requires` names. */\nexport function resolveLipsyncOptions(\n model: CatalogModel,\n request: LipsyncRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<LipsyncRequest> {\n const warnings: Warning[] = [];\n const requires = model.constraints.requires ?? [];\n if (request.image !== undefined && !requires.includes(\"firstFrame\")) {\n throw unsupported(model, \"re-times a video and does not take an image\");\n }\n if (request.sourceVideo !== undefined && !requires.includes(\"sourceVideo\")) {\n throw unsupported(model, \"animates an image and does not take a sourceVideo\");\n }\n checkRequired(model, {\n sourceVideo: request.sourceVideo !== undefined,\n firstFrame: request.image !== undefined,\n sourceAudio: true,\n });\n checkLength(model, \"audio\", request.audio, model.constraints.references?.audioSeconds);\n checkLength(model, \"sourceVideo\", request.sourceVideo, model.constraints.sourceVideoSeconds);\n const resolved: LipsyncRequest = { model: model.id, audio: request.audio };\n if (request.sourceVideo !== undefined) resolved.sourceVideo = request.sourceVideo;\n if (request.image !== undefined) resolved.image = request.image;\n const asked = request.resolution ?? model.defaults.resolution;\n if ((model.constraints.resolutions ?? []).length === 0) {\n if (request.resolution !== undefined) ignored(warnings, model, \"resolution\", asked);\n } else {\n const resolution = resolveVideoResolution(asked, model, onUnsupported, warnings);\n if (resolution !== undefined) resolved.resolution = resolution;\n }\n return { request: resolved, warnings };\n}\n\n/** `dub` on a `dubbing` row: one source, a target language the row lists. */\nexport function resolveDubbingOptions(\n model: CatalogModel,\n request: DubbingRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<DubbingRequest> {\n const warnings: Warning[] = [];\n if (request.sourceVideo !== undefined && request.sourceAudio !== undefined) {\n throw unsupported(model, \"takes a sourceVideo or a sourceAudio, not both\");\n }\n checkRequired(model, {\n sourceVideo: request.sourceVideo !== undefined,\n sourceAudio: request.sourceAudio !== undefined,\n });\n checkLength(model, \"sourceVideo\", request.sourceVideo, model.constraints.sourceVideoSeconds);\n checkLength(\n model,\n \"sourceAudio\",\n request.sourceAudio,\n model.constraints.references?.audioSeconds,\n );\n const target = resolveListed(\n model,\n {\n field: \"targetLanguage\",\n value: request.targetLanguage,\n listed: languageCodes(model),\n fallback: model.defaults.language,\n required: true,\n },\n onUnsupported,\n warnings,\n );\n if (target === undefined) throw missing(model, \"targetLanguage\");\n const resolved: DubbingRequest = { model: model.id, targetLanguage: target };\n if (request.sourceVideo !== undefined) resolved.sourceVideo = request.sourceVideo;\n if (request.sourceAudio !== undefined) resolved.sourceAudio = request.sourceAudio;\n const format = resolveOutputFormat(model, request.outputFormat, onUnsupported, warnings);\n if (format !== undefined) resolved.outputFormat = format;\n return { request: resolved, warnings };\n}\n\n/** `transcribe` on a `transcription` row. */\nexport function resolveTranscriptionOptions(\n model: CatalogModel,\n request: TranscriptionRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<TranscriptionRequest> {\n const warnings: Warning[] = [];\n checkRequired(model, { sourceAudio: true });\n checkLength(model, \"source\", request.source, model.constraints.references?.audioSeconds);\n const resolved: TranscriptionRequest = { model: model.id, source: request.source };\n const language = resolveListed(\n model,\n {\n field: \"language\",\n value: request.language,\n listed: languageCodes(model),\n fallback: model.defaults.language,\n },\n onUnsupported,\n warnings,\n );\n if (language !== undefined) resolved.language = language;\n if (request.timestamps !== undefined) resolved.timestamps = request.timestamps;\n return { request: resolved, warnings };\n}\n","import { promptConventions } from \"./catalog/conventions.js\";\nimport { ModelKitError } from \"./errors.js\";\nimport type { OnUnsupported, ResolveResult } from \"./resolve-options.js\";\nimport type {\n CatalogModel,\n VoiceCloneRequest,\n VoiceDesignRequest,\n VoiceSample,\n Warning,\n} from \"./types.js\";\n\nfunction refuse(\n model: CatalogModel,\n code: \"missing_input\" | \"unsupported_option\",\n message: string,\n): ModelKitError {\n return new ModelKitError({ code, message: `${model.label} ${message}`, model: model.id });\n}\n\nfunction checkSample(model: CatalogModel, sample: VoiceSample, index: number): void {\n const limits = model.constraints.references?.audioSeconds;\n const length = sample.audio.durationSeconds;\n if (limits === undefined || length === undefined) return;\n if (\n (limits.min !== undefined && length < limits.min) ||\n (limits.max !== undefined && length > limits.max)\n ) {\n const range = `${limits.min ?? 0}-${limits.max ?? \"any\"} s`;\n throw refuse(\n model,\n \"unsupported_option\",\n `takes samples of ${range}; sample ${index + 1} is ${length} s`,\n );\n }\n}\n\n/** `createVoice` on a `voice-clone` row. */\nexport function resolveVoiceCloneOptions(\n model: CatalogModel,\n request: VoiceCloneRequest,\n): ResolveResult<VoiceCloneRequest> {\n const title = request.title.trim();\n if (!title) throw refuse(model, \"missing_input\", \"needs a title\");\n if (request.samples.length === 0) throw refuse(model, \"missing_input\", \"needs a voice sample\");\n const max = model.constraints.references?.audios;\n if (max !== undefined && request.samples.length > max) {\n throw refuse(\n model,\n \"unsupported_option\",\n `takes up to ${max} samples; got ${request.samples.length}`,\n );\n }\n request.samples.forEach((sample, index) => checkSample(model, sample, index));\n const total = model.constraints.references?.audioSeconds?.total;\n const seconds = request.samples.reduce((sum, s) => sum + (s.audio.durationSeconds ?? 0), 0);\n if (total !== undefined && seconds > total) {\n throw refuse(\n model,\n \"unsupported_option\",\n `takes up to ${total} s of samples; got ${seconds} s`,\n );\n }\n for (const field of [\"transcript\", \"designSignature\"] as const) {\n const set = request.samples.filter((s) => s[field]?.trim()).length;\n if (set !== 0 && set !== request.samples.length) {\n throw refuse(model, \"missing_input\", `needs ${field} on every sample or on none`);\n }\n }\n return { request: { ...request, model: model.id, title }, warnings: [] };\n}\n\n/** `designVoice` on a `voice-design` row; a count over the row cap is clamped when coercing. */\nexport function resolveVoiceDesignOptions(\n model: CatalogModel,\n request: VoiceDesignRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<VoiceDesignRequest> {\n const warnings: Warning[] = [];\n const prompt = request.prompt.trim();\n if (!prompt) throw refuse(model, \"missing_input\", \"needs a voice description\");\n const maxChars = promptConventions(model).maxChars;\n if (maxChars !== undefined && prompt.length > maxChars) {\n throw refuse(\n model,\n \"unsupported_option\",\n `takes up to ${maxChars} characters; got ${prompt.length}`,\n );\n }\n const limits = model.constraints.voiceDesign;\n const resolved: VoiceDesignRequest = { model: model.id, prompt };\n const preview = request.previewText?.trim();\n if (preview) {\n if (limits !== undefined && preview.length > limits.previewMaxChars) {\n throw refuse(\n model,\n \"unsupported_option\",\n `takes a preview line of up to ${limits.previewMaxChars} characters; got ${preview.length}`,\n );\n }\n resolved.previewText = preview;\n }\n const language = request.language?.trim();\n if (language) resolved.language = language;\n if (request.seed !== undefined) resolved.seed = request.seed;\n const count = request.count ?? model.defaults.count;\n if (count !== undefined) {\n const cap = limits?.maxCandidates ?? count;\n if (!Number.isInteger(count) || count < 1 || count > cap) {\n if (onUnsupported === \"error\" || !Number.isInteger(count)) {\n throw refuse(\n model,\n \"unsupported_option\",\n `returns 1-${cap} candidates; got ${count}`,\n );\n }\n const to = Math.min(Math.max(count, 1), cap);\n warnings.push({\n code: \"option_ignored\",\n field: \"count\",\n from: String(count),\n to: String(to),\n message: `count ${count} replaced by ${to} for ${model.id}`,\n });\n resolved.count = to;\n } else resolved.count = count;\n }\n return { request: resolved, warnings };\n}\n","import { planVideoTool } from \"./catalog/video-tools-spec.js\";\nimport { ModelKitError } from \"./errors.js\";\nimport {\n resolveAudioOptions,\n resolveImageOptions,\n resolveVideoOptions,\n type OnUnsupported,\n type ResolveResult,\n} from \"./resolve-options.js\";\nimport {\n resolveDubbingOptions,\n resolveLipsyncOptions,\n resolveSpeechOptions,\n resolveTranscriptionOptions,\n resolveVoiceChangeOptions,\n} from \"./resolve-media.js\";\nimport { resolveVoiceCloneOptions, resolveVoiceDesignOptions } from \"./resolve-voice.js\";\nimport type {\n AudioRequest,\n CatalogModel,\n DubbingRequest,\n ImageRequest,\n LipsyncRequest,\n ModelType,\n SpeechRequest,\n TranscriptionRequest,\n VideoRequest,\n VideoToolOutputSpec,\n VideoToolRequest,\n VoiceChangeRequest,\n VoiceCloneRequest,\n VoiceDesignRequest,\n Warning,\n} from \"./types.js\";\n\n/** The client methods that execute a catalog row (text rows run through the text helpers). */\nexport type MediaMethod =\n | \"generateImage\"\n | \"generateVideo\"\n | \"generateAudio\"\n | \"generateSpeech\"\n | \"changeVoice\"\n | \"lipsync\"\n | \"dub\"\n | \"transcribe\"\n | \"createVoice\"\n | \"designVoice\"\n | \"submitVideoTool\";\n\n/** Typed as a full `Record` so a new `ModelType` does not compile until it is routed here. */\nexport const MEDIA_METHODS: Record<ModelType, readonly MediaMethod[]> = {\n text: [],\n image: [\"generateImage\"],\n upscale: [\"generateImage\"],\n \"bg-remove\": [\"generateImage\"],\n mask: [\"generateImage\"],\n video: [\"generateVideo\"],\n audio: [\"generateAudio\"],\n \"sound-effect\": [\"generateAudio\"],\n speech: [\"generateSpeech\"],\n \"voice-change\": [\"changeVoice\"],\n lipsync: [\"lipsync\"],\n dubbing: [\"dub\"],\n transcription: [\"transcribe\"],\n // deleteVoice runs on the voice-clone row too; it checks with assertMethod(\"createVoice\").\n \"voice-clone\": [\"createVoice\"],\n \"voice-design\": [\"designVoice\"],\n \"video-tool\": [\"submitVideoTool\"],\n // 3D jobs run through submitModel3d, which checks the row type itself; their preflight\n // is model3dInputRefusal, not resolveOptions.\n model3d: [],\n};\n\nconst METHOD_NOUN: Record<MediaMethod, string> = {\n generateImage: \"an image model\",\n generateVideo: \"a video model\",\n generateAudio: \"a music or sound-effect model\",\n generateSpeech: \"a text-to-speech model\",\n changeVoice: \"a voice changer\",\n lipsync: \"a lipsync model\",\n dub: \"a dubbing model\",\n transcribe: \"a transcription model\",\n createVoice: \"a voice cloning model\",\n designVoice: \"a voice design model\",\n submitVideoTool: \"a video tool\",\n};\n\n/** Refuses a row whose type the method does not execute, with the client's error. */\nexport function assertMethod(model: CatalogModel, method: MediaMethod): void {\n if (MEDIA_METHODS[model.type].includes(method)) return;\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} is not ${METHOD_NOUN[method]}`,\n model: model.id,\n });\n}\n\nexport function resolveImageCall(\n model: CatalogModel,\n request: ImageRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<ImageRequest> {\n assertMethod(model, \"generateImage\");\n return resolveImageOptions(model, request, onUnsupported);\n}\n\nexport function resolveVideoCall(\n model: CatalogModel,\n request: VideoRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<VideoRequest> {\n assertMethod(model, \"generateVideo\");\n return resolveVideoOptions(model, request, onUnsupported);\n}\n\nexport function resolveAudioCall(\n model: CatalogModel,\n request: AudioRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<AudioRequest> {\n assertMethod(model, \"generateAudio\");\n return resolveAudioOptions(model, request, onUnsupported);\n}\n\nexport function resolveSpeechCall(\n model: CatalogModel,\n request: SpeechRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<SpeechRequest> {\n assertMethod(model, \"generateSpeech\");\n return resolveSpeechOptions(model, request, onUnsupported);\n}\n\nexport function resolveVoiceChangeCall(\n model: CatalogModel,\n request: VoiceChangeRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<VoiceChangeRequest> {\n assertMethod(model, \"changeVoice\");\n return resolveVoiceChangeOptions(model, request, onUnsupported);\n}\n\nexport function resolveLipsyncCall(\n model: CatalogModel,\n request: LipsyncRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<LipsyncRequest> {\n assertMethod(model, \"lipsync\");\n return resolveLipsyncOptions(model, request, onUnsupported);\n}\n\nexport function resolveDubbingCall(\n model: CatalogModel,\n request: DubbingRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<DubbingRequest> {\n assertMethod(model, \"dub\");\n return resolveDubbingOptions(model, request, onUnsupported);\n}\n\nexport function resolveTranscriptionCall(\n model: CatalogModel,\n request: TranscriptionRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<TranscriptionRequest> {\n assertMethod(model, \"transcribe\");\n return resolveTranscriptionOptions(model, request, onUnsupported);\n}\n\nexport function resolveVoiceCloneCall(\n model: CatalogModel,\n request: VoiceCloneRequest,\n): ResolveResult<VoiceCloneRequest> {\n assertMethod(model, \"createVoice\");\n return resolveVoiceCloneOptions(model, request);\n}\n\nexport function resolveVoiceDesignCall(\n model: CatalogModel,\n request: VoiceDesignRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<VoiceDesignRequest> {\n assertMethod(model, \"designVoice\");\n return resolveVoiceDesignOptions(model, request, onUnsupported);\n}\n\n/** Video tools pass through unchanged: `planVideoTool` (what the adapter runs) accepts or refuses them. */\nexport function resolveVideoToolCall(\n model: CatalogModel,\n request: VideoToolRequest,\n): ResolveResult<VideoToolRequest> & { output: VideoToolOutputSpec } {\n assertMethod(model, \"submitVideoTool\");\n const plan = planVideoTool(model, request);\n if (!plan.ok) {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: plan.error,\n model: model.id,\n retryable: false,\n });\n }\n return { request, warnings: [], output: plan.output };\n}\n\n/** A request tagged with the client method it is meant for. */\nexport type ResolveCall =\n | { method: \"generateImage\"; request: ImageRequest }\n | { method: \"generateVideo\"; request: VideoRequest }\n | { method: \"generateAudio\"; request: AudioRequest }\n | { method: \"generateSpeech\"; request: SpeechRequest }\n | { method: \"changeVoice\"; request: VoiceChangeRequest }\n | { method: \"lipsync\"; request: LipsyncRequest }\n | { method: \"dub\"; request: DubbingRequest }\n | { method: \"transcribe\"; request: TranscriptionRequest }\n | { method: \"createVoice\"; request: VoiceCloneRequest }\n | { method: \"designVoice\"; request: VoiceDesignRequest }\n | { method: \"submitVideoTool\"; request: VideoToolRequest };\n\nexport type ResolvedCall =\n | { method: \"generateImage\"; request: ImageRequest; warnings: Warning[] }\n | { method: \"generateVideo\"; request: VideoRequest; warnings: Warning[] }\n | { method: \"generateAudio\"; request: AudioRequest; warnings: Warning[] }\n | { method: \"generateSpeech\"; request: SpeechRequest; warnings: Warning[] }\n | { method: \"changeVoice\"; request: VoiceChangeRequest; warnings: Warning[] }\n | { method: \"lipsync\"; request: LipsyncRequest; warnings: Warning[] }\n | { method: \"dub\"; request: DubbingRequest; warnings: Warning[] }\n | { method: \"transcribe\"; request: TranscriptionRequest; warnings: Warning[] }\n | { method: \"createVoice\"; request: VoiceCloneRequest; warnings: Warning[] }\n | { method: \"designVoice\"; request: VoiceDesignRequest; warnings: Warning[] }\n | {\n method: \"submitVideoTool\";\n request: VideoToolRequest;\n warnings: Warning[];\n output: VideoToolOutputSpec;\n };\n\n/** Resolves a request exactly as the client method it names would before calling the provider. */\nexport function resolveOptions(\n model: CatalogModel,\n call: ResolveCall,\n onUnsupported: OnUnsupported = \"error\",\n): ResolvedCall {\n switch (call.method) {\n case \"generateImage\":\n return { method: call.method, ...resolveImageCall(model, call.request, onUnsupported) };\n case \"generateVideo\":\n return { method: call.method, ...resolveVideoCall(model, call.request, onUnsupported) };\n case \"generateAudio\":\n return { method: call.method, ...resolveAudioCall(model, call.request, onUnsupported) };\n case \"generateSpeech\":\n return {\n method: call.method,\n ...resolveSpeechCall(model, call.request, onUnsupported),\n };\n case \"changeVoice\":\n return {\n method: call.method,\n ...resolveVoiceChangeCall(model, call.request, onUnsupported),\n };\n case \"lipsync\":\n return {\n method: call.method,\n ...resolveLipsyncCall(model, call.request, onUnsupported),\n };\n case \"dub\":\n return {\n method: call.method,\n ...resolveDubbingCall(model, call.request, onUnsupported),\n };\n case \"transcribe\":\n return {\n method: call.method,\n ...resolveTranscriptionCall(model, call.request, onUnsupported),\n };\n case \"createVoice\":\n return { method: call.method, ...resolveVoiceCloneCall(model, call.request) };\n case \"designVoice\":\n return {\n method: call.method,\n ...resolveVoiceDesignCall(model, call.request, onUnsupported),\n };\n case \"submitVideoTool\":\n return { method: call.method, ...resolveVideoToolCall(model, call.request) };\n }\n}\n"],"mappings":"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,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;;;AClKA,IAAMC,YAAqC,CAAC,UAAU,eAAe;AACrE,IAAM,YACF;AAMG,IAAM,wBAAwB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;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IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAA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CJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA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","names":["SURFACES","row","IMAGE_USAGE","EXPOSURE","LOBE","IMAGE_USAGE","EXPOSURE","PER_CALL","PER_REQUEST","ELEVENLABS_LOGO","PER_CALL","EXPOSURE","GOOGLE_LOGO","ELEVENLABS_LOGO","MINIMAX_LOGO","MINIMAX_LOGO","VIDEO_USAGE","EXPOSURE","LUMA_LOGO","VIDEO_USAGE","KLING_RATIOS","H3_RATIOS","KLING_PROMPT","H3_PROMPT","BYTEDANCE_LOGO","GOOGLE_LOGO","import_zod","row","listed","message","row","row","row","import_zod","row","row","SURFACES","row","import_zod","import_zod","row","result","import_zod","seconds","RangeSchema","row","range","listed","fallback","KLING_RATIOS","GROK_RATIOS","RECRAFT_RATIOS","listed","count","unsupported","seconds","missing","unsupported","range","text","range","seconds","preview","count"]}
|