getaiapi 0.4.12 → 1.0.0-alpha.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/gateway.ts","../src/resolver.ts","../src/mapper.ts","../src/categories/text-to-image.ts","../src/categories/image-edit.ts","../src/categories/text-to-video.ts","../src/categories/image-to-video.ts","../src/categories/upscale-image.ts","../src/categories/text-to-audio.ts","../src/categories/audio-to-text.ts","../src/categories/remove-background.ts","../src/categories/text-generation.ts","../src/categories/image-to-image.ts","../src/categories/text-to-3d.ts","../src/categories/image-to-3d.ts","../src/categories/upscale-video.ts","../src/categories/video-to-audio.ts","../src/categories/video-to-video.ts","../src/categories/segmentation.ts","../src/categories/moderation.ts","../src/categories/training.ts","../src/categories/doc-to-text.ts","../src/categories/image-to-text.ts","../src/categories/video-to-text.ts","../src/categories/index.ts","../src/configure.ts","../src/discovery.ts"],"sourcesContent":["import { randomUUID } from 'crypto'\nimport { AuthManager } from './auth.js'\nimport { resolveModel } from './resolver.js'\nimport { mapInput, mapOutput } from './mapper.js'\nimport { getCategoryTemplate } from './categories/index.js'\nimport { falAiAdapter } from './adapters/fal-ai.js'\nimport { replicateAdapter } from './adapters/replicate.js'\nimport { wavespeedAdapter } from './adapters/wavespeed.js'\nimport { openRouterAdapter } from './adapters/openrouter.js'\nimport type { GenerateRequest, GenerateResponse, ProviderAdapter, ProviderName } from './types.js'\nimport { ValidationError, ProviderError } from './errors.js'\nimport { withRetry } from './retry.js'\nimport { processParamsForUpload } from './storage.js'\n\n// Adapter registry\nconst adapters: Record<string, ProviderAdapter> = {\n 'fal-ai': falAiAdapter,\n 'replicate': replicateAdapter,\n 'wavespeed': wavespeedAdapter,\n 'openrouter': openRouterAdapter,\n}\n\nexport async function generate(request: GenerateRequest): Promise<GenerateResponse> {\n const startTime = Date.now()\n\n // 1. Validate request\n if (!request.model) throw new ValidationError('model', 'model is required')\n\n // 2. Auth - check available providers\n const auth = new AuthManager()\n\n // 3. Resolve model\n const model = resolveModel(request.model, auth.availableProviders())\n\n // 4. Pick provider (first available)\n const availableBindings = model.providers.filter(p =>\n auth.availableProviders().includes(p.provider) && adapters[p.provider]\n )\n if (availableBindings.length === 0) {\n throw new ValidationError(\n 'model',\n `No adapter available for model \"${model.canonical_name}\". Available providers: ${model.providers.map(p => p.provider).join(', ')}`,\n )\n }\n const binding = availableBindings[0]\n\n // 5. Get category template\n const template = getCategoryTemplate(model.category)\n if (!template) {\n throw new ValidationError('model', `No category template for \"${model.category}\" yet`)\n }\n\n // 6. Map input\n const providerParams = mapInput(request, binding, template)\n\n // 6.5 Upload binary params to R2 (no-op if storage not configured)\n const finalParams = await processParamsForUpload(providerParams, {\n reupload: request.options?.reupload as boolean | undefined,\n })\n\n // 7. Get adapter and auth key\n const adapter = adapters[binding.provider]\n const apiKey = auth.getKey(binding.provider)\n\n // 8. Submit with retry, then poll\n const timeoutMs = (request.options?.timeout as number | undefined) ?? template.default_timeout_ms\n const submitted = await withRetry(\n () => adapter.submit(binding.endpoint, finalParams, apiKey),\n { timeoutMs },\n )\n\n let result = submitted\n while (result.status === 'processing' || result.status === 'pending') {\n await new Promise(resolve => setTimeout(resolve, 1000))\n result = await adapter.poll(submitted.id, apiKey, binding.endpoint)\n }\n\n if (result.status === 'failed') {\n throw new ProviderError(\n binding.provider,\n model.canonical_name,\n 0,\n result.error || 'Generation failed',\n )\n }\n\n // 9. Map output\n const outputs = mapOutput(result.output, binding.output_map)\n\n // 10. Build response\n const rawOutput = typeof result.output === 'object' && result.output !== null\n ? result.output as Record<string, unknown>\n : undefined\n\n const metadata: GenerateResponse['metadata'] = {\n inference_time_ms: Date.now() - startTime,\n seed: rawOutput?.seed as number | undefined,\n safety_flagged: rawOutput\n ? (\n Array.isArray(rawOutput.has_nsfw_concepts)\n ? (rawOutput.has_nsfw_concepts as boolean[]).some((v: boolean) => v)\n : undefined\n )\n : undefined,\n }\n\n // Extract token usage from OpenRouter responses\n if (rawOutput?.usage) {\n const usage = rawOutput.usage as Record<string, number>\n metadata.tokens = usage.total_tokens\n metadata.prompt_tokens = usage.prompt_tokens\n metadata.completion_tokens = usage.completion_tokens\n }\n\n return {\n id: randomUUID(),\n model: model.canonical_name,\n provider: binding.provider,\n status: 'completed',\n outputs,\n metadata,\n }\n}\n","import { readFileSync } from \"fs\";\nimport { resolve, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport type { ModelEntry, ProviderName } from \"./types.js\";\nimport { ModelNotFoundError, NoProviderError } from \"./errors.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nlet registryCache: ModelEntry[] | null = null;\n\n/**\n * Reads and parses registry/registry.json.\n * Caches the result so the file is only loaded once.\n */\nexport function loadRegistry(): ModelEntry[] {\n if (registryCache) {\n return registryCache;\n }\n\n // Try resolving from project root (works both from src/ and dist/)\n // Walk up from current file to find the registry directory\n let dir = __dirname;\n for (let i = 0; i < 5; i++) {\n const candidate = resolve(dir, \"registry\", \"registry.json\");\n try {\n const raw = readFileSync(candidate, \"utf-8\");\n registryCache = JSON.parse(raw) as ModelEntry[];\n return registryCache;\n } catch {\n dir = dirname(dir);\n }\n }\n\n throw new Error(\n \"Could not find registry/registry.json. Searched upward from: \" + __dirname,\n );\n}\n\n/**\n * Normalizes a model name for fuzzy matching.\n * - Lowercase\n * - Strip all non-alphanumeric characters\n * - Strip leading 'v' from version numbers (e.g., \"v4.5\" -> \"45\")\n */\nexport function normalizeModelName(input: string): string {\n return input\n .toLowerCase()\n .replace(/[^a-z0-9]/g, \"\")\n .replace(/(?<=\\d)v(?=\\d)/g, \"\") // v between digits (unlikely but safe)\n .replace(/v(?=\\d)/g, \"\"); // v before digits\n}\n\n/**\n * Resolves a user's model name query to a matching ModelEntry.\n *\n * Resolution order:\n * 1. Exact canonical match\n * 2. Exact alias match\n * 3. Normalized canonical match\n * 4. Normalized alias match\n * 5. No match -> throw ModelNotFoundError with suggestions\n */\nexport function resolveModel(\n query: string,\n availableProviders?: ProviderName[],\n): ModelEntry {\n if (!query || typeof query !== \"string\" || query.trim() === \"\") {\n throw new ModelNotFoundError(\"Model name is required\");\n }\n\n const trimmedQuery = query.trim();\n const registry = loadRegistry();\n\n let matched: ModelEntry | undefined;\n\n // 1. Exact canonical match\n matched = registry.find((e) => e.canonical_name === trimmedQuery);\n\n // 2. Exact alias match\n if (!matched) {\n matched = registry.find((e) =>\n e.aliases.some((a) => a === trimmedQuery),\n );\n }\n\n // 3. Normalized canonical match\n if (!matched) {\n const normalizedQuery = normalizeModelName(trimmedQuery);\n matched = registry.find(\n (e) => normalizeModelName(e.canonical_name) === normalizedQuery,\n );\n\n // 4. Normalized alias match\n if (!matched) {\n matched = registry.find((e) =>\n e.aliases.some((a) => normalizeModelName(a) === normalizedQuery),\n );\n }\n }\n\n if (!matched) {\n const suggestions = findSuggestions(trimmedQuery, registry);\n throw new ModelNotFoundError(trimmedQuery, suggestions);\n }\n\n // Apply provider filtering after matching\n if (availableProviders && availableProviders.length > 0) {\n const filteredProviders = matched.providers.filter((p) =>\n availableProviders.includes(p.provider),\n );\n\n if (filteredProviders.length === 0) {\n throw new NoProviderError(\n trimmedQuery,\n matched.canonical_name,\n matched.providers.map((p) => p.provider),\n availableProviders,\n );\n }\n\n return { ...matched, providers: filteredProviders };\n }\n\n return matched;\n}\n\n/**\n * Find up to 5 suggestions for a failed query.\n * Uses prefix and substring matching on normalized names.\n * Sorted by canonical_name length (shorter = more likely intended).\n */\nfunction findSuggestions(\n query: string,\n registry: ModelEntry[],\n): string[] {\n const normalizedQuery = normalizeModelName(query);\n\n if (normalizedQuery === \"\") {\n return [];\n }\n\n const matches = registry.filter((e) => {\n const normalizedCanonical = normalizeModelName(e.canonical_name);\n // Check if either is a prefix/substring of the other\n if (\n normalizedCanonical.startsWith(normalizedQuery) ||\n normalizedCanonical.includes(normalizedQuery) ||\n normalizedQuery.startsWith(normalizedCanonical)\n ) {\n return true;\n }\n // Check for a meaningful shared prefix (at least 3 chars)\n const minLen = Math.min(normalizedQuery.length, normalizedCanonical.length);\n let shared = 0;\n for (let i = 0; i < minLen; i++) {\n if (normalizedQuery[i] === normalizedCanonical[i]) {\n shared++;\n } else {\n break;\n }\n }\n return shared >= 3 && shared >= normalizedQuery.length * 0.3;\n });\n\n return matches\n .sort((a, b) => a.canonical_name.length - b.canonical_name.length)\n .slice(0, 5)\n .map((e) => e.canonical_name);\n}\n\n/**\n * Clears the registry cache. Useful for testing.\n */\nexport function clearRegistryCache(): void {\n registryCache = null;\n}\n","import type {\n GenerateRequest,\n ProviderBinding,\n CategoryTemplate,\n ParamMapping,\n OutputItem,\n OutputMapping,\n ProviderName,\n} from './types.js'\nimport { ValidationError } from './errors.js'\n\n/**\n * Maps a universal GenerateRequest to provider-specific params\n * using the category template's input_mappings.\n */\nexport function mapInput(\n request: GenerateRequest,\n binding: ProviderBinding,\n template: CategoryTemplate,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n const provider = binding.provider\n\n for (const mapping of template.input_mappings) {\n const value = getUniversalValue(request, mapping.universal)\n\n if (value === undefined || value === null) {\n if (mapping.required) {\n throw new ValidationError(\n mapping.universal,\n `\"${mapping.universal}\" is required but was not provided.`,\n )\n }\n continue\n }\n\n const providerKey = mapping.providers[provider]\n if (providerKey === undefined) {\n // Provider doesn't support this param — silently drop\n continue\n }\n\n const transformed = applyTransform(value, mapping, provider)\n\n if (Array.isArray(providerKey)) {\n // Spread into multiple params (e.g., Replicate's [\"width\", \"height\"])\n if (typeof transformed === 'object' && transformed !== null && !Array.isArray(transformed)) {\n const obj = transformed as Record<string, unknown>\n for (const key of providerKey) {\n if (obj[key] !== undefined) {\n result[key] = obj[key]\n }\n }\n }\n } else {\n result[providerKey] = transformed\n }\n }\n\n // Merge options passthrough — options wins on conflict\n if (request.options) {\n for (const [key, val] of Object.entries(request.options)) {\n result[key] = val\n }\n }\n\n return result\n}\n\n/**\n * Extracts a universal field value from the GenerateRequest.\n */\nfunction getUniversalValue(request: GenerateRequest, field: string): unknown {\n return (request as unknown as Record<string, unknown>)[field]\n}\n\n/**\n * Applies the specified transform to the value.\n */\nfunction applyTransform(\n value: unknown,\n mapping: ParamMapping,\n provider: ProviderName,\n): unknown {\n const transform = mapping.transform\n\n if (!transform || transform === 'none') {\n return value\n }\n\n if (transform === 'flip_boolean') {\n if (provider === 'replicate') {\n return !value\n }\n return value\n }\n\n if (transform === 'parse_size') {\n return parseSizeForProvider(value, mapping, provider)\n }\n\n return value\n}\n\n/**\n * Converts a size value to the provider-specific format.\n */\nfunction parseSizeForProvider(\n value: unknown,\n mapping: ParamMapping,\n provider: ProviderName,\n): unknown {\n if (provider === 'fal-ai') {\n if (typeof value === 'string') {\n const [w, h] = value.split('x').map(Number)\n return { width: w, height: h }\n }\n // Object passthrough\n return value\n }\n\n if (provider === 'replicate') {\n if (typeof value === 'string') {\n const [w, h] = value.split('x').map(Number)\n return { width: w, height: h }\n }\n if (typeof value === 'object' && value !== null) {\n return value\n }\n return value\n }\n\n // wavespeed and others: pass through as-is\n return value\n}\n\n/**\n * Maps raw provider response to OutputItem[] using the output mapping.\n */\nexport function mapOutput(raw: unknown, outputMapping: OutputMapping): OutputItem[] {\n const { type, extract_path, content_type } = outputMapping\n const defaultContentType = content_type || 'image/jpeg'\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const data = raw as any\n\n if (extract_path === 'images[].url') {\n const images: unknown[] = data?.images ?? []\n return images.map((img: any) => ({\n type,\n url: img.url as string,\n content_type: (img.content_type as string) || defaultContentType,\n }))\n }\n\n if (extract_path === 'output[]') {\n const arr: unknown[] = Array.isArray(data) ? data : data?.output ?? []\n return arr.map((url: unknown) => ({\n type,\n url: url as string,\n content_type: defaultContentType,\n }))\n }\n\n if (extract_path === 'data.outputs[]') {\n const outputs: unknown[] = data?.data?.outputs ?? []\n return outputs.map((url: unknown) => ({\n type,\n url: url as string,\n content_type: defaultContentType,\n }))\n }\n\n if (extract_path === 'video.url') {\n return [{\n type: 'video',\n url: data?.video?.url as string,\n content_type: 'video/mp4',\n }]\n }\n\n if (extract_path === 'audio.url') {\n return [{\n type: 'audio',\n url: data?.audio?.url as string,\n content_type: 'audio/mpeg',\n }]\n }\n\n // Generic dot-notation traversal for unknown paths\n return genericExtract(data, extract_path, type, defaultContentType)\n}\n\n/**\n * Generic dot-notation traversal for unknown extract paths.\n * Supports paths like \"foo.bar[].baz\".\n */\nfunction genericExtract(\n data: unknown,\n path: string,\n type: OutputMapping['type'],\n contentType: string,\n): OutputItem[] {\n const segments = path.split('.')\n let current: unknown = data\n\n for (const seg of segments) {\n if (current === null || current === undefined) return []\n\n // Indexed array access: key[N]\n const indexMatch = seg.match(/^(.+)\\[(\\d+)\\]$/)\n if (indexMatch) {\n const key = indexMatch[1]\n const index = parseInt(indexMatch[2], 10)\n const arr = (current as Record<string, unknown>)[key]\n if (!Array.isArray(arr) || index >= arr.length) return []\n current = arr[index]\n continue\n }\n\n // Array iteration: key[]\n const arrayMatch = seg.match(/^(.+)\\[\\]$/)\n if (arrayMatch) {\n const key = arrayMatch[1]\n current = (current as Record<string, unknown>)[key]\n if (Array.isArray(current)) {\n // If there are more segments after this, we'd need to map deeper\n // For now, treat as final array\n const remaining = segments.slice(segments.indexOf(seg) + 1).join('.')\n if (remaining) {\n return (current as unknown[]).map((item: any) => ({\n type,\n url: getNestedValue(item, remaining) as string,\n content_type: contentType,\n }))\n }\n return (current as unknown[]).map((item: unknown) => ({\n type,\n url: (typeof item === 'string' ? item : (item as any)?.url) as string,\n content_type: contentType,\n }))\n }\n return []\n }\n\n current = (current as Record<string, unknown>)[seg]\n }\n\n // Single value at end of path\n if (typeof current === 'string') {\n if (type === 'text') {\n return [{ type, content: current, content_type: contentType }]\n }\n return [{ type, url: current, content_type: contentType }]\n }\n\n return []\n}\n\nfunction getNestedValue(obj: unknown, path: string): unknown {\n let current = obj\n for (const key of path.split('.')) {\n if (current === null || current === undefined) return undefined\n current = (current as Record<string, unknown>)[key]\n }\n return current\n}\n","import type { CategoryTemplate } from '../types.js'\n\nexport const textToImageTemplate: CategoryTemplate = {\n category: 'text-to-image',\n input_mappings: [\n {\n universal: 'prompt',\n providers: {\n 'fal-ai': 'prompt',\n 'replicate': 'prompt',\n 'wavespeed': 'prompt',\n },\n required: true,\n },\n {\n universal: 'negative_prompt',\n providers: {\n 'fal-ai': 'negative_prompt',\n 'replicate': 'negative_prompt',\n 'wavespeed': 'negative_prompt',\n },\n },\n {\n universal: 'count',\n providers: {\n 'fal-ai': 'num_images',\n 'replicate': 'num_outputs',\n 'wavespeed': 'num_outputs',\n },\n },\n {\n universal: 'size',\n providers: {\n 'fal-ai': 'image_size',\n 'replicate': ['width', 'height'],\n 'wavespeed': 'resolution',\n },\n transform: 'parse_size',\n },\n {\n universal: 'guidance',\n providers: {\n 'fal-ai': 'guidance_scale',\n 'replicate': 'guidance',\n 'wavespeed': 'guidance_scale',\n },\n },\n {\n universal: 'steps',\n providers: {\n 'fal-ai': 'num_inference_steps',\n 'replicate': 'num_inference_steps',\n 'wavespeed': 'num_inference_steps',\n },\n },\n {\n universal: 'seed',\n providers: {\n 'fal-ai': 'seed',\n 'replicate': 'seed',\n 'wavespeed': 'seed',\n },\n },\n {\n universal: 'format',\n providers: {\n 'fal-ai': 'output_format',\n 'replicate': 'output_format',\n 'wavespeed': 'output_format',\n },\n },\n {\n universal: 'quality',\n providers: {\n 'fal-ai': 'quality',\n 'replicate': 'output_quality',\n 'wavespeed': 'quality',\n },\n },\n {\n universal: 'safety',\n providers: {\n 'fal-ai': 'enable_safety_checker',\n 'replicate': 'disable_safety_checker',\n 'wavespeed': 'enable_safety_checker',\n },\n transform: 'flip_boolean',\n },\n ],\n output_type: 'image',\n output_extract: {\n 'fal-ai': 'images[].url',\n 'replicate': 'output[]',\n 'wavespeed': 'data.outputs[]',\n },\n default_timeout_ms: 60000,\n}\n","import type { CategoryTemplate } from '../types.js'\n\nexport const imageEditTemplate: CategoryTemplate = {\n category: 'image-edit',\n input_mappings: [\n {\n universal: 'image',\n providers: {\n 'fal-ai': 'image_url',\n 'replicate': 'image',\n 'wavespeed': 'image_url',\n },\n required: true,\n },\n {\n universal: 'images',\n providers: {\n 'fal-ai': 'image_urls',\n 'replicate': 'image_urls',\n 'wavespeed': 'image_urls',\n },\n },\n {\n universal: 'prompt',\n providers: {\n 'fal-ai': 'prompt',\n 'replicate': 'prompt',\n 'wavespeed': 'prompt',\n },\n required: true,\n },\n {\n universal: 'strength',\n providers: {\n 'fal-ai': 'strength',\n 'replicate': 'strength',\n 'wavespeed': 'strength',\n },\n },\n {\n universal: 'mask',\n providers: {\n 'fal-ai': 'mask_url',\n 'replicate': 'mask',\n 'wavespeed': 'mask_url',\n },\n },\n {\n universal: 'seed',\n providers: {\n 'fal-ai': 'seed',\n 'replicate': 'seed',\n 'wavespeed': 'seed',\n },\n },\n {\n universal: 'format',\n providers: {\n 'fal-ai': 'output_format',\n 'replicate': 'output_format',\n 'wavespeed': 'output_format',\n },\n },\n {\n universal: 'quality',\n providers: {\n 'fal-ai': 'quality',\n 'replicate': 'output_quality',\n 'wavespeed': 'quality',\n },\n },\n {\n universal: 'safety',\n providers: {\n 'fal-ai': 'enable_safety_checker',\n 'replicate': 'disable_safety_checker',\n 'wavespeed': 'enable_safety_checker',\n },\n transform: 'flip_boolean',\n },\n ],\n output_type: 'image',\n output_extract: {\n 'fal-ai': 'images[].url',\n 'replicate': 'output[]',\n 'wavespeed': 'data.outputs[]',\n },\n default_timeout_ms: 60000,\n}\n","import type { CategoryTemplate } from '../types.js'\n\nexport const textToVideoTemplate: CategoryTemplate = {\n category: 'text-to-video',\n input_mappings: [\n {\n universal: 'prompt',\n providers: {\n 'fal-ai': 'prompt',\n 'replicate': 'prompt',\n 'wavespeed': 'prompt',\n },\n required: true,\n },\n {\n universal: 'negative_prompt',\n providers: {\n 'fal-ai': 'negative_prompt',\n 'replicate': 'negative_prompt',\n 'wavespeed': 'negative_prompt',\n },\n },\n {\n universal: 'count',\n providers: {\n 'fal-ai': 'num_videos',\n 'replicate': 'num_outputs',\n 'wavespeed': 'num_outputs',\n },\n },\n {\n universal: 'size',\n providers: {\n 'fal-ai': 'video_size',\n 'replicate': ['width', 'height'],\n 'wavespeed': 'resolution',\n },\n transform: 'parse_size',\n },\n {\n universal: 'guidance',\n providers: {\n 'fal-ai': 'guidance_scale',\n 'replicate': 'guidance',\n 'wavespeed': 'guidance_scale',\n },\n },\n {\n universal: 'steps',\n providers: {\n 'fal-ai': 'num_inference_steps',\n 'replicate': 'num_inference_steps',\n 'wavespeed': 'num_inference_steps',\n },\n },\n {\n universal: 'seed',\n providers: {\n 'fal-ai': 'seed',\n 'replicate': 'seed',\n 'wavespeed': 'seed',\n },\n },\n {\n universal: 'format',\n providers: {\n 'fal-ai': 'output_format',\n 'replicate': 'output_format',\n 'wavespeed': 'output_format',\n },\n },\n {\n universal: 'safety',\n providers: {\n 'fal-ai': 'enable_safety_checker',\n 'replicate': 'disable_safety_checker',\n 'wavespeed': 'enable_safety_checker',\n },\n transform: 'flip_boolean',\n },\n ],\n output_type: 'video',\n output_extract: {\n 'fal-ai': 'video.url',\n 'replicate': 'output',\n 'wavespeed': 'data.outputs[]',\n },\n default_timeout_ms: 300000,\n}\n","import type { CategoryTemplate } from '../types.js'\n\nexport const imageToVideoTemplate: CategoryTemplate = {\n category: 'image-to-video',\n input_mappings: [\n {\n universal: 'image',\n providers: {\n 'fal-ai': 'image_url',\n 'replicate': 'image',\n 'wavespeed': 'image_url',\n },\n required: true,\n },\n {\n universal: 'prompt',\n providers: {\n 'fal-ai': 'prompt',\n 'replicate': 'prompt',\n 'wavespeed': 'prompt',\n },\n },\n {\n universal: 'negative_prompt',\n providers: {\n 'fal-ai': 'negative_prompt',\n 'replicate': 'negative_prompt',\n 'wavespeed': 'negative_prompt',\n },\n },\n {\n universal: 'seed',\n providers: {\n 'fal-ai': 'seed',\n 'replicate': 'seed',\n 'wavespeed': 'seed',\n },\n },\n {\n universal: 'guidance',\n providers: {\n 'fal-ai': 'guidance_scale',\n 'replicate': 'guidance',\n 'wavespeed': 'guidance_scale',\n },\n },\n {\n universal: 'steps',\n providers: {\n 'fal-ai': 'num_inference_steps',\n 'replicate': 'num_inference_steps',\n 'wavespeed': 'num_inference_steps',\n },\n },\n {\n universal: 'format',\n providers: {\n 'fal-ai': 'output_format',\n 'replicate': 'output_format',\n 'wavespeed': 'output_format',\n },\n },\n {\n universal: 'safety',\n providers: {\n 'fal-ai': 'enable_safety_checker',\n 'replicate': 'disable_safety_checker',\n 'wavespeed': 'enable_safety_checker',\n },\n transform: 'flip_boolean',\n },\n ],\n output_type: 'video',\n output_extract: {\n 'fal-ai': 'video.url',\n 'replicate': 'output',\n 'wavespeed': 'data.outputs[]',\n },\n default_timeout_ms: 300000,\n}\n","import type { CategoryTemplate } from '../types.js'\n\nexport const upscaleImageTemplate: CategoryTemplate = {\n category: 'upscale-image',\n input_mappings: [\n {\n universal: 'image',\n providers: {\n 'fal-ai': 'image_url',\n 'replicate': 'image',\n 'wavespeed': 'image_url',\n },\n required: true,\n },\n {\n universal: 'strength',\n providers: {\n 'fal-ai': 'scale',\n 'replicate': 'scale',\n 'wavespeed': 'scale',\n },\n },\n {\n universal: 'format',\n providers: {\n 'fal-ai': 'output_format',\n 'replicate': 'output_format',\n 'wavespeed': 'output_format',\n },\n },\n {\n universal: 'quality',\n providers: {\n 'fal-ai': 'quality',\n 'replicate': 'output_quality',\n 'wavespeed': 'quality',\n },\n },\n ],\n output_type: 'image',\n output_extract: {\n 'fal-ai': 'images[].url',\n 'replicate': 'output[]',\n 'wavespeed': 'data.outputs[]',\n },\n default_timeout_ms: 120000,\n}\n","import type { CategoryTemplate } from '../types.js'\n\nexport const textToAudioTemplate: CategoryTemplate = {\n category: 'text-to-audio',\n input_mappings: [\n {\n universal: 'prompt',\n providers: {\n 'fal-ai': 'text',\n 'replicate': 'prompt',\n 'wavespeed': 'prompt',\n },\n required: true,\n },\n {\n universal: 'count',\n providers: {\n 'fal-ai': 'num_outputs',\n 'replicate': 'num_outputs',\n 'wavespeed': 'num_outputs',\n },\n },\n {\n universal: 'format',\n providers: {\n 'fal-ai': 'output_format',\n 'replicate': 'output_format',\n 'wavespeed': 'output_format',\n },\n },\n {\n universal: 'seed',\n providers: {\n 'fal-ai': 'seed',\n 'replicate': 'seed',\n 'wavespeed': 'seed',\n },\n },\n ],\n output_type: 'audio',\n output_extract: {\n 'fal-ai': 'audio.url',\n 'replicate': 'output',\n 'wavespeed': 'data.outputs[]',\n },\n default_timeout_ms: 60000,\n}\n","import type { CategoryTemplate } from '../types.js'\n\nexport const audioToTextTemplate: CategoryTemplate = {\n category: 'audio-to-text',\n input_mappings: [\n {\n universal: 'audio',\n providers: {\n 'fal-ai': 'audio_url',\n 'replicate': 'audio',\n 'wavespeed': 'audio_url',\n },\n required: true,\n },\n ],\n output_type: 'text',\n output_extract: {\n 'fal-ai': 'text',\n 'replicate': 'output.text',\n 'wavespeed': 'data.outputs[]',\n },\n default_timeout_ms: 120000,\n}\n","import type { CategoryTemplate } from '../types.js'\n\nexport const removeBackgroundTemplate: CategoryTemplate = {\n category: 'remove-background',\n input_mappings: [\n {\n universal: 'image',\n providers: {\n 'fal-ai': 'image_url',\n 'replicate': 'image',\n 'wavespeed': 'image_url',\n },\n required: true,\n },\n {\n universal: 'format',\n providers: {\n 'fal-ai': 'output_format',\n 'replicate': 'output_format',\n 'wavespeed': 'output_format',\n },\n },\n {\n universal: 'quality',\n providers: {\n 'fal-ai': 'quality',\n 'replicate': 'output_quality',\n 'wavespeed': 'quality',\n },\n },\n ],\n output_type: 'image',\n output_extract: {\n 'fal-ai': 'images[].url',\n 'replicate': 'output[]',\n 'wavespeed': 'data.outputs[]',\n },\n default_timeout_ms: 60000,\n}\n","import type { CategoryTemplate } from '../types.js'\n\nexport const textGenerationTemplate: CategoryTemplate = {\n category: 'text-generation',\n input_mappings: [\n {\n universal: 'prompt',\n providers: {\n openrouter: 'prompt',\n },\n required: true,\n },\n ],\n output_type: 'text',\n output_extract: {\n openrouter: 'choices[0].message.content',\n },\n default_timeout_ms: 120000,\n}\n","import type { CategoryTemplate } from '../types.js'\n\nexport const imageToImageTemplate: CategoryTemplate = {\n category: 'image-to-image',\n input_mappings: [\n {\n universal: 'image',\n providers: {\n 'fal-ai': 'image_url',\n 'replicate': 'image',\n 'wavespeed': 'image',\n },\n required: true,\n },\n {\n universal: 'prompt',\n providers: {\n 'fal-ai': 'prompt',\n 'replicate': 'prompt',\n 'wavespeed': 'prompt',\n },\n },\n {\n universal: 'strength',\n providers: {\n 'fal-ai': 'strength',\n 'replicate': 'prompt_strength',\n 'wavespeed': 'strength',\n },\n },\n {\n universal: 'seed',\n providers: {\n 'fal-ai': 'seed',\n 'replicate': 'seed',\n 'wavespeed': 'seed',\n },\n },\n {\n universal: 'guidance',\n providers: {\n 'fal-ai': 'guidance_scale',\n 'replicate': 'guidance',\n 'wavespeed': 'guidance_scale',\n },\n },\n {\n universal: 'format',\n providers: {\n 'fal-ai': 'output_format',\n 'replicate': 'output_format',\n 'wavespeed': 'output_format',\n },\n },\n {\n universal: 'quality',\n providers: {\n 'fal-ai': 'quality',\n 'replicate': 'output_quality',\n 'wavespeed': 'quality',\n },\n },\n {\n universal: 'safety',\n providers: {\n 'fal-ai': 'enable_safety_checker',\n 'replicate': 'disable_safety_checker',\n 'wavespeed': 'enable_safety_checker',\n },\n transform: 'flip_boolean',\n },\n ],\n output_type: 'image',\n output_extract: {\n 'fal-ai': 'images[].url',\n 'replicate': 'output[]',\n 'wavespeed': 'data.outputs[]',\n },\n default_timeout_ms: 60000,\n}\n","import type { CategoryTemplate } from '../types.js'\n\nexport const textTo3dTemplate: CategoryTemplate = {\n category: 'text-to-3d',\n input_mappings: [\n {\n universal: 'prompt',\n providers: {\n 'fal-ai': 'prompt',\n 'replicate': 'prompt',\n 'wavespeed': 'prompt',\n },\n required: true,\n },\n {\n universal: 'seed',\n providers: {\n 'fal-ai': 'seed',\n 'replicate': 'seed',\n 'wavespeed': 'seed',\n },\n },\n {\n universal: 'format',\n providers: {\n 'fal-ai': 'output_format',\n 'replicate': 'output_format',\n 'wavespeed': 'output_format',\n },\n },\n {\n universal: 'quality',\n providers: {\n 'fal-ai': 'quality',\n 'replicate': 'output_quality',\n 'wavespeed': 'quality',\n },\n },\n ],\n output_type: '3d',\n output_extract: {\n 'fal-ai': 'output.url',\n 'replicate': 'output',\n 'wavespeed': 'data.output',\n },\n default_timeout_ms: 600000,\n}\n","import type { CategoryTemplate } from '../types.js'\n\nexport const imageTo3dTemplate: CategoryTemplate = {\n category: 'image-to-3d',\n input_mappings: [\n {\n universal: 'image',\n providers: {\n 'fal-ai': 'image_url',\n 'replicate': 'image',\n 'wavespeed': 'image',\n },\n required: true,\n },\n {\n universal: 'prompt',\n providers: {\n 'fal-ai': 'prompt',\n 'replicate': 'prompt',\n 'wavespeed': 'prompt',\n },\n },\n {\n universal: 'seed',\n providers: {\n 'fal-ai': 'seed',\n 'replicate': 'seed',\n 'wavespeed': 'seed',\n },\n },\n {\n universal: 'format',\n providers: {\n 'fal-ai': 'output_format',\n 'replicate': 'output_format',\n 'wavespeed': 'output_format',\n },\n },\n ],\n output_type: '3d',\n output_extract: {\n 'fal-ai': 'output.url',\n 'replicate': 'output',\n 'wavespeed': 'data.output',\n },\n default_timeout_ms: 600000,\n}\n","import type { CategoryTemplate } from '../types.js'\n\nexport const upscaleVideoTemplate: CategoryTemplate = {\n category: 'upscale-video',\n input_mappings: [\n {\n universal: 'video',\n providers: {\n 'fal-ai': 'video_url',\n 'replicate': 'video',\n 'wavespeed': 'video',\n },\n required: true,\n },\n {\n universal: 'strength',\n providers: {\n 'fal-ai': 'scale',\n 'replicate': 'scale',\n 'wavespeed': 'scale',\n },\n },\n ],\n output_type: 'video',\n output_extract: {\n 'fal-ai': 'video.url',\n 'replicate': 'output',\n 'wavespeed': 'data.output',\n },\n default_timeout_ms: 600000,\n}\n","import type { CategoryTemplate } from '../types.js'\n\nexport const videoToAudioTemplate: CategoryTemplate = {\n category: 'video-to-audio',\n input_mappings: [\n {\n universal: 'video',\n providers: {\n 'fal-ai': 'video_url',\n 'replicate': 'video',\n 'wavespeed': 'video',\n },\n required: true,\n },\n {\n universal: 'prompt',\n providers: {\n 'fal-ai': 'prompt',\n 'replicate': 'prompt',\n 'wavespeed': 'prompt',\n },\n },\n ],\n output_type: 'audio',\n output_extract: {\n 'fal-ai': 'audio.url',\n 'replicate': 'output',\n 'wavespeed': 'data.output',\n },\n default_timeout_ms: 120000,\n}\n","import type { CategoryTemplate } from '../types.js'\n\nexport const videoToVideoTemplate: CategoryTemplate = {\n category: 'video-to-video',\n input_mappings: [\n {\n universal: 'video',\n providers: {\n 'fal-ai': 'video_url',\n 'replicate': 'video',\n 'wavespeed': 'video',\n },\n required: true,\n },\n {\n universal: 'image',\n providers: {\n 'fal-ai': 'image_url',\n 'replicate': 'character_image',\n 'wavespeed': 'image',\n },\n },\n {\n universal: 'prompt',\n providers: {\n 'fal-ai': 'prompt',\n 'replicate': 'prompt',\n 'wavespeed': 'prompt',\n },\n },\n {\n universal: 'resolution',\n providers: {\n 'fal-ai': 'resolution',\n 'replicate': 'resolution',\n 'wavespeed': 'resolution',\n },\n },\n {\n universal: 'seed',\n providers: {\n 'fal-ai': 'seed',\n 'replicate': 'seed',\n 'wavespeed': 'seed',\n },\n },\n {\n universal: 'guidance',\n providers: {\n 'fal-ai': 'guidance_scale',\n 'replicate': 'guidance_scale',\n 'wavespeed': 'guidance_scale',\n },\n },\n {\n universal: 'steps',\n providers: {\n 'fal-ai': 'num_inference_steps',\n 'replicate': 'num_inference_steps',\n 'wavespeed': 'num_inference_steps',\n },\n },\n {\n universal: 'safety',\n providers: {\n 'fal-ai': 'enable_safety_checker',\n 'replicate': 'enable_safety_checker',\n 'wavespeed': 'enable_safety_checker',\n },\n },\n ],\n output_type: 'video',\n output_extract: {\n 'fal-ai': 'video.url',\n 'replicate': 'output[]',\n 'wavespeed': 'data.outputs[]',\n },\n default_timeout_ms: 300000,\n}\n","import type { CategoryTemplate } from '../types.js'\n\nexport const segmentationTemplate: CategoryTemplate = {\n category: 'segmentation',\n input_mappings: [\n {\n universal: 'image',\n providers: {\n 'fal-ai': 'image_url',\n 'replicate': 'image',\n 'wavespeed': 'image',\n },\n required: true,\n },\n {\n universal: 'prompt',\n providers: {\n 'fal-ai': 'prompt',\n 'replicate': 'prompt',\n 'wavespeed': 'prompt',\n },\n },\n ],\n output_type: 'segmentation',\n output_extract: {\n 'fal-ai': 'output.url',\n 'replicate': 'output',\n 'wavespeed': 'data.output',\n },\n default_timeout_ms: 60000,\n}\n","import type { CategoryTemplate } from '../types.js'\n\nexport const moderationTemplate: CategoryTemplate = {\n category: 'moderation',\n input_mappings: [\n {\n universal: 'prompt',\n providers: {\n 'fal-ai': 'prompt',\n 'replicate': 'prompt',\n 'wavespeed': 'prompt',\n },\n },\n {\n universal: 'image',\n providers: {\n 'fal-ai': 'image_url',\n 'replicate': 'image',\n 'wavespeed': 'image',\n },\n },\n {\n universal: 'video',\n providers: {\n 'fal-ai': 'video_url',\n 'replicate': 'video',\n 'wavespeed': 'video',\n },\n },\n {\n universal: 'audio',\n providers: {\n 'fal-ai': 'audio_url',\n 'replicate': 'audio',\n 'wavespeed': 'audio',\n },\n },\n ],\n output_type: 'text',\n output_extract: {\n 'fal-ai': 'output',\n 'replicate': 'output',\n 'wavespeed': 'data.output',\n },\n default_timeout_ms: 30000,\n}\n","import type { CategoryTemplate } from '../types.js'\n\nexport const trainingTemplate: CategoryTemplate = {\n category: 'training',\n input_mappings: [\n {\n universal: 'image',\n providers: {\n 'fal-ai': 'images_data_url',\n 'replicate': 'input_images',\n 'wavespeed': 'images',\n },\n required: true,\n },\n ],\n output_type: 'text',\n output_extract: {\n 'fal-ai': 'output',\n 'replicate': 'output',\n 'wavespeed': 'data.output',\n },\n default_timeout_ms: 1800000,\n}\n","import type { CategoryTemplate } from '../types.js'\n\nexport const docToTextTemplate: CategoryTemplate = {\n category: 'doc-to-text',\n input_mappings: [\n {\n universal: 'file',\n providers: {\n 'fal-ai': 'file_url',\n 'replicate': 'file',\n 'wavespeed': 'file',\n },\n required: true,\n },\n {\n universal: 'pages',\n providers: {\n 'fal-ai': 'max_pages',\n 'replicate': 'max_pages',\n 'wavespeed': 'max_pages',\n },\n },\n ],\n output_type: 'text',\n output_extract: {\n 'fal-ai': 'text',\n 'replicate': 'output',\n 'wavespeed': 'data.outputs[]',\n 'openrouter': 'choices[0].message.content',\n },\n default_timeout_ms: 120000,\n}\n","import type { CategoryTemplate } from '../types.js'\n\nexport const imageToTextTemplate: CategoryTemplate = {\n category: 'image-to-text',\n input_mappings: [\n {\n universal: 'image',\n providers: {\n 'fal-ai': 'image_url',\n 'replicate': 'image',\n 'wavespeed': 'image',\n },\n required: true,\n },\n {\n universal: 'prompt',\n providers: {\n 'fal-ai': 'prompt',\n 'replicate': 'prompt',\n 'wavespeed': 'prompt',\n },\n },\n ],\n output_type: 'text',\n output_extract: {\n 'fal-ai': 'output',\n 'replicate': 'output',\n 'wavespeed': 'data.outputs[]',\n 'openrouter': 'choices[0].message.content',\n },\n default_timeout_ms: 60000,\n}\n","import type { CategoryTemplate } from '../types.js'\n\nexport const videoToTextTemplate: CategoryTemplate = {\n category: 'video-to-text',\n input_mappings: [\n {\n universal: 'video',\n providers: {\n 'fal-ai': 'video_url',\n 'replicate': 'video',\n 'wavespeed': 'video',\n },\n required: true,\n },\n {\n universal: 'prompt',\n providers: {\n 'fal-ai': 'prompt',\n 'replicate': 'prompt',\n 'wavespeed': 'prompt',\n },\n },\n ],\n output_type: 'text',\n output_extract: {\n 'fal-ai': 'output',\n 'replicate': 'output',\n 'wavespeed': 'data.outputs[]',\n 'openrouter': 'choices[0].message.content',\n },\n default_timeout_ms: 120000,\n}\n","import { textToImageTemplate } from './text-to-image.js'\nimport { imageEditTemplate } from './image-edit.js'\nimport { textToVideoTemplate } from './text-to-video.js'\nimport { imageToVideoTemplate } from './image-to-video.js'\nimport { upscaleImageTemplate } from './upscale-image.js'\nimport { textToAudioTemplate } from './text-to-audio.js'\nimport { audioToTextTemplate } from './audio-to-text.js'\nimport { removeBackgroundTemplate } from './remove-background.js'\nimport { textGenerationTemplate } from './text-generation.js'\nimport { imageToImageTemplate } from './image-to-image.js'\nimport { textTo3dTemplate } from './text-to-3d.js'\nimport { imageTo3dTemplate } from './image-to-3d.js'\nimport { upscaleVideoTemplate } from './upscale-video.js'\nimport { videoToAudioTemplate } from './video-to-audio.js'\nimport { videoToVideoTemplate } from './video-to-video.js'\nimport { segmentationTemplate } from './segmentation.js'\nimport { moderationTemplate } from './moderation.js'\nimport { trainingTemplate } from './training.js'\nimport { docToTextTemplate } from './doc-to-text.js'\nimport { imageToTextTemplate } from './image-to-text.js'\nimport { videoToTextTemplate } from './video-to-text.js'\nimport type { CategoryTemplate, ModelCategory } from '../types.js'\n\nconst templates: Partial<Record<ModelCategory, CategoryTemplate>> = {\n 'text-to-image': textToImageTemplate,\n 'image-edit': imageEditTemplate,\n 'text-to-video': textToVideoTemplate,\n 'image-to-video': imageToVideoTemplate,\n 'upscale-image': upscaleImageTemplate,\n 'text-to-audio': textToAudioTemplate,\n 'audio-to-text': audioToTextTemplate,\n 'remove-background': removeBackgroundTemplate,\n 'text-generation': textGenerationTemplate,\n 'image-to-image': imageToImageTemplate,\n 'text-to-3d': textTo3dTemplate,\n 'image-to-3d': imageTo3dTemplate,\n 'upscale-video': upscaleVideoTemplate,\n 'video-to-audio': videoToAudioTemplate,\n 'video-to-video': videoToVideoTemplate,\n 'segmentation': segmentationTemplate,\n 'moderation': moderationTemplate,\n 'training': trainingTemplate,\n 'doc-to-text': docToTextTemplate,\n 'image-to-text': imageToTextTemplate,\n 'video-to-text': videoToTextTemplate,\n}\n\nexport function getCategoryTemplate(category: ModelCategory): CategoryTemplate | undefined {\n return templates[category]\n}\n\nexport {\n textToImageTemplate,\n imageEditTemplate,\n textToVideoTemplate,\n imageToVideoTemplate,\n upscaleImageTemplate,\n textToAudioTemplate,\n audioToTextTemplate,\n removeBackgroundTemplate,\n textGenerationTemplate,\n imageToImageTemplate,\n textTo3dTemplate,\n imageTo3dTemplate,\n upscaleVideoTemplate,\n videoToAudioTemplate,\n videoToVideoTemplate,\n segmentationTemplate,\n moderationTemplate,\n trainingTemplate,\n docToTextTemplate,\n imageToTextTemplate,\n videoToTextTemplate,\n}\n","import type { ConfigureOptions } from \"./types.js\";\nimport { configureAuth } from \"./auth.js\";\nimport { configureStorage } from \"./storage.js\";\n\nexport function configure(options: ConfigureOptions): void {\n if (options.keys) {\n configureAuth(options.keys);\n }\n if (options.storage) {\n configureStorage(options.storage);\n }\n}\n","import type { ModelEntry, ModelCategory, ProviderName } from \"./types.js\";\nimport { loadRegistry } from \"./resolver.js\";\nimport { resolveModel } from \"./resolver.js\";\nimport { AuthManager } from \"./auth.js\";\n\nexport interface ListModelsFilters {\n category?: ModelCategory;\n provider?: ProviderName;\n query?: string; // search canonical name and aliases\n accessible?: boolean; // if true, only return models the caller has API keys for\n}\n\n/**\n * Lists all models in the registry.\n * Set `accessible: true` to filter to only models the caller has API keys for.\n * Optionally filters by category, provider, or text query.\n */\nexport function listModels(filters?: ListModelsFilters): ModelEntry[] {\n let models = loadRegistry();\n\n if (filters?.accessible) {\n const auth = new AuthManager();\n models = auth.listAvailableModels(models);\n }\n\n if (filters?.category) {\n models = models.filter((m) => m.category === filters.category);\n }\n if (filters?.provider) {\n models = models.filter((m) =>\n m.providers.some((p) => p.provider === filters.provider),\n );\n }\n if (filters?.query) {\n const q = filters.query.toLowerCase();\n models = models.filter(\n (m) =>\n m.canonical_name.includes(q) ||\n m.aliases.some((a) => a.includes(q)),\n );\n }\n\n return models;\n}\n\n/**\n * Resolves a model by name (canonical name, alias, or fuzzy match).\n * Throws ModelNotFoundError if no match is found.\n */\nexport function getModel(name: string): ModelEntry {\n return resolveModel(name);\n}\n"],"mappings":"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","names":["resolve"]}