@ai-sdk/topaz 2.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -2
- package/dist/index.d.ts +183 -180
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1100 -1294
- package/dist/index.js.map +1 -1
- package/docs/210-topaz.mdx +17 -6
- package/package.json +11 -11
- package/src/topaz-image-model.ts +34 -16
- package/src/topaz-provider.ts +11 -11
- package/src/topaz-video-model-options.ts +0 -6
- package/src/topaz-video-model.ts +61 -105
- package/src/topaz-get-from-api.ts +0 -53
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/topaz-provider.ts","../src/topaz-image-model.ts","../src/topaz-error.ts","../src/topaz-get-from-api.ts","../src/topaz-image-model-options.ts","../src/topaz-image-settings.ts","../src/topaz-video-model.ts","../src/topaz-video-model-options.ts","../src/topaz-video-settings.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type Experimental_VideoModelV3 as VideoModelV3,\n type ImageModelV3,\n type ProviderV3,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { TopazImageModel } from './topaz-image-model';\nimport type { TopazImageModelId } from './topaz-image-settings';\nimport { TopazVideoModel } from './topaz-video-model';\nimport type { TopazVideoModelId } from './topaz-video-settings';\nimport { VERSION } from './version';\n\nexport interface TopazProviderSettings {\n /**\n * Topaz Labs API key. Default value is taken from the `TOPAZ_API_KEY`\n * environment variable.\n *\n * @see https://developer.topazlabs.com/getting-started/api-key-setup\n */\n apiKey?: string;\n\n /**\n * Base URL for the API calls.\n */\n baseURL?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept\n * requests, or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface TopazProvider extends ProviderV3 {\n /**\n * Creates a model for image enhancement.\n */\n image(modelId: TopazImageModelId): ImageModelV3;\n\n /**\n * Creates a model for image enhancement.\n */\n imageModel(modelId: TopazImageModelId): ImageModelV3;\n\n /**\n * Creates a model for video enhancement.\n */\n video(modelId: TopazVideoModelId): VideoModelV3;\n\n /**\n * Creates a model for video enhancement.\n */\n videoModel(modelId: TopazVideoModelId): VideoModelV3;\n}\n\nconst defaultBaseURL = 'https://api.topazlabs.com';\n\n/**\n * Create a Topaz Labs provider instance.\n */\nexport function createTopaz(\n options: TopazProviderSettings = {},\n): TopazProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL ?? defaultBaseURL) ?? defaultBaseURL;\n\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n 'X-API-Key': loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'TOPAZ_API_KEY',\n description: 'Topaz Labs',\n }),\n accept: 'application/json',\n ...options.headers,\n },\n `ai-sdk-topaz/${VERSION}`,\n );\n\n const createImageModel = (modelId: TopazImageModelId): ImageModelV3 =>\n new TopazImageModel(modelId, {\n provider: 'topaz.image',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createVideoModel = (modelId: TopazVideoModelId): VideoModelV3 =>\n new TopazVideoModel(modelId, {\n provider: 'topaz.video',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const noSuchModel = (\n modelId: string,\n modelType:\n | 'languageModel'\n | 'embeddingModel'\n | 'transcriptionModel'\n | 'speechModel'\n | 'rerankingModel',\n ): never => {\n throw new NoSuchModelError({ modelId, modelType });\n };\n\n const provider: TopazProvider = {\n specificationVersion: 'v3' as const,\n image: createImageModel,\n imageModel: createImageModel,\n video: createVideoModel,\n videoModel: createVideoModel,\n languageModel: (modelId: string) => noSuchModel(modelId, 'languageModel'),\n embeddingModel: (modelId: string) => noSuchModel(modelId, 'embeddingModel'),\n };\n\n return provider;\n}\n\n/**\n * Default Topaz Labs provider instance.\n */\nexport const topaz = createTopaz();\n","import {\n AISDKError,\n InvalidArgumentError,\n InvalidResponseDataError,\n type ImageModelV3,\n type ImageModelV3CallOptions,\n type SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertBase64ToUint8Array,\n createBinaryResponseHandler,\n createJsonResponseHandler,\n delay,\n mediaTypeToExtension,\n parseProviderOptions,\n postFormDataToApi,\n removeUndefinedEntries,\n resolve,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { TopazConfig } from './topaz-config';\nimport { topazFailedResponseHandler } from './topaz-error';\nimport { topazGetFromApi } from './topaz-get-from-api';\nimport {\n topazImageModelOptionsSchema,\n type TopazImageModelOptions,\n} from './topaz-image-model-options';\nimport {\n resolveTopazImageApiModelId,\n type TopazImageModelId,\n} from './topaz-image-settings';\n\nconst DEFAULT_POLL_INTERVAL_MILLIS = 2000;\nconst DEFAULT_POLL_TIMEOUT_MILLIS = 600_000;\n\n/**\n * Topaz enhances an image that the caller supplies, so `files` is required and\n * exactly one image is processed per call.\n */\nexport class TopazImageModel implements ImageModelV3 {\n readonly specificationVersion = 'v3';\n readonly maxImagesPerCall = 1;\n readonly supportsFileInputs = true;\n readonly supportsMaskInputs = false;\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: TopazImageModelId,\n private readonly config: TopazConfig,\n ) {}\n\n async doGenerate(\n options: ImageModelV3CallOptions,\n ): Promise<Awaited<ReturnType<ImageModelV3['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const warnings: SharedV3Warning[] = [];\n\n const topazOptions = await parseProviderOptions({\n provider: 'topaz',\n providerOptions: options.providerOptions,\n schema: topazImageModelOptionsSchema,\n });\n const headers = combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n );\n\n this.addUnsupportedWarnings(options, warnings);\n\n const formData = await this.buildFormData(options, topazOptions, warnings);\n\n const { value: submitResponse } = await postFormDataToApi({\n url: `${this.config.baseURL}/image/v1/enhance-gen/async`,\n headers,\n formData,\n successfulResponseHandler: createJsonResponseHandler(\n topazImageSubmitResponseSchema,\n ),\n failedResponseHandler: topazFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const processId = submitResponse.process_id;\n if (processId == null) {\n throw new InvalidResponseDataError({\n data: submitResponse,\n message: 'Topaz did not return a process_id for the enhance request.',\n });\n }\n\n let status: TopazImageStatusResponse;\n try {\n status = await this.waitForCompletion({\n processId,\n headers,\n abortSignal: options.abortSignal,\n pollIntervalMillis:\n topazOptions?.pollIntervalMillis ?? DEFAULT_POLL_INTERVAL_MILLIS,\n pollTimeoutMillis:\n topazOptions?.pollTimeoutMillis ?? DEFAULT_POLL_TIMEOUT_MILLIS,\n });\n } catch (error) {\n // Topaz charges on completion, so a job nobody will download should not\n // be left running after the caller aborts.\n if (options.abortSignal?.aborted) {\n await this.cancelQuietly(processId, headers);\n }\n throw error;\n }\n\n const { image, responseHeaders } = await this.download({\n processId,\n headers,\n abortSignal: options.abortSignal,\n });\n\n return {\n images: [image],\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n providerMetadata: {\n topaz: {\n images: [\n {\n processId,\n // Topaz bills exactly the credits reported on the completed job.\n ...(status.credits != null ? { credits: status.credits } : {}),\n ...(status.output_width != null\n ? { width: status.output_width }\n : {}),\n ...(status.output_height != null\n ? { height: status.output_height }\n : {}),\n ...(status.output_format != null\n ? { format: status.output_format }\n : {}),\n },\n ],\n },\n },\n };\n }\n\n private addUnsupportedWarnings(\n options: ImageModelV3CallOptions,\n warnings: SharedV3Warning[],\n ): void {\n if (options.prompt != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'prompt',\n details:\n 'Topaz image models enhance an existing image and do not take a text prompt. ' +\n 'The prompt was ignored.',\n });\n }\n\n if (options.aspectRatio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n 'Topaz image models do not support aspectRatio. Use `size`, or the ' +\n '`outputWidth` / `outputHeight` provider options, to set output dimensions.',\n });\n }\n\n if (options.seed != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'seed',\n details: 'Topaz image models do not support seed.',\n });\n }\n\n if (options.mask != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'mask',\n details:\n 'Topaz image models do not support masks. The mask was ignored.',\n });\n }\n\n if (options.n > 1) {\n warnings.push({\n type: 'unsupported',\n feature: 'n',\n details:\n 'Topaz image models enhance one image per call. Only 1 image will be returned.',\n });\n }\n }\n\n private async buildFormData(\n options: ImageModelV3CallOptions,\n topazOptions: TopazImageModelOptions | undefined,\n warnings: SharedV3Warning[],\n ): Promise<FormData> {\n const file = options.files?.[0];\n\n if (file == null) {\n throw new InvalidArgumentError({\n argument: 'files',\n message:\n 'Topaz image models enhance an existing image. Pass the input image via ' +\n '`prompt.images`.',\n });\n }\n\n if (options.files != null && options.files.length > 1) {\n warnings.push({\n type: 'unsupported',\n feature: 'files',\n details:\n 'Topaz image models enhance one image per call. Only the first file was used.',\n });\n }\n\n const formData = new FormData();\n formData.append('model', resolveTopazImageApiModelId(this.modelId));\n\n if (file.type === 'url') {\n // Topaz fetches the source itself when given a URL, so the bytes never\n // need to pass through the SDK.\n formData.append('source_url', file.url);\n } else {\n const bytes =\n typeof file.data === 'string'\n ? convertBase64ToUint8Array(file.data)\n : file.data;\n const extension = mediaTypeToExtension(file.mediaType) ?? 'png';\n\n formData.append(\n 'image',\n new File([bytes as BlobPart], `image.${extension}`, {\n type: file.mediaType,\n }),\n );\n }\n\n const { width, height } = parseSize(options.size);\n\n appendIfDefined(\n formData,\n 'output_width',\n topazOptions?.outputWidth ?? width,\n );\n appendIfDefined(\n formData,\n 'output_height',\n topazOptions?.outputHeight ?? height,\n );\n appendIfDefined(formData, 'output_format', topazOptions?.outputFormat);\n appendIfDefined(formData, 'crop_to_fill', topazOptions?.cropToFill);\n appendIfDefined(formData, 'webhook_url', topazOptions?.webhookUrl);\n\n // Model-specific settings use camelCase, unlike the request schema fields\n // above.\n appendIfDefined(\n formData,\n 'enhancementStrength',\n topazOptions?.enhancementStrength,\n );\n appendIfDefined(formData, 'grain', topazOptions?.grain);\n appendIfDefined(formData, 'grainDensity', topazOptions?.grainDensity);\n appendIfDefined(formData, 'grainModel', topazOptions?.grainModel);\n appendIfDefined(formData, 'grainSize', topazOptions?.grainSize);\n appendIfDefined(formData, 'grainStrength', topazOptions?.grainStrength);\n appendIfDefined(formData, 'inputWidth', topazOptions?.inputWidth);\n appendIfDefined(formData, 'inputHeight', topazOptions?.inputHeight);\n\n return formData;\n }\n\n private async waitForCompletion({\n processId,\n headers,\n abortSignal,\n pollIntervalMillis,\n pollTimeoutMillis,\n }: {\n processId: string;\n headers: Record<string, string | undefined> | undefined;\n abortSignal: AbortSignal | undefined;\n pollIntervalMillis: number;\n pollTimeoutMillis: number;\n }): Promise<TopazImageStatusResponse> {\n const deadline = Date.now() + pollTimeoutMillis;\n\n while (true) {\n const { value: status } = await topazGetFromApi({\n url: `${this.config.baseURL}/image/v1/status/${processId}`,\n // Built from the configured baseURL, not from response data.\n validateUrl: false,\n headers,\n successfulResponseHandler: createJsonResponseHandler(\n topazImageStatusResponseSchema,\n ),\n failedResponseHandler: topazFailedResponseHandler,\n abortSignal,\n fetch: this.config.fetch,\n });\n\n if (status.status === 'Completed') {\n return status;\n }\n\n if (status.status === 'Failed' || status.status === 'Cancelled') {\n throw new AISDKError({\n name: 'TOPAZ_IMAGE_ENHANCEMENT_FAILED',\n message: `Topaz image enhancement ${status.status.toLowerCase()} for process ${processId}.`,\n });\n }\n\n if (Date.now() + pollIntervalMillis > deadline) {\n await this.cancelQuietly(processId, headers ?? {});\n throw new AISDKError({\n name: 'TOPAZ_IMAGE_ENHANCEMENT_TIMEOUT',\n message:\n `Topaz image enhancement did not finish within ${pollTimeoutMillis}ms ` +\n `(process ${processId}, last status ${status.status ?? 'unknown'}). ` +\n 'Increase the `pollTimeoutMillis` provider option if the job needs longer.',\n });\n }\n\n await delay(pollIntervalMillis, { abortSignal });\n }\n }\n\n private async cancelQuietly(\n processId: string,\n headers: Record<string, string | undefined>,\n ): Promise<void> {\n const fetchImpl = this.config.fetch ?? globalThis.fetch;\n\n try {\n // Deliberately not tied to the caller's abort signal, which may be the\n // reason polling stopped.\n await fetchImpl(`${this.config.baseURL}/image/v1/cancel/${processId}`, {\n method: 'DELETE',\n headers: removeUndefinedEntries(headers),\n });\n } catch {\n // Best effort: the original error is more useful to the caller.\n }\n }\n\n private async download({\n processId,\n headers,\n abortSignal,\n }: {\n processId: string;\n headers: Record<string, string | undefined> | undefined;\n abortSignal: AbortSignal | undefined;\n }): Promise<{\n image: Uint8Array;\n responseHeaders: Record<string, string> | undefined;\n }> {\n const { value: downloadResponse } = await topazGetFromApi({\n url: `${this.config.baseURL}/image/v1/download/${processId}`,\n // Built from the configured baseURL, not from response data.\n validateUrl: false,\n headers,\n successfulResponseHandler: createJsonResponseHandler(\n topazImageDownloadResponseSchema,\n ),\n failedResponseHandler: topazFailedResponseHandler,\n abortSignal,\n fetch: this.config.fetch,\n });\n\n const downloadUrl = downloadResponse.download_url;\n if (downloadUrl == null) {\n throw new InvalidResponseDataError({\n data: downloadResponse,\n message: `Topaz did not return a download URL for process ${processId}.`,\n });\n }\n\n const { value: image, responseHeaders } = await topazGetFromApi({\n url: downloadUrl,\n // Comes from the Topaz response body and normally points at object\n // storage, so it is validated and the API key is withheld off-origin.\n validateUrl: true,\n credentialedOrigin: this.config.baseURL,\n trustedOrigin: this.config.baseURL,\n headers,\n successfulResponseHandler: createBinaryResponseHandler(),\n failedResponseHandler: topazFailedResponseHandler,\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return { image, responseHeaders };\n }\n}\n\nfunction parseSize(size: `${number}x${number}` | undefined): {\n width: number | undefined;\n height: number | undefined;\n} {\n if (size == null) {\n return { width: undefined, height: undefined };\n }\n\n const [width, height] = size.split('x').map(Number);\n return { width, height };\n}\n\nfunction appendIfDefined(\n formData: FormData,\n key: string,\n value: string | number | boolean | undefined,\n): void {\n if (value !== undefined) {\n formData.append(key, String(value));\n }\n}\n\nconst topazImageSubmitResponseSchema = z.object({\n process_id: z.string().nullish(),\n});\n\nconst topazImageStatusResponseSchema = z.object({\n // Documented values are Pending, Processing, Completed, Cancelled and Failed.\n // Unknown values keep polling rather than failing the parse.\n status: z.string().nullish(),\n credits: z.number().nullish(),\n output_width: z.number().nullish(),\n output_height: z.number().nullish(),\n output_format: z.string().nullish(),\n});\n\ntype TopazImageStatusResponse = z.infer<typeof topazImageStatusResponseSchema>;\n\nconst topazImageDownloadResponseSchema = z.object({\n download_url: z.string().nullish(),\n});\n","import { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/**\n * The image API reports errors as `{ \"message\": ... }` and the video API as\n * `{ \"message\": ..., \"errorCode\": ... }`. `detail` (a message or FastAPI's\n * array of validation issues) and `error` are accepted as well because a few\n * endpoints use them instead.\n */\nexport const topazErrorDataSchema = z.object({\n detail: z\n .union([\n z.string(),\n z.array(z.object({ msg: z.string().nullish() }).loose()),\n ])\n .nullish(),\n message: z.string().nullish(),\n error: z.string().nullish(),\n errorCode: z.string().nullish(),\n errors: z.array(z.object({ msg: z.string().nullish() }).loose()).nullish(),\n});\n\nexport type TopazErrorData = z.infer<typeof topazErrorDataSchema>;\n\nexport function topazErrorToMessage(data: TopazErrorData): string {\n const message = baseErrorMessage(data);\n const withCode =\n data.errorCode != null ? `${message} (${data.errorCode})` : message;\n\n // The video API lists field validation failures separately.\n const issues = (data.errors ?? [])\n .map(issue => issue.msg)\n .filter((msg): msg is string => msg != null);\n\n return issues.length > 0 ? `${withCode}: ${issues.join('; ')}` : withCode;\n}\n\nfunction baseErrorMessage(data: TopazErrorData): string {\n const { detail } = data;\n\n if (typeof detail === 'string') {\n return detail;\n }\n\n if (Array.isArray(detail)) {\n const messages = detail\n .map(issue => issue.msg)\n .filter((msg): msg is string => msg != null);\n\n if (messages.length > 0) {\n return messages.join('; ');\n }\n }\n\n return data.message ?? data.error ?? 'Unknown Topaz API error';\n}\n\nexport const topazFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: topazErrorDataSchema,\n errorToMessage: topazErrorToMessage,\n});\n","import {\n fetchWithValidatedEndpoint,\n fetchWithValidatedRedirects,\n getFromApi,\n isSameOrigin,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\n\n/**\n * Adapts URL validation to v6's getFromApi, which does not yet expose the\n * validateUrl and credentialedOrigin options.\n */\nexport async function topazGetFromApi<T>({\n validateUrl,\n credentialedOrigin,\n trustedOrigin,\n ...options\n}: Parameters<typeof getFromApi<T>>[0] & {\n validateUrl: boolean;\n credentialedOrigin?: string;\n trustedOrigin?: string;\n}) {\n const validatedFetch: FetchFunction = (url, init) =>\n fetchWithValidatedRedirects({\n url: url.toString(),\n headers: init?.headers,\n abortSignal: init?.signal ?? undefined,\n trustedOrigin,\n fetch: (hopUrl, hopInit) =>\n fetchWithValidatedEndpoint({\n url: hopUrl.toString(),\n init: {\n ...hopInit,\n headers:\n credentialedOrigin != null &&\n isSameOrigin(hopUrl.toString(), credentialedOrigin)\n ? hopInit?.headers\n : undefined,\n },\n trustedOrigin,\n redirect: 'manual',\n fetch: options.fetch,\n }),\n });\n\n // v6 ignores this flag; validation is handled by the injected fetch above.\n const requestOptions = {\n ...options,\n validateUrl: false,\n fetch: validateUrl ? validatedFetch : options.fetch,\n };\n return getFromApi(requestOptions);\n}\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/**\n * Provider options for Topaz generative image models (Wonder 3.5).\n *\n * The documented request schema fields are sent in snake_case\n * (`output_width`, `output_format`, ...); model-specific settings are sent in\n * camelCase, matching the Topaz model reference.\n *\n * @see https://developer.topazlabs.com/image-models/wonder/wonder-3.5-new\n */\nexport const topazImageModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z.object({\n /**\n * How aggressively the model enhances the image. Defaults to `high`.\n */\n enhancementStrength: z.enum(['low', 'medium', 'high']).optional(),\n\n /**\n * Whether to add grain to the output. Defaults to `false`.\n */\n grain: z.boolean().optional(),\n\n /**\n * Grain intensity, 0.0 to 1.0. Defaults to 0.5.\n */\n grainDensity: z.number().min(0).max(1).optional(),\n\n /**\n * Grain model. Defaults to `silver`.\n */\n grainModel: z.enum(['silver', 'gaussian', 'grey']).optional(),\n\n /**\n * Grain particle size, 1 to 5. Defaults to 1.\n */\n grainSize: z.number().min(1).max(5).optional(),\n\n /**\n * Grain effect strength, 0.0 to 1.0. Defaults to 0.5.\n */\n grainStrength: z.number().min(0).max(1).optional(),\n\n /**\n * Width of the input image in pixels. Topaz infers this from the upload when\n * omitted.\n */\n inputWidth: z.number().int().positive().optional(),\n\n /**\n * Height of the input image in pixels. Topaz infers this from the upload\n * when omitted.\n */\n inputHeight: z.number().int().positive().optional(),\n\n /**\n * Width of the output image in pixels, 1 to 32000. Takes precedence over the\n * width derived from the `size` call option.\n */\n outputWidth: z.number().int().min(1).max(32000).optional(),\n\n /**\n * Height of the output image in pixels, 1 to 32000. Takes precedence over\n * the height derived from the `size` call option.\n */\n outputHeight: z.number().int().min(1).max(32000).optional(),\n\n /**\n * Output image format. Defaults to the Topaz API default.\n */\n outputFormat: z.enum(['jpeg', 'jpg', 'png', 'tiff', 'tif']).optional(),\n\n /**\n * Whether to crop the output to fill the requested dimensions. Defaults to\n * `false`.\n */\n cropToFill: z.boolean().optional(),\n\n /**\n * URL to receive job-status webhooks.\n */\n webhookUrl: z.string().optional(),\n\n /**\n * How often to poll the Topaz status endpoint, in milliseconds. Defaults to\n * 2000.\n */\n pollIntervalMillis: z.number().int().positive().optional(),\n\n /**\n * How long to wait for the job to finish before failing, in milliseconds.\n * Defaults to 600000 (10 minutes).\n */\n pollTimeoutMillis: z.number().int().positive().optional(),\n }),\n ),\n);\n\nexport type TopazImageModelOptions = InferSchema<\n typeof topazImageModelOptionsSchema\n>;\n","/**\n * Topaz image model ids.\n *\n * The AI SDK exposes a readable id that is mapped onto the name the Topaz API\n * expects in the `model` form field (see `topazImageApiModelIds`). Passing a\n * raw Topaz name such as `Wonder 3.5` also works - unknown ids are forwarded\n * to the API unchanged.\n */\nexport type TopazImageModelId = 'wonder-3.5' | (string & {});\n\n/**\n * Maps AI SDK image model ids onto Topaz API model names.\n *\n * @see https://developer.topazlabs.com/image-models/wonder/wonder-3.5-new\n */\nexport const topazImageApiModelIds: Record<string, string> = {\n 'wonder-3.5': 'Wonder 3.5',\n};\n\nexport function resolveTopazImageApiModelId(modelId: string): string {\n return topazImageApiModelIds[modelId] ?? modelId;\n}\n","import {\n AISDKError,\n APICallError,\n InvalidArgumentError,\n InvalidResponseDataError,\n type Experimental_VideoModelV3 as VideoModelV3,\n type Experimental_VideoModelV3File as VideoModelV3File,\n type SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertBase64ToUint8Array,\n createJsonResponseHandler,\n delay,\n isSameOrigin,\n parseProviderOptions,\n postJsonToApi,\n removeUndefinedEntries,\n resolve,\n validateDownloadUrl,\n withUserAgentSuffix,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { TopazConfig } from './topaz-config';\nimport { topazFailedResponseHandler } from './topaz-error';\nimport { topazGetFromApi } from './topaz-get-from-api';\nimport {\n TOPAZ_NON_FILTER_OPTION_KEYS,\n type topazOutputContainers,\n topazSourceContainers,\n topazVideoModelOptionsSchema,\n type TopazVideoModelOptions,\n} from './topaz-video-model-options';\nimport {\n resolveTopazVideoApiModelId,\n type TopazVideoModelId,\n} from './topaz-video-settings';\nimport { VERSION } from './version';\n\ntype VideoModelResult = Awaited<ReturnType<VideoModelV3['doGenerate']>>;\ntype TopazVideoOperation = { requestId: string; outputContainer: string };\n\nconst DEFAULT_POLL_INTERVAL_MILLIS = 2000;\nconst DEFAULT_POLL_TIMEOUT_MILLIS = 3_600_000;\n\ntype TopazSourceContainer = (typeof topazSourceContainers)[number];\ntype TopazOutputContainer = (typeof topazOutputContainers)[number];\n\nconst mediaTypeContainers: Record<string, TopazSourceContainer> = {\n 'video/mp4': 'mp4',\n 'video/quicktime': 'mov',\n 'video/mov': 'mov',\n 'video/x-matroska': 'mkv',\n 'video/matroska': 'mkv',\n 'video/webm': 'webm',\n 'video/x-msvideo': 'avi',\n 'video/avi': 'avi',\n 'video/mpeg': 'mpeg',\n 'video/mp2t': 'ts',\n 'video/x-ms-wmv': 'wmv',\n 'video/x-flv': 'flv',\n 'video/3gpp': '3gp',\n 'video/x-m4v': 'm4v',\n 'application/mxf': 'mxf',\n};\n\nconst extensionContainers: Record<string, TopazSourceContainer> = {\n ...Object.fromEntries(topazSourceContainers.map(c => [c, c])),\n qt: 'mov',\n};\n\nconst containerMediaTypes: Record<string, string> = {\n mp4: 'video/mp4',\n m4v: 'video/mp4',\n mov: 'video/quicktime',\n mkv: 'video/x-matroska',\n webm: 'video/webm',\n avi: 'video/x-msvideo',\n mpeg: 'video/mpeg',\n mpg: 'video/mpeg',\n ts: 'video/mp2t',\n wmv: 'video/x-ms-wmv',\n flv: 'video/x-flv',\n '3gp': 'video/3gpp',\n mxf: 'application/mxf',\n};\n\n/**\n * Topaz video models enhance a video the caller supplies, passed through\n * `inputReferences`. `doGenerate` creates an express request: Topaz fetches URL\n * inputs itself, and file inputs are uploaded to the returned URL. Processing\n * starts once Topaz has the video, and the provider polls until it completes.\n */\nexport class TopazVideoModel implements VideoModelV3 {\n readonly specificationVersion = 'v3';\n readonly maxVideosPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: TopazVideoModelId,\n private readonly config: TopazConfig,\n ) {}\n\n async doGenerate(\n options: Parameters<VideoModelV3['doGenerate']>[0],\n ): Promise<VideoModelResult> {\n const topazOptions = await parseProviderOptions({\n provider: 'topaz',\n providerOptions: options.providerOptions,\n schema: topazVideoModelOptionsSchema,\n });\n const started = await this.start(options);\n const pollIntervalMillis =\n topazOptions?.pollIntervalMillis ?? DEFAULT_POLL_INTERVAL_MILLIS;\n const pollTimeoutMillis =\n topazOptions?.pollTimeoutMillis ?? DEFAULT_POLL_TIMEOUT_MILLIS;\n const deadline = Date.now() + pollTimeoutMillis;\n\n try {\n while (true) {\n const result = await this.getStatus({\n operation: started.operation,\n headers: options.headers,\n abortSignal: options.abortSignal,\n });\n if (result != null) {\n return {\n ...result,\n warnings: [...started.warnings, ...result.warnings],\n response: {\n ...result.response,\n timestamp: started.response.timestamp,\n },\n };\n }\n\n if (Date.now() + pollIntervalMillis > deadline) {\n const headers = combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n );\n await this.cancelQuietly(started.operation.requestId, headers);\n throw new AISDKError({\n name: 'TOPAZ_VIDEO_ENHANCEMENT_TIMEOUT',\n message:\n `Topaz video enhancement did not finish within ${pollTimeoutMillis}ms ` +\n `(request ${started.operation.requestId}). ` +\n 'Increase the `pollTimeoutMillis` provider option if the job needs longer.',\n });\n }\n await delay(pollIntervalMillis, { abortSignal: options.abortSignal });\n }\n } catch (error) {\n if (options.abortSignal?.aborted) {\n const headers = combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n );\n await this.cancelQuietly(started.operation.requestId, headers);\n }\n throw error;\n }\n }\n\n private async start(\n options: Parameters<VideoModelV3['doGenerate']>[0],\n ): Promise<\n Omit<VideoModelResult, 'videos'> & { operation: TopazVideoOperation }\n > {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const warnings: SharedV3Warning[] = [];\n\n const topazOptions = await parseProviderOptions({\n provider: 'topaz',\n providerOptions: options.providerOptions,\n schema: topazVideoModelOptionsSchema,\n });\n const headers = combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n );\n\n this.addUnsupportedWarnings(options, warnings);\n\n const input = this.selectInputVideo(options, warnings);\n const container = resolveContainer(input, topazOptions?.source?.container);\n const source = resolveSource(topazOptions, container);\n const output = buildOutput({ options, topazOptions, source });\n const filters = [\n buildFilter(this.modelId, topazOptions),\n ...(topazOptions?.additionalFilters ?? []),\n ];\n const contentType =\n containerMediaTypes[source.container] ?? 'application/octet-stream';\n\n const metadata = source.metadata;\n const bytes = input.type === 'file' ? fileBytes(input) : undefined;\n let requestId: string | undefined;\n\n try {\n const { value: created, responseHeaders } = await postJsonToApi({\n url: `${this.config.baseURL}/video/express`,\n headers,\n body: {\n source: {\n container: source.container,\n ...(metadata != null\n ? {\n duration: metadata.duration,\n frameCount: metadata.frameCount,\n frameRate: metadata.frameRate,\n resolution: {\n width: metadata.width,\n height: metadata.height,\n },\n }\n : {}),\n ...(input.type === 'url'\n ? // Topaz fetches URL inputs itself, so, like other providers,\n // the SDK never downloads them.\n { external: { provider: 's3', presignedUrl: input.url } }\n : { size: bytes?.byteLength }),\n },\n output,\n filters,\n },\n successfulResponseHandler: createJsonResponseHandler(\n topazVideoExpressResponseSchema,\n ),\n failedResponseHandler: topazFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n requestId = requireRequestId(created.requestId);\n\n if (bytes != null) {\n await this.uploadVideo({\n requestId,\n bytes,\n urls: created.uploadUrls,\n contentType,\n abortSignal: options.abortSignal,\n });\n }\n\n return {\n // The output container travels with the operation so the polling code can\n // report the right media type without re-deriving it.\n operation: { requestId, outputContainer: output.container },\n warnings,\n providerMetadata: {\n topaz: {\n requestId,\n // Preliminary: Topaz estimates up front only when it gets source\n // metadata, and the completed status carries the billed value.\n ...(created.estimates?.cost != null\n ? { estimatedCredits: created.estimates.cost }\n : {}),\n },\n },\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n } catch (error) {\n // Canceling before processing starts refunds any reserved credits.\n if (requestId != null) {\n await this.cancelQuietly(requestId, headers);\n }\n throw error;\n }\n }\n\n private async getStatus(options: {\n operation: TopazVideoOperation;\n headers?: Record<string, string | undefined>;\n abortSignal?: AbortSignal;\n }): Promise<VideoModelResult | undefined> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { requestId, outputContainer } = options.operation as {\n requestId: string;\n outputContainer?: string;\n };\n\n const { value: status, responseHeaders } = await topazGetFromApi({\n url: `${this.config.baseURL}/video/${requestId}/status`,\n // Built from the configured baseURL, not from response data.\n validateUrl: false,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n successfulResponseHandler: createJsonResponseHandler(\n topazVideoStatusResponseSchema,\n ),\n failedResponseHandler: topazFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const response = {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n };\n\n if (status.status === 'complete') {\n // Topaz confirmed it invoices the lower bound of `estimates.cost`, which\n // it recomputes once the source upload has been received.\n const credits = lowerBoundCredits(status.estimates?.cost);\n\n const url = status.download?.url;\n if (url == null) {\n throw new InvalidResponseDataError({\n data: status,\n message: `Topaz reported request ${requestId} complete but returned no download URL.`,\n });\n }\n\n return {\n videos: [\n {\n type: 'url',\n url,\n mediaType:\n (outputContainer != null\n ? containerMediaTypes[outputContainer]\n : undefined) ?? 'video/mp4',\n },\n ],\n warnings: [],\n response,\n providerMetadata: {\n topaz: {\n requestId,\n ...(credits != null ? { credits } : {}),\n ...(status.estimates?.cost != null\n ? { estimatedCredits: status.estimates.cost }\n : {}),\n ...(status.outputSize != null\n ? { outputSize: status.outputSize }\n : {}),\n ...(status.download?.expiresAt != null\n ? { expiresAt: status.download.expiresAt }\n : {}),\n },\n },\n };\n }\n\n if (status.status === 'failed' || status.status === 'canceled') {\n throw new AISDKError({\n name: 'TOPAZ_VIDEO_ENHANCEMENT_FAILED',\n message:\n `Topaz video request ${requestId} ${status.status}` +\n (status.errorCode != null ? ` (${status.errorCode})` : '') +\n (status.message != null ? `: ${status.message}` : '.'),\n });\n }\n\n // Documented in-progress values are requested, accepted, initializing,\n // preprocessing, processing, postprocessing and canceling. Anything else\n // keeps polling too, so a newly added state cannot break running jobs.\n return undefined;\n }\n\n private addUnsupportedWarnings(\n options: Parameters<VideoModelV3['doGenerate']>[0],\n warnings: SharedV3Warning[],\n ): void {\n // `generateVideo` requires a prompt, so an empty one is the expected way\n // to call an enhancement model and does not warrant a warning.\n if (options.prompt != null && options.prompt.trim() !== '') {\n warnings.push({\n type: 'unsupported',\n feature: 'prompt',\n details:\n 'Topaz video models enhance an existing video and do not take a text prompt. ' +\n 'The prompt was ignored.',\n });\n }\n\n if (options.aspectRatio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n 'Topaz video models do not support aspectRatio. Use `resolution`, or the ' +\n '`output` provider option, to set the output dimensions.',\n });\n }\n\n if (options.seed != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'seed',\n details: 'Topaz video models do not support seed.',\n });\n }\n\n if (options.duration != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details:\n 'Topaz video models enhance the whole input video, so duration was ignored. ' +\n 'Pass the input duration via the `source.duration` provider option instead.',\n });\n }\n\n if (options.generateAudio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'generateAudio',\n details:\n 'Topaz video models do not generate audio. Use the `output.audioTransfer` ' +\n 'provider option to control how the input audio track is carried over.',\n });\n }\n\n if (options.frameImages != null && options.frameImages.length > 0) {\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n 'Topaz video models do not support first/last frame generation. The frame ' +\n 'images were ignored.',\n });\n }\n\n if (options.n > 1) {\n warnings.push({\n type: 'unsupported',\n feature: 'n',\n details:\n 'Topaz video models enhance one video per call. Only 1 video will be produced.',\n });\n }\n }\n\n private selectInputVideo(\n options: Parameters<VideoModelV3['doGenerate']>[0],\n warnings: SharedV3Warning[],\n ): VideoModelV3File {\n const references = options.inputReferences ?? [];\n const videos = references.filter(isVideoReference);\n\n if (videos.length === 0) {\n if (options.image != null) {\n throw new InvalidArgumentError({\n argument: 'image',\n message:\n 'Topaz video models enhance an existing video, not a still image. Pass the ' +\n 'input video via `inputReferences`.',\n });\n }\n\n throw new InvalidArgumentError({\n argument: 'inputReferences',\n message:\n 'Topaz video models require an input video. Pass it via `inputReferences`, ' +\n 'e.g. `inputReferences: [{ type: \"file\", mediaType: \"video/mp4\", data: bytes }]`. ' +\n 'For URL references, include `mediaType` so the reference is recognized as a video.',\n });\n }\n\n if (references.length > 1) {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'Topaz video models enhance a single video. Only the first video reference was used.',\n });\n }\n\n return videos[0];\n }\n\n private async uploadVideo({\n requestId,\n bytes,\n urls,\n contentType,\n abortSignal,\n }: {\n requestId: string;\n bytes: Uint8Array;\n urls: string[] | null | undefined;\n contentType: string;\n abortSignal: AbortSignal | undefined;\n }): Promise<void> {\n const url = urls?.[0];\n if (url == null) {\n throw new InvalidResponseDataError({\n data: urls,\n message: `Topaz returned no upload URL for request ${requestId}.`,\n });\n }\n\n // The upload URL comes from the Topaz response body. `getFromApi` cannot\n // be used for a PUT, so the same trust decision is made explicitly here:\n // validate unless the URL points back at the configured base URL, and\n // never attach the API key (presigned URLs carry their own credentials).\n if (!isSameOrigin(url, this.config.baseURL)) {\n validateDownloadUrl(url);\n }\n\n const fetchImpl = this.config.fetch ?? globalThis.fetch;\n const response = await fetchImpl(url, {\n method: 'PUT',\n headers: withUserAgentSuffix(\n { 'Content-Type': contentType },\n `ai-sdk-topaz/${VERSION}`,\n ) as HeadersInit,\n body: bytes as BodyInit,\n signal: abortSignal,\n });\n\n if (!response.ok) {\n throw new APICallError({\n message: `Uploading the input video failed with status ${response.status}.`,\n url,\n requestBodyValues: {},\n statusCode: response.status,\n responseHeaders: Object.fromEntries(response.headers.entries()),\n responseBody: await response.text(),\n });\n }\n }\n\n private async cancelQuietly(\n requestId: string,\n headers: Record<string, string | undefined>,\n ): Promise<void> {\n const fetchImpl = this.config.fetch ?? globalThis.fetch;\n\n try {\n // Deliberately not tied to the caller's abort signal, which may be the\n // reason the start failed.\n await fetchImpl(`${this.config.baseURL}/video/${requestId}`, {\n method: 'DELETE',\n headers: removeUndefinedEntries(headers),\n });\n } catch {\n // Best effort: the original error is more useful to the caller.\n }\n }\n}\n\nfunction lowerBoundCredits(\n cost: number[] | null | undefined,\n): number | undefined {\n return cost != null && cost.length > 0 ? Math.min(...cost) : undefined;\n}\n\nfunction fileBytes(\n input: Extract<VideoModelV3File, { type: 'file' }>,\n): Uint8Array {\n return typeof input.data === 'string'\n ? convertBase64ToUint8Array(input.data)\n : input.data;\n}\n\nfunction resolveContainer(\n input: VideoModelV3File,\n declaredContainer: TopazSourceContainer | undefined,\n): TopazSourceContainer {\n if (declaredContainer != null) {\n return declaredContainer;\n }\n\n if (input.type === 'file') {\n const container = mediaTypeContainers[input.mediaType.toLowerCase()];\n\n if (container == null) {\n throw new InvalidArgumentError({\n argument: 'inputReferences',\n message:\n `Could not map the media type \"${input.mediaType}\" onto a Topaz container. ` +\n 'Set the `source.container` provider option explicitly.',\n });\n }\n\n return container;\n }\n\n const container =\n (input.mediaType != null\n ? mediaTypeContainers[input.mediaType.toLowerCase()]\n : undefined) ?? containerFromUrl(input.url);\n\n if (container == null) {\n throw new InvalidArgumentError({\n argument: 'inputReferences',\n message:\n `Could not determine the container of the input video at \"${input.url}\". Set ` +\n 'the `source.container` provider option, or pass `mediaType` on the reference.',\n });\n }\n\n return container;\n}\n\nfunction isVideoReference(reference: VideoModelV3File): boolean {\n if (reference.type === 'file') {\n return reference.mediaType.toLowerCase().startsWith('video/');\n }\n\n if (reference.mediaType != null) {\n return reference.mediaType.toLowerCase().startsWith('video/');\n }\n\n return containerFromUrl(reference.url) != null;\n}\n\nfunction containerFromUrl(url: string): TopazSourceContainer | undefined {\n const withoutQuery = url.split(/[?#]/)[0];\n const extension = withoutQuery.split('.').pop()?.toLowerCase();\n return extension != null ? extensionContainers[extension] : undefined;\n}\n\ntype SourceMetadata = {\n duration: number;\n frameRate: number;\n frameCount: number;\n width: number;\n height: number;\n};\n\ntype ResolvedSource = {\n container: TopazSourceContainer;\n metadata: SourceMetadata | undefined;\n};\n\n/**\n * Reads the optional source metadata, which is all or nothing. Starlight\n * models require it, and it lets Topaz estimate the cost up front. Nothing is\n * read out of the video bytes: no provider package inspects media files.\n */\nfunction resolveSource(\n topazOptions: TopazVideoModelOptions | undefined,\n container: TopazSourceContainer,\n): ResolvedSource {\n const source = topazOptions?.source;\n const { width, height, duration, frameRate } = source ?? {};\n\n if (\n width == null &&\n height == null &&\n duration == null &&\n frameRate == null &&\n source?.frameCount == null\n ) {\n return { container, metadata: undefined };\n }\n\n const frameCount =\n source?.frameCount ??\n (duration != null && frameRate != null\n ? Math.round(duration * frameRate)\n : undefined);\n\n const missing = [\n width == null ? 'source.width' : undefined,\n height == null ? 'source.height' : undefined,\n duration == null ? 'source.duration' : undefined,\n frameRate == null ? 'source.frameRate' : undefined,\n ].filter(field => field != null);\n\n if (\n width == null ||\n height == null ||\n duration == null ||\n frameRate == null ||\n frameCount == null\n ) {\n throw new InvalidArgumentError({\n argument: 'providerOptions.topaz.source',\n message: `Source metadata must be complete. Missing: ${missing.join(', ')}.`,\n });\n }\n\n return {\n container,\n metadata: { duration, frameRate, frameCount, width, height },\n };\n}\n\nfunction parseResolution(resolution: `${number}x${number}` | undefined): {\n width: number | undefined;\n height: number | undefined;\n} {\n if (resolution == null) {\n return { width: undefined, height: undefined };\n }\n\n const [width, height] = resolution.split('x').map(Number);\n return { width, height };\n}\n\nfunction buildOutput({\n options,\n topazOptions,\n source,\n}: {\n options: Parameters<VideoModelV3['doGenerate']>[0];\n topazOptions: TopazVideoModelOptions | undefined;\n source: ResolvedSource;\n}): Record<string, unknown> & { container: TopazOutputContainer } {\n const output = topazOptions?.output;\n const resolution = parseResolution(options.resolution);\n\n const width = output?.width ?? resolution.width ?? source.metadata?.width;\n const height = output?.height ?? resolution.height ?? source.metadata?.height;\n\n if (width == null || height == null) {\n throw new InvalidArgumentError({\n argument: 'resolution',\n message:\n 'Topaz needs the output resolution. Set the `resolution` call option or the ' +\n '`output.width` / `output.height` provider options.',\n });\n }\n\n const frameRate =\n output?.frameRate ?? options.fps ?? source.metadata?.frameRate;\n const audioTransfer = output?.audioTransfer ?? 'Copy';\n\n return {\n resolution: { width, height },\n ...(frameRate != null ? { frameRate } : {}),\n audioTransfer,\n ...(audioTransfer !== 'None'\n ? { audioCodec: output?.audioCodec ?? 'AAC' }\n : output?.audioCodec != null\n ? { audioCodec: output.audioCodec }\n : {}),\n ...(output?.audioBitrate != null\n ? { audioBitrate: output.audioBitrate }\n : {}),\n ...(output?.videoEncoder != null\n ? { videoEncoder: output.videoEncoder }\n : {}),\n ...(output?.videoProfile != null\n ? { videoProfile: output.videoProfile }\n : {}),\n ...(output?.videoBitrate != null\n ? { videoBitrate: output.videoBitrate }\n : {}),\n ...(output?.dynamicCompressionLevel != null\n ? { dynamicCompressionLevel: output.dynamicCompressionLevel }\n : {}),\n ...(output?.cropToFit != null ? { cropToFit: output.cropToFit } : {}),\n container: resolveOutputContainer(output, source.container),\n };\n}\n\n/**\n * Mirrors Topaz's container rules so the polling code can report the media type of\n * the file Topaz will actually produce.\n */\nfunction resolveOutputContainer(\n output: TopazVideoModelOptions['output'],\n sourceContainer: TopazSourceContainer,\n): TopazOutputContainer {\n switch (output?.videoEncoder) {\n case 'ProRes':\n return 'mov';\n case 'AV1':\n case 'VP9':\n return 'mp4';\n }\n\n if (output?.container != null) {\n return output.container;\n }\n\n // The default H265 encoder only writes mp4, mov and mkv.\n return sourceContainer === 'mov' || sourceContainer === 'mkv'\n ? sourceContainer\n : 'mp4';\n}\n\nfunction requireRequestId(requestId: string | null | undefined): string {\n if (requestId == null) {\n throw new InvalidResponseDataError({\n data: requestId,\n message: 'Topaz did not return a requestId for the video request.',\n });\n }\n\n return requestId;\n}\n\nfunction buildFilter(\n modelId: string,\n topazOptions: TopazVideoModelOptions | undefined,\n): Record<string, unknown> {\n const filter: Record<string, unknown> = {\n model: resolveTopazVideoApiModelId(modelId),\n };\n\n if (topazOptions != null) {\n const nonFilterKeys = new Set<string>(TOPAZ_NON_FILTER_OPTION_KEYS);\n\n for (const [key, value] of Object.entries(topazOptions)) {\n if (!nonFilterKeys.has(key) && value !== undefined) {\n filter[key] = value;\n }\n }\n\n Object.assign(filter, topazOptions.filter ?? {});\n }\n\n return filter;\n}\n\n// `cost` (credits) and `time` (seconds) are [lowerBound, upperBound] pairs.\nconst topazVideoEstimatesSchema = z\n .object({\n cost: z.array(z.number()).nullish(),\n time: z.array(z.number()).nullish(),\n })\n .nullish();\n\nconst topazVideoExpressResponseSchema = z.object({\n requestId: z.string().nullish(),\n uploadUrls: z.array(z.string()).nullish(),\n estimates: topazVideoEstimatesSchema,\n});\n\nconst topazVideoStatusResponseSchema = z.object({\n status: z.string().nullish(),\n message: z.string().nullish(),\n errorCode: z.string().nullish(),\n // Documented as a string, accepted as a number too.\n outputSize: z.union([z.string(), z.number()]).nullish(),\n estimates: topazVideoEstimatesSchema,\n download: z\n .object({\n url: z.string().nullish(),\n expiresAt: z.union([z.string(), z.number()]).nullish(),\n })\n .nullish(),\n});\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/**\n * Containers Topaz accepts for the input video.\n */\nexport const topazSourceContainers = [\n '3gp',\n 'avi',\n 'dv',\n 'flv',\n 'm1v',\n 'm2t',\n 'm2ts',\n 'm2v',\n 'm4v',\n 'mkv',\n 'mov',\n 'mp4',\n 'mpeg',\n 'mpg',\n 'mts',\n 'mxf',\n 'ser',\n 'ts',\n 'vob',\n 'webm',\n 'wmv',\n] as const;\n\n/**\n * Containers Topaz can produce for the enhanced video.\n */\nexport const topazOutputContainers = [\n 'mp4',\n 'mov',\n 'mkv',\n 'avi',\n 'webm',\n] as const;\n\n/**\n * Metadata about the input video.\n *\n * Starlight models require `width`, `height`, `duration` and `frameRate`\n * (Topaz prices them from these values), and for other models they let Topaz\n * estimate the cost before it has the video. The AI SDK does not inspect\n * media files, so the values come from the caller. Setting any of them\n * requires all four.\n */\nexport const topazVideoSourceSchema = z.object({\n /**\n * Width of the input video in pixels.\n */\n width: z.number().int().positive().optional(),\n\n /**\n * Height of the input video in pixels.\n */\n height: z.number().int().positive().optional(),\n\n /**\n * Duration of the input video in seconds.\n */\n duration: z.number().positive().optional(),\n\n /**\n * Frame rate of the input video.\n */\n frameRate: z.number().positive().optional(),\n\n /**\n * Total number of frames in the input video. Derived from\n * `duration * frameRate` when omitted, which is only correct for\n * constant-frame-rate input, so set it explicitly for variable-frame-rate\n * sources.\n */\n frameCount: z.number().int().positive().optional(),\n\n /**\n * Container of the input video. Detected from the input file's media type\n * or URL extension when omitted.\n */\n container: z.enum(topazSourceContainers).optional(),\n});\n\nexport type TopazVideoSource = z.infer<typeof topazVideoSourceSchema>;\n\n/**\n * Output settings for the enhanced video.\n */\nexport const topazVideoOutputSchema = z.object({\n /**\n * Width of the output video in pixels. Takes precedence over the\n * `resolution` call option.\n */\n width: z.number().int().positive().optional(),\n\n /**\n * Height of the output video in pixels. Takes precedence over the\n * `resolution` call option.\n */\n height: z.number().int().positive().optional(),\n\n /**\n * Frame rate of the output video. Takes precedence over the `fps` call\n * option. Topaz only changes the frame rate when a frame-interpolation\n * filter is present.\n */\n frameRate: z.number().positive().optional(),\n\n /**\n * Audio codec of the output video. Defaults to `AAC`.\n */\n audioCodec: z.enum(['AAC', 'AC3', 'PCM']).optional(),\n\n /**\n * Audio bitrate, e.g. `192k`. Topaz uses the codec default when omitted.\n */\n audioBitrate: z.string().optional(),\n\n /**\n * How to handle the input audio track. Defaults to `Copy`.\n */\n audioTransfer: z.enum(['Copy', 'Convert', 'None']).optional(),\n\n /**\n * Video encoder. Topaz defaults to `H265`. `ProRes` forces a `mov`\n * container, `AV1` and `VP9` force `mp4`.\n */\n videoEncoder: z.enum(['AV1', 'H264', 'H265', 'ProRes', 'VP9']).optional(),\n\n /**\n * Encoder profile, e.g. `Main10` for H265 or `422 HQ` for ProRes. Topaz uses\n * the encoder's default profile when omitted.\n */\n videoProfile: z.string().optional(),\n\n /**\n * Constant bitrate, e.g. `20m`. Required for `VP9`. Mutually exclusive with\n * `dynamicCompressionLevel`.\n */\n videoBitrate: z.string().optional(),\n\n /**\n * Automatic constant-quality compression level. Topaz defaults to `High`\n * unless `videoBitrate` is set.\n */\n dynamicCompressionLevel: z.enum(['Low', 'Mid', 'High']).optional(),\n\n /**\n * Center-crop to fit the output dimensions.\n */\n cropToFit: z.boolean().optional(),\n\n /**\n * Container of the output video. Defaults to the input container when Topaz\n * can produce it, otherwise `mp4`.\n */\n container: z.enum(topazOutputContainers).optional(),\n});\n\nexport type TopazVideoOutput = z.infer<typeof topazVideoOutputSchema>;\n\n/**\n * Provider options for Topaz video models.\n *\n * @see https://developer.topazlabs.com/video-models/proteus/proteus-1\n * @see https://developer.topazlabs.com/video-models/starlight/starlight-precise-2.6\n */\nexport const topazVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z.object({\n /** Interval between status polls, in milliseconds. Defaults to 2000. */\n pollIntervalMillis: z.number().positive().optional(),\n /** Maximum time to poll, in milliseconds. Defaults to 3600000 (1 hour). */\n pollTimeoutMillis: z.number().positive().optional(),\n source: topazVideoSourceSchema.optional(),\n output: topazVideoOutputSchema.optional(),\n\n /**\n * Extra `filters[]` entries to send alongside the model's own filter, e.g. a\n * frame-interpolation filter. Each entry must include a `model` key.\n */\n additionalFilters: z.array(z.record(z.string(), z.unknown())).optional(),\n\n /**\n * Escape hatch for filter settings this package does not model yet. Merged\n * into the model's filter entry, taking precedence over the typed options\n * below.\n */\n filter: z.record(z.string(), z.unknown()).optional(),\n\n // ---------------------------------------------------------------------------\n // Proteus (`proteus`)\n // ---------------------------------------------------------------------------\n\n /** Proteus: how the input frames are encoded. */\n videoType: z\n .enum(['Progressive', 'Interlaced', 'ProgressiveInterlaced'])\n .optional(),\n\n /** Proteus: parameter estimation mode. */\n auto: z.enum(['Auto', 'Manual', 'Relative']).optional(),\n\n /** Proteus: field order for interlaced input. */\n fieldOrder: z.enum(['TopFirst', 'BottomFirst', 'Auto']).optional(),\n\n /** Proteus: focus-fix strength. */\n focusFixLevel: z.enum(['None', 'Normal', 'Strong']).optional(),\n\n /** Proteus: compression artifact removal, -1 to 1. */\n compression: z.number().min(-1).max(1).optional(),\n\n /** Proteus: detail recovery, -1 to 1. */\n details: z.number().min(-1).max(1).optional(),\n\n /** Proteus: pre-processing noise reduction, 0 to 0.1. */\n prenoise: z.number().min(0).max(0.1).optional(),\n\n /** Proteus: noise reduction, -1 to 1. */\n noise: z.number().min(-1).max(1).optional(),\n\n /** Proteus: halo suppression, -1 to 1. */\n halo: z.number().min(-1).max(1).optional(),\n\n /** Proteus: pre-processing blur, -1 to 1. */\n preblur: z.number().min(-1).max(1).optional(),\n\n /** Proteus: sharpening, -1 to 1. */\n blur: z.number().min(-1).max(1).optional(),\n\n /** Proteus: grain amount, 0 to 0.1. */\n grain: z.number().min(0).max(0.1).optional(),\n\n /** Proteus: grain sigma, 0 to 1. */\n grainSigma: z.number().min(0).max(1).optional(),\n\n /** Proteus: grain size, 0 to 5. */\n grainSize: z.number().min(0).max(5).optional(),\n\n /** Proteus: grain model. */\n grainType: z.enum(['silver_rich', 'gaussian', 'grey']).optional(),\n\n /** Proteus: original detail recovery, 0 to 1. */\n recoverOriginalDetailValue: z.number().min(0).max(1).optional(),\n\n // ---------------------------------------------------------------------------\n // Starlight Precise (`starlight-precise-2.6`)\n // ---------------------------------------------------------------------------\n\n /** Starlight: sharpening applied to the output, 1.0 to 5.0. Defaults to 5.0. */\n sharpness: z.number().min(1).max(5).optional(),\n\n /** Starlight: output bit depth. */\n videoBitDepth: z.number().int().positive().optional(),\n\n /** Starlight: output video codec. */\n videoCodec: z.enum(['ffv1', 'prores', 'vp9']).optional(),\n\n /** Starlight: output chroma subsampling profile. */\n videoProfile: z.enum(['420', '422', '444']).optional(),\n\n /** Starlight: whether to watermark the output. Defaults to `false`. */\n watermark: z.boolean().optional(),\n }),\n ),\n);\n\nexport type TopazVideoModelOptions = InferSchema<\n typeof topazVideoModelOptionsSchema\n>;\n\n/**\n * Option keys that are structural rather than filter settings, so they are not\n * forwarded into the `filters[]` entry.\n */\nexport const TOPAZ_NON_FILTER_OPTION_KEYS = [\n 'pollIntervalMillis',\n 'pollTimeoutMillis',\n 'source',\n 'output',\n 'additionalFilters',\n 'filter',\n] as const satisfies ReadonlyArray<keyof TopazVideoModelOptions>;\n","/**\n * Topaz video model ids.\n *\n * The AI SDK exposes readable ids that are mapped onto the short names the\n * Topaz API expects in the `filters[].model` field (see\n * `topazVideoApiModelIds`). Passing a raw Topaz name such as `slp-2.6` also\n * works - unknown ids are forwarded to the API unchanged.\n */\nexport type TopazVideoModelId =\n | 'proteus'\n | 'starlight-precise-2.6'\n | (string & {});\n\n/**\n * Maps AI SDK video model ids onto Topaz API model names.\n *\n * @see https://developer.topazlabs.com/video-models/proteus/proteus-1\n * @see https://developer.topazlabs.com/video-models/starlight/starlight-precise-2.6\n */\nexport const topazVideoApiModelIds: Record<string, string> = {\n proteus: 'prob-4',\n 'starlight-precise-2.6': 'slp-2.6',\n};\n\nexport function resolveTopazVideoApiModelId(modelId: string): string {\n return topazVideoApiModelIds[modelId] ?? modelId;\n}\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["withUserAgentSuffix","z","z","z","AISDKError","InvalidArgumentError","InvalidResponseDataError","combineHeaders","convertBase64ToUint8Array","createJsonResponseHandler","delay","isSameOrigin","parseProviderOptions","removeUndefinedEntries","resolve","z","lazySchema","zodSchema","z","DEFAULT_POLL_INTERVAL_MILLIS","DEFAULT_POLL_TIMEOUT_MILLIS","parseProviderOptions","combineHeaders","resolve","AISDKError","delay","createJsonResponseHandler","InvalidResponseDataError","InvalidArgumentError","isSameOrigin","removeUndefinedEntries","convertBase64ToUint8Array","container","z","withUserAgentSuffix"]}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/topaz-error.ts","../src/topaz-image-model-options.ts","../src/topaz-image-settings.ts","../src/topaz-image-model.ts","../src/topaz-video-model-options.ts","../src/topaz-video-settings.ts","../src/version.ts","../src/topaz-video-model.ts","../src/topaz-provider.ts"],"sourcesContent":["import { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/**\n * The image API reports errors as `{ \"message\": ... }` and the video API as\n * `{ \"message\": ..., \"errorCode\": ... }`. `detail` (a message or FastAPI's\n * array of validation issues) and `error` are accepted as well because a few\n * endpoints use them instead.\n */\nexport const topazErrorDataSchema = z.object({\n detail: z\n .union([\n z.string(),\n z.array(z.object({ msg: z.string().nullish() }).loose()),\n ])\n .nullish(),\n message: z.string().nullish(),\n error: z.string().nullish(),\n errorCode: z.string().nullish(),\n errors: z.array(z.object({ msg: z.string().nullish() }).loose()).nullish(),\n});\n\nexport type TopazErrorData = z.infer<typeof topazErrorDataSchema>;\n\nexport function topazErrorToMessage(data: TopazErrorData): string {\n const message = baseErrorMessage(data);\n const withCode =\n data.errorCode != null ? `${message} (${data.errorCode})` : message;\n\n // The video API lists field validation failures separately.\n const issues = (data.errors ?? [])\n .map(issue => issue.msg)\n .filter((msg): msg is string => msg != null);\n\n return issues.length > 0 ? `${withCode}: ${issues.join('; ')}` : withCode;\n}\n\nfunction baseErrorMessage(data: TopazErrorData): string {\n const { detail } = data;\n\n if (typeof detail === 'string') {\n return detail;\n }\n\n if (Array.isArray(detail)) {\n const messages = detail\n .map(issue => issue.msg)\n .filter((msg): msg is string => msg != null);\n\n if (messages.length > 0) {\n return messages.join('; ');\n }\n }\n\n return data.message ?? data.error ?? 'Unknown Topaz API error';\n}\n\nexport const topazFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: topazErrorDataSchema,\n errorToMessage: topazErrorToMessage,\n});\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/**\n * Provider options for Topaz generative image models (Wonder 3.5).\n *\n * The documented request schema fields are sent in snake_case\n * (`output_width`, `output_format`, ...); model-specific settings are sent in\n * camelCase, matching the Topaz model reference.\n *\n * @see https://developer.topazlabs.com/image-models/wonder/wonder-3.5-new\n */\nexport const topazImageModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z.object({\n /**\n * How aggressively the model enhances the image. Defaults to `high`.\n */\n enhancementStrength: z.enum(['low', 'medium', 'high']).optional(),\n\n /**\n * Whether to add grain to the output. Defaults to `false`.\n */\n grain: z.boolean().optional(),\n\n /**\n * Grain intensity, 0.0 to 1.0. Defaults to 0.5.\n */\n grainDensity: z.number().min(0).max(1).optional(),\n\n /**\n * Grain model. Defaults to `silver`.\n */\n grainModel: z.enum(['silver', 'gaussian', 'grey']).optional(),\n\n /**\n * Grain particle size, 1 to 5. Defaults to 1.\n */\n grainSize: z.number().min(1).max(5).optional(),\n\n /**\n * Grain effect strength, 0.0 to 1.0. Defaults to 0.5.\n */\n grainStrength: z.number().min(0).max(1).optional(),\n\n /**\n * Width of the input image in pixels. Topaz infers this from the upload when\n * omitted.\n */\n inputWidth: z.number().int().positive().optional(),\n\n /**\n * Height of the input image in pixels. Topaz infers this from the upload\n * when omitted.\n */\n inputHeight: z.number().int().positive().optional(),\n\n /**\n * Width of the output image in pixels, 1 to 32000. Takes precedence over the\n * width derived from the `size` call option.\n */\n outputWidth: z.number().int().min(1).max(32000).optional(),\n\n /**\n * Height of the output image in pixels, 1 to 32000. Takes precedence over\n * the height derived from the `size` call option.\n */\n outputHeight: z.number().int().min(1).max(32000).optional(),\n\n /**\n * Output image format. Defaults to the Topaz API default.\n */\n outputFormat: z.enum(['jpeg', 'jpg', 'png', 'tiff', 'tif']).optional(),\n\n /**\n * Whether to crop the output to fill the requested dimensions. Defaults to\n * `false`.\n */\n cropToFill: z.boolean().optional(),\n\n /**\n * URL to receive job-status webhooks.\n */\n webhookUrl: z.string().optional(),\n\n /**\n * How often to poll the Topaz status endpoint, in milliseconds. Defaults to\n * 2000.\n */\n pollIntervalMillis: z.number().int().positive().optional(),\n\n /**\n * How long to wait for the job to finish before failing, in milliseconds.\n * Defaults to 600000 (10 minutes).\n */\n pollTimeoutMillis: z.number().int().positive().optional(),\n }),\n ),\n);\n\nexport type TopazImageModelOptions = InferSchema<\n typeof topazImageModelOptionsSchema\n>;\n","/**\n * Topaz image model ids.\n *\n * The AI SDK exposes a readable id that is mapped onto the name the Topaz API\n * expects in the `model` form field (see `topazImageApiModelIds`). Passing a\n * raw Topaz name such as `Wonder 3.5` also works - unknown ids are forwarded\n * to the API unchanged.\n */\nexport type TopazImageModelId = 'wonder-3.5' | (string & {});\n\n/**\n * Maps AI SDK image model ids onto Topaz API model names.\n *\n * @see https://developer.topazlabs.com/image-models/wonder/wonder-3.5-new\n */\nexport const topazImageApiModelIds: Record<string, string> = {\n 'wonder-3.5': 'Wonder 3.5',\n};\n\nexport function resolveTopazImageApiModelId(modelId: string): string {\n return topazImageApiModelIds[modelId] ?? modelId;\n}\n","import {\n AISDKError,\n InvalidArgumentError,\n InvalidResponseDataError,\n type ImageModelV4,\n type ImageModelV4CallOptions,\n type ImageModelV4Result,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertBase64ToUint8Array,\n createBinaryResponseHandler,\n createJsonResponseHandler,\n delay,\n getFromApi,\n mediaTypeToExtension,\n parseProviderOptions,\n postFormDataToApi,\n removeUndefinedEntries,\n resolve,\n serializeModelOptions,\n WORKFLOW_DESERIALIZE,\n WORKFLOW_SERIALIZE,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { TopazConfig } from './topaz-config';\nimport { topazFailedResponseHandler } from './topaz-error';\nimport {\n topazImageModelOptionsSchema,\n type TopazImageModelOptions,\n} from './topaz-image-model-options';\nimport {\n resolveTopazImageApiModelId,\n type TopazImageModelId,\n} from './topaz-image-settings';\n\nconst DEFAULT_POLL_INTERVAL_MILLIS = 2000;\nconst DEFAULT_POLL_TIMEOUT_MILLIS = 600_000;\n\n/**\n * Topaz enhances an image that the caller supplies, so `files` is required and\n * exactly one image is processed per call.\n */\nexport class TopazImageModel implements ImageModelV4 {\n readonly specificationVersion = 'v4';\n readonly maxImagesPerCall = 1;\n readonly supportsFileInputs = true;\n readonly supportsMaskInputs = false;\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: TopazImageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: TopazImageModelId;\n config: TopazConfig;\n }) {\n return new TopazImageModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: TopazImageModelId,\n private readonly config: TopazConfig,\n ) {}\n\n async doGenerate(\n options: ImageModelV4CallOptions,\n ): Promise<ImageModelV4Result> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const warnings: SharedV4Warning[] = [];\n\n const topazOptions = await parseProviderOptions({\n provider: 'topaz',\n providerOptions: options.providerOptions,\n schema: topazImageModelOptionsSchema,\n });\n const headers = combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n );\n\n this.addUnsupportedWarnings(options, warnings);\n\n const formData = await this.buildFormData(options, topazOptions, warnings);\n\n const { value: submitResponse } = await postFormDataToApi({\n url: `${this.config.baseURL}/image/v1/enhance-gen/async`,\n headers,\n formData,\n successfulResponseHandler: createJsonResponseHandler(\n topazImageSubmitResponseSchema,\n ),\n failedResponseHandler: topazFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const processId = submitResponse.process_id;\n if (processId == null) {\n throw new InvalidResponseDataError({\n data: submitResponse,\n message: 'Topaz did not return a process_id for the enhance request.',\n });\n }\n\n let status: TopazImageStatusResponse;\n try {\n status = await this.waitForCompletion({\n processId,\n headers,\n abortSignal: options.abortSignal,\n pollIntervalMillis:\n topazOptions?.pollIntervalMillis ?? DEFAULT_POLL_INTERVAL_MILLIS,\n pollTimeoutMillis:\n topazOptions?.pollTimeoutMillis ?? DEFAULT_POLL_TIMEOUT_MILLIS,\n });\n } catch (error) {\n // Topaz charges on completion, so a job nobody will download should not\n // be left running after the caller aborts.\n if (options.abortSignal?.aborted) {\n await this.cancelQuietly(processId, headers);\n }\n throw error;\n }\n\n const { image, responseHeaders } = await this.download({\n processId,\n headers,\n abortSignal: options.abortSignal,\n });\n\n return {\n images: [image],\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n providerMetadata: {\n topaz: {\n images: [\n {\n processId,\n // Topaz bills exactly the credits reported on the completed job.\n ...(status.credits != null ? { credits: status.credits } : {}),\n ...(status.output_width != null\n ? { width: status.output_width }\n : {}),\n ...(status.output_height != null\n ? { height: status.output_height }\n : {}),\n ...(status.output_format != null\n ? { format: status.output_format }\n : {}),\n },\n ],\n },\n },\n };\n }\n\n private addUnsupportedWarnings(\n options: ImageModelV4CallOptions,\n warnings: SharedV4Warning[],\n ): void {\n if (options.prompt != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'prompt',\n details:\n 'Topaz image models enhance an existing image and do not take a text prompt. ' +\n 'The prompt was ignored.',\n });\n }\n\n if (options.aspectRatio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n 'Topaz image models do not support aspectRatio. Use `size`, or the ' +\n '`outputWidth` / `outputHeight` provider options, to set output dimensions.',\n });\n }\n\n if (options.seed != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'seed',\n details: 'Topaz image models do not support seed.',\n });\n }\n\n if (options.mask != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'mask',\n details:\n 'Topaz image models do not support masks. The mask was ignored.',\n });\n }\n\n if (options.n > 1) {\n warnings.push({\n type: 'unsupported',\n feature: 'n',\n details:\n 'Topaz image models enhance one image per call. Only 1 image will be returned.',\n });\n }\n }\n\n private async buildFormData(\n options: ImageModelV4CallOptions,\n topazOptions: TopazImageModelOptions | undefined,\n warnings: SharedV4Warning[],\n ): Promise<FormData> {\n const file = options.files?.[0];\n\n if (file == null) {\n throw new InvalidArgumentError({\n argument: 'files',\n message:\n 'Topaz image models enhance an existing image. Pass the input image via ' +\n '`prompt.images`.',\n });\n }\n\n if (options.files != null && options.files.length > 1) {\n warnings.push({\n type: 'unsupported',\n feature: 'files',\n details:\n 'Topaz image models enhance one image per call. Only the first file was used.',\n });\n }\n\n const formData = new FormData();\n formData.append('model', resolveTopazImageApiModelId(this.modelId));\n\n if (file.type === 'url') {\n // Topaz fetches the source itself when given a URL, so the bytes never\n // need to pass through the SDK.\n formData.append('source_url', file.url);\n } else {\n const bytes =\n typeof file.data === 'string'\n ? convertBase64ToUint8Array(file.data)\n : file.data;\n const extension = mediaTypeToExtension(file.mediaType) ?? 'png';\n\n formData.append(\n 'image',\n new File([bytes as BlobPart], `image.${extension}`, {\n type: file.mediaType,\n }),\n );\n }\n\n const { width, height } = parseSize(options.size);\n\n appendIfDefined(\n formData,\n 'output_width',\n topazOptions?.outputWidth ?? width,\n );\n appendIfDefined(\n formData,\n 'output_height',\n topazOptions?.outputHeight ?? height,\n );\n appendIfDefined(formData, 'output_format', topazOptions?.outputFormat);\n appendIfDefined(formData, 'crop_to_fill', topazOptions?.cropToFill);\n appendIfDefined(formData, 'webhook_url', topazOptions?.webhookUrl);\n\n // Model-specific settings use camelCase, unlike the request schema fields\n // above.\n appendIfDefined(\n formData,\n 'enhancementStrength',\n topazOptions?.enhancementStrength,\n );\n appendIfDefined(formData, 'grain', topazOptions?.grain);\n appendIfDefined(formData, 'grainDensity', topazOptions?.grainDensity);\n appendIfDefined(formData, 'grainModel', topazOptions?.grainModel);\n appendIfDefined(formData, 'grainSize', topazOptions?.grainSize);\n appendIfDefined(formData, 'grainStrength', topazOptions?.grainStrength);\n appendIfDefined(formData, 'inputWidth', topazOptions?.inputWidth);\n appendIfDefined(formData, 'inputHeight', topazOptions?.inputHeight);\n\n return formData;\n }\n\n private async waitForCompletion({\n processId,\n headers,\n abortSignal,\n pollIntervalMillis,\n pollTimeoutMillis,\n }: {\n processId: string;\n headers: Record<string, string | undefined> | undefined;\n abortSignal: AbortSignal | undefined;\n pollIntervalMillis: number;\n pollTimeoutMillis: number;\n }): Promise<TopazImageStatusResponse> {\n const deadline = Date.now() + pollTimeoutMillis;\n\n while (true) {\n const { value: status } = await getFromApi({\n url: `${this.config.baseURL}/image/v1/status/${processId}`,\n // Built from the configured baseURL, not from response data.\n validateUrl: false,\n headers,\n successfulResponseHandler: createJsonResponseHandler(\n topazImageStatusResponseSchema,\n ),\n failedResponseHandler: topazFailedResponseHandler,\n abortSignal,\n fetch: this.config.fetch,\n });\n\n if (status.status === 'Completed') {\n return status;\n }\n\n if (status.status === 'Failed' || status.status === 'Cancelled') {\n throw new AISDKError({\n name: 'TOPAZ_IMAGE_ENHANCEMENT_FAILED',\n message: `Topaz image enhancement ${status.status.toLowerCase()} for process ${processId}.`,\n });\n }\n\n if (Date.now() + pollIntervalMillis > deadline) {\n await this.cancelQuietly(processId, headers ?? {});\n throw new AISDKError({\n name: 'TOPAZ_IMAGE_ENHANCEMENT_TIMEOUT',\n message:\n `Topaz image enhancement did not finish within ${pollTimeoutMillis}ms ` +\n `(process ${processId}, last status ${status.status ?? 'unknown'}). ` +\n 'Increase the `pollTimeoutMillis` provider option if the job needs longer.',\n });\n }\n\n await delay(pollIntervalMillis, { abortSignal });\n }\n }\n\n private async cancelQuietly(\n processId: string,\n headers: Record<string, string | undefined>,\n ): Promise<void> {\n const fetchImpl = this.config.fetch ?? globalThis.fetch;\n\n try {\n // Deliberately not tied to the caller's abort signal, which may be the\n // reason polling stopped.\n await fetchImpl(`${this.config.baseURL}/image/v1/cancel/${processId}`, {\n method: 'DELETE',\n headers: removeUndefinedEntries(headers),\n });\n } catch {\n // Best effort: the original error is more useful to the caller.\n }\n }\n\n private async download({\n processId,\n headers,\n abortSignal,\n }: {\n processId: string;\n headers: Record<string, string | undefined> | undefined;\n abortSignal: AbortSignal | undefined;\n }): Promise<{\n image: Uint8Array;\n responseHeaders: Record<string, string> | undefined;\n }> {\n const { value: downloadResponse } = await getFromApi({\n url: `${this.config.baseURL}/image/v1/download/${processId}`,\n // Built from the configured baseURL, not from response data.\n validateUrl: false,\n headers,\n successfulResponseHandler: createJsonResponseHandler(\n topazImageDownloadResponseSchema,\n ),\n failedResponseHandler: topazFailedResponseHandler,\n abortSignal,\n fetch: this.config.fetch,\n });\n\n const downloadUrl = downloadResponse.download_url;\n if (downloadUrl == null) {\n throw new InvalidResponseDataError({\n data: downloadResponse,\n message: `Topaz did not return a download URL for process ${processId}.`,\n });\n }\n\n const { value: image, responseHeaders } = await getFromApi({\n url: downloadUrl,\n // Comes from the Topaz response body and normally points at object\n // storage, so it is validated and the API key is withheld off-origin.\n validateUrl: true,\n credentialedOrigin: this.config.baseURL,\n trustedOrigin: this.config.baseURL,\n headers,\n successfulResponseHandler: createBinaryResponseHandler(),\n failedResponseHandler: topazFailedResponseHandler,\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return { image, responseHeaders };\n }\n}\n\nfunction parseSize(size: `${number}x${number}` | undefined): {\n width: number | undefined;\n height: number | undefined;\n} {\n if (size == null) {\n return { width: undefined, height: undefined };\n }\n\n const [width, height] = size.split('x').map(Number);\n return { width, height };\n}\n\nfunction appendIfDefined(\n formData: FormData,\n key: string,\n value: string | number | boolean | undefined,\n): void {\n if (value !== undefined) {\n formData.append(key, String(value));\n }\n}\n\nconst topazImageSubmitResponseSchema = z.object({\n process_id: z.string().nullish(),\n});\n\nconst topazImageStatusResponseSchema = z.object({\n // Documented values are Pending, Processing, Completed, Cancelled and Failed.\n // Unknown values keep polling rather than failing the parse.\n status: z.string().nullish(),\n credits: z.number().nullish(),\n output_width: z.number().nullish(),\n output_height: z.number().nullish(),\n output_format: z.string().nullish(),\n});\n\ntype TopazImageStatusResponse = z.infer<typeof topazImageStatusResponseSchema>;\n\nconst topazImageDownloadResponseSchema = z.object({\n download_url: z.string().nullish(),\n});\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/**\n * Containers Topaz accepts for the input video.\n */\nexport const topazSourceContainers = [\n '3gp',\n 'avi',\n 'dv',\n 'flv',\n 'm1v',\n 'm2t',\n 'm2ts',\n 'm2v',\n 'm4v',\n 'mkv',\n 'mov',\n 'mp4',\n 'mpeg',\n 'mpg',\n 'mts',\n 'mxf',\n 'ser',\n 'ts',\n 'vob',\n 'webm',\n 'wmv',\n] as const;\n\n/**\n * Containers Topaz can produce for the enhanced video.\n */\nexport const topazOutputContainers = [\n 'mp4',\n 'mov',\n 'mkv',\n 'avi',\n 'webm',\n] as const;\n\n/**\n * Metadata about the input video.\n *\n * Starlight models require `width`, `height`, `duration` and `frameRate`\n * (Topaz prices them from these values), and for other models they let Topaz\n * estimate the cost before it has the video. The AI SDK does not inspect\n * media files, so the values come from the caller. Setting any of them\n * requires all four.\n */\nexport const topazVideoSourceSchema = z.object({\n /**\n * Width of the input video in pixels.\n */\n width: z.number().int().positive().optional(),\n\n /**\n * Height of the input video in pixels.\n */\n height: z.number().int().positive().optional(),\n\n /**\n * Duration of the input video in seconds.\n */\n duration: z.number().positive().optional(),\n\n /**\n * Frame rate of the input video.\n */\n frameRate: z.number().positive().optional(),\n\n /**\n * Total number of frames in the input video. Derived from\n * `duration * frameRate` when omitted, which is only correct for\n * constant-frame-rate input, so set it explicitly for variable-frame-rate\n * sources.\n */\n frameCount: z.number().int().positive().optional(),\n\n /**\n * Container of the input video. Detected from the input file's media type\n * or URL extension when omitted.\n */\n container: z.enum(topazSourceContainers).optional(),\n});\n\nexport type TopazVideoSource = z.infer<typeof topazVideoSourceSchema>;\n\n/**\n * Output settings for the enhanced video.\n */\nexport const topazVideoOutputSchema = z.object({\n /**\n * Width of the output video in pixels. Takes precedence over the\n * `resolution` call option.\n */\n width: z.number().int().positive().optional(),\n\n /**\n * Height of the output video in pixels. Takes precedence over the\n * `resolution` call option.\n */\n height: z.number().int().positive().optional(),\n\n /**\n * Frame rate of the output video. Takes precedence over the `fps` call\n * option. Topaz only changes the frame rate when a frame-interpolation\n * filter is present.\n */\n frameRate: z.number().positive().optional(),\n\n /**\n * Audio codec of the output video. Defaults to `AAC`.\n */\n audioCodec: z.enum(['AAC', 'AC3', 'PCM']).optional(),\n\n /**\n * Audio bitrate, e.g. `192k`. Topaz uses the codec default when omitted.\n */\n audioBitrate: z.string().optional(),\n\n /**\n * How to handle the input audio track. Defaults to `Copy`.\n */\n audioTransfer: z.enum(['Copy', 'Convert', 'None']).optional(),\n\n /**\n * Video encoder. Topaz defaults to `H265`. `ProRes` forces a `mov`\n * container, `AV1` and `VP9` force `mp4`.\n */\n videoEncoder: z.enum(['AV1', 'H264', 'H265', 'ProRes', 'VP9']).optional(),\n\n /**\n * Encoder profile, e.g. `Main10` for H265 or `422 HQ` for ProRes. Topaz uses\n * the encoder's default profile when omitted.\n */\n videoProfile: z.string().optional(),\n\n /**\n * Constant bitrate, e.g. `20m`. Required for `VP9`. Mutually exclusive with\n * `dynamicCompressionLevel`.\n */\n videoBitrate: z.string().optional(),\n\n /**\n * Automatic constant-quality compression level. Topaz defaults to `High`\n * unless `videoBitrate` is set.\n */\n dynamicCompressionLevel: z.enum(['Low', 'Mid', 'High']).optional(),\n\n /**\n * Center-crop to fit the output dimensions.\n */\n cropToFit: z.boolean().optional(),\n\n /**\n * Container of the output video. Defaults to the input container when Topaz\n * can produce it, otherwise `mp4`.\n */\n container: z.enum(topazOutputContainers).optional(),\n});\n\nexport type TopazVideoOutput = z.infer<typeof topazVideoOutputSchema>;\n\n/**\n * Provider options for Topaz video models.\n *\n * @see https://developer.topazlabs.com/video-models/proteus/proteus-1\n * @see https://developer.topazlabs.com/video-models/starlight/starlight-precise-2.6\n */\nexport const topazVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z.object({\n source: topazVideoSourceSchema.optional(),\n output: topazVideoOutputSchema.optional(),\n\n /**\n * Extra `filters[]` entries to send alongside the model's own filter, e.g. a\n * frame-interpolation filter. Each entry must include a `model` key.\n */\n additionalFilters: z.array(z.record(z.string(), z.unknown())).optional(),\n\n /**\n * Escape hatch for filter settings this package does not model yet. Merged\n * into the model's filter entry, taking precedence over the typed options\n * below.\n */\n filter: z.record(z.string(), z.unknown()).optional(),\n\n // ---------------------------------------------------------------------------\n // Proteus (`proteus`)\n // ---------------------------------------------------------------------------\n\n /** Proteus: how the input frames are encoded. */\n videoType: z\n .enum(['Progressive', 'Interlaced', 'ProgressiveInterlaced'])\n .optional(),\n\n /** Proteus: parameter estimation mode. */\n auto: z.enum(['Auto', 'Manual', 'Relative']).optional(),\n\n /** Proteus: field order for interlaced input. */\n fieldOrder: z.enum(['TopFirst', 'BottomFirst', 'Auto']).optional(),\n\n /** Proteus: focus-fix strength. */\n focusFixLevel: z.enum(['None', 'Normal', 'Strong']).optional(),\n\n /** Proteus: compression artifact removal, -1 to 1. */\n compression: z.number().min(-1).max(1).optional(),\n\n /** Proteus: detail recovery, -1 to 1. */\n details: z.number().min(-1).max(1).optional(),\n\n /** Proteus: pre-processing noise reduction, 0 to 0.1. */\n prenoise: z.number().min(0).max(0.1).optional(),\n\n /** Proteus: noise reduction, -1 to 1. */\n noise: z.number().min(-1).max(1).optional(),\n\n /** Proteus: halo suppression, -1 to 1. */\n halo: z.number().min(-1).max(1).optional(),\n\n /** Proteus: pre-processing blur, -1 to 1. */\n preblur: z.number().min(-1).max(1).optional(),\n\n /** Proteus: sharpening, -1 to 1. */\n blur: z.number().min(-1).max(1).optional(),\n\n /** Proteus: grain amount, 0 to 0.1. */\n grain: z.number().min(0).max(0.1).optional(),\n\n /** Proteus: grain sigma, 0 to 1. */\n grainSigma: z.number().min(0).max(1).optional(),\n\n /** Proteus: grain size, 0 to 5. */\n grainSize: z.number().min(0).max(5).optional(),\n\n /** Proteus: grain model. */\n grainType: z.enum(['silver_rich', 'gaussian', 'grey']).optional(),\n\n /** Proteus: original detail recovery, 0 to 1. */\n recoverOriginalDetailValue: z.number().min(0).max(1).optional(),\n\n // ---------------------------------------------------------------------------\n // Starlight Precise (`starlight-precise-2.6`)\n // ---------------------------------------------------------------------------\n\n /** Starlight: sharpening applied to the output, 1.0 to 5.0. Defaults to 5.0. */\n sharpness: z.number().min(1).max(5).optional(),\n\n /** Starlight: output bit depth. */\n videoBitDepth: z.number().int().positive().optional(),\n\n /** Starlight: output video codec. */\n videoCodec: z.enum(['ffv1', 'prores', 'vp9']).optional(),\n\n /** Starlight: output chroma subsampling profile. */\n videoProfile: z.enum(['420', '422', '444']).optional(),\n\n /** Starlight: whether to watermark the output. Defaults to `false`. */\n watermark: z.boolean().optional(),\n }),\n ),\n);\n\nexport type TopazVideoModelOptions = InferSchema<\n typeof topazVideoModelOptionsSchema\n>;\n\n/**\n * Option keys that are structural rather than filter settings, so they are not\n * forwarded into the `filters[]` entry.\n */\nexport const TOPAZ_NON_FILTER_OPTION_KEYS = [\n 'source',\n 'output',\n 'additionalFilters',\n 'filter',\n] as const satisfies ReadonlyArray<keyof TopazVideoModelOptions>;\n","/**\n * Topaz video model ids.\n *\n * The AI SDK exposes readable ids that are mapped onto the short names the\n * Topaz API expects in the `filters[].model` field (see\n * `topazVideoApiModelIds`). Passing a raw Topaz name such as `slp-2.6` also\n * works - unknown ids are forwarded to the API unchanged.\n */\nexport type TopazVideoModelId =\n | 'proteus'\n | 'starlight-precise-2.6'\n | (string & {});\n\n/**\n * Maps AI SDK video model ids onto Topaz API model names.\n *\n * @see https://developer.topazlabs.com/video-models/proteus/proteus-1\n * @see https://developer.topazlabs.com/video-models/starlight/starlight-precise-2.6\n */\nexport const topazVideoApiModelIds: Record<string, string> = {\n proteus: 'prob-4',\n 'starlight-precise-2.6': 'slp-2.6',\n};\n\nexport function resolveTopazVideoApiModelId(modelId: string): string {\n return topazVideoApiModelIds[modelId] ?? modelId;\n}\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n","import {\n APICallError,\n InvalidArgumentError,\n InvalidResponseDataError,\n type Experimental_VideoModelV4 as VideoModelV4,\n type Experimental_VideoModelV4File as VideoModelV4File,\n type Experimental_VideoModelV4OperationStartResult as VideoModelV4OperationStartResult,\n type Experimental_VideoModelV4OperationStatusResult as VideoModelV4OperationStatusResult,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertBase64ToUint8Array,\n createJsonResponseHandler,\n getFromApi,\n isSameOrigin,\n parseProviderOptions,\n postJsonToApi,\n removeUndefinedEntries,\n resolve,\n serializeModelOptions,\n validateDownloadUrl,\n withUserAgentSuffix,\n WORKFLOW_DESERIALIZE,\n WORKFLOW_SERIALIZE,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { TopazConfig } from './topaz-config';\nimport { topazFailedResponseHandler } from './topaz-error';\nimport {\n TOPAZ_NON_FILTER_OPTION_KEYS,\n type topazOutputContainers,\n topazSourceContainers,\n topazVideoModelOptionsSchema,\n type TopazVideoModelOptions,\n} from './topaz-video-model-options';\nimport {\n resolveTopazVideoApiModelId,\n type TopazVideoModelId,\n} from './topaz-video-settings';\nimport { VERSION } from './version';\n\ntype TopazSourceContainer = (typeof topazSourceContainers)[number];\ntype TopazOutputContainer = (typeof topazOutputContainers)[number];\n\nconst mediaTypeContainers: Record<string, TopazSourceContainer> = {\n 'video/mp4': 'mp4',\n 'video/quicktime': 'mov',\n 'video/mov': 'mov',\n 'video/x-matroska': 'mkv',\n 'video/matroska': 'mkv',\n 'video/webm': 'webm',\n 'video/x-msvideo': 'avi',\n 'video/avi': 'avi',\n 'video/mpeg': 'mpeg',\n 'video/mp2t': 'ts',\n 'video/x-ms-wmv': 'wmv',\n 'video/x-flv': 'flv',\n 'video/3gpp': '3gp',\n 'video/x-m4v': 'm4v',\n 'application/mxf': 'mxf',\n};\n\nconst extensionContainers: Record<string, TopazSourceContainer> = {\n ...Object.fromEntries(topazSourceContainers.map(c => [c, c])),\n qt: 'mov',\n};\n\nconst containerMediaTypes: Record<string, string> = {\n mp4: 'video/mp4',\n m4v: 'video/mp4',\n mov: 'video/quicktime',\n mkv: 'video/x-matroska',\n webm: 'video/webm',\n avi: 'video/x-msvideo',\n mpeg: 'video/mpeg',\n mpg: 'video/mpeg',\n ts: 'video/mp2t',\n wmv: 'video/x-ms-wmv',\n flv: 'video/x-flv',\n '3gp': 'video/3gpp',\n mxf: 'application/mxf',\n};\n\n/**\n * Topaz video models enhance a video the caller supplies, passed through\n * `inputReferences`. `doStart` creates an express request: Topaz fetches URL\n * inputs itself, and file inputs are uploaded to the returned URL. Processing\n * starts once Topaz has the video, and `doStatus` polls.\n */\nexport class TopazVideoModel implements VideoModelV4 {\n readonly specificationVersion = 'v4';\n readonly maxVideosPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: TopazVideoModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: TopazVideoModelId;\n config: TopazConfig;\n }) {\n return new TopazVideoModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: TopazVideoModelId,\n private readonly config: TopazConfig,\n ) {}\n\n async doStart(\n options: Parameters<NonNullable<VideoModelV4['doStart']>>[0],\n ): Promise<VideoModelV4OperationStartResult> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const warnings: SharedV4Warning[] = [];\n\n const topazOptions = await parseProviderOptions({\n provider: 'topaz',\n providerOptions: options.providerOptions,\n schema: topazVideoModelOptionsSchema,\n });\n const headers = combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n );\n\n this.addUnsupportedWarnings(options, warnings);\n\n const input = this.selectInputVideo(options, warnings);\n const container = resolveContainer(input, topazOptions?.source?.container);\n const source = resolveSource(topazOptions, container);\n const output = buildOutput({ options, topazOptions, source });\n const filters = [\n buildFilter(this.modelId, topazOptions),\n ...(topazOptions?.additionalFilters ?? []),\n ];\n const contentType =\n containerMediaTypes[source.container] ?? 'application/octet-stream';\n\n const metadata = source.metadata;\n const bytes = input.type === 'file' ? fileBytes(input) : undefined;\n let requestId: string | undefined;\n\n try {\n const { value: created, responseHeaders } = await postJsonToApi({\n url: `${this.config.baseURL}/video/express`,\n headers,\n body: {\n source: {\n container: source.container,\n ...(metadata != null\n ? {\n duration: metadata.duration,\n frameCount: metadata.frameCount,\n frameRate: metadata.frameRate,\n resolution: {\n width: metadata.width,\n height: metadata.height,\n },\n }\n : {}),\n ...(input.type === 'url'\n ? // Topaz fetches URL inputs itself, so, like other providers,\n // the SDK never downloads them.\n { external: { provider: 's3', presignedUrl: input.url } }\n : { size: bytes?.byteLength }),\n },\n output,\n filters,\n },\n successfulResponseHandler: createJsonResponseHandler(\n topazVideoExpressResponseSchema,\n ),\n failedResponseHandler: topazFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n requestId = requireRequestId(created.requestId);\n\n if (bytes != null) {\n await this.uploadVideo({\n requestId,\n bytes,\n urls: created.uploadUrls,\n contentType,\n abortSignal: options.abortSignal,\n });\n }\n\n return {\n // The output container travels with the operation so `doStatus` can\n // report the right media type without re-deriving it.\n operation: { requestId, outputContainer: output.container },\n warnings,\n providerMetadata: {\n topaz: {\n requestId,\n // Preliminary: Topaz estimates up front only when it gets source\n // metadata, and the completed status carries the billed value.\n ...(created.estimates?.cost != null\n ? { estimatedCredits: created.estimates.cost }\n : {}),\n },\n },\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n } catch (error) {\n // Canceling before processing starts refunds any reserved credits.\n if (requestId != null) {\n await this.cancelQuietly(requestId, headers);\n }\n throw error;\n }\n }\n\n async doStatus(\n options: Parameters<NonNullable<VideoModelV4['doStatus']>>[0],\n ): Promise<VideoModelV4OperationStatusResult> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { requestId, outputContainer } = options.operation as {\n requestId: string;\n outputContainer?: string;\n };\n\n const { value: status, responseHeaders } = await getFromApi({\n url: `${this.config.baseURL}/video/${requestId}/status`,\n // Built from the configured baseURL, not from response data.\n validateUrl: false,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n successfulResponseHandler: createJsonResponseHandler(\n topazVideoStatusResponseSchema,\n ),\n failedResponseHandler: topazFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const response = {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n };\n\n if (status.status === 'complete') {\n // Topaz confirmed it invoices the lower bound of `estimates.cost`, which\n // it recomputes once the source upload has been received.\n const credits = lowerBoundCredits(status.estimates?.cost);\n\n const url = status.download?.url;\n if (url == null) {\n throw new InvalidResponseDataError({\n data: status,\n message: `Topaz reported request ${requestId} complete but returned no download URL.`,\n });\n }\n\n return {\n status: 'completed',\n videos: [\n {\n type: 'url',\n url,\n mediaType:\n (outputContainer != null\n ? containerMediaTypes[outputContainer]\n : undefined) ?? 'video/mp4',\n },\n ],\n warnings: [],\n response,\n providerMetadata: {\n topaz: {\n requestId,\n ...(credits != null ? { credits } : {}),\n ...(status.estimates?.cost != null\n ? { estimatedCredits: status.estimates.cost }\n : {}),\n ...(status.outputSize != null\n ? { outputSize: status.outputSize }\n : {}),\n ...(status.download?.expiresAt != null\n ? { expiresAt: status.download.expiresAt }\n : {}),\n },\n },\n };\n }\n\n if (status.status === 'failed' || status.status === 'canceled') {\n return {\n status: 'error',\n error:\n `Topaz video request ${requestId} ${status.status}` +\n (status.errorCode != null ? ` (${status.errorCode})` : '') +\n (status.message != null ? `: ${status.message}` : '.'),\n providerMetadata: {\n topaz: {\n requestId,\n ...(status.errorCode != null\n ? { errorCode: status.errorCode }\n : {}),\n },\n },\n response,\n };\n }\n\n // Documented in-progress values are requested, accepted, initializing,\n // preprocessing, processing, postprocessing and canceling. Anything else\n // keeps polling too, so a newly added state cannot break running jobs.\n return { status: 'pending', response };\n }\n\n private addUnsupportedWarnings(\n options: Parameters<NonNullable<VideoModelV4['doStart']>>[0],\n warnings: SharedV4Warning[],\n ): void {\n // `generateVideo` requires a prompt, so an empty one is the expected way\n // to call an enhancement model and does not warrant a warning.\n if (options.prompt != null && options.prompt.trim() !== '') {\n warnings.push({\n type: 'unsupported',\n feature: 'prompt',\n details:\n 'Topaz video models enhance an existing video and do not take a text prompt. ' +\n 'The prompt was ignored.',\n });\n }\n\n if (options.aspectRatio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n 'Topaz video models do not support aspectRatio. Use `resolution`, or the ' +\n '`output` provider option, to set the output dimensions.',\n });\n }\n\n if (options.seed != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'seed',\n details: 'Topaz video models do not support seed.',\n });\n }\n\n if (options.duration != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'duration',\n details:\n 'Topaz video models enhance the whole input video, so duration was ignored. ' +\n 'Pass the input duration via the `source.duration` provider option instead.',\n });\n }\n\n if (options.generateAudio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'generateAudio',\n details:\n 'Topaz video models do not generate audio. Use the `output.audioTransfer` ' +\n 'provider option to control how the input audio track is carried over.',\n });\n }\n\n if (options.frameImages != null && options.frameImages.length > 0) {\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n 'Topaz video models do not support first/last frame generation. The frame ' +\n 'images were ignored.',\n });\n }\n\n if (options.n > 1) {\n warnings.push({\n type: 'unsupported',\n feature: 'n',\n details:\n 'Topaz video models enhance one video per call. Only 1 video will be produced.',\n });\n }\n }\n\n private selectInputVideo(\n options: Parameters<NonNullable<VideoModelV4['doStart']>>[0],\n warnings: SharedV4Warning[],\n ): VideoModelV4File {\n const references = options.inputReferences ?? [];\n const videos = references.filter(isVideoReference);\n\n if (videos.length === 0) {\n if (options.image != null) {\n throw new InvalidArgumentError({\n argument: 'image',\n message:\n 'Topaz video models enhance an existing video, not a still image. Pass the ' +\n 'input video via `inputReferences`.',\n });\n }\n\n throw new InvalidArgumentError({\n argument: 'inputReferences',\n message:\n 'Topaz video models require an input video. Pass it via `inputReferences`, ' +\n 'e.g. `inputReferences: [{ type: \"file\", mediaType: \"video/mp4\", data: bytes }]`. ' +\n 'For URL references, include `mediaType` so the reference is recognized as a video.',\n });\n }\n\n if (references.length > 1) {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'Topaz video models enhance a single video. Only the first video reference was used.',\n });\n }\n\n return videos[0];\n }\n\n private async uploadVideo({\n requestId,\n bytes,\n urls,\n contentType,\n abortSignal,\n }: {\n requestId: string;\n bytes: Uint8Array;\n urls: string[] | null | undefined;\n contentType: string;\n abortSignal: AbortSignal | undefined;\n }): Promise<void> {\n const url = urls?.[0];\n if (url == null) {\n throw new InvalidResponseDataError({\n data: urls,\n message: `Topaz returned no upload URL for request ${requestId}.`,\n });\n }\n\n // The upload URL comes from the Topaz response body. `getFromApi` cannot\n // be used for a PUT, so the same trust decision is made explicitly here:\n // validate unless the URL points back at the configured base URL, and\n // never attach the API key (presigned URLs carry their own credentials).\n if (!isSameOrigin(url, this.config.baseURL)) {\n validateDownloadUrl(url);\n }\n\n const fetchImpl = this.config.fetch ?? globalThis.fetch;\n const response = await fetchImpl(url, {\n method: 'PUT',\n headers: withUserAgentSuffix(\n { 'Content-Type': contentType },\n `ai-sdk-topaz/${VERSION}`,\n ) as HeadersInit,\n body: bytes as BodyInit,\n signal: abortSignal,\n });\n\n if (!response.ok) {\n throw new APICallError({\n message: `Uploading the input video failed with status ${response.status}.`,\n url,\n requestBodyValues: {},\n statusCode: response.status,\n responseHeaders: Object.fromEntries(response.headers.entries()),\n responseBody: await response.text(),\n });\n }\n }\n\n private async cancelQuietly(\n requestId: string,\n headers: Record<string, string | undefined>,\n ): Promise<void> {\n const fetchImpl = this.config.fetch ?? globalThis.fetch;\n\n try {\n // Deliberately not tied to the caller's abort signal, which may be the\n // reason the start failed.\n await fetchImpl(`${this.config.baseURL}/video/${requestId}`, {\n method: 'DELETE',\n headers: removeUndefinedEntries(headers),\n });\n } catch {\n // Best effort: the original error is more useful to the caller.\n }\n }\n}\n\nfunction lowerBoundCredits(\n cost: number[] | null | undefined,\n): number | undefined {\n return cost != null && cost.length > 0 ? Math.min(...cost) : undefined;\n}\n\nfunction fileBytes(\n input: Extract<VideoModelV4File, { type: 'file' }>,\n): Uint8Array {\n return typeof input.data === 'string'\n ? convertBase64ToUint8Array(input.data)\n : input.data;\n}\n\nfunction resolveContainer(\n input: VideoModelV4File,\n declaredContainer: TopazSourceContainer | undefined,\n): TopazSourceContainer {\n if (declaredContainer != null) {\n return declaredContainer;\n }\n\n if (input.type === 'file') {\n const container = mediaTypeContainers[input.mediaType.toLowerCase()];\n\n if (container == null) {\n throw new InvalidArgumentError({\n argument: 'inputReferences',\n message:\n `Could not map the media type \"${input.mediaType}\" onto a Topaz container. ` +\n 'Set the `source.container` provider option explicitly.',\n });\n }\n\n return container;\n }\n\n const container =\n (input.mediaType != null\n ? mediaTypeContainers[input.mediaType.toLowerCase()]\n : undefined) ?? containerFromUrl(input.url);\n\n if (container == null) {\n throw new InvalidArgumentError({\n argument: 'inputReferences',\n message:\n `Could not determine the container of the input video at \"${input.url}\". Set ` +\n 'the `source.container` provider option, or pass `mediaType` on the reference.',\n });\n }\n\n return container;\n}\n\nfunction isVideoReference(reference: VideoModelV4File): boolean {\n if (reference.type === 'file') {\n return reference.mediaType.toLowerCase().startsWith('video/');\n }\n\n if (reference.mediaType != null) {\n return reference.mediaType.toLowerCase().startsWith('video/');\n }\n\n return containerFromUrl(reference.url) != null;\n}\n\nfunction containerFromUrl(url: string): TopazSourceContainer | undefined {\n const withoutQuery = url.split(/[?#]/)[0];\n const extension = withoutQuery.split('.').pop()?.toLowerCase();\n return extension != null ? extensionContainers[extension] : undefined;\n}\n\ntype SourceMetadata = {\n duration: number;\n frameRate: number;\n frameCount: number;\n width: number;\n height: number;\n};\n\ntype ResolvedSource = {\n container: TopazSourceContainer;\n metadata: SourceMetadata | undefined;\n};\n\n/**\n * Reads the optional source metadata, which is all or nothing. Starlight\n * models require it, and it lets Topaz estimate the cost up front. Nothing is\n * read out of the video bytes: no provider package inspects media files.\n */\nfunction resolveSource(\n topazOptions: TopazVideoModelOptions | undefined,\n container: TopazSourceContainer,\n): ResolvedSource {\n const source = topazOptions?.source;\n const { width, height, duration, frameRate } = source ?? {};\n\n if (\n width == null &&\n height == null &&\n duration == null &&\n frameRate == null &&\n source?.frameCount == null\n ) {\n return { container, metadata: undefined };\n }\n\n const frameCount =\n source?.frameCount ??\n (duration != null && frameRate != null\n ? Math.round(duration * frameRate)\n : undefined);\n\n const missing = [\n width == null ? 'source.width' : undefined,\n height == null ? 'source.height' : undefined,\n duration == null ? 'source.duration' : undefined,\n frameRate == null ? 'source.frameRate' : undefined,\n ].filter(field => field != null);\n\n if (\n width == null ||\n height == null ||\n duration == null ||\n frameRate == null ||\n frameCount == null\n ) {\n throw new InvalidArgumentError({\n argument: 'providerOptions.topaz.source',\n message: `Source metadata must be complete. Missing: ${missing.join(', ')}.`,\n });\n }\n\n return {\n container,\n metadata: { duration, frameRate, frameCount, width, height },\n };\n}\n\nfunction parseResolution(resolution: `${number}x${number}` | undefined): {\n width: number | undefined;\n height: number | undefined;\n} {\n if (resolution == null) {\n return { width: undefined, height: undefined };\n }\n\n const [width, height] = resolution.split('x').map(Number);\n return { width, height };\n}\n\nfunction buildOutput({\n options,\n topazOptions,\n source,\n}: {\n options: Parameters<NonNullable<VideoModelV4['doStart']>>[0];\n topazOptions: TopazVideoModelOptions | undefined;\n source: ResolvedSource;\n}): Record<string, unknown> & { container: TopazOutputContainer } {\n const output = topazOptions?.output;\n const resolution = parseResolution(options.resolution);\n\n const width = output?.width ?? resolution.width ?? source.metadata?.width;\n const height = output?.height ?? resolution.height ?? source.metadata?.height;\n\n if (width == null || height == null) {\n throw new InvalidArgumentError({\n argument: 'resolution',\n message:\n 'Topaz needs the output resolution. Set the `resolution` call option or the ' +\n '`output.width` / `output.height` provider options.',\n });\n }\n\n const frameRate =\n output?.frameRate ?? options.fps ?? source.metadata?.frameRate;\n const audioTransfer = output?.audioTransfer ?? 'Copy';\n\n return {\n resolution: { width, height },\n ...(frameRate != null ? { frameRate } : {}),\n audioTransfer,\n ...(audioTransfer !== 'None'\n ? { audioCodec: output?.audioCodec ?? 'AAC' }\n : output?.audioCodec != null\n ? { audioCodec: output.audioCodec }\n : {}),\n ...(output?.audioBitrate != null\n ? { audioBitrate: output.audioBitrate }\n : {}),\n ...(output?.videoEncoder != null\n ? { videoEncoder: output.videoEncoder }\n : {}),\n ...(output?.videoProfile != null\n ? { videoProfile: output.videoProfile }\n : {}),\n ...(output?.videoBitrate != null\n ? { videoBitrate: output.videoBitrate }\n : {}),\n ...(output?.dynamicCompressionLevel != null\n ? { dynamicCompressionLevel: output.dynamicCompressionLevel }\n : {}),\n ...(output?.cropToFit != null ? { cropToFit: output.cropToFit } : {}),\n container: resolveOutputContainer(output, source.container),\n };\n}\n\n/**\n * Mirrors Topaz's container rules so `doStatus` can report the media type of\n * the file Topaz will actually produce.\n */\nfunction resolveOutputContainer(\n output: TopazVideoModelOptions['output'],\n sourceContainer: TopazSourceContainer,\n): TopazOutputContainer {\n switch (output?.videoEncoder) {\n case 'ProRes':\n return 'mov';\n case 'AV1':\n case 'VP9':\n return 'mp4';\n }\n\n if (output?.container != null) {\n return output.container;\n }\n\n // The default H265 encoder only writes mp4, mov and mkv.\n return sourceContainer === 'mov' || sourceContainer === 'mkv'\n ? sourceContainer\n : 'mp4';\n}\n\nfunction requireRequestId(requestId: string | null | undefined): string {\n if (requestId == null) {\n throw new InvalidResponseDataError({\n data: requestId,\n message: 'Topaz did not return a requestId for the video request.',\n });\n }\n\n return requestId;\n}\n\nfunction buildFilter(\n modelId: string,\n topazOptions: TopazVideoModelOptions | undefined,\n): Record<string, unknown> {\n const filter: Record<string, unknown> = {\n model: resolveTopazVideoApiModelId(modelId),\n };\n\n if (topazOptions != null) {\n const nonFilterKeys = new Set<string>(TOPAZ_NON_FILTER_OPTION_KEYS);\n\n for (const [key, value] of Object.entries(topazOptions)) {\n if (!nonFilterKeys.has(key) && value !== undefined) {\n filter[key] = value;\n }\n }\n\n Object.assign(filter, topazOptions.filter ?? {});\n }\n\n return filter;\n}\n\n// `cost` (credits) and `time` (seconds) are [lowerBound, upperBound] pairs.\nconst topazVideoEstimatesSchema = z\n .object({\n cost: z.array(z.number()).nullish(),\n time: z.array(z.number()).nullish(),\n })\n .nullish();\n\nconst topazVideoExpressResponseSchema = z.object({\n requestId: z.string().nullish(),\n uploadUrls: z.array(z.string()).nullish(),\n estimates: topazVideoEstimatesSchema,\n});\n\nconst topazVideoStatusResponseSchema = z.object({\n status: z.string().nullish(),\n message: z.string().nullish(),\n errorCode: z.string().nullish(),\n // Documented as a string, accepted as a number too.\n outputSize: z.union([z.string(), z.number()]).nullish(),\n estimates: topazVideoEstimatesSchema,\n download: z\n .object({\n url: z.string().nullish(),\n expiresAt: z.union([z.string(), z.number()]).nullish(),\n })\n .nullish(),\n});\n","import {\n NoSuchModelError,\n type Experimental_VideoModelV4 as VideoModelV4,\n type ImageModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { TopazImageModel } from './topaz-image-model';\nimport type { TopazImageModelId } from './topaz-image-settings';\nimport { TopazVideoModel } from './topaz-video-model';\nimport type { TopazVideoModelId } from './topaz-video-settings';\nimport { VERSION } from './version';\n\nexport interface TopazProviderSettings {\n /**\n * Topaz Labs API key. Default value is taken from the `TOPAZ_API_KEY`\n * environment variable.\n *\n * @see https://developer.topazlabs.com/getting-started/api-key-setup\n */\n apiKey?: string;\n\n /**\n * Base URL for the API calls.\n */\n baseURL?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept\n * requests, or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface TopazProvider extends ProviderV4 {\n /**\n * Creates a model for image enhancement.\n */\n image(modelId: TopazImageModelId): ImageModelV4;\n\n /**\n * Creates a model for image enhancement.\n */\n imageModel(modelId: TopazImageModelId): ImageModelV4;\n\n /**\n * Creates a model for video enhancement.\n */\n video(modelId: TopazVideoModelId): VideoModelV4;\n\n /**\n * Creates a model for video enhancement.\n */\n videoModel(modelId: TopazVideoModelId): VideoModelV4;\n}\n\nconst defaultBaseURL = 'https://api.topazlabs.com';\n\n/**\n * Create a Topaz Labs provider instance.\n */\nexport function createTopaz(\n options: TopazProviderSettings = {},\n): TopazProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL ?? defaultBaseURL) ?? defaultBaseURL;\n\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n 'X-API-Key': loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'TOPAZ_API_KEY',\n description: 'Topaz Labs',\n }),\n accept: 'application/json',\n ...options.headers,\n },\n `ai-sdk-topaz/${VERSION}`,\n );\n\n const createImageModel = (modelId: TopazImageModelId): ImageModelV4 =>\n new TopazImageModel(modelId, {\n provider: 'topaz.image',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createVideoModel = (modelId: TopazVideoModelId): VideoModelV4 =>\n new TopazVideoModel(modelId, {\n provider: 'topaz.video',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const noSuchModel = (\n modelId: string,\n modelType:\n | 'languageModel'\n | 'embeddingModel'\n | 'transcriptionModel'\n | 'speechModel'\n | 'rerankingModel',\n ): never => {\n throw new NoSuchModelError({ modelId, modelType });\n };\n\n const provider: TopazProvider = {\n specificationVersion: 'v4' as const,\n image: createImageModel,\n imageModel: createImageModel,\n video: createVideoModel,\n videoModel: createVideoModel,\n languageModel: (modelId: string) => noSuchModel(modelId, 'languageModel'),\n embeddingModel: (modelId: string) => noSuchModel(modelId, 'embeddingModel'),\n };\n\n return provider;\n}\n\n/**\n * Default Topaz Labs provider instance.\n */\nexport const topaz = createTopaz();\n"],"mappings":"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"}
|
package/docs/210-topaz.mdx
CHANGED
|
@@ -226,18 +226,29 @@ A non-empty `prompt`, `aspectRatio`, `seed`, `duration`, `generateAudio`, `frame
|
|
|
226
226
|
|
|
227
227
|
### Long-Running Operations
|
|
228
228
|
|
|
229
|
-
Video enhancement
|
|
229
|
+
Video enhancement takes minutes, so Topaz video models implement the AI SDK's async operation protocol. `generateVideo` polls to completion, and long clips can exceed its default 10 minute timeout, so raise `poll.timeoutMs` when needed. Use `experimental_startVideo` when you would rather persist the operation and check its status later:
|
|
230
230
|
|
|
231
|
-
|
|
232
|
-
|
|
231
|
+
```ts
|
|
232
|
+
import { topaz } from '@ai-sdk/topaz';
|
|
233
|
+
import { experimental_startVideo as startVideo } from 'ai';
|
|
233
234
|
|
|
234
|
-
|
|
235
|
+
const operation = await startVideo({
|
|
236
|
+
model: topaz.video('proteus'),
|
|
237
|
+
prompt: '',
|
|
238
|
+
inputReferences: ['https://example.com/clip.mp4'],
|
|
239
|
+
resolution: '3840x2160',
|
|
240
|
+
});
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
If the upload fails after the request is created, the provider cancels the Topaz request so any reserved credits are refunded.
|
|
235
244
|
|
|
236
245
|
### Video Provider Metadata
|
|
237
246
|
|
|
238
247
|
Topaz estimates the cost of a video request in credits as a `[lowerBound, upperBound]` range and bills the lower bound.
|
|
239
248
|
|
|
240
|
-
The result's `providerMetadata.topaz` contains:
|
|
249
|
+
The start result's `providerMetadata.topaz` contains the `requestId` and, when Topaz could estimate the cost at request time, `estimatedCredits`. Topaz can do that when source metadata is set. It is informational only: the completed status carries the billed value.
|
|
250
|
+
|
|
251
|
+
The completed status's `providerMetadata.topaz` contains:
|
|
241
252
|
|
|
242
253
|
- **requestId** _string_: the Topaz request id.
|
|
243
254
|
- **credits** _number_: the credits Topaz bills for the request (the lower bound of its final estimate).
|
|
@@ -245,4 +256,4 @@ The result's `providerMetadata.topaz` contains:
|
|
|
245
256
|
- **outputSize** _string_: the size of the enhanced video.
|
|
246
257
|
- **expiresAt** _number_: when the download URL expires, in milliseconds since the Unix epoch.
|
|
247
258
|
|
|
248
|
-
A failed request reports Topaz's `errorCode` (for example `CREDIT_DIFFERENCE` when Topaz's estimate after reading the video diverged from the first one, in which case it refunds the credits) in the error message.
|
|
259
|
+
A failed request reports Topaz's `errorCode` (for example `CREDIT_DIFFERENCE` when Topaz's estimate after reading the video diverged from the first one, in which case it refunds the credits) in both the error message and `providerMetadata.topaz.errorCode`.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/topaz",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -29,16 +29,16 @@
|
|
|
29
29
|
}
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@ai-sdk/provider": "
|
|
33
|
-
"@ai-sdk/provider-utils": "
|
|
32
|
+
"@ai-sdk/provider": "4.0.21",
|
|
33
|
+
"@ai-sdk/provider-utils": "5.0.53"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
|
-
"@
|
|
36
|
+
"@ai-sdk/test-server": "2.0.3",
|
|
37
|
+
"@types/node": "22.19.19",
|
|
38
|
+
"@vercel/ai-tsconfig": "0.0.0",
|
|
39
|
+
"tsdown": "^0.23.0",
|
|
37
40
|
"typescript": "5.8.3",
|
|
38
|
-
"zod": "3.25.76"
|
|
39
|
-
"tsup": "^8.5.1",
|
|
40
|
-
"@ai-sdk/test-server": "1.0.6",
|
|
41
|
-
"@vercel/ai-tsconfig": "0.0.0"
|
|
41
|
+
"zod": "3.25.76"
|
|
42
42
|
},
|
|
43
43
|
"peerDependencies": {
|
|
44
44
|
"zod": "^3.25.76 || ^4.1.8"
|
|
@@ -63,9 +63,9 @@
|
|
|
63
63
|
"ai"
|
|
64
64
|
],
|
|
65
65
|
"scripts": {
|
|
66
|
-
"build": "pnpm clean &&
|
|
67
|
-
"build:watch": "pnpm clean &&
|
|
68
|
-
"clean": "del-cli
|
|
66
|
+
"build": "pnpm clean && tsdown",
|
|
67
|
+
"build:watch": "pnpm clean && tsdown --watch",
|
|
68
|
+
"clean": "del-cli docs *.tsbuildinfo",
|
|
69
69
|
"type-check": "tsc --build",
|
|
70
70
|
"test": "pnpm test:node && pnpm test:edge",
|
|
71
71
|
"test:update": "pnpm test:node -u",
|