@agentproto/catalog-sync 0.2.0 → 0.4.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/LICENSE +202 -21
- package/dist/bin.mjs +138 -4
- package/dist/bin.mjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.mjs +159 -1
- package/dist/index.mjs.map +1 -1
- package/dist/refresh-workflow.d.ts +83 -0
- package/dist/refresh-workflow.mjs +161 -0
- package/dist/refresh-workflow.mjs.map +1 -0
- package/dist/sources/openai.d.ts +26 -0
- package/dist/sources/openai.mjs +20 -0
- package/dist/sources/openai.mjs.map +1 -0
- package/package.json +13 -3
- package/snapshots/llm-anthropic.json +697 -0
- package/snapshots/llm-groq.json +568 -0
- package/snapshots/llm-moonshot.json +267 -0
- package/snapshots/llm-xai.json +184 -0
package/dist/bin.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/generators/llm-openrouter.ts","../src/generators/serialize-voices.ts","../src/generators/voice-elevenlabs.ts","../src/generators/voice-minimax.ts","../src/generators/image-replicate.ts","../src/runner.ts","../src/bin.ts"],"names":["OUTPUT_PATH","__dirname","files","changed"],"mappings":"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","file":"bin.mjs","sourcesContent":["/**\n * catalog-sync generator contract.\n *\n * FROZEN — a sibling agent builds provider generators against this surface.\n * Do not change field names, shapes, or the `defineGenerator` signature\n * without coordinating. Adding new generators is the expected extension\n * path; editing this file is not.\n */\n\nexport interface CatalogSource {\n id: string\n url: string\n /** HTTP method for the live (`--refresh`) fetch. Default `\"GET\"`. */\n method?: \"GET\" | \"POST\"\n /**\n * Request headers for the live fetch. A value may embed `env:VAR_NAME`\n * tokens, resolved from `process.env` at fetch time (e.g.\n * `{ \"xi-api-key\": \"env:ELEVENLABS_API_KEY\" }` or\n * `{ Authorization: \"Bearer env:MINIMAX_API_KEY\" }`). If any referenced env\n * var is unset, the source is treated as un-refreshable — the committed\n * snapshot is reused rather than fetched without auth. Offline reads\n * (default, no `--refresh`) ignore headers entirely.\n */\n headers?: Record<string, string>\n /** JSON request body for POST sources (e.g. MiniMax `get_voice`). */\n body?: unknown\n}\n\nexport interface GeneratorContext {\n /**\n * Reads the pinned snapshot at `snapshots/<src.id>.json`; if missing and\n * `refresh=true`, fetches `src.url` and writes the snapshot. Returns\n * parsed JSON.\n *\n * Offline by default: when no snapshot exists and `refresh` is false this\n * throws — generators MUST be runnable without network access so CI and\n * tests are deterministic. The only network path is behind `--refresh`.\n */\n fetchSource(src: CatalogSource): Promise<unknown>\n refresh: boolean\n}\n\n/** Repo-relative path → TS source text. */\nexport type GeneratedFiles = Record<string, string>\n\nexport interface CatalogGenerator {\n /** e.g. \"llm:openrouter\" */\n name: string\n modality: \"llm\" | \"image\" | \"video\" | \"audio\" | \"voice\"\n sources: CatalogSource[]\n generate(ctx: GeneratorContext): Promise<GeneratedFiles>\n}\n\n/** Identity helper — lets a generator module declare itself with type inference. */\nexport function defineGenerator(g: CatalogGenerator): CatalogGenerator {\n return g\n}\n","import { z } from \"zod\"\n\nimport { defineGenerator, type GeneratedFiles, type GeneratorContext } from \"../types.js\"\n\n/**\n * PINNED source. The OpenRouter `/api/v1/models` payload lists every route\n * the router exposes with per-token USD pricing. We never fetch it at build\n * or test time — only behind `--refresh`, which writes\n * `snapshots/llm-openrouter.json` so the next offline run is deterministic.\n */\nconst OPENROUTER_MODELS_URL = \"https://openrouter.ai/api/v1/models\"\n\n/** Repo-relative drop-in target for {@link @agentproto/model-catalog}. */\nconst OUTPUT_PATH = \"packages/model-catalog/src/llm/openrouter-routes.generated.ts\"\n\n// ── Source schema ────────────────────────────────────────────────────────\n// OpenRouter prices are STRINGS of USD-per-token (e.g. \"0.000003\" = $3/1M).\n// `input_cache_read` / `input_cache_write` are optional and only present for\n// models that support prompt caching (Anthropic, etc.). These are the REAL\n// OpenRouter field names (verified against the live /v1/models payload) — an\n// earlier draft used `cache_read`/`cache_write`, which never matched, so cache\n// multipliers were silently always absent. passthrough() keeps the other live\n// keys (web_search, image, audio, internal_reasoning, input_cache_write_1h)\n// forward-compatible without a regenerate — we only read what we model.\n\nconst PricingSchema = z\n .object({\n prompt: z.string().optional(),\n completion: z.string().optional(),\n input_cache_read: z.string().optional(),\n input_cache_write: z.string().optional(),\n })\n .passthrough()\n\nconst ModelSchema = z\n .object({\n id: z.string(),\n pricing: PricingSchema.optional(),\n })\n .passthrough()\n\nconst SnapshotSchema = z.object({\n data: z.array(ModelSchema),\n})\n\n// ── Output shape (mirrors model-catalog's LLMPricing) ────────────────────\n// Drop-in for `packages/model-catalog/src/llm/openrouter-routes.generated.ts`.\n// Structurally identical to LLMPricing — inputPer1M / outputPer1M in USD per\n// 1M tokens, plus cacheReadMultiplier / cacheWriteMultiplier WHEN the source\n// carries cache_read / cache_write. The existing committed file omits cache\n// fields; this generator emits them when present (per the P3 spec: \"plus\n// cache fields if the source has them\"). Fields are optional on LLMPricing,\n// so the output remains drop-in compatible.\n\ninterface LLMPricingEntry {\n inputPer1M: number\n outputPer1M: number\n cacheReadMultiplier?: number\n cacheWriteMultiplier?: number\n vendor: string\n provider: \"openrouter\"\n}\n\n// ── Number helpers ──────────────────────────────────────────────────────\n\n/** Round to 6 decimal places, killing binary-float noise from the per-token × 1e6 product. */\nfunction round6(n: number): number {\n return Math.round(n * 1_000_000) / 1_000_000\n}\n\n/** Convert a per-token USD string to USD-per-1M-tokens, or undefined if unpriced. */\nfunction per1m(tokenPrice: string | undefined): number | undefined {\n if (tokenPrice === undefined) return undefined\n const n = Number(tokenPrice)\n if (!Number.isFinite(n)) return undefined\n return round6(n * 1_000_000)\n}\n\n/** Shortest faithful decimal string (matches existing file: 1, 0.5, 0.7448, 1.25). */\nfunction fmt(n: number): string {\n if (!Number.isFinite(n)) return \"0\"\n return `${round6(n)}`\n}\n\n/** Vendor slug = first segment of the OpenRouter route id (`vendor/model`). */\nfunction vendorOf(id: string): string {\n if (!id.includes(\"/\")) return id\n return id.split(\"/\")[0] ?? id\n}\n\n// ── Serialization ────────────────────────────────────────────────────────\n\nfunction serializeEntry(e: LLMPricingEntry): string {\n const fields: string[] = [\n `inputPer1M: ${fmt(e.inputPer1M)}`,\n `outputPer1M: ${fmt(e.outputPer1M)}`,\n ]\n if (e.cacheReadMultiplier !== undefined) {\n fields.push(`cacheReadMultiplier: ${fmt(e.cacheReadMultiplier)}`)\n }\n if (e.cacheWriteMultiplier !== undefined) {\n fields.push(`cacheWriteMultiplier: ${fmt(e.cacheWriteMultiplier)}`)\n }\n fields.push(`vendor: ${JSON.stringify(e.vendor)}`)\n fields.push(`provider: ${JSON.stringify(e.provider)}`)\n return `{\\n ${fields.join(\",\\n \")},\\n }`\n}\n\nfunction serializeFile(entries: Record<string, LLMPricingEntry>): string {\n const ids = Object.keys(entries).sort()\n const providers = Array.from(new Set(ids.map(vendorOf))).sort()\n\n const lines: string[] = [\n \"// AUTO-GENERATED by @agentproto/catalog-sync (llm:openrouter).\",\n \"// Do not edit by hand — re-run `pnpm --filter @agentproto/catalog-sync generate`.\",\n `// Source: ${OPENROUTER_MODELS_URL}`,\n \"// Pricing carries provider USD (inputPer1M / outputPer1M) plus cache\",\n \"// multipliers (cacheReadMultiplier / cacheWriteMultiplier) derived from the\",\n \"// source's input_cache_read / input_cache_write per-token fields when present.\",\n \"\",\n 'import type { LLMPricing } from \"./catalog.js\"',\n \"\",\n \"export const OPENROUTER_ROUTES: Record<string, LLMPricing> = {\",\n ]\n for (const id of ids) {\n lines.push(` ${JSON.stringify(id)}: ${serializeEntry(entries[id]!)},`)\n }\n lines.push(\"}\")\n lines.push(\"\")\n lines.push(\"/** Provider slugs treated as OpenRouter routes by the picker. */\")\n lines.push(\"export const OPENROUTER_PROVIDERS: readonly string[] = [\")\n for (const p of providers) {\n lines.push(` ${JSON.stringify(p)},`)\n }\n lines.push(\"]\")\n lines.push(\"\")\n return lines.join(\"\\n\")\n}\n\n// ── Generator ───────────────────────────────────────────────────────────\n\nasync function generate(ctx: GeneratorContext): Promise<GeneratedFiles> {\n const src = sources[0]\n if (!src) throw new Error(\"llm:openrouter: no source configured\")\n const parsed = SnapshotSchema.parse(await ctx.fetchSource(src))\n\n const entries: Record<string, LLMPricingEntry> = {}\n for (const model of parsed.data) {\n const pricing = model.pricing\n if (!pricing) continue\n const inputPer1M = per1m(pricing.prompt)\n const outputPer1M = per1m(pricing.completion)\n if (inputPer1M === undefined || outputPer1M === undefined) continue\n // Skip unpriced routes (e.g. openrouter/auto, which carries \"0\" pricing).\n if (inputPer1M === 0 && outputPer1M === 0) continue\n\n const entry: LLMPricingEntry = {\n inputPer1M,\n outputPer1M,\n vendor: vendorOf(model.id),\n provider: \"openrouter\",\n }\n\n const cacheReadPer1M = per1m(pricing.input_cache_read)\n const cacheWritePer1M = per1m(pricing.input_cache_write)\n if (cacheReadPer1M !== undefined && cacheReadPer1M > 0 && inputPer1M > 0) {\n entry.cacheReadMultiplier = round6(cacheReadPer1M / inputPer1M)\n }\n if (cacheWritePer1M !== undefined && cacheWritePer1M > 0 && inputPer1M > 0) {\n entry.cacheWriteMultiplier = round6(cacheWritePer1M / inputPer1M)\n }\n\n entries[model.id] = entry\n }\n\n return { [OUTPUT_PATH]: serializeFile(entries) }\n}\n\nconst sources = [{ id: \"llm-openrouter\", url: OPENROUTER_MODELS_URL }]\n\nexport const llmOpenRouterGenerator = defineGenerator({\n name: \"llm:openrouter\",\n modality: \"llm\",\n sources,\n generate,\n})\n","/**\n * Shared CatalogVoice[] → TS-source serializer for the voice generators.\n *\n * The mapping (raw provider JSON → CatalogVoice) lives in\n * `@agentproto/model-catalog/providers` so build time and runtime share it;\n * this module only turns the mapped voices into a committed `*.generated.ts`.\n * Field emit order is fixed (matches the historical generator output) so the\n * generated file stays diff-stable across runs.\n */\n\nimport type { CatalogVoice } from \"@agentproto/model-catalog/schema/voice\"\n\nfunction serializeVoice(v: CatalogVoice): string {\n const lines: string[] = [\" {\"]\n lines.push(` catalogId: ${JSON.stringify(v.catalogId)},`)\n lines.push(` providerVoiceId: ${JSON.stringify(v.providerVoiceId)},`)\n lines.push(` provider: ${JSON.stringify(v.provider)},`)\n lines.push(` label: ${JSON.stringify(v.label)},`)\n lines.push(` description: ${JSON.stringify(v.description)},`)\n lines.push(` gender: ${JSON.stringify(v.gender)},`)\n lines.push(` primaryLanguage: ${JSON.stringify(v.primaryLanguage)},`)\n lines.push(\n ` supportedLanguages: [${v.supportedLanguages.map(l => JSON.stringify(l)).join(\", \")}],`,\n )\n if (v.quality !== undefined) lines.push(` quality: ${JSON.stringify(v.quality)},`)\n if (v.featured !== undefined) lines.push(` featured: ${v.featured},`)\n if (v.samplePath !== undefined) lines.push(` samplePath: ${JSON.stringify(v.samplePath)},`)\n if (v.age !== undefined) lines.push(` age: ${JSON.stringify(v.age)},`)\n lines.push(\" },\")\n return lines.join(\"\\n\")\n}\n\n/**\n * Render a full generated voice module.\n *\n * @param generatorName e.g. `voice:elevenlabs` (goes in the header comment)\n * @param exportName e.g. `ELEVENLABS_VOICES`\n * @param voices mapped voices, in emit order\n */\nexport function serializeVoiceModule(\n generatorName: string,\n exportName: string,\n voices: readonly CatalogVoice[],\n): string {\n const lines: string[] = [\n `// Generated by @agentproto/catalog-sync generator ${generatorName}`,\n \"// DO NOT EDIT MANUALLY — regenerate with catalog-sync\",\n \"\",\n 'import type { CatalogVoice } from \"@agentproto/model-catalog/schema/voice\"',\n \"\",\n `export const ${exportName}: readonly CatalogVoice[] = [`,\n ]\n for (const v of voices) lines.push(serializeVoice(v))\n lines.push(\"] as const\")\n lines.push(\"\")\n return lines.join(\"\\n\")\n}\n","/**\n * voice-elevenlabs generator — reads the ElevenLabs /v1/voices snapshot and\n * emits a CatalogVoice[]-shaped generated TS file.\n *\n * The raw → CatalogVoice mapping lives in\n * `@agentproto/model-catalog/providers` (shared with the runtime\n * live-on-setup path); this generator only fetches, validates, and\n * serializes. Provider-native ids only; no product-specific aliases.\n */\n\nimport {\n ElevenLabsVoicesSnapshotSchema,\n mapElevenLabsVoices,\n} from \"@agentproto/model-catalog/providers\"\n\nimport type {\n CatalogGenerator,\n CatalogSource,\n GeneratedFiles,\n GeneratorContext,\n} from \"../types.js\"\nimport { defineGenerator } from \"../types.js\"\nimport { serializeVoiceModule } from \"./serialize-voices.js\"\n\n// `id` MUST match the snapshot filename stem — the framework's\n// `ctx.fetchSource` resolves `snapshots/<id>.json` (and is the single,\n// dist-safe reader; generators never touch the filesystem themselves).\nexport const ELEVENLABS_SOURCE: CatalogSource = {\n id: \"voice-elevenlabs\",\n url: \"https://api.elevenlabs.io/v1/voices\",\n // Live refresh needs the account key; offline reads ignore this.\n headers: { \"xi-api-key\": \"env:ELEVENLABS_API_KEY\" },\n}\n\nconst OUTPUT_PATH = \"packages/catalog-sync/generated/voice-elevenlabs.generated.ts\"\n\nexport const voiceElevenlabs: CatalogGenerator = defineGenerator({\n name: \"voice:elevenlabs\",\n modality: \"voice\",\n sources: [ELEVENLABS_SOURCE],\n\n async generate(ctx: GeneratorContext): Promise<GeneratedFiles> {\n // Snapshot-first (refresh re-fetches) — both handled by the framework.\n const snapshot = ElevenLabsVoicesSnapshotSchema.parse(\n await ctx.fetchSource(ELEVENLABS_SOURCE),\n )\n const voices = mapElevenLabsVoices(snapshot)\n return {\n [OUTPUT_PATH]: serializeVoiceModule(\n \"voice:elevenlabs\",\n \"ELEVENLABS_VOICES\",\n voices,\n ),\n }\n },\n})\n","/**\n * voice-minimax generator — reads the MiniMax /v1/get_voice snapshot and\n * emits a CatalogVoice[]-shaped generated TS file.\n *\n * The raw → CatalogVoice mapping lives in\n * `@agentproto/model-catalog/providers` (shared with the runtime\n * live-on-setup path); this generator only fetches, validates, and\n * serializes. Provider-native ids only; no product-specific aliases.\n */\n\nimport {\n mapMinimaxVoices,\n MinimaxVoicesSnapshotSchema,\n} from \"@agentproto/model-catalog/providers\"\n\nimport type {\n CatalogGenerator,\n CatalogSource,\n GeneratedFiles,\n GeneratorContext,\n} from \"../types.js\"\nimport { defineGenerator } from \"../types.js\"\nimport { serializeVoiceModule } from \"./serialize-voices.js\"\n\n// `id` MUST match the snapshot filename stem — the framework's\n// `ctx.fetchSource` resolves `snapshots/<id>.json` (single dist-safe reader;\n// generators never touch the filesystem themselves).\nexport const MINIMAX_SOURCE: CatalogSource = {\n id: \"voice-minimax\",\n url: \"https://api.minimax.io/v1/get_voice\",\n // get_voice is a POST; live refresh needs the account key (Bearer). Without\n // MINIMAX_API_KEY set, the framework reuses the committed snapshot.\n method: \"POST\",\n headers: {\n Authorization: \"Bearer env:MINIMAX_API_KEY\",\n \"Content-Type\": \"application/json\",\n },\n body: { voice_type: \"system\" },\n}\n\nconst OUTPUT_PATH = \"packages/catalog-sync/generated/voice-minimax.generated.ts\"\n\nexport const voiceMinimax: CatalogGenerator = defineGenerator({\n name: \"voice:minimax\",\n modality: \"voice\",\n sources: [MINIMAX_SOURCE],\n\n async generate(ctx: GeneratorContext): Promise<GeneratedFiles> {\n // Snapshot-first (refresh re-fetches) — both handled by the framework.\n const snapshot = MinimaxVoicesSnapshotSchema.parse(\n await ctx.fetchSource(MINIMAX_SOURCE),\n )\n const voices = mapMinimaxVoices(snapshot)\n return {\n [OUTPUT_PATH]: serializeVoiceModule(\n \"voice:minimax\",\n \"MINIMAX_VOICES\",\n voices,\n ),\n }\n },\n})\n","/**\n * image-replicate generator — reads a curated Replicate image-models\n * snapshot and emits ImageModelDefinition[]-shaped generated TS entries.\n *\n * Mirrors the shape from packages/model-catalog/src/image/catalog.ts exactly.\n * Provider-native ids only; no product-specific aliases.\n */\n\nimport type {\n CatalogGenerator,\n CatalogSource,\n GeneratedFiles,\n GeneratorContext,\n} from \"../types.js\"\nimport { defineGenerator } from \"../types.js\"\n\n// ── Replicate snapshot shapes ───────────────────────────────────────────\n\ninterface ReplicateOpenApiSchema {\n input: { type: string; properties: Record<string, { type: string; items?: { type: string }; format?: string }> }\n output: { type: string; items?: { type: string; format?: string }; format?: string }\n}\n\ninterface ReplicateLatestVersion {\n id: string\n created_at: string\n openapi_schema: ReplicateOpenApiSchema\n}\n\ninterface ReplicateModel {\n owner: string\n name: string\n description: string\n visibility: string\n run_count: number\n cover_image_url: string | null\n latest_version: ReplicateLatestVersion\n}\n\ninterface ReplicateSnapshot {\n _meta: Record<string, unknown>\n models: ReplicateModel[]\n}\n\n// ── ImageModelDefinition mirror (from packages/model-catalog/src/image/catalog.ts) ──\n\ninterface ImageModelPricing {\n costPerImage: number\n costTier: \"low\" | \"medium\" | \"high\"\n billingUnit: \"per_image\"\n baseCost: number\n creditCost?: number\n overrideCreditCost?: number\n}\n\ninterface ImageModelCapabilities {\n generate: boolean\n edit: boolean\n upscale?: boolean\n}\n\ninterface ImageModelReferenceImages {\n supported: boolean\n fieldName: \"image_input\" | \"input_images\" | \"input_image\" | \"none\"\n maxCount: number\n singular: boolean\n}\n\ninterface ImageModelAspectRatio {\n supported: string[]\n default: string\n}\n\ninterface ImageModelEntry {\n id: string\n name: string\n providerId: string\n provider: string\n capabilities: ImageModelCapabilities\n referenceImages: ImageModelReferenceImages\n aspectRatio: ImageModelAspectRatio\n output: \"string\" | \"array\"\n pricing: ImageModelPricing\n description: string\n agentVisible: boolean\n triggerWord?: string\n}\n\n// ── Pricing (hand-authored, mirrors model-catalog) ──────────────────────\n\ninterface PricingRecord {\n costPerImage: number\n costTier: \"low\" | \"medium\" | \"high\"\n baseCost: number\n creditCost?: number\n overrideCreditCost?: number\n}\n\nconst PRICING: Record<string, PricingRecord> = {\n \"nano-banana-pro\": { costPerImage: 0.15, costTier: \"high\", baseCost: 0.15, creditCost: 10 },\n \"nano-banana-2\": { costPerImage: 0.06, costTier: \"medium\", baseCost: 0.06, creditCost: 5 },\n \"nano-banana\": { costPerImage: 0.04, costTier: \"low\", baseCost: 0.04, creditCost: 5 },\n \"flux-2-dev\": { costPerImage: 0.03, costTier: \"low\", baseCost: 0.03, creditCost: 3 },\n \"flux-kontext-pro\": { costPerImage: 0.04, costTier: \"low\", baseCost: 0.04, creditCost: 5 },\n \"flux-kontext-max\": { costPerImage: 0.08, costTier: \"medium\", baseCost: 0.08, creditCost: 8 },\n \"flux-1.1-pro-ultra\": { costPerImage: 0.06, costTier: \"medium\", baseCost: 0.06, creditCost: 8 },\n \"seedream-4\": { costPerImage: 0.03, costTier: \"low\", baseCost: 0.03, creditCost: 3 },\n \"recraft-v3\": { costPerImage: 0.04, costTier: \"low\", baseCost: 0.04, creditCost: 5 },\n \"image-01\": { costPerImage: 0.02, costTier: \"low\", baseCost: 0.02, creditCost: 2 },\n \"gpt-image-1\": { costPerImage: 0.04, costTier: \"low\", baseCost: 0.04, creditCost: 5 },\n \"ideogram-v3-turbo\": { costPerImage: 0.03, costTier: \"low\", baseCost: 0.03, creditCost: 4 },\n \"flux-1.1-pro\": { costPerImage: 0.04, costTier: \"low\", baseCost: 0.04, creditCost: 5 },\n}\n\n// Models visible to agents (the active generation ones)\nconst AGENT_VISIBLE = new Set([\n \"nano-banana-pro\",\n \"nano-banana-2\",\n \"nano-banana\",\n \"flux-2-dev\",\n \"flux-kontext-pro\",\n \"flux-kontext-max\",\n \"flux-1.1-pro-ultra\",\n \"seedream-4\",\n \"recraft-v3\",\n \"image-01\",\n \"gpt-image-1\",\n \"ideogram-v3-turbo\",\n])\n\nconst ASPECT_RATIOS_DEFAULT: ImageModelAspectRatio = {\n supported: [\"1:1\", \"9:16\", \"16:9\", \"2:3\", \"3:2\", \"3:4\", \"4:3\"],\n default: \"1:1\",\n}\n\nconst ASPECT_RATIOS_WIDE: ImageModelAspectRatio = {\n supported: [\"1:1\", \"9:16\", \"16:9\", \"2:3\", \"3:2\", \"3:4\", \"4:3\", \"4:5\", \"5:4\"],\n default: \"1:1\",\n}\n\nconst ASPECT_RATIOS_ULTRA: ImageModelAspectRatio = {\n supported: [\"1:1\", \"9:16\", \"16:9\", \"21:9\", \"9:21\", \"3:4\", \"4:3\"],\n default: \"1:1\",\n}\n\nconst ASPECT_RATIOS_NBPRO: ImageModelAspectRatio = {\n supported: [\n \"1:1\", \"9:16\", \"16:9\", \"2:3\", \"3:2\", \"3:4\", \"4:3\",\n \"4:5\", \"5:4\", \"21:9\",\n ],\n default: \"match_input_image\",\n}\n\nconst ASPECT_RATIOS_NB2: ImageModelAspectRatio = {\n supported: [\n \"1:1\", \"9:16\", \"16:9\", \"2:3\", \"3:2\", \"3:4\", \"4:3\",\n \"4:5\", \"5:4\",\n ],\n default: \"match_input_image\",\n}\n\nconst ASPECT_RATIOS_SQUARE: ImageModelAspectRatio = {\n supported: [\"1:1\"],\n default: \"1:1\",\n}\n\ninterface ModelSpec {\n id: string\n name: string\n capabilities: ImageModelCapabilities\n referenceImages: ImageModelReferenceImages\n aspectRatio: ImageModelAspectRatio\n output: \"string\" | \"array\"\n triggerWord?: string\n}\n\nconst MODEL_SPECS: Record<string, ModelSpec> = {\n \"nano-banana-pro\": {\n id: \"nano-banana-pro\",\n name: \"Nano Banana Pro\",\n capabilities: { generate: true, edit: true },\n referenceImages: { supported: true, fieldName: \"image_input\", maxCount: 14, singular: false },\n aspectRatio: ASPECT_RATIOS_NBPRO,\n output: \"string\",\n },\n \"nano-banana-2\": {\n id: \"nano-banana-2\",\n name: \"Nano Banana 2\",\n capabilities: { generate: true, edit: true },\n referenceImages: { supported: true, fieldName: \"image_input\", maxCount: 4, singular: false },\n aspectRatio: ASPECT_RATIOS_NB2,\n output: \"string\",\n },\n \"nano-banana\": {\n id: \"nano-banana\",\n name: \"Nano Banana\",\n capabilities: { generate: true, edit: true },\n referenceImages: { supported: true, fieldName: \"image_input\", maxCount: 4, singular: false },\n aspectRatio: ASPECT_RATIOS_DEFAULT,\n output: \"string\",\n },\n \"flux-2-dev\": {\n id: \"flux-2-dev\",\n name: \"Flux 2 Dev\",\n capabilities: { generate: true, edit: true },\n referenceImages: { supported: true, fieldName: \"input_images\", maxCount: 5, singular: false },\n aspectRatio: ASPECT_RATIOS_WIDE,\n output: \"string\",\n },\n \"flux-kontext-pro\": {\n id: \"flux-kontext-pro\",\n name: \"Flux Kontext Pro\",\n capabilities: { generate: true, edit: true },\n referenceImages: { supported: true, fieldName: \"input_image\", maxCount: 1, singular: true },\n aspectRatio: ASPECT_RATIOS_DEFAULT,\n output: \"string\",\n },\n \"flux-kontext-max\": {\n id: \"flux-kontext-max\",\n name: \"Flux Kontext Max\",\n capabilities: { generate: true, edit: true },\n referenceImages: { supported: true, fieldName: \"input_image\", maxCount: 1, singular: true },\n aspectRatio: ASPECT_RATIOS_DEFAULT,\n output: \"string\",\n },\n \"flux-1.1-pro-ultra\": {\n id: \"flux-1.1-pro-ultra\",\n name: \"Flux 1.1 Pro Ultra\",\n capabilities: { generate: true, edit: false },\n referenceImages: { supported: false, fieldName: \"none\", maxCount: 0, singular: false },\n aspectRatio: ASPECT_RATIOS_ULTRA,\n output: \"string\",\n },\n \"seedream-4\": {\n id: \"seedream-4\",\n name: \"SeedReam 4\",\n capabilities: { generate: true, edit: true },\n referenceImages: { supported: true, fieldName: \"image_input\", maxCount: 10, singular: false },\n aspectRatio: ASPECT_RATIOS_DEFAULT,\n output: \"string\",\n },\n \"recraft-v3\": {\n id: \"recraft\",\n name: \"Recraft V3\",\n capabilities: { generate: true, edit: false },\n referenceImages: { supported: false, fieldName: \"none\", maxCount: 0, singular: false },\n aspectRatio: ASPECT_RATIOS_SQUARE,\n output: \"string\",\n },\n \"image-01\": {\n id: \"minimax\",\n name: \"MiniMax Image\",\n capabilities: { generate: true, edit: false },\n referenceImages: { supported: false, fieldName: \"none\", maxCount: 0, singular: false },\n aspectRatio: { supported: [\"1:1\", \"9:16\", \"16:9\", \"3:4\", \"4:3\"], default: \"1:1\" },\n output: \"array\",\n },\n \"gpt-image-1\": {\n id: \"gpt-image-1\",\n name: \"OpenAI GPT Image 1\",\n capabilities: { generate: true, edit: true },\n referenceImages: { supported: true, fieldName: \"input_image\", maxCount: 1, singular: true },\n aspectRatio: { supported: [\"1:1\", \"2:3\", \"3:2\"], default: \"1:1\" },\n output: \"string\",\n },\n \"ideogram-v3-turbo\": {\n id: \"ideogram-v3\",\n name: \"Ideogram v3\",\n capabilities: { generate: true, edit: false },\n referenceImages: { supported: false, fieldName: \"none\", maxCount: 0, singular: false },\n aspectRatio: { supported: [\"1:1\", \"9:16\", \"16:9\", \"2:3\", \"3:2\"], default: \"1:1\" },\n output: \"string\",\n },\n \"flux-1.1-pro\": {\n id: \"flux\",\n name: \"Flux 1.1 Pro\",\n capabilities: { generate: true, edit: false },\n referenceImages: { supported: false, fieldName: \"none\", maxCount: 0, singular: false },\n aspectRatio: { supported: [\"1:1\", \"9:16\", \"16:9\"], default: \"1:1\" },\n output: \"string\",\n },\n}\n\nfunction mapModel(raw: ReplicateModel): ImageModelEntry {\n const providerId = `${raw.owner}/${raw.name}`\n const spec = MODEL_SPECS[raw.name] ?? {\n id: raw.name,\n name: raw.name,\n capabilities: { generate: true, edit: false },\n referenceImages: { supported: false, fieldName: \"none\" as const, maxCount: 0, singular: false },\n aspectRatio: ASPECT_RATIOS_DEFAULT,\n output: \"string\" as const,\n }\n\n const pricing = PRICING[raw.name] ?? {\n costPerImage: 0.03,\n costTier: \"low\" as const,\n baseCost: 0.03,\n creditCost: 3,\n }\n\n return {\n id: spec.id,\n name: spec.name,\n providerId,\n provider: raw.owner === \"openai\" ? \"openai\" : raw.owner === \"minimax\" ? \"minimax\" : \"replicate\",\n capabilities: spec.capabilities,\n referenceImages: spec.referenceImages,\n aspectRatio: spec.aspectRatio,\n output: spec.output,\n pricing: {\n costPerImage: pricing.costPerImage,\n costTier: pricing.costTier,\n billingUnit: \"per_image\" as const,\n baseCost: pricing.baseCost,\n ...(pricing.creditCost !== undefined ? { creditCost: pricing.creditCost } : {}),\n ...(pricing.overrideCreditCost !== undefined ? { overrideCreditCost: pricing.overrideCreditCost } : {}),\n },\n description: raw.description,\n agentVisible: AGENT_VISIBLE.has(raw.name),\n ...(spec.triggerWord ? { triggerWord: spec.triggerWord } : {}),\n }\n}\n\n// ── Generator ────────────────────────────────────────────────────────────\n\n// `id` MUST match the snapshot filename stem — the framework's\n// `ctx.fetchSource` resolves `snapshots/<id>.json` (single dist-safe reader;\n// generators never touch the filesystem themselves).\nexport const REPLICATE_SOURCE: CatalogSource = {\n id: \"image-replicate\",\n url: \"https://api.replicate.com/v1/models?query=image+generation\",\n}\n\nexport const imageReplicate: CatalogGenerator = defineGenerator({\n name: \"image:replicate\",\n modality: \"image\",\n sources: [REPLICATE_SOURCE],\n\n async generate(ctx: GeneratorContext): Promise<GeneratedFiles> {\n // Snapshot-first (refresh re-fetches) — both handled by the framework.\n const data = (await ctx.fetchSource(REPLICATE_SOURCE)) as ReplicateSnapshot\n\n const entries = data.models.map(mapModel)\n\n const lines: string[] = [\n \"// Generated by @agentproto/catalog-sync generator image:replicate\",\n \"// DO NOT EDIT MANUALLY — regenerate with catalog-sync\",\n \"\",\n \"import type { ImageModelDefinition } from \\\"@agentproto/model-catalog/image\\\"\",\n \"\",\n \"export const REPLICATE_IMAGE_MODELS: Record<string, ImageModelDefinition> = {\",\n ]\n\n for (const e of entries) {\n const trigger = e.triggerWord ? `,\\n triggerWord: ${JSON.stringify(e.triggerWord)}` : \"\"\n const creditCost = e.pricing.creditCost !== undefined\n ? `,\\n creditCost: ${e.pricing.creditCost}`\n : \"\"\n const override = e.pricing.overrideCreditCost !== undefined\n ? `,\\n overrideCreditCost: ${e.pricing.overrideCreditCost}`\n : \"\"\n\n lines.push(` ${JSON.stringify(e.id)}: {`)\n lines.push(` id: ${JSON.stringify(e.id)},`)\n lines.push(` name: ${JSON.stringify(e.name)},`)\n lines.push(` providerId: ${JSON.stringify(e.providerId)},`)\n lines.push(` provider: ${JSON.stringify(e.provider)},`)\n lines.push(` capabilities: { generate: ${e.capabilities.generate}, edit: ${e.capabilities.edit}${e.capabilities.upscale ? `, upscale: ${e.capabilities.upscale}` : \"\"} },`)\n lines.push(` referenceImages: {`)\n lines.push(` supported: ${e.referenceImages.supported},`)\n lines.push(` fieldName: ${JSON.stringify(e.referenceImages.fieldName)},`)\n lines.push(` maxCount: ${e.referenceImages.maxCount},`)\n lines.push(` singular: ${e.referenceImages.singular},`)\n lines.push(` },`)\n lines.push(` aspectRatio: {`)\n lines.push(` supported: [${e.aspectRatio.supported.map(a => JSON.stringify(a)).join(\", \")}],`)\n lines.push(` default: ${JSON.stringify(e.aspectRatio.default)},`)\n lines.push(` },`)\n lines.push(` output: ${JSON.stringify(e.output)},`)\n lines.push(` pricing: {`)\n lines.push(` costPerImage: ${e.pricing.costPerImage},`)\n lines.push(` costTier: ${JSON.stringify(e.pricing.costTier)},`)\n lines.push(` billingUnit: ${JSON.stringify(e.pricing.billingUnit)},`)\n lines.push(` baseCost: ${e.pricing.baseCost},${creditCost}${override}`)\n lines.push(` },`)\n lines.push(` description: ${JSON.stringify(e.description)},`)\n lines.push(` agentVisible: ${e.agentVisible},${trigger}`)\n lines.push(` },`)\n }\n\n lines.push(\"}\")\n lines.push(\"\")\n\n const outputPath = \"packages/catalog-sync/generated/image-replicate.generated.ts\"\n return { [outputPath]: lines.join(\"\\n\") }\n },\n})\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\"\nimport { dirname, join, resolve } from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\n\nimport type {\n CatalogGenerator,\n CatalogSource,\n GeneratedFiles,\n GeneratorContext,\n} from \"./types.js\"\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\n\n/**\n * The catalog-sync package directory. Resolves the same way whether the\n * module is loaded from `src/` (vitest, type-checking) or `dist/` (built) —\n * both sit one level below the package root, so walking up one directory\n * from this file lands on `packages/catalog-sync/`.\n */\nfunction catalogSyncDir(): string {\n return resolve(__dirname, \"..\")\n}\n\n/** Absolute path to a committed/pinned source snapshot. */\nfunction snapshotPath(id: string): string {\n return join(catalogSyncDir(), \"snapshots\", `${id}.json`)\n}\n\n/**\n * The monorepo root. Resolved by walking up from the catalog-sync package\n * until `pnpm-workspace.yaml` is found. Generated-file paths in\n * {@link GeneratedFiles} are repo-relative and are resolved against this.\n */\nfunction repoRoot(): string {\n let dir = catalogSyncDir()\n for (let i = 0; i < 12; i++) {\n if (existsSync(join(dir, \"pnpm-workspace.yaml\"))) return dir\n const parent = dirname(dir)\n if (parent === dir) break\n dir = parent\n }\n // Fallback: catalog-sync lives at <root>/packages/catalog-sync.\n return dirname(dirname(catalogSyncDir()))\n}\n\n/** Reads an existing file as UTF-8, or returns undefined when absent. */\nfunction readIfExists(absPath: string): string | undefined {\n if (!existsSync(absPath)) return undefined\n return readFileSync(absPath, \"utf8\")\n}\n\n/**\n * Resolve `env:VAR_NAME` tokens inside header values from `process.env`.\n * Returns the materialized headers plus the names of any referenced env vars\n * that are unset — the caller uses `missing` to decide whether the source can\n * be refreshed (we never fetch an authed endpoint without its key).\n */\nfunction resolveHeaders(headers?: Record<string, string>): {\n headers: Record<string, string>\n missing: string[]\n} {\n const out: Record<string, string> = {}\n const missing: string[] = []\n if (!headers) return { headers: out, missing }\n for (const [key, value] of Object.entries(headers)) {\n out[key] = value.replace(/env:([A-Z0-9_]+)/g, (_match, name: string) => {\n const v = process.env[name]\n if (v === undefined || v === \"\") {\n missing.push(name)\n return \"\"\n }\n return v\n })\n }\n return { headers: out, missing }\n}\n\nexport interface RunGeneratorsOptions {\n /** When true, missing snapshots are fetched from their pinned `url`. */\n refresh: boolean\n /** When true, generated files are written to disk at their repo-relative path. */\n write: boolean\n}\n\nexport interface RunGeneratorsResult {\n files: GeneratedFiles\n /** Repo-relative paths whose generated content differs from what is on disk. */\n changed: string[]\n}\n\n/**\n * Runs each generator, gathering its emitted files, then (optionally) writes\n * them. `changed` is ALWAYS computed — it is the diff of generated content\n * vs disk — so `--check` (write=false) can surface drift without mutating\n * anything. Writes only happen when `write=true` AND a path differs.\n */\nexport async function runGenerators(\n gens: CatalogGenerator[],\n opts: RunGeneratorsOptions\n): Promise<RunGeneratorsResult> {\n const files: GeneratedFiles = {}\n\n for (const gen of gens) {\n const ctx: GeneratorContext = {\n refresh: opts.refresh,\n async fetchSource(src: CatalogSource): Promise<unknown> {\n const path = snapshotPath(src.id)\n const existing = readIfExists(path)\n\n // Offline path (default): reuse the committed snapshot; error if none.\n if (!opts.refresh) {\n if (existing !== undefined) return JSON.parse(existing)\n throw new Error(\n `catalog-sync: no committed snapshot for source \"${src.id}\" ` +\n `(${path}), and --refresh is not set. Run ` +\n `\\`catalog-sync generate --refresh\\` to fetch ${src.url}.`\n )\n }\n\n // --refresh: force a live re-fetch (do NOT short-circuit on an existing\n // snapshot — refreshing is the whole point). Auth headers may embed\n // `env:VAR` tokens; if a referenced var is unset we can't authenticate,\n // so reuse the committed snapshot rather than fetch unauthenticated.\n const { headers, missing } = resolveHeaders(src.headers)\n if (missing.length > 0) {\n if (existing !== undefined) {\n process.stderr.write(\n `catalog-sync: skipping refresh of \"${src.id}\" — missing env ` +\n `${missing.join(\", \")}; reusing committed snapshot.\\n`\n )\n return JSON.parse(existing)\n }\n throw new Error(\n `catalog-sync: cannot refresh \"${src.id}\" — missing env ` +\n `${missing.join(\", \")} and no committed snapshot.`\n )\n }\n const res = await fetch(src.url, {\n method: src.method ?? \"GET\",\n headers,\n ...(src.body !== undefined\n ? { body: JSON.stringify(src.body) }\n : {}),\n })\n if (!res.ok) {\n throw new Error(\n `catalog-sync: fetch ${src.url} failed: ${res.status} ${res.statusText}`\n )\n }\n const text = await res.text()\n const parsed: unknown = JSON.parse(text)\n mkdirSync(dirname(path), { recursive: true })\n writeFileSync(path, `${JSON.stringify(parsed, null, 2)}\\n`, \"utf8\")\n return parsed\n },\n }\n\n const out = await gen.generate(ctx)\n for (const [path, content] of Object.entries(out)) {\n files[path] = content\n }\n }\n\n const root = repoRoot()\n const changed: string[] = []\n for (const [relPath, content] of Object.entries(files)) {\n const abs = join(root, relPath)\n const existing = readIfExists(abs)\n if (existing !== content) {\n changed.push(relPath)\n if (opts.write) {\n mkdirSync(dirname(abs), { recursive: true })\n writeFileSync(abs, content, \"utf8\")\n }\n }\n }\n\n return { files, changed }\n}\n","#!/usr/bin/env node\n\n/**\n * catalog-sync CLI.\n *\n * catalog-sync generate [--refresh] [--check]\n *\n * - `generate` (default) — generate from pinned snapshots, write changed files.\n * - `--refresh` — re-fetch each source's pinned URL into snapshots/.\n * - `--check` — generate in memory, diff vs committed files; exit 1\n * on drift. This is what CI runs. Never writes.\n */\n\nimport { llmOpenRouterGenerator } from \"./generators/llm-openrouter.js\"\nimport { voiceElevenlabs } from \"./generators/voice-elevenlabs.js\"\nimport { voiceMinimax } from \"./generators/voice-minimax.js\"\nimport { imageReplicate } from \"./generators/image-replicate.js\"\nimport { runGenerators } from \"./runner.js\"\n\nconst args = process.argv.slice(2)\nconst command = args[0] ?? \"\"\nconst flags = new Set(args.slice(1))\n\nconst KNOWN_FLAGS = new Set([\"--refresh\", \"--check\"])\nconst unknownFlags = [...flags].filter((f) => !KNOWN_FLAGS.has(f))\n\nif (command !== \"generate\" || unknownFlags.length > 0) {\n if (command !== \"generate\") {\n process.stderr.write(\n `catalog-sync: unknown command \"${command}\". Usage: catalog-sync generate [--refresh] [--check]\\n`\n )\n }\n if (unknownFlags.length > 0) {\n process.stderr.write(`catalog-sync: unknown flag(s) ${unknownFlags.join(\", \")}\\n`)\n }\n process.exit(2)\n}\n\nconst refresh = flags.has(\"--refresh\")\nconst check = flags.has(\"--check\")\nconst generators = [\n llmOpenRouterGenerator,\n voiceElevenlabs,\n voiceMinimax,\n imageReplicate,\n]\n\nconst { changed, files } = await runGenerators(generators, {\n refresh,\n write: !check,\n})\n\nif (check) {\n if (changed.length > 0) {\n process.stderr.write(\n `catalog-sync: drift detected — ${changed.length} file(s) differ from committed:\\n`\n )\n for (const p of changed) process.stderr.write(` ${p}\\n`)\n process.stderr.write(`Re-run \\`catalog-sync generate\\` to update.\\n`)\n process.exit(1)\n }\n process.stdout.write(\n `catalog-sync: no drift (${generators.length} generator(s), ${Object.keys(files).length} file(s) up to date).\\n`\n )\n process.exit(0)\n}\n\nif (changed.length > 0) {\n process.stdout.write(`catalog-sync: wrote ${changed.length} file(s):\\n`)\n for (const p of changed) process.stdout.write(` ${p}\\n`)\n} else {\n process.stdout.write(`catalog-sync: no changes.\\n`)\n}\nprocess.exit(0)\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/generators/llm-openrouter.ts","../src/generators/llm-context-windows.ts","../src/generators/serialize-voices.ts","../src/generators/voice-elevenlabs.ts","../src/generators/voice-minimax.ts","../src/generators/image-replicate.ts","../src/runner.ts","../src/bin.ts"],"names":["OUTPUT_PATH","z","serializeEntry","serializeFile","generate","sources","__dirname","files","changed"],"mappings":"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","file":"bin.mjs","sourcesContent":["/**\n * catalog-sync generator contract.\n *\n * FROZEN — a sibling agent builds provider generators against this surface.\n * Do not change field names, shapes, or the `defineGenerator` signature\n * without coordinating. Adding new generators is the expected extension\n * path; editing this file is not.\n */\n\nexport interface CatalogSource {\n id: string\n url: string\n /** HTTP method for the live (`--refresh`) fetch. Default `\"GET\"`. */\n method?: \"GET\" | \"POST\"\n /**\n * Request headers for the live fetch. A value may embed `env:VAR_NAME`\n * tokens, resolved from `process.env` at fetch time (e.g.\n * `{ \"xi-api-key\": \"env:ELEVENLABS_API_KEY\" }` or\n * `{ Authorization: \"Bearer env:MINIMAX_API_KEY\" }`). If any referenced env\n * var is unset, the source is treated as un-refreshable — the committed\n * snapshot is reused rather than fetched without auth. Offline reads\n * (default, no `--refresh`) ignore headers entirely.\n */\n headers?: Record<string, string>\n /** JSON request body for POST sources (e.g. MiniMax `get_voice`). */\n body?: unknown\n}\n\nexport interface GeneratorContext {\n /**\n * Reads the pinned snapshot at `snapshots/<src.id>.json`; if missing and\n * `refresh=true`, fetches `src.url` and writes the snapshot. Returns\n * parsed JSON.\n *\n * Offline by default: when no snapshot exists and `refresh` is false this\n * throws — generators MUST be runnable without network access so CI and\n * tests are deterministic. The only network path is behind `--refresh`.\n */\n fetchSource(src: CatalogSource): Promise<unknown>\n refresh: boolean\n}\n\n/** Repo-relative path → TS source text. */\nexport type GeneratedFiles = Record<string, string>\n\nexport interface CatalogGenerator {\n /** e.g. \"llm:openrouter\" */\n name: string\n modality: \"llm\" | \"image\" | \"video\" | \"audio\" | \"voice\"\n sources: CatalogSource[]\n generate(ctx: GeneratorContext): Promise<GeneratedFiles>\n}\n\n/** Identity helper — lets a generator module declare itself with type inference. */\nexport function defineGenerator(g: CatalogGenerator): CatalogGenerator {\n return g\n}\n","import { z } from \"zod\"\n\nimport { defineGenerator, type GeneratedFiles, type GeneratorContext } from \"../types.js\"\n\n/**\n * PINNED source. The OpenRouter `/api/v1/models` payload lists every route\n * the router exposes with per-token USD pricing. We never fetch it at build\n * or test time — only behind `--refresh`, which writes\n * `snapshots/llm-openrouter.json` so the next offline run is deterministic.\n */\nconst OPENROUTER_MODELS_URL = \"https://openrouter.ai/api/v1/models\"\n\n/** Repo-relative drop-in target for {@link @agentproto/model-catalog}. */\nconst OUTPUT_PATH = \"packages/model-catalog/src/llm/openrouter-routes.generated.ts\"\n\n// ── Source schema ────────────────────────────────────────────────────────\n// OpenRouter prices are STRINGS of USD-per-token (e.g. \"0.000003\" = $3/1M).\n// `input_cache_read` / `input_cache_write` are optional and only present for\n// models that support prompt caching (Anthropic, etc.). These are the REAL\n// OpenRouter field names (verified against the live /v1/models payload) — an\n// earlier draft used `cache_read`/`cache_write`, which never matched, so cache\n// multipliers were silently always absent. passthrough() keeps the other live\n// keys (web_search, image, audio, internal_reasoning, input_cache_write_1h)\n// forward-compatible without a regenerate — we only read what we model.\n\nconst PricingSchema = z\n .object({\n prompt: z.string().optional(),\n completion: z.string().optional(),\n input_cache_read: z.string().optional(),\n input_cache_write: z.string().optional(),\n })\n .passthrough()\n\nconst ModelSchema = z\n .object({\n id: z.string(),\n pricing: PricingSchema.optional(),\n })\n .passthrough()\n\nconst SnapshotSchema = z.object({\n data: z.array(ModelSchema),\n})\n\n// ── Output shape (mirrors model-catalog's LLMPricing) ────────────────────\n// Drop-in for `packages/model-catalog/src/llm/openrouter-routes.generated.ts`.\n// Structurally identical to LLMPricing — inputPer1M / outputPer1M in USD per\n// 1M tokens, plus cacheReadMultiplier / cacheWriteMultiplier WHEN the source\n// carries cache_read / cache_write. The existing committed file omits cache\n// fields; this generator emits them when present (per the P3 spec: \"plus\n// cache fields if the source has them\"). Fields are optional on LLMPricing,\n// so the output remains drop-in compatible.\n\ninterface LLMPricingEntry {\n inputPer1M: number\n outputPer1M: number\n cacheReadMultiplier?: number\n cacheWriteMultiplier?: number\n vendor: string\n provider: \"openrouter\"\n}\n\n// ── Number helpers ──────────────────────────────────────────────────────\n\n/** Round to 6 decimal places, killing binary-float noise from the per-token × 1e6 product. */\nfunction round6(n: number): number {\n return Math.round(n * 1_000_000) / 1_000_000\n}\n\n/** Convert a per-token USD string to USD-per-1M-tokens, or undefined if unpriced. */\nfunction per1m(tokenPrice: string | undefined): number | undefined {\n if (tokenPrice === undefined) return undefined\n const n = Number(tokenPrice)\n if (!Number.isFinite(n)) return undefined\n return round6(n * 1_000_000)\n}\n\n/** Shortest faithful decimal string (matches existing file: 1, 0.5, 0.7448, 1.25). */\nfunction fmt(n: number): string {\n if (!Number.isFinite(n)) return \"0\"\n return `${round6(n)}`\n}\n\n/** Vendor slug = first segment of the OpenRouter route id (`vendor/model`). */\nfunction vendorOf(id: string): string {\n if (!id.includes(\"/\")) return id\n return id.split(\"/\")[0] ?? id\n}\n\n// ── Serialization ────────────────────────────────────────────────────────\n\nfunction serializeEntry(e: LLMPricingEntry): string {\n const fields: string[] = [\n `inputPer1M: ${fmt(e.inputPer1M)}`,\n `outputPer1M: ${fmt(e.outputPer1M)}`,\n ]\n if (e.cacheReadMultiplier !== undefined) {\n fields.push(`cacheReadMultiplier: ${fmt(e.cacheReadMultiplier)}`)\n }\n if (e.cacheWriteMultiplier !== undefined) {\n fields.push(`cacheWriteMultiplier: ${fmt(e.cacheWriteMultiplier)}`)\n }\n fields.push(`vendor: ${JSON.stringify(e.vendor)}`)\n fields.push(`provider: ${JSON.stringify(e.provider)}`)\n return `{\\n ${fields.join(\",\\n \")},\\n }`\n}\n\nfunction serializeFile(entries: Record<string, LLMPricingEntry>): string {\n const ids = Object.keys(entries).sort()\n const providers = Array.from(new Set(ids.map(vendorOf))).sort()\n\n const lines: string[] = [\n \"// AUTO-GENERATED by @agentproto/catalog-sync (llm:openrouter).\",\n \"// Do not edit by hand — re-run `pnpm --filter @agentproto/catalog-sync generate`.\",\n `// Source: ${OPENROUTER_MODELS_URL}`,\n \"// Pricing carries provider USD (inputPer1M / outputPer1M) plus cache\",\n \"// multipliers (cacheReadMultiplier / cacheWriteMultiplier) derived from the\",\n \"// source's input_cache_read / input_cache_write per-token fields when present.\",\n \"\",\n 'import type { LLMPricing } from \"./catalog.js\"',\n \"\",\n \"export const OPENROUTER_ROUTES: Record<string, LLMPricing> = {\",\n ]\n for (const id of ids) {\n lines.push(` ${JSON.stringify(id)}: ${serializeEntry(entries[id]!)},`)\n }\n lines.push(\"}\")\n lines.push(\"\")\n lines.push(\"/** Provider slugs treated as OpenRouter routes by the picker. */\")\n lines.push(\"export const OPENROUTER_PROVIDERS: readonly string[] = [\")\n for (const p of providers) {\n lines.push(` ${JSON.stringify(p)},`)\n }\n lines.push(\"]\")\n lines.push(\"\")\n return lines.join(\"\\n\")\n}\n\n// ── Generator ───────────────────────────────────────────────────────────\n\nasync function generate(ctx: GeneratorContext): Promise<GeneratedFiles> {\n const src = sources[0]\n if (!src) throw new Error(\"llm:openrouter: no source configured\")\n const parsed = SnapshotSchema.parse(await ctx.fetchSource(src))\n\n const entries: Record<string, LLMPricingEntry> = {}\n for (const model of parsed.data) {\n const pricing = model.pricing\n if (!pricing) continue\n const inputPer1M = per1m(pricing.prompt)\n const outputPer1M = per1m(pricing.completion)\n if (inputPer1M === undefined || outputPer1M === undefined) continue\n // Skip unpriced routes (e.g. openrouter/auto, which carries \"0\" pricing).\n if (inputPer1M === 0 && outputPer1M === 0) continue\n\n const entry: LLMPricingEntry = {\n inputPer1M,\n outputPer1M,\n vendor: vendorOf(model.id),\n provider: \"openrouter\",\n }\n\n const cacheReadPer1M = per1m(pricing.input_cache_read)\n const cacheWritePer1M = per1m(pricing.input_cache_write)\n if (cacheReadPer1M !== undefined && cacheReadPer1M > 0 && inputPer1M > 0) {\n entry.cacheReadMultiplier = round6(cacheReadPer1M / inputPer1M)\n }\n if (cacheWritePer1M !== undefined && cacheWritePer1M > 0 && inputPer1M > 0) {\n entry.cacheWriteMultiplier = round6(cacheWritePer1M / inputPer1M)\n }\n\n entries[model.id] = entry\n }\n\n return { [OUTPUT_PATH]: serializeFile(entries) }\n}\n\nconst sources = [{ id: \"llm-openrouter\", url: OPENROUTER_MODELS_URL }]\n\nexport const llmOpenRouterGenerator = defineGenerator({\n name: \"llm:openrouter\",\n modality: \"llm\",\n sources,\n generate,\n})\n","import { z } from \"zod\"\n\nimport { defineGenerator, type CatalogSource, type GeneratedFiles, type GeneratorContext } from \"../types.js\"\n\n/**\n * Context window (max input tokens) + max output tokens, live per model id,\n * for the four providers that publish a machine-readable models-list with\n * this data: Anthropic, Groq, xAI, Moonshot. This is NOT pricing — Anthropic's\n * `/v1/models` carries no price at all, and Groq/xAI pricing units need\n * separate verification before they're trusted for billing; see\n * `LLM_PRICING_CATALOG` / `OPENROUTER_ROUTES` in `catalog.ts` for that.\n *\n * ZAI/Zhipu and OpenAI are deliberately excluded: ZAI's `/v4/models` list\n * returns bare `{id, owned_by, created}` with no context field, and OpenAI\n * has no stable models-list endpoint at all (see `sources/openai.ts`) — both\n * stay hand-maintained until (if ever) they publish one.\n */\n\n/** Repo-relative drop-in target for {@link @agentproto/model-catalog}. */\nconst OUTPUT_PATH = \"packages/model-catalog/src/llm/context-windows.generated.ts\"\n\n// ── Output shape (mirrors ContextWindowEntry in model-catalog's catalog.ts) ──\n\ninterface ContextWindowEntry {\n contextWindow: number\n maxOutput?: number\n displayName?: string\n provider: \"anthropic\" | \"groq\" | \"xai\" | \"moonshot\"\n}\n\n// ── Source schemas ───────────────────────────────────────────────────────\n// Each provider's models-list shape, verified against the live payload\n// (2026-07-16). `passthrough()` keeps unrelated fields forward-compatible.\n\nconst AnthropicModelSchema = z\n .object({\n id: z.string(),\n display_name: z.string().optional(),\n max_input_tokens: z.number().optional(),\n max_tokens: z.number().optional(),\n })\n .passthrough()\nconst AnthropicSnapshotSchema = z.object({ data: z.array(AnthropicModelSchema) })\n\nconst GroqModelSchema = z\n .object({\n id: z.string(),\n context_window: z.number().optional(),\n max_completion_tokens: z.number().optional(),\n })\n .passthrough()\nconst GroqSnapshotSchema = z.object({ data: z.array(GroqModelSchema) })\n\n// xAI's `context_length` is `null` for non-text models (e.g. grok-imagine-video).\nconst XaiModelSchema = z\n .object({\n id: z.string(),\n context_length: z.number().nullable().optional(),\n })\n .passthrough()\nconst XaiSnapshotSchema = z.object({ data: z.array(XaiModelSchema) })\n\nconst MoonshotModelSchema = z\n .object({\n id: z.string(),\n context_length: z.number().optional(),\n })\n .passthrough()\nconst MoonshotSnapshotSchema = z.object({ data: z.array(MoonshotModelSchema) })\n\n// ── Serialization ────────────────────────────────────────────────────────\n\nfunction serializeEntry(e: ContextWindowEntry): string {\n const fields: string[] = [`contextWindow: ${e.contextWindow}`]\n if (e.maxOutput !== undefined) fields.push(`maxOutput: ${e.maxOutput}`)\n if (e.displayName !== undefined) fields.push(`displayName: ${JSON.stringify(e.displayName)}`)\n fields.push(`provider: ${JSON.stringify(e.provider)}`)\n return `{ ${fields.join(\", \")} }`\n}\n\nfunction serializeFile(entries: Record<string, ContextWindowEntry>): string {\n const ids = Object.keys(entries).sort()\n const lines: string[] = [\n \"// AUTO-GENERATED by @agentproto/catalog-sync (llm:context-windows).\",\n \"// Do not edit by hand — re-run `pnpm --filter @agentproto/catalog-sync generate --refresh`.\",\n \"// Sources: api.anthropic.com/v1/models, api.groq.com/openai/v1/models,\",\n \"// api.x.ai/v1/models, api.moonshot.ai/v1/models\",\n \"// Context window (max input tokens) + max output tokens per live model id.\",\n \"// NOT pricing — see LLM_PRICING_CATALOG / OPENROUTER_ROUTES in catalog.ts.\",\n \"\",\n \"export interface ContextWindowEntry {\",\n \" contextWindow: number\",\n \" maxOutput?: number\",\n \" displayName?: string\",\n ' provider: \"anthropic\" | \"groq\" | \"xai\" | \"moonshot\"',\n \"}\",\n \"\",\n \"export const CONTEXT_WINDOWS: Record<string, ContextWindowEntry> = {\",\n ]\n for (const id of ids) {\n lines.push(` ${JSON.stringify(id)}: ${serializeEntry(entries[id]!)},`)\n }\n lines.push(\"}\")\n lines.push(\"\")\n return lines.join(\"\\n\")\n}\n\n// ── Generator ───────────────────────────────────────────────────────────\n\nasync function generate(ctx: GeneratorContext): Promise<GeneratedFiles> {\n const entries: Record<string, ContextWindowEntry> = {}\n\n const anthropicSrc = sources.find(s => s.id === \"llm-anthropic\")\n if (anthropicSrc) {\n const parsed = AnthropicSnapshotSchema.parse(await ctx.fetchSource(anthropicSrc))\n for (const m of parsed.data) {\n if (!m.max_input_tokens || !m.max_tokens) continue\n entries[m.id] = {\n contextWindow: m.max_input_tokens,\n maxOutput: m.max_tokens,\n ...(m.display_name ? { displayName: m.display_name } : {}),\n provider: \"anthropic\",\n }\n }\n }\n\n const groqSrc = sources.find(s => s.id === \"llm-groq\")\n if (groqSrc) {\n const parsed = GroqSnapshotSchema.parse(await ctx.fetchSource(groqSrc))\n for (const m of parsed.data) {\n if (!m.context_window) continue\n entries[m.id] = {\n contextWindow: m.context_window,\n ...(m.max_completion_tokens ? { maxOutput: m.max_completion_tokens } : {}),\n provider: \"groq\",\n }\n }\n }\n\n const xaiSrc = sources.find(s => s.id === \"llm-xai\")\n if (xaiSrc) {\n const parsed = XaiSnapshotSchema.parse(await ctx.fetchSource(xaiSrc))\n for (const m of parsed.data) {\n if (!m.context_length) continue\n entries[m.id] = { contextWindow: m.context_length, provider: \"xai\" }\n }\n }\n\n const moonshotSrc = sources.find(s => s.id === \"llm-moonshot\")\n if (moonshotSrc) {\n const parsed = MoonshotSnapshotSchema.parse(await ctx.fetchSource(moonshotSrc))\n for (const m of parsed.data) {\n if (!m.context_length) continue\n entries[m.id] = { contextWindow: m.context_length, provider: \"moonshot\" }\n }\n }\n\n return { [OUTPUT_PATH]: serializeFile(entries) }\n}\n\nconst sources: CatalogSource[] = [\n {\n id: \"llm-anthropic\",\n url: \"https://api.anthropic.com/v1/models?limit=1000\",\n headers: {\n \"x-api-key\": \"env:ANTHROPIC_API_KEY\",\n \"anthropic-version\": \"2023-06-01\",\n },\n },\n {\n id: \"llm-groq\",\n url: \"https://api.groq.com/openai/v1/models\",\n headers: { Authorization: \"Bearer env:GROQ_API_KEY\" },\n },\n {\n id: \"llm-xai\",\n url: \"https://api.x.ai/v1/models\",\n headers: { Authorization: \"Bearer env:XAI_API_KEY\" },\n },\n {\n id: \"llm-moonshot\",\n url: \"https://api.moonshot.ai/v1/models\",\n headers: { Authorization: \"Bearer env:MOONSHOT_API_KEY\" },\n },\n]\n\nexport const llmContextWindowsGenerator = defineGenerator({\n name: \"llm:context-windows\",\n modality: \"llm\",\n sources,\n generate,\n})\n","/**\n * Shared CatalogVoice[] → TS-source serializer for the voice generators.\n *\n * The mapping (raw provider JSON → CatalogVoice) lives in\n * `@agentproto/model-catalog/providers` so build time and runtime share it;\n * this module only turns the mapped voices into a committed `*.generated.ts`.\n * Field emit order is fixed (matches the historical generator output) so the\n * generated file stays diff-stable across runs.\n */\n\nimport type { CatalogVoice } from \"@agentproto/model-catalog/schema/voice\"\n\nfunction serializeVoice(v: CatalogVoice): string {\n const lines: string[] = [\" {\"]\n lines.push(` catalogId: ${JSON.stringify(v.catalogId)},`)\n lines.push(` providerVoiceId: ${JSON.stringify(v.providerVoiceId)},`)\n lines.push(` provider: ${JSON.stringify(v.provider)},`)\n lines.push(` label: ${JSON.stringify(v.label)},`)\n lines.push(` description: ${JSON.stringify(v.description)},`)\n lines.push(` gender: ${JSON.stringify(v.gender)},`)\n lines.push(` primaryLanguage: ${JSON.stringify(v.primaryLanguage)},`)\n lines.push(\n ` supportedLanguages: [${v.supportedLanguages.map(l => JSON.stringify(l)).join(\", \")}],`,\n )\n if (v.quality !== undefined) lines.push(` quality: ${JSON.stringify(v.quality)},`)\n if (v.featured !== undefined) lines.push(` featured: ${v.featured},`)\n if (v.samplePath !== undefined) lines.push(` samplePath: ${JSON.stringify(v.samplePath)},`)\n if (v.age !== undefined) lines.push(` age: ${JSON.stringify(v.age)},`)\n lines.push(\" },\")\n return lines.join(\"\\n\")\n}\n\n/**\n * Render a full generated voice module.\n *\n * @param generatorName e.g. `voice:elevenlabs` (goes in the header comment)\n * @param exportName e.g. `ELEVENLABS_VOICES`\n * @param voices mapped voices, in emit order\n */\nexport function serializeVoiceModule(\n generatorName: string,\n exportName: string,\n voices: readonly CatalogVoice[],\n): string {\n const lines: string[] = [\n `// Generated by @agentproto/catalog-sync generator ${generatorName}`,\n \"// DO NOT EDIT MANUALLY — regenerate with catalog-sync\",\n \"\",\n 'import type { CatalogVoice } from \"@agentproto/model-catalog/schema/voice\"',\n \"\",\n `export const ${exportName}: readonly CatalogVoice[] = [`,\n ]\n for (const v of voices) lines.push(serializeVoice(v))\n lines.push(\"] as const\")\n lines.push(\"\")\n return lines.join(\"\\n\")\n}\n","/**\n * voice-elevenlabs generator — reads the ElevenLabs /v1/voices snapshot and\n * emits a CatalogVoice[]-shaped generated TS file.\n *\n * The raw → CatalogVoice mapping lives in\n * `@agentproto/model-catalog/providers` (shared with the runtime\n * live-on-setup path); this generator only fetches, validates, and\n * serializes. Provider-native ids only; no product-specific aliases.\n */\n\nimport {\n ElevenLabsVoicesSnapshotSchema,\n mapElevenLabsVoices,\n} from \"@agentproto/model-catalog/providers\"\n\nimport type {\n CatalogGenerator,\n CatalogSource,\n GeneratedFiles,\n GeneratorContext,\n} from \"../types.js\"\nimport { defineGenerator } from \"../types.js\"\nimport { serializeVoiceModule } from \"./serialize-voices.js\"\n\n// `id` MUST match the snapshot filename stem — the framework's\n// `ctx.fetchSource` resolves `snapshots/<id>.json` (and is the single,\n// dist-safe reader; generators never touch the filesystem themselves).\nexport const ELEVENLABS_SOURCE: CatalogSource = {\n id: \"voice-elevenlabs\",\n url: \"https://api.elevenlabs.io/v1/voices\",\n // Live refresh needs the account key; offline reads ignore this.\n headers: { \"xi-api-key\": \"env:ELEVENLABS_API_KEY\" },\n}\n\nconst OUTPUT_PATH = \"packages/catalog-sync/generated/voice-elevenlabs.generated.ts\"\n\nexport const voiceElevenlabs: CatalogGenerator = defineGenerator({\n name: \"voice:elevenlabs\",\n modality: \"voice\",\n sources: [ELEVENLABS_SOURCE],\n\n async generate(ctx: GeneratorContext): Promise<GeneratedFiles> {\n // Snapshot-first (refresh re-fetches) — both handled by the framework.\n const snapshot = ElevenLabsVoicesSnapshotSchema.parse(\n await ctx.fetchSource(ELEVENLABS_SOURCE),\n )\n const voices = mapElevenLabsVoices(snapshot)\n return {\n [OUTPUT_PATH]: serializeVoiceModule(\n \"voice:elevenlabs\",\n \"ELEVENLABS_VOICES\",\n voices,\n ),\n }\n },\n})\n","/**\n * voice-minimax generator — reads the MiniMax /v1/get_voice snapshot and\n * emits a CatalogVoice[]-shaped generated TS file.\n *\n * The raw → CatalogVoice mapping lives in\n * `@agentproto/model-catalog/providers` (shared with the runtime\n * live-on-setup path); this generator only fetches, validates, and\n * serializes. Provider-native ids only; no product-specific aliases.\n */\n\nimport {\n mapMinimaxVoices,\n MinimaxVoicesSnapshotSchema,\n} from \"@agentproto/model-catalog/providers\"\n\nimport type {\n CatalogGenerator,\n CatalogSource,\n GeneratedFiles,\n GeneratorContext,\n} from \"../types.js\"\nimport { defineGenerator } from \"../types.js\"\nimport { serializeVoiceModule } from \"./serialize-voices.js\"\n\n// `id` MUST match the snapshot filename stem — the framework's\n// `ctx.fetchSource` resolves `snapshots/<id>.json` (single dist-safe reader;\n// generators never touch the filesystem themselves).\nexport const MINIMAX_SOURCE: CatalogSource = {\n id: \"voice-minimax\",\n url: \"https://api.minimax.io/v1/get_voice\",\n // get_voice is a POST; live refresh needs the account key (Bearer). Without\n // MINIMAX_API_KEY set, the framework reuses the committed snapshot.\n method: \"POST\",\n headers: {\n Authorization: \"Bearer env:MINIMAX_API_KEY\",\n \"Content-Type\": \"application/json\",\n },\n body: { voice_type: \"system\" },\n}\n\nconst OUTPUT_PATH = \"packages/catalog-sync/generated/voice-minimax.generated.ts\"\n\nexport const voiceMinimax: CatalogGenerator = defineGenerator({\n name: \"voice:minimax\",\n modality: \"voice\",\n sources: [MINIMAX_SOURCE],\n\n async generate(ctx: GeneratorContext): Promise<GeneratedFiles> {\n // Snapshot-first (refresh re-fetches) — both handled by the framework.\n const snapshot = MinimaxVoicesSnapshotSchema.parse(\n await ctx.fetchSource(MINIMAX_SOURCE),\n )\n const voices = mapMinimaxVoices(snapshot)\n return {\n [OUTPUT_PATH]: serializeVoiceModule(\n \"voice:minimax\",\n \"MINIMAX_VOICES\",\n voices,\n ),\n }\n },\n})\n","/**\n * image-replicate generator — reads a curated Replicate image-models\n * snapshot and emits ImageModelDefinition[]-shaped generated TS entries.\n *\n * Mirrors the shape from packages/model-catalog/src/image/catalog.ts exactly.\n * Provider-native ids only; no product-specific aliases.\n */\n\nimport type {\n CatalogGenerator,\n CatalogSource,\n GeneratedFiles,\n GeneratorContext,\n} from \"../types.js\"\nimport { defineGenerator } from \"../types.js\"\n\n// ── Replicate snapshot shapes ───────────────────────────────────────────\n\ninterface ReplicateOpenApiSchema {\n input: { type: string; properties: Record<string, { type: string; items?: { type: string }; format?: string }> }\n output: { type: string; items?: { type: string; format?: string }; format?: string }\n}\n\ninterface ReplicateLatestVersion {\n id: string\n created_at: string\n openapi_schema: ReplicateOpenApiSchema\n}\n\ninterface ReplicateModel {\n owner: string\n name: string\n description: string\n visibility: string\n run_count: number\n cover_image_url: string | null\n latest_version: ReplicateLatestVersion\n}\n\ninterface ReplicateSnapshot {\n _meta: Record<string, unknown>\n models: ReplicateModel[]\n}\n\n// ── ImageModelDefinition mirror (from packages/model-catalog/src/image/catalog.ts) ──\n\ninterface ImageModelPricing {\n costPerImage: number\n costTier: \"low\" | \"medium\" | \"high\"\n billingUnit: \"per_image\"\n baseCost: number\n creditCost?: number\n overrideCreditCost?: number\n}\n\ninterface ImageModelCapabilities {\n generate: boolean\n edit: boolean\n upscale?: boolean\n}\n\ninterface ImageModelReferenceImages {\n supported: boolean\n fieldName: \"image_input\" | \"input_images\" | \"input_image\" | \"none\"\n maxCount: number\n singular: boolean\n}\n\ninterface ImageModelAspectRatio {\n supported: string[]\n default: string\n}\n\ninterface ImageModelEntry {\n id: string\n name: string\n providerId: string\n provider: string\n capabilities: ImageModelCapabilities\n referenceImages: ImageModelReferenceImages\n aspectRatio: ImageModelAspectRatio\n output: \"string\" | \"array\"\n pricing: ImageModelPricing\n description: string\n agentVisible: boolean\n triggerWord?: string\n}\n\n// ── Pricing (hand-authored, mirrors model-catalog) ──────────────────────\n\ninterface PricingRecord {\n costPerImage: number\n costTier: \"low\" | \"medium\" | \"high\"\n baseCost: number\n creditCost?: number\n overrideCreditCost?: number\n}\n\nconst PRICING: Record<string, PricingRecord> = {\n \"nano-banana-pro\": { costPerImage: 0.15, costTier: \"high\", baseCost: 0.15, creditCost: 10 },\n \"nano-banana-2\": { costPerImage: 0.06, costTier: \"medium\", baseCost: 0.06, creditCost: 5 },\n \"nano-banana\": { costPerImage: 0.04, costTier: \"low\", baseCost: 0.04, creditCost: 5 },\n \"flux-2-dev\": { costPerImage: 0.03, costTier: \"low\", baseCost: 0.03, creditCost: 3 },\n \"flux-kontext-pro\": { costPerImage: 0.04, costTier: \"low\", baseCost: 0.04, creditCost: 5 },\n \"flux-kontext-max\": { costPerImage: 0.08, costTier: \"medium\", baseCost: 0.08, creditCost: 8 },\n \"flux-1.1-pro-ultra\": { costPerImage: 0.06, costTier: \"medium\", baseCost: 0.06, creditCost: 8 },\n \"seedream-4\": { costPerImage: 0.03, costTier: \"low\", baseCost: 0.03, creditCost: 3 },\n \"recraft-v3\": { costPerImage: 0.04, costTier: \"low\", baseCost: 0.04, creditCost: 5 },\n \"image-01\": { costPerImage: 0.02, costTier: \"low\", baseCost: 0.02, creditCost: 2 },\n \"gpt-image-1\": { costPerImage: 0.04, costTier: \"low\", baseCost: 0.04, creditCost: 5 },\n \"ideogram-v3-turbo\": { costPerImage: 0.03, costTier: \"low\", baseCost: 0.03, creditCost: 4 },\n \"flux-1.1-pro\": { costPerImage: 0.04, costTier: \"low\", baseCost: 0.04, creditCost: 5 },\n}\n\n// Models visible to agents (the active generation ones)\nconst AGENT_VISIBLE = new Set([\n \"nano-banana-pro\",\n \"nano-banana-2\",\n \"nano-banana\",\n \"flux-2-dev\",\n \"flux-kontext-pro\",\n \"flux-kontext-max\",\n \"flux-1.1-pro-ultra\",\n \"seedream-4\",\n \"recraft-v3\",\n \"image-01\",\n \"gpt-image-1\",\n \"ideogram-v3-turbo\",\n])\n\nconst ASPECT_RATIOS_DEFAULT: ImageModelAspectRatio = {\n supported: [\"1:1\", \"9:16\", \"16:9\", \"2:3\", \"3:2\", \"3:4\", \"4:3\"],\n default: \"1:1\",\n}\n\nconst ASPECT_RATIOS_WIDE: ImageModelAspectRatio = {\n supported: [\"1:1\", \"9:16\", \"16:9\", \"2:3\", \"3:2\", \"3:4\", \"4:3\", \"4:5\", \"5:4\"],\n default: \"1:1\",\n}\n\nconst ASPECT_RATIOS_ULTRA: ImageModelAspectRatio = {\n supported: [\"1:1\", \"9:16\", \"16:9\", \"21:9\", \"9:21\", \"3:4\", \"4:3\"],\n default: \"1:1\",\n}\n\nconst ASPECT_RATIOS_NBPRO: ImageModelAspectRatio = {\n supported: [\n \"1:1\", \"9:16\", \"16:9\", \"2:3\", \"3:2\", \"3:4\", \"4:3\",\n \"4:5\", \"5:4\", \"21:9\",\n ],\n default: \"match_input_image\",\n}\n\nconst ASPECT_RATIOS_NB2: ImageModelAspectRatio = {\n supported: [\n \"1:1\", \"9:16\", \"16:9\", \"2:3\", \"3:2\", \"3:4\", \"4:3\",\n \"4:5\", \"5:4\",\n ],\n default: \"match_input_image\",\n}\n\nconst ASPECT_RATIOS_SQUARE: ImageModelAspectRatio = {\n supported: [\"1:1\"],\n default: \"1:1\",\n}\n\ninterface ModelSpec {\n id: string\n name: string\n capabilities: ImageModelCapabilities\n referenceImages: ImageModelReferenceImages\n aspectRatio: ImageModelAspectRatio\n output: \"string\" | \"array\"\n triggerWord?: string\n}\n\nconst MODEL_SPECS: Record<string, ModelSpec> = {\n \"nano-banana-pro\": {\n id: \"nano-banana-pro\",\n name: \"Nano Banana Pro\",\n capabilities: { generate: true, edit: true },\n referenceImages: { supported: true, fieldName: \"image_input\", maxCount: 14, singular: false },\n aspectRatio: ASPECT_RATIOS_NBPRO,\n output: \"string\",\n },\n \"nano-banana-2\": {\n id: \"nano-banana-2\",\n name: \"Nano Banana 2\",\n capabilities: { generate: true, edit: true },\n referenceImages: { supported: true, fieldName: \"image_input\", maxCount: 4, singular: false },\n aspectRatio: ASPECT_RATIOS_NB2,\n output: \"string\",\n },\n \"nano-banana\": {\n id: \"nano-banana\",\n name: \"Nano Banana\",\n capabilities: { generate: true, edit: true },\n referenceImages: { supported: true, fieldName: \"image_input\", maxCount: 4, singular: false },\n aspectRatio: ASPECT_RATIOS_DEFAULT,\n output: \"string\",\n },\n \"flux-2-dev\": {\n id: \"flux-2-dev\",\n name: \"Flux 2 Dev\",\n capabilities: { generate: true, edit: true },\n referenceImages: { supported: true, fieldName: \"input_images\", maxCount: 5, singular: false },\n aspectRatio: ASPECT_RATIOS_WIDE,\n output: \"string\",\n },\n \"flux-kontext-pro\": {\n id: \"flux-kontext-pro\",\n name: \"Flux Kontext Pro\",\n capabilities: { generate: true, edit: true },\n referenceImages: { supported: true, fieldName: \"input_image\", maxCount: 1, singular: true },\n aspectRatio: ASPECT_RATIOS_DEFAULT,\n output: \"string\",\n },\n \"flux-kontext-max\": {\n id: \"flux-kontext-max\",\n name: \"Flux Kontext Max\",\n capabilities: { generate: true, edit: true },\n referenceImages: { supported: true, fieldName: \"input_image\", maxCount: 1, singular: true },\n aspectRatio: ASPECT_RATIOS_DEFAULT,\n output: \"string\",\n },\n \"flux-1.1-pro-ultra\": {\n id: \"flux-1.1-pro-ultra\",\n name: \"Flux 1.1 Pro Ultra\",\n capabilities: { generate: true, edit: false },\n referenceImages: { supported: false, fieldName: \"none\", maxCount: 0, singular: false },\n aspectRatio: ASPECT_RATIOS_ULTRA,\n output: \"string\",\n },\n \"seedream-4\": {\n id: \"seedream-4\",\n name: \"SeedReam 4\",\n capabilities: { generate: true, edit: true },\n referenceImages: { supported: true, fieldName: \"image_input\", maxCount: 10, singular: false },\n aspectRatio: ASPECT_RATIOS_DEFAULT,\n output: \"string\",\n },\n \"recraft-v3\": {\n id: \"recraft\",\n name: \"Recraft V3\",\n capabilities: { generate: true, edit: false },\n referenceImages: { supported: false, fieldName: \"none\", maxCount: 0, singular: false },\n aspectRatio: ASPECT_RATIOS_SQUARE,\n output: \"string\",\n },\n \"image-01\": {\n id: \"minimax\",\n name: \"MiniMax Image\",\n capabilities: { generate: true, edit: false },\n referenceImages: { supported: false, fieldName: \"none\", maxCount: 0, singular: false },\n aspectRatio: { supported: [\"1:1\", \"9:16\", \"16:9\", \"3:4\", \"4:3\"], default: \"1:1\" },\n output: \"array\",\n },\n \"gpt-image-1\": {\n id: \"gpt-image-1\",\n name: \"OpenAI GPT Image 1\",\n capabilities: { generate: true, edit: true },\n referenceImages: { supported: true, fieldName: \"input_image\", maxCount: 1, singular: true },\n aspectRatio: { supported: [\"1:1\", \"2:3\", \"3:2\"], default: \"1:1\" },\n output: \"string\",\n },\n \"ideogram-v3-turbo\": {\n id: \"ideogram-v3\",\n name: \"Ideogram v3\",\n capabilities: { generate: true, edit: false },\n referenceImages: { supported: false, fieldName: \"none\", maxCount: 0, singular: false },\n aspectRatio: { supported: [\"1:1\", \"9:16\", \"16:9\", \"2:3\", \"3:2\"], default: \"1:1\" },\n output: \"string\",\n },\n \"flux-1.1-pro\": {\n id: \"flux\",\n name: \"Flux 1.1 Pro\",\n capabilities: { generate: true, edit: false },\n referenceImages: { supported: false, fieldName: \"none\", maxCount: 0, singular: false },\n aspectRatio: { supported: [\"1:1\", \"9:16\", \"16:9\"], default: \"1:1\" },\n output: \"string\",\n },\n}\n\nfunction mapModel(raw: ReplicateModel): ImageModelEntry {\n const providerId = `${raw.owner}/${raw.name}`\n const spec = MODEL_SPECS[raw.name] ?? {\n id: raw.name,\n name: raw.name,\n capabilities: { generate: true, edit: false },\n referenceImages: { supported: false, fieldName: \"none\" as const, maxCount: 0, singular: false },\n aspectRatio: ASPECT_RATIOS_DEFAULT,\n output: \"string\" as const,\n }\n\n const pricing = PRICING[raw.name] ?? {\n costPerImage: 0.03,\n costTier: \"low\" as const,\n baseCost: 0.03,\n creditCost: 3,\n }\n\n return {\n id: spec.id,\n name: spec.name,\n providerId,\n provider: raw.owner === \"openai\" ? \"openai\" : raw.owner === \"minimax\" ? \"minimax\" : \"replicate\",\n capabilities: spec.capabilities,\n referenceImages: spec.referenceImages,\n aspectRatio: spec.aspectRatio,\n output: spec.output,\n pricing: {\n costPerImage: pricing.costPerImage,\n costTier: pricing.costTier,\n billingUnit: \"per_image\" as const,\n baseCost: pricing.baseCost,\n ...(pricing.creditCost !== undefined ? { creditCost: pricing.creditCost } : {}),\n ...(pricing.overrideCreditCost !== undefined ? { overrideCreditCost: pricing.overrideCreditCost } : {}),\n },\n description: raw.description,\n agentVisible: AGENT_VISIBLE.has(raw.name),\n ...(spec.triggerWord ? { triggerWord: spec.triggerWord } : {}),\n }\n}\n\n// ── Generator ────────────────────────────────────────────────────────────\n\n// `id` MUST match the snapshot filename stem — the framework's\n// `ctx.fetchSource` resolves `snapshots/<id>.json` (single dist-safe reader;\n// generators never touch the filesystem themselves).\nexport const REPLICATE_SOURCE: CatalogSource = {\n id: \"image-replicate\",\n url: \"https://api.replicate.com/v1/models?query=image+generation\",\n}\n\nexport const imageReplicate: CatalogGenerator = defineGenerator({\n name: \"image:replicate\",\n modality: \"image\",\n sources: [REPLICATE_SOURCE],\n\n async generate(ctx: GeneratorContext): Promise<GeneratedFiles> {\n // Snapshot-first (refresh re-fetches) — both handled by the framework.\n const data = (await ctx.fetchSource(REPLICATE_SOURCE)) as ReplicateSnapshot\n\n const entries = data.models.map(mapModel)\n\n const lines: string[] = [\n \"// Generated by @agentproto/catalog-sync generator image:replicate\",\n \"// DO NOT EDIT MANUALLY — regenerate with catalog-sync\",\n \"\",\n \"import type { ImageModelDefinition } from \\\"@agentproto/model-catalog/image\\\"\",\n \"\",\n \"export const REPLICATE_IMAGE_MODELS: Record<string, ImageModelDefinition> = {\",\n ]\n\n for (const e of entries) {\n const trigger = e.triggerWord ? `,\\n triggerWord: ${JSON.stringify(e.triggerWord)}` : \"\"\n const creditCost = e.pricing.creditCost !== undefined\n ? `,\\n creditCost: ${e.pricing.creditCost}`\n : \"\"\n const override = e.pricing.overrideCreditCost !== undefined\n ? `,\\n overrideCreditCost: ${e.pricing.overrideCreditCost}`\n : \"\"\n\n lines.push(` ${JSON.stringify(e.id)}: {`)\n lines.push(` id: ${JSON.stringify(e.id)},`)\n lines.push(` name: ${JSON.stringify(e.name)},`)\n lines.push(` providerId: ${JSON.stringify(e.providerId)},`)\n lines.push(` provider: ${JSON.stringify(e.provider)},`)\n lines.push(` capabilities: { generate: ${e.capabilities.generate}, edit: ${e.capabilities.edit}${e.capabilities.upscale ? `, upscale: ${e.capabilities.upscale}` : \"\"} },`)\n lines.push(` referenceImages: {`)\n lines.push(` supported: ${e.referenceImages.supported},`)\n lines.push(` fieldName: ${JSON.stringify(e.referenceImages.fieldName)},`)\n lines.push(` maxCount: ${e.referenceImages.maxCount},`)\n lines.push(` singular: ${e.referenceImages.singular},`)\n lines.push(` },`)\n lines.push(` aspectRatio: {`)\n lines.push(` supported: [${e.aspectRatio.supported.map(a => JSON.stringify(a)).join(\", \")}],`)\n lines.push(` default: ${JSON.stringify(e.aspectRatio.default)},`)\n lines.push(` },`)\n lines.push(` output: ${JSON.stringify(e.output)},`)\n lines.push(` pricing: {`)\n lines.push(` costPerImage: ${e.pricing.costPerImage},`)\n lines.push(` costTier: ${JSON.stringify(e.pricing.costTier)},`)\n lines.push(` billingUnit: ${JSON.stringify(e.pricing.billingUnit)},`)\n lines.push(` baseCost: ${e.pricing.baseCost},${creditCost}${override}`)\n lines.push(` },`)\n lines.push(` description: ${JSON.stringify(e.description)},`)\n lines.push(` agentVisible: ${e.agentVisible},${trigger}`)\n lines.push(` },`)\n }\n\n lines.push(\"}\")\n lines.push(\"\")\n\n const outputPath = \"packages/catalog-sync/generated/image-replicate.generated.ts\"\n return { [outputPath]: lines.join(\"\\n\") }\n },\n})\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\"\nimport { dirname, join, resolve } from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\n\nimport type {\n CatalogGenerator,\n CatalogSource,\n GeneratedFiles,\n GeneratorContext,\n} from \"./types.js\"\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\n\n/**\n * The catalog-sync package directory. Resolves the same way whether the\n * module is loaded from `src/` (vitest, type-checking) or `dist/` (built) —\n * both sit one level below the package root, so walking up one directory\n * from this file lands on `packages/catalog-sync/`.\n */\nfunction catalogSyncDir(): string {\n return resolve(__dirname, \"..\")\n}\n\n/** Absolute path to a committed/pinned source snapshot. */\nfunction snapshotPath(id: string): string {\n return join(catalogSyncDir(), \"snapshots\", `${id}.json`)\n}\n\n/**\n * The monorepo root. Resolved by walking up from the catalog-sync package\n * until `pnpm-workspace.yaml` is found. Generated-file paths in\n * {@link GeneratedFiles} are repo-relative and are resolved against this.\n */\nfunction repoRoot(): string {\n let dir = catalogSyncDir()\n for (let i = 0; i < 12; i++) {\n if (existsSync(join(dir, \"pnpm-workspace.yaml\"))) return dir\n const parent = dirname(dir)\n if (parent === dir) break\n dir = parent\n }\n // Fallback: catalog-sync lives at <root>/packages/catalog-sync.\n return dirname(dirname(catalogSyncDir()))\n}\n\n/** Reads an existing file as UTF-8, or returns undefined when absent. */\nfunction readIfExists(absPath: string): string | undefined {\n if (!existsSync(absPath)) return undefined\n return readFileSync(absPath, \"utf8\")\n}\n\n/**\n * Resolve `env:VAR_NAME` tokens inside header values from `process.env`.\n * Returns the materialized headers plus the names of any referenced env vars\n * that are unset — the caller uses `missing` to decide whether the source can\n * be refreshed (we never fetch an authed endpoint without its key).\n */\nfunction resolveHeaders(headers?: Record<string, string>): {\n headers: Record<string, string>\n missing: string[]\n} {\n const out: Record<string, string> = {}\n const missing: string[] = []\n if (!headers) return { headers: out, missing }\n for (const [key, value] of Object.entries(headers)) {\n out[key] = value.replace(/env:([A-Z0-9_]+)/g, (_match, name: string) => {\n const v = process.env[name]\n if (v === undefined || v === \"\") {\n missing.push(name)\n return \"\"\n }\n return v\n })\n }\n return { headers: out, missing }\n}\n\nexport interface RunGeneratorsOptions {\n /** When true, missing snapshots are fetched from their pinned `url`. */\n refresh: boolean\n /** When true, generated files are written to disk at their repo-relative path. */\n write: boolean\n}\n\nexport interface RunGeneratorsResult {\n files: GeneratedFiles\n /** Repo-relative paths whose generated content differs from what is on disk. */\n changed: string[]\n}\n\n/**\n * Runs each generator, gathering its emitted files, then (optionally) writes\n * them. `changed` is ALWAYS computed — it is the diff of generated content\n * vs disk — so `--check` (write=false) can surface drift without mutating\n * anything. Writes only happen when `write=true` AND a path differs.\n */\nexport async function runGenerators(\n gens: CatalogGenerator[],\n opts: RunGeneratorsOptions\n): Promise<RunGeneratorsResult> {\n const files: GeneratedFiles = {}\n\n for (const gen of gens) {\n const ctx: GeneratorContext = {\n refresh: opts.refresh,\n async fetchSource(src: CatalogSource): Promise<unknown> {\n const path = snapshotPath(src.id)\n const existing = readIfExists(path)\n\n // Offline path (default): reuse the committed snapshot; error if none.\n if (!opts.refresh) {\n if (existing !== undefined) return JSON.parse(existing)\n throw new Error(\n `catalog-sync: no committed snapshot for source \"${src.id}\" ` +\n `(${path}), and --refresh is not set. Run ` +\n `\\`catalog-sync generate --refresh\\` to fetch ${src.url}.`\n )\n }\n\n // --refresh: force a live re-fetch (do NOT short-circuit on an existing\n // snapshot — refreshing is the whole point). Auth headers may embed\n // `env:VAR` tokens; if a referenced var is unset we can't authenticate,\n // so reuse the committed snapshot rather than fetch unauthenticated.\n const { headers, missing } = resolveHeaders(src.headers)\n if (missing.length > 0) {\n if (existing !== undefined) {\n process.stderr.write(\n `catalog-sync: skipping refresh of \"${src.id}\" — missing env ` +\n `${missing.join(\", \")}; reusing committed snapshot.\\n`\n )\n return JSON.parse(existing)\n }\n throw new Error(\n `catalog-sync: cannot refresh \"${src.id}\" — missing env ` +\n `${missing.join(\", \")} and no committed snapshot.`\n )\n }\n const res = await fetch(src.url, {\n method: src.method ?? \"GET\",\n headers,\n ...(src.body !== undefined\n ? { body: JSON.stringify(src.body) }\n : {}),\n })\n if (!res.ok) {\n throw new Error(\n `catalog-sync: fetch ${src.url} failed: ${res.status} ${res.statusText}`\n )\n }\n const text = await res.text()\n const parsed: unknown = JSON.parse(text)\n mkdirSync(dirname(path), { recursive: true })\n writeFileSync(path, `${JSON.stringify(parsed, null, 2)}\\n`, \"utf8\")\n return parsed\n },\n }\n\n const out = await gen.generate(ctx)\n for (const [path, content] of Object.entries(out)) {\n files[path] = content\n }\n }\n\n const root = repoRoot()\n const changed: string[] = []\n for (const [relPath, content] of Object.entries(files)) {\n const abs = join(root, relPath)\n const existing = readIfExists(abs)\n if (existing !== content) {\n changed.push(relPath)\n if (opts.write) {\n mkdirSync(dirname(abs), { recursive: true })\n writeFileSync(abs, content, \"utf8\")\n }\n }\n }\n\n return { files, changed }\n}\n","#!/usr/bin/env node\n\n/**\n * catalog-sync CLI.\n *\n * catalog-sync generate [--refresh] [--check]\n *\n * - `generate` (default) — generate from pinned snapshots, write changed files.\n * - `--refresh` — re-fetch each source's pinned URL into snapshots/.\n * - `--check` — generate in memory, diff vs committed files; exit 1\n * on drift. This is what CI runs. Never writes.\n */\n\nimport { llmOpenRouterGenerator } from \"./generators/llm-openrouter.js\"\nimport { llmContextWindowsGenerator } from \"./generators/llm-context-windows.js\"\nimport { voiceElevenlabs } from \"./generators/voice-elevenlabs.js\"\nimport { voiceMinimax } from \"./generators/voice-minimax.js\"\nimport { imageReplicate } from \"./generators/image-replicate.js\"\nimport { runGenerators } from \"./runner.js\"\n\nconst args = process.argv.slice(2)\nconst command = args[0] ?? \"\"\nconst flags = new Set(args.slice(1))\n\nconst KNOWN_FLAGS = new Set([\"--refresh\", \"--check\"])\nconst unknownFlags = [...flags].filter((f) => !KNOWN_FLAGS.has(f))\n\nif (command !== \"generate\" || unknownFlags.length > 0) {\n if (command !== \"generate\") {\n process.stderr.write(\n `catalog-sync: unknown command \"${command}\". Usage: catalog-sync generate [--refresh] [--check]\\n`\n )\n }\n if (unknownFlags.length > 0) {\n process.stderr.write(`catalog-sync: unknown flag(s) ${unknownFlags.join(\", \")}\\n`)\n }\n process.exit(2)\n}\n\nconst refresh = flags.has(\"--refresh\")\nconst check = flags.has(\"--check\")\nconst generators = [\n llmOpenRouterGenerator,\n llmContextWindowsGenerator,\n voiceElevenlabs,\n voiceMinimax,\n imageReplicate,\n]\n\nconst { changed, files } = await runGenerators(generators, {\n refresh,\n write: !check,\n})\n\nif (check) {\n if (changed.length > 0) {\n process.stderr.write(\n `catalog-sync: drift detected — ${changed.length} file(s) differ from committed:\\n`\n )\n for (const p of changed) process.stderr.write(` ${p}\\n`)\n process.stderr.write(`Re-run \\`catalog-sync generate\\` to update.\\n`)\n process.exit(1)\n }\n process.stdout.write(\n `catalog-sync: no drift (${generators.length} generator(s), ${Object.keys(files).length} file(s) up to date).\\n`\n )\n process.exit(0)\n}\n\nif (changed.length > 0) {\n process.stdout.write(`catalog-sync: wrote ${changed.length} file(s):\\n`)\n for (const p of changed) process.stdout.write(` ${p}\\n`)\n} else {\n process.stdout.write(`catalog-sync: no changes.\\n`)\n}\nprocess.exit(0)\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,8 @@ import { CatalogGenerator } from './types.js';
|
|
|
2
2
|
export { CatalogSource, GeneratedFiles, GeneratorContext, defineGenerator } from './types.js';
|
|
3
3
|
export { RunGeneratorsOptions, RunGeneratorsResult, runGenerators } from './runner.js';
|
|
4
4
|
export { llmOpenRouterGenerator } from './generators/llm-openrouter.js';
|
|
5
|
+
export { CatalogFileDiff, RefreshableSource, ReviewedRefreshOptions, ReviewedRefreshResult, SourceRefreshResult, refreshSources, reviewedRefresh } from './refresh-workflow.js';
|
|
6
|
+
export { OPENAI_LLM_SOURCE, OPENAI_SOURCES } from './sources/openai.js';
|
|
5
7
|
|
|
6
8
|
/**
|
|
7
9
|
* voice-elevenlabs generator — reads the ElevenLabs /v1/voices snapshot and
|
package/dist/index.mjs
CHANGED
|
@@ -603,7 +603,165 @@ var imageReplicate = defineGenerator({
|
|
|
603
603
|
return { [outputPath]: lines.join("\n") };
|
|
604
604
|
}
|
|
605
605
|
});
|
|
606
|
+
var __dirname2 = dirname(fileURLToPath(import.meta.url));
|
|
607
|
+
function catalogSyncDir2() {
|
|
608
|
+
return resolve(__dirname2, "..");
|
|
609
|
+
}
|
|
610
|
+
function snapshotPath2(id) {
|
|
611
|
+
return join(catalogSyncDir2(), "snapshots", `${id}.json`);
|
|
612
|
+
}
|
|
613
|
+
function repoRoot2() {
|
|
614
|
+
let dir = catalogSyncDir2();
|
|
615
|
+
for (let i = 0; i < 12; i++) {
|
|
616
|
+
if (existsSync(join(dir, "pnpm-workspace.yaml"))) return dir;
|
|
617
|
+
const parent = dirname(dir);
|
|
618
|
+
if (parent === dir) break;
|
|
619
|
+
dir = parent;
|
|
620
|
+
}
|
|
621
|
+
return dirname(dirname(catalogSyncDir2()));
|
|
622
|
+
}
|
|
623
|
+
function readIfExists2(absPath) {
|
|
624
|
+
if (!existsSync(absPath)) return void 0;
|
|
625
|
+
return readFileSync(absPath, "utf8");
|
|
626
|
+
}
|
|
627
|
+
function resolveHeaders2(headers) {
|
|
628
|
+
const out = {};
|
|
629
|
+
const missing = [];
|
|
630
|
+
if (!headers) return { headers: out, missing };
|
|
631
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
632
|
+
out[key] = value.replace(/env:([A-Z0-9_]+)/g, (_match, name) => {
|
|
633
|
+
const v = process.env[name];
|
|
634
|
+
if (v === void 0 || v === "") {
|
|
635
|
+
missing.push(name);
|
|
636
|
+
return "";
|
|
637
|
+
}
|
|
638
|
+
return v;
|
|
639
|
+
});
|
|
640
|
+
}
|
|
641
|
+
return { headers: out, missing };
|
|
642
|
+
}
|
|
643
|
+
async function refreshSources(sources2, opts) {
|
|
644
|
+
const results = [];
|
|
645
|
+
const fetchImpl = opts.fetchImpl ?? fetch;
|
|
646
|
+
for (const { source, refreshable, notes } of sources2) {
|
|
647
|
+
if (!opts.refresh) {
|
|
648
|
+
results.push({
|
|
649
|
+
id: source.id,
|
|
650
|
+
url: source.url,
|
|
651
|
+
refreshed: false,
|
|
652
|
+
notes: "Offline mode: using committed snapshot."
|
|
653
|
+
});
|
|
654
|
+
continue;
|
|
655
|
+
}
|
|
656
|
+
if (!refreshable) {
|
|
657
|
+
results.push({
|
|
658
|
+
id: source.id,
|
|
659
|
+
url: source.url,
|
|
660
|
+
refreshed: false,
|
|
661
|
+
skipped: true,
|
|
662
|
+
notes: notes ?? "Source is not refreshable."
|
|
663
|
+
});
|
|
664
|
+
continue;
|
|
665
|
+
}
|
|
666
|
+
const { headers, missing } = resolveHeaders2(source.headers);
|
|
667
|
+
if (missing.length > 0) {
|
|
668
|
+
results.push({
|
|
669
|
+
id: source.id,
|
|
670
|
+
url: source.url,
|
|
671
|
+
refreshed: false,
|
|
672
|
+
error: `Missing env vars: ${missing.join(", ")}`
|
|
673
|
+
});
|
|
674
|
+
continue;
|
|
675
|
+
}
|
|
676
|
+
try {
|
|
677
|
+
const res = await fetchImpl(source.url, {
|
|
678
|
+
method: source.method ?? "GET",
|
|
679
|
+
headers,
|
|
680
|
+
...source.body !== void 0 ? { body: JSON.stringify(source.body) } : {}
|
|
681
|
+
});
|
|
682
|
+
if (!res.ok) {
|
|
683
|
+
results.push({
|
|
684
|
+
id: source.id,
|
|
685
|
+
url: source.url,
|
|
686
|
+
refreshed: false,
|
|
687
|
+
error: `${res.status} ${res.statusText}`
|
|
688
|
+
});
|
|
689
|
+
continue;
|
|
690
|
+
}
|
|
691
|
+
const text = await res.text();
|
|
692
|
+
const parsed = JSON.parse(text);
|
|
693
|
+
mkdirSync(dirname(snapshotPath2(source.id)), { recursive: true });
|
|
694
|
+
writeFileSync(
|
|
695
|
+
snapshotPath2(source.id),
|
|
696
|
+
`${JSON.stringify(parsed, null, 2)}
|
|
697
|
+
`,
|
|
698
|
+
"utf8"
|
|
699
|
+
);
|
|
700
|
+
results.push({
|
|
701
|
+
id: source.id,
|
|
702
|
+
url: source.url,
|
|
703
|
+
refreshed: true,
|
|
704
|
+
notes: "Snapshot updated from live source."
|
|
705
|
+
});
|
|
706
|
+
} catch (err) {
|
|
707
|
+
results.push({
|
|
708
|
+
id: source.id,
|
|
709
|
+
url: source.url,
|
|
710
|
+
refreshed: false,
|
|
711
|
+
error: err instanceof Error ? err.message : String(err)
|
|
712
|
+
});
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
return results;
|
|
716
|
+
}
|
|
717
|
+
async function reviewedRefresh(gens, refreshableSources, opts) {
|
|
718
|
+
const sourceResults = await refreshSources(refreshableSources, opts);
|
|
719
|
+
const files = {};
|
|
720
|
+
for (const gen of gens) {
|
|
721
|
+
const ctx = {
|
|
722
|
+
refresh: opts.refresh,
|
|
723
|
+
async fetchSource(src) {
|
|
724
|
+
const path = snapshotPath2(src.id);
|
|
725
|
+
const existing = readIfExists2(path);
|
|
726
|
+
if (existing !== void 0) return JSON.parse(existing);
|
|
727
|
+
throw new Error(
|
|
728
|
+
`catalog-sync: no committed snapshot for source "${src.id}" (${path}).`
|
|
729
|
+
);
|
|
730
|
+
}
|
|
731
|
+
};
|
|
732
|
+
const out = await gen.generate(ctx);
|
|
733
|
+
Object.assign(files, out);
|
|
734
|
+
}
|
|
735
|
+
const root = repoRoot2();
|
|
736
|
+
const diffs = [];
|
|
737
|
+
const changed = [];
|
|
738
|
+
for (const [relPath, after] of Object.entries(files)) {
|
|
739
|
+
const abs = join(root, relPath);
|
|
740
|
+
const before = readIfExists2(abs);
|
|
741
|
+
const isChanged = before !== after;
|
|
742
|
+
diffs.push({ path: relPath, before, after, changed: isChanged });
|
|
743
|
+
if (isChanged) {
|
|
744
|
+
changed.push(relPath);
|
|
745
|
+
if (opts.write) {
|
|
746
|
+
mkdirSync(dirname(abs), { recursive: true });
|
|
747
|
+
writeFileSync(abs, after, "utf8");
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
return { files, changed, diffs, sources: sourceResults };
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
// src/sources/openai.ts
|
|
755
|
+
var OPENAI_LLM_SOURCE = {
|
|
756
|
+
source: {
|
|
757
|
+
id: "llm-openai",
|
|
758
|
+
url: "https://openai.com/api/pricing"
|
|
759
|
+
},
|
|
760
|
+
refreshable: false,
|
|
761
|
+
notes: "OpenAI has no stable machine-readable pricing endpoint. Pricing in @agentproto/model-catalog is committed manually from openai.com/api/pricing and verified against independent aggregators where possible. Automated refresh is disabled to avoid scraping or fabricating prices."
|
|
762
|
+
};
|
|
763
|
+
var OPENAI_SOURCES = [OPENAI_LLM_SOURCE];
|
|
606
764
|
|
|
607
|
-
export { defineGenerator, imageReplicate, llmOpenRouterGenerator, runGenerators, voiceElevenlabs, voiceMinimax };
|
|
765
|
+
export { OPENAI_LLM_SOURCE, OPENAI_SOURCES, defineGenerator, imageReplicate, llmOpenRouterGenerator, refreshSources, reviewedRefresh, runGenerators, voiceElevenlabs, voiceMinimax };
|
|
608
766
|
//# sourceMappingURL=index.mjs.map
|
|
609
767
|
//# sourceMappingURL=index.mjs.map
|