@shop-os/modelkit 0.3.4 → 0.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/catalog-entry.ts","../src/errors.ts","../src/catalog/order.ts","../src/catalog/registry.ts","../src/catalog/exposure.ts","../src/catalog/image.ts","../src/catalog/other.ts","../src/catalog/text.ts","../src/catalog/video.ts","../src/catalog/video-tools.ts","../src/catalog/models.ts","../src/catalog/schema.ts","../src/catalog/collisions.ts","../src/catalog/conventions.ts","../src/catalog/input-spec.ts","../src/catalog/live.ts","../src/json.ts","../src/catalog/load.ts","../src/catalog/video-tools-spec.ts","../src/resolve-options.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 { 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 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\nimport {\n resolveAudioOptions,\n resolveImageOptions,\n resolveVideoOptions,\n} from \"./resolve-options.js\";\nimport type { AudioRequest, CatalogModel, ImageRequest, VideoRequest } from \"./types.js\";\nimport type { OnUnsupported, ResolveResult } from \"./resolve-options.js\";\n\n/** Resolve caller options against a catalog row, dispatching on `model.type`. */\nexport function resolveOptions(\n model: CatalogModel,\n request: ImageRequest | VideoRequest | AudioRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<ImageRequest | VideoRequest | AudioRequest> {\n switch (model.type) {\n case \"image\":\n case \"upscale\":\n case \"bg-remove\":\n return resolveImageOptions(model, request as ImageRequest, onUnsupported);\n case \"video\":\n return resolveVideoOptions(model, request as VideoRequest, onUnsupported);\n case \"audio\":\n return resolveAudioOptions(model, request as AudioRequest, onUnsupported);\n default:\n throw new Error(`resolveOptions: unsupported model type \"${model.type}\"`);\n }\n}\n","import type { JsonValue } from \"./types.js\";\n\n/** Provider body or the lifted detail (Gemini blockReason, fal body.detail). */\nexport type ProviderErrorBody = string | JsonValue;\n\nexport type ModelKitErrorCode =\n | \"unknown_model\"\n | \"unsupported_option\"\n | \"missing_input\"\n | \"content_blocked\"\n | \"provider_rejected\"\n | \"timeout\"\n | \"auth\"\n | \"network\"\n | \"rate_limited\";\n\nexport interface ModelKitErrorInit {\n code: ModelKitErrorCode;\n message: string;\n provider?: string;\n model?: string;\n status?: number;\n body?: ProviderErrorBody;\n cause?: unknown;\n retryable?: boolean;\n}\n\nexport class ModelKitError extends Error {\n readonly code: ModelKitErrorCode;\n readonly provider: string | undefined;\n readonly model: string | undefined;\n readonly status: number | undefined;\n readonly body: ProviderErrorBody | undefined;\n readonly retryable: boolean;\n\n constructor(init: ModelKitErrorInit) {\n super(init.message, { cause: init.cause });\n this.name = \"ModelKitError\";\n this.code = init.code;\n this.provider = init.provider;\n this.model = init.model;\n this.status = init.status;\n this.body = init.body;\n this.retryable = init.retryable ?? defaultRetryable(init.code);\n }\n}\n\nfunction defaultRetryable(code: ModelKitErrorCode): boolean {\n return code === \"timeout\" || code === \"network\" || code === \"rate_limited\";\n}\n\nexport function isModelKitError(err: unknown): err is ModelKitError {\n return err instanceof ModelKitError;\n}\n","import 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 {\n AspectRatio,\n CatalogDisplay,\n CatalogModel,\n ImageSize,\n PromptConventions,\n ReferenceLimits,\n Surface,\n} from \"../types.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 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 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 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];\n","import type { CatalogModel } from \"../types.js\";\n\nconst GOOGLE_LOGO =\n \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.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 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 id: \"bg-remove\",\n aliases: [],\n label: \"Background Remover\",\n type: \"bg-remove\",\n adapter: \"prodia\",\n providerModelId: \"inference.remove-background.v1\",\n lifecycle: \"active\",\n 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 text(\"sonar\", \"Sonar\", \"sonar\", {\n exposure: [],\n display: {\n provider: \"perplexity\",\n costTier: 1,\n description:\n \"Perplexity Sonar lightweight web-grounded search model returning cited answers; 128K-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 128_000,\n },\n }),\n text(\"sonar-pro\", \"Sonar Pro\", \"sonar-pro\", {\n exposure: [],\n display: {\n provider: \"perplexity\",\n costTier: 2,\n description:\n \"Perplexity Sonar Pro advanced web-grounded search model for complex multi-step queries; 200K-token context.\",\n },\n capabilities: {\n vision: true,\n\n contextWindow: 200_000,\n },\n }),\n text(\"sonar-reasoning-pro\", \"Sonar Reasoning Pro\", \"sonar-reasoning-pro\", {\n exposure: [],\n display: {\n provider: \"perplexity\",\n costTier: 2,\n description:\n \"Perplexity Sonar Reasoning Pro chain-of-thought web-grounded search model for complex problem-solving; 128K-token context.\",\n },\n capabilities: {\n vision: true,\n\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 } from \"../types.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// Replicate's kling-v3-omni-video 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];\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// 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 {\n id: \"veo-3.1\",\n aliases: [\n \"veo-3.1-generate-001\",\n \"veo-3.1-generate-preview\",\n \"veo3\",\n \"veo-3.1-frame-specific\",\n ],\n label: \"Veo 3.1\",\n type: \"video\",\n adapter: \"google-genai\",\n providerModelId: \"veo-3.1-generate-preview\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\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: \"active\",\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: \"active\",\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: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\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 // mode standard/pro/4k selects 720p/1080p/4K; the endpoint takes no separate resolution.\n // Replicate: \"Max 7 [images] without video, 4 with video\"; 4K does not support\n // reference_video. No `videos` limit yet: the adapter sends no reference video,\n // so `imagesWithVideo` stays dormant until one is wired through.\n id: \"kling-v3-omni-video\",\n aliases: [\"kwaivgi/kling-v3-omni-video\", \"kling-v3-omni\"],\n label: \"Kling V3 Omni\",\n type: \"video\",\n adapter: \"replicate\",\n providerModelId: \"kwaivgi/kling-v3-omni-video\",\n lifecycle: \"active\",\n 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, imagesWithVideo: 4 },\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: { unit: \"compute_seconds\" },\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 unified generation and editing from text, start/end images, up to 7 reference images, and reference video; up to 15 seconds at up to 4K.\",\n },\n // end_image \"Requires start_image\", but no lastFrameRequiresFirstFrame: SpaceLab resolves\n // replicate rows in error mode, so the flag would refuse its end-frame-only nodes, which\n // the adapter sends as start_image.\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 // 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 pricingKind: \"video_per_second\",\n display: {\n provider: \"higgsfield\",\n description:\n \"Higgsfield DOP image-to-video model; animates a required first-frame image from a text prompt with an optional last-frame image and motion controls.\",\n },\n capabilities: {},\n },\n];\n","import type { CatalogModel } from \"../types.js\";\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","import type { CatalogModel } from \"../types.js\";\nimport { IMAGE_MODELS } from \"./image.js\";\nimport { OTHER_MODELS } from \"./other.js\";\nimport { TEXT_MODELS } from \"./text.js\";\nimport { VIDEO_MODELS } from \"./video.js\";\nimport { VIDEO_TOOL_MODELS } from \"./video-tools.js\";\n\n/** Seeded from Cowork, Space Builder and trigger-workflows. See catalog/*.ts. */\nexport const MODELS: CatalogModel[] = [\n ...TEXT_MODELS,\n ...IMAGE_MODELS,\n ...VIDEO_MODELS,\n ...VIDEO_TOOL_MODELS,\n ...OTHER_MODELS,\n];\n","import { z } from \"zod\";\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 { validateInputSpec } from \"./input-spec.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] 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 \"upscale\",\n \"bg-remove\",\n \"video-tool\",\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\"]);\nconst 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\"]);\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]);\nconst UsageUnitSchema = z.enum([\n \"tokens\",\n \"images\",\n \"seconds\",\n \"reported_cost_usd\",\n \"compute_seconds\",\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});\n\nconst RangeSchema = z.looseObject({ min: z.number(), max: z.number() });\n\nconst VideoToolConstraintsSchema = z.looseObject({\n kind: z.enum([\"upscale\", \"interpolate\", \"hdr\"]),\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\"]))\n .min(1)\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 exactSizes: z.record(z.string(), z.string()).optional(),\n references: ReferenceLimitsSchema.optional(),\n requires: z.array(RequiredInputSchema).optional(),\n supports: z.array(SupportedOptionSchema).optional(),\n ratioIgnoredWith: z.array(z.enum([\"firstFrame\", \"sourceVideo\"])).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 // 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\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 outputFormat: OutputFormatSchema.optional(),\n scaleFactor: z.number().optional(),\n safetySettings: z.array(ImageSafetySettingSchema).optional(),\n temperature: z.number().optional(),\n upscale: UpscaleOptionsSchema.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 taskType: z.enum([\"reference\", \"edit\", \"extend\"]).optional(),\n mode: z.enum([\"standard\", \"pro\"]).optional(),\n instrumental: z.boolean().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.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 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","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 { 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\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 })\n .superRefine((spec, ctx) => {\n const mappedNames = new Set([\n ...Object.values(spec.fields),\n ...Object.keys(spec.arrays ?? {}),\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 { path: [], message: \"inputSpec is only supported on replicate and fal rows\" },\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 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","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\";\n\nconst RangeSchema = z.object({ min: z.number(), max: z.number() });\nconst ToolSchema = z.object({\n kind: z.enum([\"upscale\", \"interpolate\", \"hdr\"]),\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\"]))\n .min(1)\n .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 { kind, upscaleFactor, maxOutputLongEdge, prompt, fps, outputFormats } = 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 };\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 && 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 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 return {\n ok: true,\n output: { ...base, width, height, resolution: resolutionTier(width, height), format },\n };\n}\n","import { ModelKitError } from \"./errors.js\";\nimport type {\n AspectRatio,\n AudioRequest,\n CatalogModel,\n ImageRequest,\n ImageSize,\n MediaRef,\n VideoRequest,\n VideoResolution,\n Warning,\n} from \"./types.js\";\n\nexport type OnUnsupported = \"error\" | \"coerce\";\n\nexport interface ResolveResult<T> {\n request: T;\n warnings: Warning[];\n}\n\nconst SIZE_ORDER: ImageSize[] = [\"512\", \"1K\", \"2K\", \"4K\"];\nconst RESOLUTION_ORDER: VideoResolution[] = [\"360p\", \"480p\", \"720p\", \"768p\", \"1080p\", \"2k\", \"4k\"];\n\nfunction ratioValue(r: AspectRatio): number {\n if (r === \"adaptive\") return 1;\n // SAFETY: every non-adaptive AspectRatio literal is \"<int>:<int>\", so the split has two numbers.\n const [w, h] = r.split(\":\").map(Number) as [number, number];\n return w / h;\n}\n\ntype Orientation = \"landscape\" | \"portrait\" | \"square\";\nfunction orientation(r: AspectRatio): Orientation {\n const v = ratioValue(r);\n return v > 1 ? \"landscape\" : v < 1 ? \"portrait\" : \"square\";\n}\n\n/** Nearest supported ratio in the same orientation bucket, else nearest overall, by log distance. */\nexport function nearestAspectRatio(requested: AspectRatio, supported: AspectRatio[]): AspectRatio {\n if (supported.includes(requested)) return requested;\n const target = requested === \"adaptive\" ? \"1:1\" : requested;\n const sameBucket = supported.filter(\n (s) => s !== \"adaptive\" && orientation(s) === orientation(target),\n );\n const pool = sameBucket.length > 0 ? sameBucket : supported.filter((s) => s !== \"adaptive\");\n const fallback = pool[0] ?? supported[0];\n if (!fallback) return target;\n const dist = (s: AspectRatio) =>\n Math.abs(Math.log(ratioValue(s)) - Math.log(ratioValue(target)));\n return pool.reduce((best, s) => (dist(s) < dist(best) ? s : best), fallback);\n}\n\nfunction nearestLowerTier<T extends string>(requested: T, supported: T[], order: T[]): T {\n const idx = order.indexOf(requested);\n for (let i = idx; i >= 0; i--) {\n const candidate = order[i];\n if (candidate !== undefined && supported.includes(candidate)) return candidate;\n }\n for (let i = idx + 1; i < order.length; i++) {\n const candidate = order[i];\n if (candidate !== undefined && supported.includes(candidate)) return candidate;\n }\n return requested;\n}\n\nfunction resolveTier<T extends string>(\n field: string,\n code: Warning[\"code\"],\n requested: T | undefined,\n supported: T[] | undefined,\n order: T[],\n model: CatalogModel,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): T | undefined {\n if (requested === undefined || !supported || supported.includes(requested)) return requested;\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} does not support ${field} \"${requested}\". Supported: ${supported.join(\", \")}.`,\n model: model.id,\n });\n }\n const to = nearestLowerTier(requested, supported, order);\n warnings.push({\n code,\n field,\n from: requested,\n to,\n message: `${field} ${requested} coerced to ${to} for ${model.id}`,\n });\n return to;\n}\n\nfunction resolveDuration(\n requested: number | undefined,\n durations: CatalogModel[\"constraints\"][\"durations\"],\n model: CatalogModel,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): number | undefined {\n if (requested === undefined || !durations) return requested;\n const inSet = Array.isArray(durations)\n ? durations.includes(requested)\n : requested >= durations.min && requested <= durations.max;\n if (inSet) return requested;\n if (onUnsupported === \"error\") {\n const supported = Array.isArray(durations)\n ? `Supported: ${durations.join(\", \")}.`\n : `Supported range: ${durations.min}-${durations.max}.`;\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} does not support durationSeconds ${requested}. ${supported}`,\n model: model.id,\n });\n }\n const to = Array.isArray(durations)\n ? durations.reduce(\n (best, d) => (Math.abs(d - requested) < Math.abs(best - requested) ? d : best),\n durations[0] ?? requested,\n )\n : Math.min(Math.max(requested, durations.min), durations.max);\n warnings.push({\n code: \"duration_coerced\",\n field: \"durationSeconds\",\n from: requested,\n to,\n message: `duration ${requested}s coerced to ${to}s for ${model.id}`,\n });\n return to;\n}\n\n/** An unsupported ratio errors under \"error\"; under \"coerce\" it snaps with a warning. */\nfunction resolveAspectRatio(\n requested: AspectRatio | undefined,\n supported: AspectRatio[] | undefined,\n model: CatalogModel,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): AspectRatio | undefined {\n if (requested === undefined || requested === \"adaptive\" || !supported) return requested;\n if (supported.includes(requested)) return requested;\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} does not support aspectRatio \"${requested}\". Supported: ${supported.join(\", \")}.`,\n model: model.id,\n });\n }\n const to = nearestAspectRatio(requested, supported);\n warnings.push({\n code: \"ratio_coerced\",\n field: \"aspectRatio\",\n from: requested,\n to,\n message: `aspect ratio ${requested} coerced to ${to} for ${model.id}`,\n });\n return to;\n}\n\nfunction compact(refs: MediaRef[] | undefined): MediaRef[] {\n return (refs ?? []).filter((r): r is MediaRef => Boolean(r));\n}\n\nfunction trim(\n field: string,\n refs: MediaRef[],\n limit: number | undefined,\n model: CatalogModel,\n warnings: Warning[],\n): MediaRef[] {\n if (limit === undefined || refs.length <= limit) return refs;\n warnings.push({\n code: \"references_trimmed\",\n field,\n from: refs.length,\n to: limit,\n message: `${field} trimmed from ${refs.length} to ${limit} for ${model.id}`,\n });\n return refs.slice(0, limit);\n}\n\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 && 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 refSum = lengths.reduce<number>((acc, len) => acc + (len ?? 0), 0);\n const sum = refSum + (sourceLimits?.inReferenceTotal ? (source ?? 0) : 0);\n if (sum > 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 && 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 merged: ImageRequest = { ...model.defaults, ...stripUndefined(request), model: model.id };\n\n const aspectRatio = resolveAspectRatio(\n merged.aspectRatio,\n c.aspectRatios,\n model,\n onUnsupported,\n warnings,\n );\n if (aspectRatio !== undefined) merged.aspectRatio = aspectRatio;\n const size = resolveTier(\n \"size\",\n \"size_coerced\",\n merged.size,\n c.sizes,\n SIZE_ORDER,\n model,\n onUnsupported,\n warnings,\n );\n if (size !== undefined) merged.size = size;\n\n const references = trim(\n \"references\",\n compact(merged.references),\n c.references?.images ?? c.references?.total,\n model,\n warnings,\n );\n if (references.length > 0) merged.references = references;\n else delete merged.references;\n if (c.requires?.includes(\"references\") && references.length === 0) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} requires at least one reference image`,\n model: model.id,\n });\n }\n dropUnsupported(merged, model, warnings, [\n \"seed\",\n \"quality\",\n \"count\",\n \"outputFormat\",\n \"scaleFactor\",\n \"safetySettings\",\n \"temperature\",\n \"upscale\",\n ]);\n return { request: merged, warnings };\n}\n\nexport function resolveVideoOptions(\n model: CatalogModel,\n request: VideoRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<VideoRequest> {\n const warnings: Warning[] = [];\n const c = model.constraints;\n const merged: VideoRequest = { ...model.defaults, ...stripUndefined(request), model: model.id };\n\n for (const input of c.requires ?? []) {\n const present =\n input === \"references\"\n ? compact(merged.referenceImages).length +\n compact(merged.referenceVideos).length +\n compact(merged.referenceAudios).length >\n 0\n : merged[input] !== undefined;\n if (!present)\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} requires ${input}`,\n model: model.id,\n });\n }\n\n // 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 const resolution = resolveTier(\n \"resolution\",\n \"resolution_coerced\",\n merged.resolution,\n c.resolutions,\n RESOLUTION_ORDER,\n model,\n onUnsupported,\n warnings,\n );\n if (resolution !== undefined) merged.resolution = resolution;\n const duration = resolveDuration(\n merged.durationSeconds,\n c.durations,\n model,\n onUnsupported,\n warnings,\n );\n if (duration !== undefined) merged.durationSeconds = duration;\n\n const limits = c.references ?? {};\n let images = trim(\n \"referenceImages\",\n compact(merged.referenceImages),\n limits.images,\n model,\n warnings,\n );\n let videos = trim(\n \"referenceVideos\",\n compact(merged.referenceVideos),\n limits.videos,\n model,\n warnings,\n );\n let audios = trim(\n \"referenceAudios\",\n compact(merged.referenceAudios),\n limits.audios,\n model,\n warnings,\n );\n // 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 ...(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 return { request: merged, warnings };\n}\n\nexport function resolveAudioOptions(\n model: CatalogModel,\n request: AudioRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<AudioRequest> {\n const warnings: Warning[] = [];\n const c = model.constraints;\n const merged: AudioRequest = { ...model.defaults, ...stripUndefined(request), model: model.id };\n\n for (const input of c.requires ?? []) {\n const present =\n input === \"references\"\n ? compact(merged.references).length > 0\n : input === \"sourceVideo\" && merged.sourceVideo !== undefined;\n if (!present)\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} requires ${input}`,\n model: model.id,\n });\n }\n\n const duration = resolveDuration(\n merged.durationSeconds,\n c.durations,\n model,\n onUnsupported,\n warnings,\n );\n if (duration !== undefined) merged.durationSeconds = duration;\n\n const references = trim(\n \"references\",\n compact(merged.references),\n c.references?.images ?? c.references?.total,\n model,\n warnings,\n );\n if (references.length > 0) merged.references = references;\n else delete merged.references;\n\n dropUnsupported(merged, model, warnings, [\"seed\", \"negativePrompt\", \"instrumental\"]);\n return { request: merged, warnings };\n}\n\nfunction dropUnsupported<T extends object>(\n req: T,\n model: CatalogModel,\n warnings: Warning[],\n fields: (keyof T & string)[],\n): void {\n const supports = model.constraints.supports ?? [];\n for (const field of fields) {\n // SAFETY: `fields` are a subset of SupportedOption; the cast only bridges the generic key type.\n if (req[field] !== undefined && !supports.includes(field as never)) {\n warnings.push({\n code: \"option_ignored\",\n field,\n from: req[field],\n message: `${model.id} does not support ${field}; ignored`,\n });\n delete req[field];\n }\n }\n}\n\nfunction setOrDelete(\n req: VideoRequest,\n field: \"referenceImages\" | \"referenceVideos\" | \"referenceAudios\",\n refs: MediaRef[],\n): void {\n if (refs.length > 0) req[field] = refs;\n else delete req[field];\n}\n\nfunction stripUndefined<T extends object>(obj: T): T {\n // SAFETY: only undefined-valued keys are removed, which does not change the static type of T.\n return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as T;\n}\n"],"mappings":"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","names":["SURFACES","GOOGLE_LOGO","import_zod","import_zod","SURFACES","import_zod","import_zod","result","import_zod","RangeSchema"]}
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.ts","../src/catalog/other.ts","../src/catalog/text.ts","../src/catalog/video.ts","../src/catalog/video-tools.ts","../src/catalog/models.ts","../src/catalog/schema.ts","../src/catalog/collisions.ts","../src/catalog/conventions.ts","../src/catalog/input-spec.ts","../src/catalog/live.ts","../src/json.ts","../src/catalog/load.ts","../src/catalog/video-tools-spec.ts","../src/resolve-options.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 { 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 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\nimport {\n resolveAudioOptions,\n resolveImageOptions,\n resolveVideoOptions,\n} from \"./resolve-options.js\";\nimport type { AudioRequest, CatalogModel, ImageRequest, VideoRequest } from \"./types.js\";\nimport type { OnUnsupported, ResolveResult } from \"./resolve-options.js\";\n\n/** Resolve caller options against a catalog row, dispatching on `model.type`. */\nexport function resolveOptions(\n model: CatalogModel,\n request: ImageRequest | VideoRequest | AudioRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<ImageRequest | VideoRequest | AudioRequest> {\n switch (model.type) {\n case \"image\":\n case \"upscale\":\n case \"bg-remove\":\n return resolveImageOptions(model, request as ImageRequest, onUnsupported);\n case \"video\":\n return resolveVideoOptions(model, request as VideoRequest, onUnsupported);\n case \"audio\":\n return resolveAudioOptions(model, request as AudioRequest, onUnsupported);\n default:\n throw new Error(`resolveOptions: unsupported model type \"${model.type}\"`);\n }\n}\n","import type { JsonValue } from \"./types.js\";\n\n/** Provider body or the lifted detail (Gemini blockReason, fal body.detail). */\nexport type ProviderErrorBody = string | JsonValue;\n\nexport type ModelKitErrorCode =\n | \"unknown_model\"\n | \"unsupported_option\"\n | \"missing_input\"\n | \"content_blocked\"\n | \"provider_rejected\"\n | \"timeout\"\n | \"auth\"\n | \"network\"\n | \"rate_limited\";\n\nexport interface ModelKitErrorInit {\n code: ModelKitErrorCode;\n message: string;\n provider?: string;\n model?: string;\n status?: number;\n body?: ProviderErrorBody;\n cause?: unknown;\n retryable?: boolean;\n}\n\nexport class ModelKitError extends Error {\n readonly code: ModelKitErrorCode;\n readonly provider: string | undefined;\n readonly model: string | undefined;\n readonly status: number | undefined;\n readonly body: ProviderErrorBody | undefined;\n readonly retryable: boolean;\n\n constructor(init: ModelKitErrorInit) {\n super(init.message, { cause: init.cause });\n this.name = \"ModelKitError\";\n this.code = init.code;\n this.provider = init.provider;\n this.model = init.model;\n this.status = init.status;\n this.body = init.body;\n this.retryable = init.retryable ?? defaultRetryable(init.code);\n }\n}\n\nfunction defaultRetryable(code: ModelKitErrorCode): boolean {\n return code === \"timeout\" || code === \"network\" || code === \"rate_limited\";\n}\n\nexport function isModelKitError(err: unknown): err is ModelKitError {\n return err instanceof ModelKitError;\n}\n","import 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 {\n AspectRatio,\n CatalogDisplay,\n CatalogModel,\n ImageSize,\n PromptConventions,\n ReferenceLimits,\n Surface,\n} from \"../types.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 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 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 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];\n","import type { CatalogModel } from \"../types.js\";\n\nconst GOOGLE_LOGO =\n \"https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.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 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 id: \"bg-remove\",\n aliases: [],\n label: \"Background Remover\",\n type: \"bg-remove\",\n adapter: \"prodia\",\n providerModelId: \"inference.remove-background.v1\",\n lifecycle: \"active\",\n 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 } from \"../types.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// Replicate's kling-v3-omni-video 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];\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// 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 {\n id: \"veo-3.1\",\n aliases: [\n \"veo-3.1-generate-001\",\n \"veo-3.1-generate-preview\",\n \"veo3\",\n \"veo-3.1-frame-specific\",\n ],\n label: \"Veo 3.1\",\n type: \"video\",\n adapter: \"google-genai\",\n providerModelId: \"veo-3.1-generate-preview\",\n lifecycle: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\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: \"active\",\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: \"active\",\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: \"active\",\n exposure: [\"cowork\", \"space_builder\"],\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 // mode standard/pro/4k selects 720p/1080p/4K; the endpoint takes no separate resolution.\n // Replicate: \"Max 7 [images] without video, 4 with video\"; 4K does not support\n // reference_video. No `videos` limit yet: the adapter sends no reference video,\n // so `imagesWithVideo` stays dormant until one is wired through.\n id: \"kling-v3-omni-video\",\n aliases: [\"kwaivgi/kling-v3-omni-video\", \"kling-v3-omni\"],\n label: \"Kling V3 Omni\",\n type: \"video\",\n adapter: \"replicate\",\n providerModelId: \"kwaivgi/kling-v3-omni-video\",\n lifecycle: \"active\",\n 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, imagesWithVideo: 4 },\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: { unit: \"compute_seconds\" },\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 unified generation and editing from text, start/end images, up to 7 reference images, and reference video; up to 15 seconds at up to 4K.\",\n },\n // end_image \"Requires start_image\", but no lastFrameRequiresFirstFrame: SpaceLab resolves\n // replicate rows in error mode, so the flag would refuse its end-frame-only nodes, which\n // the adapter sends as start_image.\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 // 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 pricingKind: \"video_per_second\",\n display: {\n provider: \"higgsfield\",\n description:\n \"Higgsfield DOP image-to-video model; animates a required first-frame image from a text prompt with an optional last-frame image and motion controls.\",\n },\n capabilities: {},\n },\n];\n","import type { CatalogModel } from \"../types.js\";\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","import type { CatalogModel } from \"../types.js\";\nimport { IMAGE_MODELS } from \"./image.js\";\nimport { OTHER_MODELS } from \"./other.js\";\nimport { TEXT_MODELS } from \"./text.js\";\nimport { VIDEO_MODELS } from \"./video.js\";\nimport { VIDEO_TOOL_MODELS } from \"./video-tools.js\";\n\n/** Seeded from Cowork, Space Builder and trigger-workflows. See catalog/*.ts. */\nexport const MODELS: CatalogModel[] = [\n ...TEXT_MODELS,\n ...IMAGE_MODELS,\n ...VIDEO_MODELS,\n ...VIDEO_TOOL_MODELS,\n ...OTHER_MODELS,\n];\n","import { z } from \"zod\";\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 { validateInputSpec } from \"./input-spec.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] 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 \"upscale\",\n \"bg-remove\",\n \"video-tool\",\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\"]);\nconst 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\"]);\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]);\nconst UsageUnitSchema = z.enum([\n \"tokens\",\n \"images\",\n \"seconds\",\n \"reported_cost_usd\",\n \"compute_seconds\",\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});\n\nconst RangeSchema = z.looseObject({ min: z.number(), max: z.number() });\n\nconst VideoToolConstraintsSchema = z.looseObject({\n kind: z.enum([\"upscale\", \"interpolate\", \"hdr\"]),\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\"]))\n .min(1)\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 exactSizes: z.record(z.string(), z.string()).optional(),\n references: ReferenceLimitsSchema.optional(),\n requires: z.array(RequiredInputSchema).optional(),\n supports: z.array(SupportedOptionSchema).optional(),\n ratioIgnoredWith: z.array(z.enum([\"firstFrame\", \"sourceVideo\"])).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 // 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\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 outputFormat: OutputFormatSchema.optional(),\n scaleFactor: z.number().optional(),\n safetySettings: z.array(ImageSafetySettingSchema).optional(),\n temperature: z.number().optional(),\n upscale: UpscaleOptionsSchema.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 taskType: z.enum([\"reference\", \"edit\", \"extend\"]).optional(),\n mode: z.enum([\"standard\", \"pro\"]).optional(),\n instrumental: z.boolean().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.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 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","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 { 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\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 })\n .superRefine((spec, ctx) => {\n const mappedNames = new Set([\n ...Object.values(spec.fields),\n ...Object.keys(spec.arrays ?? {}),\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 { path: [], message: \"inputSpec is only supported on replicate and fal rows\" },\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 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","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\";\n\nconst RangeSchema = z.object({ min: z.number(), max: z.number() });\nconst ToolSchema = z.object({\n kind: z.enum([\"upscale\", \"interpolate\", \"hdr\"]),\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\"]))\n .min(1)\n .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 { kind, upscaleFactor, maxOutputLongEdge, prompt, fps, outputFormats } = 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 };\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 && 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 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 return {\n ok: true,\n output: { ...base, width, height, resolution: resolutionTier(width, height), format },\n };\n}\n","import { ModelKitError } from \"./errors.js\";\nimport type {\n AspectRatio,\n AudioRequest,\n CatalogModel,\n ImageRequest,\n ImageSize,\n MediaRef,\n VideoRequest,\n VideoResolution,\n Warning,\n} from \"./types.js\";\n\nexport type OnUnsupported = \"error\" | \"coerce\";\n\nexport interface ResolveResult<T> {\n request: T;\n warnings: Warning[];\n}\n\nconst SIZE_ORDER: ImageSize[] = [\"512\", \"1K\", \"2K\", \"4K\"];\nconst RESOLUTION_ORDER: VideoResolution[] = [\"360p\", \"480p\", \"720p\", \"768p\", \"1080p\", \"2k\", \"4k\"];\n\nfunction ratioValue(r: AspectRatio): number {\n if (r === \"adaptive\") return 1;\n // SAFETY: every non-adaptive AspectRatio literal is \"<int>:<int>\", so the split has two numbers.\n const [w, h] = r.split(\":\").map(Number) as [number, number];\n return w / h;\n}\n\ntype Orientation = \"landscape\" | \"portrait\" | \"square\";\nfunction orientation(r: AspectRatio): Orientation {\n const v = ratioValue(r);\n return v > 1 ? \"landscape\" : v < 1 ? \"portrait\" : \"square\";\n}\n\n/** Nearest supported ratio in the same orientation bucket, else nearest overall, by log distance. */\nexport function nearestAspectRatio(requested: AspectRatio, supported: AspectRatio[]): AspectRatio {\n if (supported.includes(requested)) return requested;\n const target = requested === \"adaptive\" ? \"1:1\" : requested;\n const sameBucket = supported.filter(\n (s) => s !== \"adaptive\" && orientation(s) === orientation(target),\n );\n const pool = sameBucket.length > 0 ? sameBucket : supported.filter((s) => s !== \"adaptive\");\n const fallback = pool[0] ?? supported[0];\n if (!fallback) return target;\n const dist = (s: AspectRatio) =>\n Math.abs(Math.log(ratioValue(s)) - Math.log(ratioValue(target)));\n return pool.reduce((best, s) => (dist(s) < dist(best) ? s : best), fallback);\n}\n\nfunction nearestLowerTier<T extends string>(requested: T, supported: T[], order: T[]): T {\n const idx = order.indexOf(requested);\n for (let i = idx; i >= 0; i--) {\n const candidate = order[i];\n if (candidate !== undefined && supported.includes(candidate)) return candidate;\n }\n for (let i = idx + 1; i < order.length; i++) {\n const candidate = order[i];\n if (candidate !== undefined && supported.includes(candidate)) return candidate;\n }\n return requested;\n}\n\nfunction resolveTier<T extends string>(\n field: string,\n code: Warning[\"code\"],\n requested: T | undefined,\n supported: T[] | undefined,\n order: T[],\n model: CatalogModel,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): T | undefined {\n if (requested === undefined || !supported || supported.includes(requested)) return requested;\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} does not support ${field} \"${requested}\". Supported: ${supported.join(\", \")}.`,\n model: model.id,\n });\n }\n const to = nearestLowerTier(requested, supported, order);\n warnings.push({\n code,\n field,\n from: requested,\n to,\n message: `${field} ${requested} coerced to ${to} for ${model.id}`,\n });\n return to;\n}\n\nfunction resolveDuration(\n requested: number | undefined,\n durations: CatalogModel[\"constraints\"][\"durations\"],\n model: CatalogModel,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): number | undefined {\n if (requested === undefined || !durations) return requested;\n const inSet = Array.isArray(durations)\n ? durations.includes(requested)\n : requested >= durations.min && requested <= durations.max;\n if (inSet) return requested;\n if (onUnsupported === \"error\") {\n const supported = Array.isArray(durations)\n ? `Supported: ${durations.join(\", \")}.`\n : `Supported range: ${durations.min}-${durations.max}.`;\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} does not support durationSeconds ${requested}. ${supported}`,\n model: model.id,\n });\n }\n const to = Array.isArray(durations)\n ? durations.reduce(\n (best, d) => (Math.abs(d - requested) < Math.abs(best - requested) ? d : best),\n durations[0] ?? requested,\n )\n : Math.min(Math.max(requested, durations.min), durations.max);\n warnings.push({\n code: \"duration_coerced\",\n field: \"durationSeconds\",\n from: requested,\n to,\n message: `duration ${requested}s coerced to ${to}s for ${model.id}`,\n });\n return to;\n}\n\n/** An unsupported ratio errors under \"error\"; under \"coerce\" it snaps with a warning. */\nfunction resolveAspectRatio(\n requested: AspectRatio | undefined,\n supported: AspectRatio[] | undefined,\n model: CatalogModel,\n onUnsupported: OnUnsupported,\n warnings: Warning[],\n): AspectRatio | undefined {\n if (requested === undefined || requested === \"adaptive\" || !supported) return requested;\n if (supported.includes(requested)) return requested;\n if (onUnsupported === \"error\") {\n throw new ModelKitError({\n code: \"unsupported_option\",\n message: `${model.id} does not support aspectRatio \"${requested}\". Supported: ${supported.join(\", \")}.`,\n model: model.id,\n });\n }\n const to = nearestAspectRatio(requested, supported);\n warnings.push({\n code: \"ratio_coerced\",\n field: \"aspectRatio\",\n from: requested,\n to,\n message: `aspect ratio ${requested} coerced to ${to} for ${model.id}`,\n });\n return to;\n}\n\nfunction compact(refs: MediaRef[] | undefined): MediaRef[] {\n return (refs ?? []).filter((r): r is MediaRef => Boolean(r));\n}\n\nfunction trim(\n field: string,\n refs: MediaRef[],\n limit: number | undefined,\n model: CatalogModel,\n warnings: Warning[],\n): MediaRef[] {\n if (limit === undefined || refs.length <= limit) return refs;\n warnings.push({\n code: \"references_trimmed\",\n field,\n from: refs.length,\n to: limit,\n message: `${field} trimmed from ${refs.length} to ${limit} for ${model.id}`,\n });\n return refs.slice(0, limit);\n}\n\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 && 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 refSum = lengths.reduce<number>((acc, len) => acc + (len ?? 0), 0);\n const sum = refSum + (sourceLimits?.inReferenceTotal ? (source ?? 0) : 0);\n if (sum > 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 && 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 merged: ImageRequest = { ...model.defaults, ...stripUndefined(request), model: model.id };\n\n const aspectRatio = resolveAspectRatio(\n merged.aspectRatio,\n c.aspectRatios,\n model,\n onUnsupported,\n warnings,\n );\n if (aspectRatio !== undefined) merged.aspectRatio = aspectRatio;\n const size = resolveTier(\n \"size\",\n \"size_coerced\",\n merged.size,\n c.sizes,\n SIZE_ORDER,\n model,\n onUnsupported,\n warnings,\n );\n if (size !== undefined) merged.size = size;\n\n const references = trim(\n \"references\",\n compact(merged.references),\n c.references?.images ?? c.references?.total,\n model,\n warnings,\n );\n if (references.length > 0) merged.references = references;\n else delete merged.references;\n if (c.requires?.includes(\"references\") && references.length === 0) {\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} requires at least one reference image`,\n model: model.id,\n });\n }\n dropUnsupported(merged, model, warnings, [\n \"seed\",\n \"quality\",\n \"count\",\n \"outputFormat\",\n \"scaleFactor\",\n \"safetySettings\",\n \"temperature\",\n \"upscale\",\n ]);\n return { request: merged, warnings };\n}\n\nexport function resolveVideoOptions(\n model: CatalogModel,\n request: VideoRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<VideoRequest> {\n const warnings: Warning[] = [];\n const c = model.constraints;\n const merged: VideoRequest = { ...model.defaults, ...stripUndefined(request), model: model.id };\n\n for (const input of c.requires ?? []) {\n const present =\n input === \"references\"\n ? compact(merged.referenceImages).length +\n compact(merged.referenceVideos).length +\n compact(merged.referenceAudios).length >\n 0\n : merged[input] !== undefined;\n if (!present)\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} requires ${input}`,\n model: model.id,\n });\n }\n\n // 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 const resolution = resolveTier(\n \"resolution\",\n \"resolution_coerced\",\n merged.resolution,\n c.resolutions,\n RESOLUTION_ORDER,\n model,\n onUnsupported,\n warnings,\n );\n if (resolution !== undefined) merged.resolution = resolution;\n const duration = resolveDuration(\n merged.durationSeconds,\n c.durations,\n model,\n onUnsupported,\n warnings,\n );\n if (duration !== undefined) merged.durationSeconds = duration;\n\n const limits = c.references ?? {};\n let images = trim(\n \"referenceImages\",\n compact(merged.referenceImages),\n limits.images,\n model,\n warnings,\n );\n let videos = trim(\n \"referenceVideos\",\n compact(merged.referenceVideos),\n limits.videos,\n model,\n warnings,\n );\n let audios = trim(\n \"referenceAudios\",\n compact(merged.referenceAudios),\n limits.audios,\n model,\n warnings,\n );\n // 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 ...(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 return { request: merged, warnings };\n}\n\nexport function resolveAudioOptions(\n model: CatalogModel,\n request: AudioRequest,\n onUnsupported: OnUnsupported = \"error\",\n): ResolveResult<AudioRequest> {\n const warnings: Warning[] = [];\n const c = model.constraints;\n const merged: AudioRequest = { ...model.defaults, ...stripUndefined(request), model: model.id };\n\n for (const input of c.requires ?? []) {\n const present =\n input === \"references\"\n ? compact(merged.references).length > 0\n : input === \"sourceVideo\" && merged.sourceVideo !== undefined;\n if (!present)\n throw new ModelKitError({\n code: \"missing_input\",\n message: `${model.id} requires ${input}`,\n model: model.id,\n });\n }\n\n const duration = resolveDuration(\n merged.durationSeconds,\n c.durations,\n model,\n onUnsupported,\n warnings,\n );\n if (duration !== undefined) merged.durationSeconds = duration;\n\n const references = trim(\n \"references\",\n compact(merged.references),\n c.references?.images ?? c.references?.total,\n model,\n warnings,\n );\n if (references.length > 0) merged.references = references;\n else delete merged.references;\n\n dropUnsupported(merged, model, warnings, [\"seed\", \"negativePrompt\", \"instrumental\"]);\n return { request: merged, warnings };\n}\n\nfunction dropUnsupported<T extends object>(\n req: T,\n model: CatalogModel,\n warnings: Warning[],\n fields: (keyof T & string)[],\n): void {\n const supports = model.constraints.supports ?? [];\n for (const field of fields) {\n // SAFETY: `fields` are a subset of SupportedOption; the cast only bridges the generic key type.\n if (req[field] !== undefined && !supports.includes(field as never)) {\n warnings.push({\n code: \"option_ignored\",\n field,\n from: req[field],\n message: `${model.id} does not support ${field}; ignored`,\n });\n delete req[field];\n }\n }\n}\n\nfunction setOrDelete(\n req: VideoRequest,\n field: \"referenceImages\" | \"referenceVideos\" | \"referenceAudios\",\n refs: MediaRef[],\n): void {\n if (refs.length > 0) req[field] = refs;\n else delete req[field];\n}\n\nfunction stripUndefined<T extends object>(obj: T): T {\n // SAFETY: only undefined-valued keys are removed, which does not change the static type of T.\n return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as T;\n}\n"],"mappings":"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","names":["SURFACES","GOOGLE_LOGO","import_zod","import_zod","SURFACES","import_zod","import_zod","result","import_zod","RangeSchema"]}