getaiapi 1.0.0-alpha.0 → 1.0.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/v2/gateway.ts","../../src/v2/registry.ts","../../src/v2/mapper.ts","../../src/v2/discovery.ts"],"sourcesContent":["import { randomUUID } from 'crypto'\nimport { resolveModel } from './registry.js'\nimport { mapInput, mapOutput } from './mapper.js'\nimport { AuthManager } from '../auth.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 { GenerateRequestV2, GenerateResponseV2, ProviderName } from './types.js'\nimport type { ProviderAdapter } from '../types.js'\nimport { ValidationError, ProviderError } from '../errors.js'\nimport { withRetry } from '../retry.js'\nimport { processParamsForUpload } from '../storage.js'\n\nconst adapters: Record<string, ProviderAdapter> = {\n 'fal-ai': falAiAdapter,\n 'replicate': replicateAdapter,\n 'wavespeed': wavespeedAdapter,\n 'openrouter': openRouterAdapter,\n}\n\nconst DEFAULT_TIMEOUT_MS = 120000\n\nexport async function generate(request: GenerateRequestV2): Promise<GenerateResponseV2> {\n const startTime = Date.now()\n\n // 1. Validate\n if (!request.model) throw new ValidationError('model', 'model is required')\n\n // 2. Auth\n const auth = new AuthManager()\n\n // 3. Resolve model\n const model = resolveModel(request.model, auth.availableProviders() as ProviderName[])\n\n // 4. Pick provider\n let availableBindings = model.providers.filter(p =>\n auth.availableProviders().includes(p.provider) && adapters[p.provider],\n )\n\n // If caller requested a specific provider, filter to it\n if (request.provider) {\n availableBindings = availableBindings.filter(p => p.provider === request.provider)\n if (availableBindings.length === 0) {\n throw new ValidationError(\n 'provider',\n `Provider \"${request.provider}\" is not available for model \"${model.canonical_name}\". Available: ${model.providers.map(p => p.provider).join(', ')}`,\n )\n }\n }\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. Map input — uses binding.param_map directly, no template lookup\n const providerParams = mapInput(request, binding)\n\n // 6. 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 as any)\n\n // 8. Submit with retry, then poll\n const timeoutMs = (request.options?.timeout as number | undefined) ?? 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: GenerateResponseV2['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 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 { ModelEntryV2, ProviderName } from './types.js'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = dirname(__filename)\n\nlet registryCache: ModelEntryV2[] | null = null\n\n/**\n * Reads and parses registry/v2/registry.json.\n * Caches the result so the file is only loaded once.\n */\nexport function loadRegistry(): ModelEntryV2[] {\n if (registryCache) return registryCache\n\n let dir = __dirname\n for (let i = 0; i < 5; i++) {\n const candidate = resolve(dir, 'registry', 'v2', 'registry.json')\n try {\n const raw = readFileSync(candidate, 'utf-8')\n registryCache = JSON.parse(raw) as ModelEntryV2[]\n return registryCache\n } catch {\n dir = dirname(dir)\n }\n }\n\n throw new Error(\n 'Could not find registry/v2/registry.json. Searched upward from: ' + __dirname,\n )\n}\n\n/**\n * Normalizes a model name for fuzzy matching.\n */\nexport function normalizeModelName(input: string): string {\n return input\n .toLowerCase()\n .replace(/[^a-z0-9]/g, '')\n .replace(/(?<=\\d)v(?=\\d)/g, '')\n .replace(/v(?=\\d)/g, '')\n}\n\n/**\n * Resolves a user's model name query to a matching ModelEntryV2.\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 with suggestions\n */\nexport function resolveModel(\n query: string,\n availableProviders?: ProviderName[],\n): ModelEntryV2 {\n if (!query || typeof query !== 'string' || query.trim() === '') {\n throw new Error('Model name is required')\n }\n\n const trimmedQuery = query.trim()\n const registry = loadRegistry()\n\n let matched: ModelEntryV2 | undefined\n\n matched = registry.find(e => e.canonical_name === trimmedQuery)\n\n if (!matched) {\n matched = registry.find(e => e.aliases.some(a => a === trimmedQuery))\n }\n\n if (!matched) {\n const normalizedQuery = normalizeModelName(trimmedQuery)\n matched = registry.find(\n e => normalizeModelName(e.canonical_name) === normalizedQuery,\n )\n\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 Error(\n `Model \"${trimmedQuery}\" not found.${suggestions.length > 0 ? ` Did you mean: ${suggestions.join(', ')}?` : ''}`,\n )\n }\n\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 Error(\n `No available provider for \"${matched.canonical_name}\". Model supports: ${matched.providers.map(p => p.provider).join(', ')}`,\n )\n }\n\n return { ...matched, providers: filteredProviders }\n }\n\n return matched\n}\n\nfunction findSuggestions(query: string, registry: ModelEntryV2[]): string[] {\n const normalizedQuery = normalizeModelName(query)\n if (normalizedQuery === '') return []\n\n const matches = registry.filter(e => {\n const normalizedCanonical = normalizeModelName(e.canonical_name)\n if (\n normalizedCanonical.startsWith(normalizedQuery) ||\n normalizedCanonical.includes(normalizedQuery) ||\n normalizedQuery.startsWith(normalizedCanonical)\n ) {\n return true\n }\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]) shared++\n else break\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 GenerateRequestV2,\n ProviderBindingV2,\n OutputMapping,\n OutputItemV2,\n ProviderName,\n} from './types.js'\n\n/**\n * Maps a universal GenerateRequestV2 to provider-specific params\n * using the binding's own param_map. No template lookup needed.\n */\nexport function mapInput(\n request: GenerateRequestV2,\n binding: ProviderBindingV2,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n const provider = binding.provider\n\n for (const [universal, providerKey] of Object.entries(binding.param_map)) {\n const value = (request as unknown as Record<string, unknown>)[universal]\n if (value === undefined || value === null) continue\n\n const transformed = applyTransform(universal, value, 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 * Applies transform based on the universal key name and provider.\n * Transforms are deterministic — no need to store them in the registry.\n */\nfunction applyTransform(\n universal: string,\n value: unknown,\n provider: ProviderName,\n): unknown {\n if (universal === 'safety') {\n // Replicate uses inverted boolean (disable_safety_checker)\n if (provider === 'replicate') return !value\n return value\n }\n\n if (universal === 'size') {\n return parseSizeForProvider(value, provider)\n }\n\n return value\n}\n\n/**\n * Converts a size value to the provider-specific format.\n */\nfunction parseSizeForProvider(value: unknown, provider: ProviderName): unknown {\n if (provider === 'fal-ai' || provider === 'replicate') {\n if (typeof value === 'string') {\n const [w, h] = value.split('x').map(Number)\n return { width: w, height: h }\n }\n return value\n }\n // wavespeed and others: pass through as-is\n return value\n}\n\n/**\n * Maps raw provider response to OutputItemV2[] using the output mapping.\n * Same logic as v1 — output_map was already per-model.\n */\nexport function mapOutput(raw: unknown, outputMapping: OutputMapping): OutputItemV2[] {\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\nfunction genericExtract(\n data: unknown,\n path: string,\n type: OutputMapping['type'],\n contentType: string,\n): OutputItemV2[] {\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 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 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 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 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 { ModelEntryV2, ListModelsFiltersV2 } from './types.js'\nimport { loadRegistry } from './registry.js'\n\n/**\n * Lists models filtered by modality, provider, or text query.\n * Category is derived, not stored — filter by input/output modality instead.\n */\nexport function listModels(filters?: ListModelsFiltersV2): ModelEntryV2[] {\n let models = loadRegistry()\n\n if (filters?.input) {\n models = models.filter(m => m.modality.inputs.includes(filters.input!))\n }\n\n if (filters?.output) {\n models = models.filter(m => m.modality.outputs.includes(filters.output!))\n }\n\n if (filters?.provider) {\n models = models.filter(m =>\n m.providers.some(p => p.provider === filters.provider),\n )\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 * Derives a display category label from modality.\n * e.g., inputs=[\"text\"], outputs=[\"image\"] → \"text-to-image\"\n * e.g., inputs=[\"image\",\"text\"], outputs=[\"video\"] → \"image,text-to-video\"\n */\nexport function deriveCategory(model: ModelEntryV2): string {\n const inputs = model.modality.inputs.join(',')\n const outputs = model.modality.outputs.join(',')\n return `${inputs}-to-${outputs}`\n}\n"],"mappings":"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","names":["resolve"]}
package/registry/.gitkeep DELETED
File without changes