@agentproto/model-catalog 0.12.7 → 0.13.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.
Files changed (30) hide show
  1. package/dist/access/index.mjs +4 -4
  2. package/dist/{chunk-CEP4H4FD.mjs → chunk-3WNSSJTB.mjs} +3 -3
  3. package/dist/{chunk-CEP4H4FD.mjs.map → chunk-3WNSSJTB.mjs.map} +1 -1
  4. package/dist/{chunk-UWZLV4P2.mjs → chunk-H2TPFH4A.mjs} +5 -5
  5. package/dist/{chunk-UWZLV4P2.mjs.map → chunk-H2TPFH4A.mjs.map} +1 -1
  6. package/dist/{chunk-XYM6UG7C.mjs → chunk-JMEDHOCQ.mjs} +60 -40
  7. package/dist/chunk-JMEDHOCQ.mjs.map +1 -0
  8. package/dist/{chunk-ITX3DL26.mjs → chunk-LMY5TLSF.mjs} +4 -4
  9. package/dist/{chunk-ITX3DL26.mjs.map → chunk-LMY5TLSF.mjs.map} +1 -1
  10. package/dist/{chunk-N2XHRKQI.mjs → chunk-PITHETND.mjs} +3 -3
  11. package/dist/{chunk-N2XHRKQI.mjs.map → chunk-PITHETND.mjs.map} +1 -1
  12. package/dist/{chunk-Z2WIEJR7.mjs → chunk-S27LMEYZ.mjs} +44 -36
  13. package/dist/chunk-S27LMEYZ.mjs.map +1 -0
  14. package/dist/{chunk-HC5TGYJW.mjs → chunk-TWTG323Z.mjs} +5 -4
  15. package/dist/chunk-TWTG323Z.mjs.map +1 -0
  16. package/dist/{chunk-USCEVZQG.mjs → chunk-XP2KTH6U.mjs} +4 -4
  17. package/dist/{chunk-USCEVZQG.mjs.map → chunk-XP2KTH6U.mjs.map} +1 -1
  18. package/dist/cost/index.mjs +6 -6
  19. package/dist/curation/index.mjs +6 -6
  20. package/dist/defaults-BDkNRPK8.d.ts +50 -0
  21. package/dist/index.d.ts +1 -0
  22. package/dist/index.mjs +10 -10
  23. package/dist/index.mjs.map +1 -1
  24. package/dist/llm/index.d.ts +2 -44
  25. package/dist/llm/index.mjs +2 -2
  26. package/dist/route-identity/index.mjs +2 -2
  27. package/package.json +5 -5
  28. package/dist/chunk-HC5TGYJW.mjs.map +0 -1
  29. package/dist/chunk-XYM6UG7C.mjs.map +0 -1
  30. package/dist/chunk-Z2WIEJR7.mjs.map +0 -1
@@ -1,7 +1,7 @@
1
- export { evaluateAccess, evaluateCatalogDefaults } from '../chunk-N2XHRKQI.mjs';
2
- import '../chunk-CEP4H4FD.mjs';
3
- import '../chunk-HC5TGYJW.mjs';
4
- import '../chunk-Z2WIEJR7.mjs';
1
+ export { evaluateAccess, evaluateCatalogDefaults } from '../chunk-PITHETND.mjs';
2
+ import '../chunk-3WNSSJTB.mjs';
3
+ import '../chunk-TWTG323Z.mjs';
4
+ import '../chunk-S27LMEYZ.mjs';
5
5
  import '../chunk-QHELXPSL.mjs';
6
6
  //# sourceMappingURL=index.mjs.map
7
7
  //# sourceMappingURL=index.mjs.map
@@ -1,4 +1,4 @@
1
- import { DEFAULT_PRICING } from './chunk-Z2WIEJR7.mjs';
1
+ import { DEFAULT_PRICING } from './chunk-S27LMEYZ.mjs';
2
2
 
3
3
  /**
4
4
  * @agentproto/model-catalog v0.1.0
@@ -364,5 +364,5 @@ function modelMatchesKind(model, kind) {
364
364
  }
365
365
 
366
366
  export { assertReservedPrefixDiscipline, getActions, getEnrichment, isActionTag, modelHasAction, modelHasTag, modelMatchesCatalogPriceTier, modelMatchesKind, modelMatchesPriceTier, priceTierForModel };
367
- //# sourceMappingURL=chunk-CEP4H4FD.mjs.map
368
- //# sourceMappingURL=chunk-CEP4H4FD.mjs.map
367
+ //# sourceMappingURL=chunk-3WNSSJTB.mjs.map
368
+ //# sourceMappingURL=chunk-3WNSSJTB.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/registry/actions.ts","../src/enrichment/index.ts"],"names":[],"mappings":"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","file":"chunk-CEP4H4FD.mjs","sourcesContent":["/**\n * Action projection — `<kind>:<verb>` namespaced strings derived from\n * each model's per-kind capability object.\n *\n * Convention:\n * - `image:generate`, `image:edit`, `image:upscale`, `image:reference`\n * - `video:text_to`, `video:image_to`, `video:subject_reference`,\n * `video:audio`\n * - `audio:tts`, `audio:stt`, `audio:realtime`\n * - `llm:vision`, `llm:tool_use`, `llm:reasoning`, `llm:long_context`\n *\n * Always `<kind>:<verb_or_modifier>`, snake_case.\n *\n * Action tags share a string array with curation tags but live behind the\n * reserved `<kind>:` prefix. Curation tags MUST NOT use the prefix —\n * `assertReservedPrefixDiscipline` enforces this at module load.\n *\n * The reason this lives in the catalog package (not enrichment) is that\n * actions are intrinsic to a model — derived from its capability fields,\n * not subjectively curated. Keeping the projection separate makes it\n * trivially callable from anywhere (e.g. a UI badge component) without\n * pulling the heuristic enrichment table.\n */\n\nimport type { ResolvedModel } from \"./index.js\"\n\nconst RESERVED_KIND_PREFIXES = [\"llm:\", \"image:\", \"video:\", \"audio:\"] as const\n\n/**\n * Compute the action tags a model supports. Returns an empty array for\n * models with no recognized capability bits (defensive — never throws).\n */\nexport function getActions(model: ResolvedModel): string[] {\n switch (model.kind) {\n case \"image\": {\n const out: string[] = []\n const c = model.def.capabilities\n if (c.generate) out.push(\"image:generate\")\n if (c.edit) out.push(\"image:edit\")\n if (c.upscale) out.push(\"image:upscale\")\n if (model.def.referenceImages.supported) out.push(\"image:reference\")\n return out\n }\n case \"video\": {\n const out: string[] = []\n const c = model.def.capabilities\n if (c.textToVideo) out.push(\"video:text_to\")\n if (c.imageToVideo) out.push(\"video:image_to\")\n if (c.subjectReference) out.push(\"video:subject_reference\")\n if (c.audio) out.push(\"video:audio\")\n return out\n }\n case \"audio\": {\n const out: string[] = []\n const c = model.def.capabilities\n // One action per enabled modality (a model may do more than one).\n if (c.tts) out.push(\"audio:tts\")\n if (c.stt) out.push(\"audio:stt\")\n if (c.s2s) out.push(\"audio:s2s\")\n if (c.voiceCloning) out.push(\"audio:voice_cloning\")\n if (c.streaming) out.push(\"audio:streaming\")\n if (c.diarization) out.push(\"audio:diarization\")\n if (c.timestamps) out.push(\"audio:timestamps\")\n return out\n }\n case \"voice\":\n // Voice metadata represents a render-target, not an action — tag it\n // with the engine modality so it matches the same action vocabulary\n // as audio models (s2s engines vs sequential tts).\n return model.voice.provider === \"openai-realtime\" ||\n model.voice.provider === \"gemini-live\"\n ? [\"audio:s2s\"]\n : [\"audio:tts\"]\n case \"llm\": {\n // LLM actions piggyback on the catalog-attached capability metadata\n // when present. The legacy `LLMPricing` shape doesn't carry\n // capabilities directly — those live in the agent-framework\n // catalog (to be folded into model-catalog/llm in a future phase).\n // For v1, infer from canonical id heuristics. Keep conservative:\n // only emit actions we can prove from the id.\n const out: string[] = []\n const id = model.canonicalId.toLowerCase()\n // Tool use: every modern frontier LLM supports it. Bare `gpt`,\n // `claude`, `gemini` are tool-capable; small fast variants\n // (haiku, mini, flash, lite) are too. We assume yes unless the\n // id obviously rules it out.\n out.push(\"llm:tool_use\")\n // Reasoning: opus / sonnet / pro / r1 / o1 / o3 / thinking models.\n if (\n /opus|sonnet|claude-3.7|gpt-4\\.5|gpt-5|gemini-.*-pro|deepseek-r1|o1|o3|thinking|reasoning/.test(\n id\n )\n ) {\n out.push(\"llm:reasoning\")\n }\n // Vision: Sonnet, Opus, GPT-4o, Gemini, multimodal-marked ids.\n if (\n /sonnet|opus|gpt-4o|gpt-5|gemini|claude-3|claude-haiku-4|vision|vl/.test(\n id\n )\n ) {\n out.push(\"llm:vision\")\n }\n // Long context: Gemini, GPT-4.1, Sonnet 4 (1M), Kimi, Grok 4 fast.\n if (\n /gemini|gpt-4\\.1|claude-sonnet-4|kimi|grok-4|qwen3-next|long.context/.test(\n id\n )\n ) {\n out.push(\"llm:long_context\")\n }\n return out\n }\n }\n}\n\n/**\n * Validate that a string array intended as curation tags does not use a\n * reserved `<kind>:` prefix. Run at module load on the explicit\n * enrichment map; throws on violation so the offending entry is caught\n * before any access decision is made.\n *\n * Caller pattern (in tests / module-load init):\n * for (const e of Object.values(EXPLICIT_ENRICHMENT))\n * assertReservedPrefixDiscipline(e.tags)\n */\nexport function assertReservedPrefixDiscipline(\n curationTags: readonly string[]\n): void {\n for (const tag of curationTags) {\n for (const prefix of RESERVED_KIND_PREFIXES) {\n if (tag.startsWith(prefix)) {\n throw new Error(\n `Reserved tag prefix \"${prefix}\" used in curation tag \"${tag}\". ` +\n `Action tags (\\`<kind>:<verb>\\`) are derived automatically by ` +\n `getActions() — do not put them in curation arrays.`\n )\n }\n }\n }\n}\n\n/**\n * Returns true iff the given tag is in the reserved action-tag namespace.\n * Useful for callers that need to display curation tags only (e.g.\n * an admin UI) without hardcoding the prefix list.\n */\nexport function isActionTag(tag: string): boolean {\n return RESERVED_KIND_PREFIXES.some(p => tag.startsWith(p))\n}\n","/**\n * Model enrichment — `catalogPriceTier` / `tags` / `lifecycle` / `actions`\n * per model id.\n *\n * Bridge between the legacy data shape (`ImageModelDefinition`,\n * `VideoModelDefinition`, `LLMPricing`) and the v2 access-rule\n * primitives that target by tier, tag, and action. Without this, rules\n * like `priceTier:premium` and `tag:nsfw` would never match anything.\n *\n * Two layers:\n * 1. Explicit map for the curated set we know about (overrides win).\n * 2. Heuristic inference for any model not in the explicit map\n * (catalogPriceTier from creditCost / token rates; tags from kind +\n * provider).\n *\n * Actions (`<kind>:<verb>` — e.g. `image:generate`, `llm:tool_use`) are\n * computed from per-kind capability objects via `getActions` and merged\n * into `tags` so existing tag-based access rules match action targets\n * without any evaluator change. The reserved `<kind>:` prefix is enforced\n * by `assertReservedPrefixDiscipline` at module load — free-form curation\n * tags must NOT use it.\n *\n * Add an entry to `EXPLICIT_ENRICHMENT` when you want exact control;\n * skip it when defaults are good enough.\n */\n\nimport type { CatalogPriceTier, Lifecycle, ModelKind } from \"../schema/index.js\"\nimport type { ResolvedModel } from \"../registry/index.js\"\nimport { DEFAULT_PRICING } from \"../llm/index.js\"\nimport {\n getActions,\n assertReservedPrefixDiscipline,\n} from \"../registry/actions.js\"\n\nexport interface ModelEnrichment {\n catalogPriceTier: CatalogPriceTier\n /** Curation tags + action tags (`<kind>:<verb>`) merged. */\n tags: readonly string[]\n lifecycle: Lifecycle\n /** Action tags only — convenience subset of `tags`. */\n actions: readonly string[]\n}\n\n/**\n * Internal shape for the curated explicit-enrichment map. The map carries\n * only the *curation* fields — `tags` here is curation-only (no action\n * tags). `getEnrichment` adds derived `actions` and merges them into\n * `tags` at read time.\n */\ninterface ExplicitEnrichment {\n catalogPriceTier: CatalogPriceTier\n tags: readonly string[]\n lifecycle: Lifecycle\n}\n\nconst EXPLICIT_ENRICHMENT: Record<string, ExplicitEnrichment> = {\n // ── LLM ──────────────────────────────────────────────────────────────\n \"claude-opus-4-5\": {\n catalogPriceTier: \"premium\",\n tags: [\"llm\", \"anthropic\", \"premium\", \"reasoning\"],\n lifecycle: \"stable\",\n },\n \"claude-sonnet-4-5\": {\n catalogPriceTier: \"high\",\n tags: [\"llm\", \"anthropic\"],\n lifecycle: \"stable\",\n },\n \"claude-haiku-4-5\": {\n catalogPriceTier: \"low\",\n tags: [\"llm\", \"anthropic\", \"fast\"],\n lifecycle: \"stable\",\n },\n \"gemini-2.5-flash\": {\n catalogPriceTier: \"low\",\n tags: [\"llm\", \"google\", \"fast\"],\n lifecycle: \"stable\",\n },\n \"gemini-2.5-pro\": {\n catalogPriceTier: \"mid\",\n tags: [\"llm\", \"google\", \"reasoning\"],\n lifecycle: \"stable\",\n },\n \"gpt-4.1\": {\n catalogPriceTier: \"mid\",\n tags: [\"llm\", \"openai\"],\n lifecycle: \"stable\",\n },\n \"gpt-4.1-mini\": {\n catalogPriceTier: \"low\",\n tags: [\"llm\", \"openai\", \"fast\"],\n lifecycle: \"stable\",\n },\n \"gpt-4o\": {\n catalogPriceTier: \"mid\",\n tags: [\"llm\", \"openai\"],\n lifecycle: \"stable\",\n },\n \"gpt-4o-mini\": {\n catalogPriceTier: \"low\",\n tags: [\"llm\", \"openai\", \"fast\"],\n lifecycle: \"stable\",\n },\n\n // ── Image (highlights — others fall through to heuristic) ────────────\n \"nano-banana-pro\": {\n catalogPriceTier: \"high\",\n tags: [\"image\", \"google\", \"high-quality\", \"text-rendering\"],\n lifecycle: \"stable\",\n },\n \"nano-banana-2\": {\n catalogPriceTier: \"mid\",\n tags: [\"image\", \"google\"],\n lifecycle: \"stable\",\n },\n \"nano-banana\": {\n catalogPriceTier: \"low\",\n tags: [\"image\", \"google\", \"fast\"],\n lifecycle: \"stable\",\n },\n \"flux-2-dev\": {\n catalogPriceTier: \"low\",\n tags: [\"image\", \"bfl\", \"flux\"],\n lifecycle: \"stable\",\n },\n \"flux-kontext-pro\": {\n catalogPriceTier: \"low\",\n tags: [\"image\", \"bfl\", \"flux\", \"edit\"],\n lifecycle: \"stable\",\n },\n \"flux-kontext-max\": {\n catalogPriceTier: \"mid\",\n tags: [\"image\", \"bfl\", \"flux\", \"edit\", \"high-quality\"],\n lifecycle: \"stable\",\n },\n \"seedream-4\": {\n catalogPriceTier: \"low\",\n tags: [\"image\", \"bytedance\", \"photorealistic\"],\n lifecycle: \"stable\",\n },\n\n // ── Video (highlights) ──────────────────────────────────────────────\n \"google/veo-3.1\": {\n catalogPriceTier: \"high\",\n tags: [\"video\", \"google\", \"veo\", \"high-quality\", \"audio\"],\n lifecycle: \"stable\",\n },\n \"google/veo-3.1-fast\": {\n catalogPriceTier: \"mid\",\n tags: [\"video\", \"google\", \"veo\", \"fast\", \"audio\"],\n lifecycle: \"stable\",\n },\n \"kwaivgi/kling-v2.5-turbo-pro\": {\n catalogPriceTier: \"low\",\n tags: [\"video\", \"kling\", \"fast\"],\n lifecycle: \"deprecated\",\n },\n}\n\n// Module-load lint: every curation tag in the explicit map must avoid the\n// reserved `<kind>:` prefix. Action tags are derived by `getActions`,\n// never written by hand.\nfor (const entry of Object.values(EXPLICIT_ENRICHMENT)) {\n assertReservedPrefixDiscipline(entry.tags)\n}\n\n/**\n * Heuristic catalogPriceTier — used when an entry has no explicit\n * enrichment. Buckets are intentionally generous so rules don't need\n * every model priced exactly.\n */\nfunction inferCatalogPriceTier(model: ResolvedModel): CatalogPriceTier {\n switch (model.kind) {\n case \"image\": {\n // Derive from baseCost (USD) — formula bucketing keeps tiers\n // stable when category markup changes.\n const usd = model.def.pricing.baseCost\n if (usd <= 0.02) return \"low\"\n if (usd <= 0.05) return \"mid\"\n if (usd <= 0.1) return \"high\"\n return \"premium\"\n }\n case \"video\": {\n const usd = model.def.pricing.baseCost\n if (usd <= 0.3) return \"low\"\n if (usd <= 0.7) return \"mid\"\n if (usd <= 1.2) return \"high\"\n return \"premium\"\n }\n case \"llm\": {\n // Bucket on provider USD/1M output tokens (output dominates spend).\n // Stable across markup changes — was previously keyed on the\n // credit-side rate, which moved with formula tweaks. A known-but-\n // unpriced id (pricing undefined — see ResolvedModel's doc comment)\n // buckets on DEFAULT_PRICING, same fallback convention as\n // `calculateLLMCreditCost` and the HuggingFace route in\n // `route-identity/index.ts`.\n const out = model.pricing?.outputPer1M ?? DEFAULT_PRICING.outputPer1M\n if (out <= 1) return \"low\"\n if (out <= 10) return \"mid\"\n if (out <= 30) return \"high\"\n return \"premium\"\n }\n case \"audio\": {\n // Bucket on production USD per billing unit (1k chars or 1 min).\n const usd = model.def.pricing.baseCost\n if (usd <= 0.01) return \"low\"\n if (usd <= 0.05) return \"mid\"\n if (usd <= 0.2) return \"high\"\n return \"premium\"\n }\n case \"voice\":\n // Voice metadata isn't priced on its own.\n return \"low\"\n }\n}\n\n/**\n * Display price gauge level (1..5) for a model — the **visual** \"price\n * mostly\" indicator (Low / Medium / High / Max / Ultra) the pickers and the\n * estimator render as a bar. Distinct from {@link inferCatalogPriceTier}:\n * that one drives 4-value *access* rules (`priceTier:premium`) and must stay a\n * `CatalogPriceTier`; this is cosmetic and free to span 5 bands. Both bucket\n * the same provider USD cost, so they move together by construction.\n */\nexport function priceTierForModel(model: ResolvedModel): number {\n switch (model.kind) {\n case \"image\": {\n const usd = model.def.pricing.baseCost\n if (usd <= 0.02) return 1\n if (usd <= 0.05) return 2\n if (usd <= 0.1) return 3\n if (usd <= 0.2) return 4\n return 5\n }\n case \"video\": {\n const usd = model.def.pricing.baseCost\n if (usd <= 0.3) return 1\n if (usd <= 0.7) return 2\n if (usd <= 1.2) return 3\n if (usd <= 2.5) return 4\n return 5\n }\n case \"llm\": {\n // Same DEFAULT_PRICING fallback as inferCatalogPriceTier above.\n const out = model.pricing?.outputPer1M ?? DEFAULT_PRICING.outputPer1M\n if (out <= 1) return 1\n if (out <= 10) return 2\n if (out <= 30) return 3\n if (out <= 75) return 4\n return 5\n }\n case \"audio\": {\n const usd = model.def.pricing.baseCost\n if (usd <= 0.01) return 1\n if (usd <= 0.05) return 2\n if (usd <= 0.2) return 3\n if (usd <= 0.5) return 4\n return 5\n }\n case \"voice\":\n return 1\n }\n}\n\nfunction inferTags(model: ResolvedModel): string[] {\n const tags: string[] = [model.kind]\n switch (model.kind) {\n case \"image\":\n if (model.def.provider) tags.push(model.def.provider)\n if (model.def.capabilities.edit) tags.push(\"edit\")\n if (model.def.capabilities.upscale) tags.push(\"upscale\")\n if (model.def.referenceImages.supported) tags.push(\"ref-images\")\n if (!model.def.agentVisible) tags.push(\"hidden\")\n break\n case \"video\":\n tags.push(model.def.provider)\n if (model.def.capabilities.audio) tags.push(\"audio\")\n if (model.def.capabilities.subjectReference) tags.push(\"subject-ref\")\n if (model.def.capabilities.imageToVideo) tags.push(\"i2v\")\n if (model.def.capabilities.textToVideo) tags.push(\"t2v\")\n if (!model.def.agentVisible) tags.push(\"hidden\")\n break\n case \"llm\":\n // Provider inferred from canonical id prefix (anthropic / openai / google).\n if (model.canonicalId.includes(\"claude\")) tags.push(\"anthropic\")\n else if (model.canonicalId.includes(\"gpt\")) tags.push(\"openai\")\n else if (model.canonicalId.includes(\"gemini\")) tags.push(\"google\")\n break\n case \"audio\":\n tags.push(model.def.provider)\n // Modality is multi-valued — emit a tag per enabled capability so\n // access rules can target `s2s` / `tts` / `stt` independently.\n if (model.def.capabilities.tts) tags.push(\"tts\")\n if (model.def.capabilities.stt) tags.push(\"stt\")\n if (model.def.capabilities.s2s) tags.push(\"s2s\")\n for (const lang of model.def.capabilities.languages) {\n tags.push(`lang:${lang}`)\n }\n if (model.def.capabilities.voiceCloning) tags.push(\"voice-cloning\")\n if (model.def.capabilities.streaming) tags.push(\"streaming\")\n if (model.def.capabilities.diarization) tags.push(\"diarization\")\n if (model.def.capabilities.timestamps) tags.push(\"timestamps\")\n if (!model.def.agentVisible) tags.push(\"hidden\")\n break\n case \"voice\": {\n // \"voice\" is already pushed via `model.kind`. Tag the engine provider\n // and its modality (s2s engines vs sequential tts) so voice access\n // rules can target the same `s2s`/`tts` vocabulary as audio models.\n tags.push(model.voice.provider)\n const s2sVoice =\n model.voice.provider === \"openai-realtime\" ||\n model.voice.provider === \"gemini-live\"\n tags.push(s2sVoice ? \"s2s\" : \"tts\")\n tags.push(`gender:${model.voice.gender}`)\n tags.push(`lang:${model.voice.primaryLanguage}`)\n break\n }\n }\n return tags\n}\n\nfunction inferLifecycle(model: ResolvedModel): Lifecycle {\n // Image / video catalogs use `agentVisible: false` to mark legacy /\n // less-used entries — treat those as \"deprecated\" for rule purposes.\n if (model.kind === \"image\" && !model.def.agentVisible) return \"deprecated\"\n if (model.kind === \"video\" && !model.def.agentVisible) return \"deprecated\"\n return \"stable\"\n}\n\n/**\n * Compose the curation portion of enrichment (everything except actions).\n * Internal — `getEnrichment` is the public entry that adds actions.\n */\nfunction getCurationEnrichment(model: ResolvedModel): ExplicitEnrichment {\n const explicit = EXPLICIT_ENRICHMENT[model.id]\n if (explicit) return explicit\n // For LLM, also try the canonical id (e.g., \"claude-sonnet-4-5\" →\n // \"claude-sonnet-4\" maps via aliases).\n if (model.kind === \"llm\" && model.canonicalId !== model.id) {\n const byCanonical = EXPLICIT_ENRICHMENT[model.canonicalId]\n if (byCanonical) return byCanonical\n }\n return {\n catalogPriceTier: inferCatalogPriceTier(model),\n tags: inferTags(model),\n lifecycle: inferLifecycle(model),\n }\n}\n\n/**\n * Merge two tag arrays preserving first-occurrence order, deduped.\n * Used to fold action tags into curation tags without duplicating.\n */\nfunction mergeTags(\n curation: readonly string[],\n actions: readonly string[]\n): string[] {\n const out: string[] = []\n const seen = new Set<string>()\n for (const t of curation) {\n if (seen.has(t)) continue\n seen.add(t)\n out.push(t)\n }\n for (const t of actions) {\n if (seen.has(t)) continue\n seen.add(t)\n out.push(t)\n }\n return out\n}\n\n/**\n * Resolve enrichment for any model. Explicit map wins; heuristic fallback\n * fills the rest. Action tags (`<kind>:<verb>`) are derived from the\n * model's capability fields and merged into `tags`. Always returns a\n * value (never undefined).\n */\nexport function getEnrichment(model: ResolvedModel): ModelEnrichment {\n const curation = getCurationEnrichment(model)\n const actions = getActions(model)\n return {\n catalogPriceTier: curation.catalogPriceTier,\n tags: mergeTags(curation.tags, actions),\n lifecycle: curation.lifecycle,\n actions,\n }\n}\n\nexport function modelHasTag(model: ResolvedModel, tag: string): boolean {\n return getEnrichment(model).tags.includes(tag)\n}\n\nexport function modelHasAction(model: ResolvedModel, action: string): boolean {\n return getEnrichment(model).actions.includes(action)\n}\n\nexport function modelMatchesCatalogPriceTier(\n model: ResolvedModel,\n tier: CatalogPriceTier\n): boolean {\n return getEnrichment(model).catalogPriceTier === tier\n}\n\n/**\n * @deprecated Use `modelMatchesCatalogPriceTier`. Kept for back-compat\n * with the v1 evaluator's switch case which still uses the\n * `priceTier` discriminator string. The function itself routes to the\n * canonical name.\n */\nexport function modelMatchesPriceTier(\n model: ResolvedModel,\n tier: CatalogPriceTier\n): boolean {\n return modelMatchesCatalogPriceTier(model, tier)\n}\n\nexport function modelMatchesKind(\n model: ResolvedModel,\n kind: ModelKind\n): boolean {\n return model.kind === kind\n}\n"]}
1
+ {"version":3,"sources":["../src/registry/actions.ts","../src/enrichment/index.ts"],"names":[],"mappings":"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","file":"chunk-3WNSSJTB.mjs","sourcesContent":["/**\n * Action projection — `<kind>:<verb>` namespaced strings derived from\n * each model's per-kind capability object.\n *\n * Convention:\n * - `image:generate`, `image:edit`, `image:upscale`, `image:reference`\n * - `video:text_to`, `video:image_to`, `video:subject_reference`,\n * `video:audio`\n * - `audio:tts`, `audio:stt`, `audio:realtime`\n * - `llm:vision`, `llm:tool_use`, `llm:reasoning`, `llm:long_context`\n *\n * Always `<kind>:<verb_or_modifier>`, snake_case.\n *\n * Action tags share a string array with curation tags but live behind the\n * reserved `<kind>:` prefix. Curation tags MUST NOT use the prefix —\n * `assertReservedPrefixDiscipline` enforces this at module load.\n *\n * The reason this lives in the catalog package (not enrichment) is that\n * actions are intrinsic to a model — derived from its capability fields,\n * not subjectively curated. Keeping the projection separate makes it\n * trivially callable from anywhere (e.g. a UI badge component) without\n * pulling the heuristic enrichment table.\n */\n\nimport type { ResolvedModel } from \"./index.js\"\n\nconst RESERVED_KIND_PREFIXES = [\"llm:\", \"image:\", \"video:\", \"audio:\"] as const\n\n/**\n * Compute the action tags a model supports. Returns an empty array for\n * models with no recognized capability bits (defensive — never throws).\n */\nexport function getActions(model: ResolvedModel): string[] {\n switch (model.kind) {\n case \"image\": {\n const out: string[] = []\n const c = model.def.capabilities\n if (c.generate) out.push(\"image:generate\")\n if (c.edit) out.push(\"image:edit\")\n if (c.upscale) out.push(\"image:upscale\")\n if (model.def.referenceImages.supported) out.push(\"image:reference\")\n return out\n }\n case \"video\": {\n const out: string[] = []\n const c = model.def.capabilities\n if (c.textToVideo) out.push(\"video:text_to\")\n if (c.imageToVideo) out.push(\"video:image_to\")\n if (c.subjectReference) out.push(\"video:subject_reference\")\n if (c.audio) out.push(\"video:audio\")\n return out\n }\n case \"audio\": {\n const out: string[] = []\n const c = model.def.capabilities\n // One action per enabled modality (a model may do more than one).\n if (c.tts) out.push(\"audio:tts\")\n if (c.stt) out.push(\"audio:stt\")\n if (c.s2s) out.push(\"audio:s2s\")\n if (c.voiceCloning) out.push(\"audio:voice_cloning\")\n if (c.streaming) out.push(\"audio:streaming\")\n if (c.diarization) out.push(\"audio:diarization\")\n if (c.timestamps) out.push(\"audio:timestamps\")\n return out\n }\n case \"voice\":\n // Voice metadata represents a render-target, not an action — tag it\n // with the engine modality so it matches the same action vocabulary\n // as audio models (s2s engines vs sequential tts).\n return model.voice.provider === \"openai-realtime\" ||\n model.voice.provider === \"gemini-live\"\n ? [\"audio:s2s\"]\n : [\"audio:tts\"]\n case \"llm\": {\n // LLM actions piggyback on the catalog-attached capability metadata\n // when present. The legacy `LLMPricing` shape doesn't carry\n // capabilities directly — those live in the agent-framework\n // catalog (to be folded into model-catalog/llm in a future phase).\n // For v1, infer from canonical id heuristics. Keep conservative:\n // only emit actions we can prove from the id.\n const out: string[] = []\n const id = model.canonicalId.toLowerCase()\n // Tool use: every modern frontier LLM supports it. Bare `gpt`,\n // `claude`, `gemini` are tool-capable; small fast variants\n // (haiku, mini, flash, lite) are too. We assume yes unless the\n // id obviously rules it out.\n out.push(\"llm:tool_use\")\n // Reasoning: opus / sonnet / pro / r1 / o1 / o3 / thinking models.\n if (\n /opus|sonnet|claude-3.7|gpt-4\\.5|gpt-5|gemini-.*-pro|deepseek-r1|o1|o3|thinking|reasoning/.test(\n id\n )\n ) {\n out.push(\"llm:reasoning\")\n }\n // Vision: Sonnet, Opus, GPT-4o, Gemini, multimodal-marked ids.\n if (\n /sonnet|opus|gpt-4o|gpt-5|gemini|claude-3|claude-haiku-4|vision|vl/.test(\n id\n )\n ) {\n out.push(\"llm:vision\")\n }\n // Long context: Gemini, GPT-4.1, Sonnet 4 (1M), Kimi, Grok 4 fast.\n if (\n /gemini|gpt-4\\.1|claude-sonnet-4|kimi|grok-4|qwen3-next|long.context/.test(\n id\n )\n ) {\n out.push(\"llm:long_context\")\n }\n return out\n }\n }\n}\n\n/**\n * Validate that a string array intended as curation tags does not use a\n * reserved `<kind>:` prefix. Run at module load on the explicit\n * enrichment map; throws on violation so the offending entry is caught\n * before any access decision is made.\n *\n * Caller pattern (in tests / module-load init):\n * for (const e of Object.values(EXPLICIT_ENRICHMENT))\n * assertReservedPrefixDiscipline(e.tags)\n */\nexport function assertReservedPrefixDiscipline(\n curationTags: readonly string[]\n): void {\n for (const tag of curationTags) {\n for (const prefix of RESERVED_KIND_PREFIXES) {\n if (tag.startsWith(prefix)) {\n throw new Error(\n `Reserved tag prefix \"${prefix}\" used in curation tag \"${tag}\". ` +\n `Action tags (\\`<kind>:<verb>\\`) are derived automatically by ` +\n `getActions() — do not put them in curation arrays.`\n )\n }\n }\n }\n}\n\n/**\n * Returns true iff the given tag is in the reserved action-tag namespace.\n * Useful for callers that need to display curation tags only (e.g.\n * an admin UI) without hardcoding the prefix list.\n */\nexport function isActionTag(tag: string): boolean {\n return RESERVED_KIND_PREFIXES.some(p => tag.startsWith(p))\n}\n","/**\n * Model enrichment — `catalogPriceTier` / `tags` / `lifecycle` / `actions`\n * per model id.\n *\n * Bridge between the legacy data shape (`ImageModelDefinition`,\n * `VideoModelDefinition`, `LLMPricing`) and the v2 access-rule\n * primitives that target by tier, tag, and action. Without this, rules\n * like `priceTier:premium` and `tag:nsfw` would never match anything.\n *\n * Two layers:\n * 1. Explicit map for the curated set we know about (overrides win).\n * 2. Heuristic inference for any model not in the explicit map\n * (catalogPriceTier from creditCost / token rates; tags from kind +\n * provider).\n *\n * Actions (`<kind>:<verb>` — e.g. `image:generate`, `llm:tool_use`) are\n * computed from per-kind capability objects via `getActions` and merged\n * into `tags` so existing tag-based access rules match action targets\n * without any evaluator change. The reserved `<kind>:` prefix is enforced\n * by `assertReservedPrefixDiscipline` at module load — free-form curation\n * tags must NOT use it.\n *\n * Add an entry to `EXPLICIT_ENRICHMENT` when you want exact control;\n * skip it when defaults are good enough.\n */\n\nimport type { CatalogPriceTier, Lifecycle, ModelKind } from \"../schema/index.js\"\nimport type { ResolvedModel } from \"../registry/index.js\"\nimport { DEFAULT_PRICING } from \"../llm/index.js\"\nimport {\n getActions,\n assertReservedPrefixDiscipline,\n} from \"../registry/actions.js\"\n\nexport interface ModelEnrichment {\n catalogPriceTier: CatalogPriceTier\n /** Curation tags + action tags (`<kind>:<verb>`) merged. */\n tags: readonly string[]\n lifecycle: Lifecycle\n /** Action tags only — convenience subset of `tags`. */\n actions: readonly string[]\n}\n\n/**\n * Internal shape for the curated explicit-enrichment map. The map carries\n * only the *curation* fields — `tags` here is curation-only (no action\n * tags). `getEnrichment` adds derived `actions` and merges them into\n * `tags` at read time.\n */\ninterface ExplicitEnrichment {\n catalogPriceTier: CatalogPriceTier\n tags: readonly string[]\n lifecycle: Lifecycle\n}\n\nconst EXPLICIT_ENRICHMENT: Record<string, ExplicitEnrichment> = {\n // ── LLM ──────────────────────────────────────────────────────────────\n \"claude-opus-4-5\": {\n catalogPriceTier: \"premium\",\n tags: [\"llm\", \"anthropic\", \"premium\", \"reasoning\"],\n lifecycle: \"stable\",\n },\n \"claude-sonnet-4-5\": {\n catalogPriceTier: \"high\",\n tags: [\"llm\", \"anthropic\"],\n lifecycle: \"stable\",\n },\n \"claude-haiku-4-5\": {\n catalogPriceTier: \"low\",\n tags: [\"llm\", \"anthropic\", \"fast\"],\n lifecycle: \"stable\",\n },\n \"gemini-2.5-flash\": {\n catalogPriceTier: \"low\",\n tags: [\"llm\", \"google\", \"fast\"],\n lifecycle: \"stable\",\n },\n \"gemini-2.5-pro\": {\n catalogPriceTier: \"mid\",\n tags: [\"llm\", \"google\", \"reasoning\"],\n lifecycle: \"stable\",\n },\n \"gpt-4.1\": {\n catalogPriceTier: \"mid\",\n tags: [\"llm\", \"openai\"],\n lifecycle: \"stable\",\n },\n \"gpt-4.1-mini\": {\n catalogPriceTier: \"low\",\n tags: [\"llm\", \"openai\", \"fast\"],\n lifecycle: \"stable\",\n },\n \"gpt-4o\": {\n catalogPriceTier: \"mid\",\n tags: [\"llm\", \"openai\"],\n lifecycle: \"stable\",\n },\n \"gpt-4o-mini\": {\n catalogPriceTier: \"low\",\n tags: [\"llm\", \"openai\", \"fast\"],\n lifecycle: \"stable\",\n },\n\n // ── Image (highlights — others fall through to heuristic) ────────────\n \"nano-banana-pro\": {\n catalogPriceTier: \"high\",\n tags: [\"image\", \"google\", \"high-quality\", \"text-rendering\"],\n lifecycle: \"stable\",\n },\n \"nano-banana-2\": {\n catalogPriceTier: \"mid\",\n tags: [\"image\", \"google\"],\n lifecycle: \"stable\",\n },\n \"nano-banana\": {\n catalogPriceTier: \"low\",\n tags: [\"image\", \"google\", \"fast\"],\n lifecycle: \"stable\",\n },\n \"flux-2-dev\": {\n catalogPriceTier: \"low\",\n tags: [\"image\", \"bfl\", \"flux\"],\n lifecycle: \"stable\",\n },\n \"flux-kontext-pro\": {\n catalogPriceTier: \"low\",\n tags: [\"image\", \"bfl\", \"flux\", \"edit\"],\n lifecycle: \"stable\",\n },\n \"flux-kontext-max\": {\n catalogPriceTier: \"mid\",\n tags: [\"image\", \"bfl\", \"flux\", \"edit\", \"high-quality\"],\n lifecycle: \"stable\",\n },\n \"seedream-4\": {\n catalogPriceTier: \"low\",\n tags: [\"image\", \"bytedance\", \"photorealistic\"],\n lifecycle: \"stable\",\n },\n\n // ── Video (highlights) ──────────────────────────────────────────────\n \"google/veo-3.1\": {\n catalogPriceTier: \"high\",\n tags: [\"video\", \"google\", \"veo\", \"high-quality\", \"audio\"],\n lifecycle: \"stable\",\n },\n \"google/veo-3.1-fast\": {\n catalogPriceTier: \"mid\",\n tags: [\"video\", \"google\", \"veo\", \"fast\", \"audio\"],\n lifecycle: \"stable\",\n },\n \"kwaivgi/kling-v2.5-turbo-pro\": {\n catalogPriceTier: \"low\",\n tags: [\"video\", \"kling\", \"fast\"],\n lifecycle: \"deprecated\",\n },\n}\n\n// Module-load lint: every curation tag in the explicit map must avoid the\n// reserved `<kind>:` prefix. Action tags are derived by `getActions`,\n// never written by hand.\nfor (const entry of Object.values(EXPLICIT_ENRICHMENT)) {\n assertReservedPrefixDiscipline(entry.tags)\n}\n\n/**\n * Heuristic catalogPriceTier — used when an entry has no explicit\n * enrichment. Buckets are intentionally generous so rules don't need\n * every model priced exactly.\n */\nfunction inferCatalogPriceTier(model: ResolvedModel): CatalogPriceTier {\n switch (model.kind) {\n case \"image\": {\n // Derive from baseCost (USD) — formula bucketing keeps tiers\n // stable when category markup changes.\n const usd = model.def.pricing.baseCost\n if (usd <= 0.02) return \"low\"\n if (usd <= 0.05) return \"mid\"\n if (usd <= 0.1) return \"high\"\n return \"premium\"\n }\n case \"video\": {\n const usd = model.def.pricing.baseCost\n if (usd <= 0.3) return \"low\"\n if (usd <= 0.7) return \"mid\"\n if (usd <= 1.2) return \"high\"\n return \"premium\"\n }\n case \"llm\": {\n // Bucket on provider USD/1M output tokens (output dominates spend).\n // Stable across markup changes — was previously keyed on the\n // credit-side rate, which moved with formula tweaks. A known-but-\n // unpriced id (pricing undefined — see ResolvedModel's doc comment)\n // buckets on DEFAULT_PRICING, same fallback convention as\n // `calculateLLMCreditCost` and the HuggingFace route in\n // `route-identity/index.ts`.\n const out = model.pricing?.outputPer1M ?? DEFAULT_PRICING.outputPer1M\n if (out <= 1) return \"low\"\n if (out <= 10) return \"mid\"\n if (out <= 30) return \"high\"\n return \"premium\"\n }\n case \"audio\": {\n // Bucket on production USD per billing unit (1k chars or 1 min).\n const usd = model.def.pricing.baseCost\n if (usd <= 0.01) return \"low\"\n if (usd <= 0.05) return \"mid\"\n if (usd <= 0.2) return \"high\"\n return \"premium\"\n }\n case \"voice\":\n // Voice metadata isn't priced on its own.\n return \"low\"\n }\n}\n\n/**\n * Display price gauge level (1..5) for a model — the **visual** \"price\n * mostly\" indicator (Low / Medium / High / Max / Ultra) the pickers and the\n * estimator render as a bar. Distinct from {@link inferCatalogPriceTier}:\n * that one drives 4-value *access* rules (`priceTier:premium`) and must stay a\n * `CatalogPriceTier`; this is cosmetic and free to span 5 bands. Both bucket\n * the same provider USD cost, so they move together by construction.\n */\nexport function priceTierForModel(model: ResolvedModel): number {\n switch (model.kind) {\n case \"image\": {\n const usd = model.def.pricing.baseCost\n if (usd <= 0.02) return 1\n if (usd <= 0.05) return 2\n if (usd <= 0.1) return 3\n if (usd <= 0.2) return 4\n return 5\n }\n case \"video\": {\n const usd = model.def.pricing.baseCost\n if (usd <= 0.3) return 1\n if (usd <= 0.7) return 2\n if (usd <= 1.2) return 3\n if (usd <= 2.5) return 4\n return 5\n }\n case \"llm\": {\n // Same DEFAULT_PRICING fallback as inferCatalogPriceTier above.\n const out = model.pricing?.outputPer1M ?? DEFAULT_PRICING.outputPer1M\n if (out <= 1) return 1\n if (out <= 10) return 2\n if (out <= 30) return 3\n if (out <= 75) return 4\n return 5\n }\n case \"audio\": {\n const usd = model.def.pricing.baseCost\n if (usd <= 0.01) return 1\n if (usd <= 0.05) return 2\n if (usd <= 0.2) return 3\n if (usd <= 0.5) return 4\n return 5\n }\n case \"voice\":\n return 1\n }\n}\n\nfunction inferTags(model: ResolvedModel): string[] {\n const tags: string[] = [model.kind]\n switch (model.kind) {\n case \"image\":\n if (model.def.provider) tags.push(model.def.provider)\n if (model.def.capabilities.edit) tags.push(\"edit\")\n if (model.def.capabilities.upscale) tags.push(\"upscale\")\n if (model.def.referenceImages.supported) tags.push(\"ref-images\")\n if (!model.def.agentVisible) tags.push(\"hidden\")\n break\n case \"video\":\n tags.push(model.def.provider)\n if (model.def.capabilities.audio) tags.push(\"audio\")\n if (model.def.capabilities.subjectReference) tags.push(\"subject-ref\")\n if (model.def.capabilities.imageToVideo) tags.push(\"i2v\")\n if (model.def.capabilities.textToVideo) tags.push(\"t2v\")\n if (!model.def.agentVisible) tags.push(\"hidden\")\n break\n case \"llm\":\n // Provider inferred from canonical id prefix (anthropic / openai / google).\n if (model.canonicalId.includes(\"claude\")) tags.push(\"anthropic\")\n else if (model.canonicalId.includes(\"gpt\")) tags.push(\"openai\")\n else if (model.canonicalId.includes(\"gemini\")) tags.push(\"google\")\n break\n case \"audio\":\n tags.push(model.def.provider)\n // Modality is multi-valued — emit a tag per enabled capability so\n // access rules can target `s2s` / `tts` / `stt` independently.\n if (model.def.capabilities.tts) tags.push(\"tts\")\n if (model.def.capabilities.stt) tags.push(\"stt\")\n if (model.def.capabilities.s2s) tags.push(\"s2s\")\n for (const lang of model.def.capabilities.languages) {\n tags.push(`lang:${lang}`)\n }\n if (model.def.capabilities.voiceCloning) tags.push(\"voice-cloning\")\n if (model.def.capabilities.streaming) tags.push(\"streaming\")\n if (model.def.capabilities.diarization) tags.push(\"diarization\")\n if (model.def.capabilities.timestamps) tags.push(\"timestamps\")\n if (!model.def.agentVisible) tags.push(\"hidden\")\n break\n case \"voice\": {\n // \"voice\" is already pushed via `model.kind`. Tag the engine provider\n // and its modality (s2s engines vs sequential tts) so voice access\n // rules can target the same `s2s`/`tts` vocabulary as audio models.\n tags.push(model.voice.provider)\n const s2sVoice =\n model.voice.provider === \"openai-realtime\" ||\n model.voice.provider === \"gemini-live\"\n tags.push(s2sVoice ? \"s2s\" : \"tts\")\n tags.push(`gender:${model.voice.gender}`)\n tags.push(`lang:${model.voice.primaryLanguage}`)\n break\n }\n }\n return tags\n}\n\nfunction inferLifecycle(model: ResolvedModel): Lifecycle {\n // Image / video catalogs use `agentVisible: false` to mark legacy /\n // less-used entries — treat those as \"deprecated\" for rule purposes.\n if (model.kind === \"image\" && !model.def.agentVisible) return \"deprecated\"\n if (model.kind === \"video\" && !model.def.agentVisible) return \"deprecated\"\n return \"stable\"\n}\n\n/**\n * Compose the curation portion of enrichment (everything except actions).\n * Internal — `getEnrichment` is the public entry that adds actions.\n */\nfunction getCurationEnrichment(model: ResolvedModel): ExplicitEnrichment {\n const explicit = EXPLICIT_ENRICHMENT[model.id]\n if (explicit) return explicit\n // For LLM, also try the canonical id (e.g., \"claude-sonnet-4-5\" →\n // \"claude-sonnet-4\" maps via aliases).\n if (model.kind === \"llm\" && model.canonicalId !== model.id) {\n const byCanonical = EXPLICIT_ENRICHMENT[model.canonicalId]\n if (byCanonical) return byCanonical\n }\n return {\n catalogPriceTier: inferCatalogPriceTier(model),\n tags: inferTags(model),\n lifecycle: inferLifecycle(model),\n }\n}\n\n/**\n * Merge two tag arrays preserving first-occurrence order, deduped.\n * Used to fold action tags into curation tags without duplicating.\n */\nfunction mergeTags(\n curation: readonly string[],\n actions: readonly string[]\n): string[] {\n const out: string[] = []\n const seen = new Set<string>()\n for (const t of curation) {\n if (seen.has(t)) continue\n seen.add(t)\n out.push(t)\n }\n for (const t of actions) {\n if (seen.has(t)) continue\n seen.add(t)\n out.push(t)\n }\n return out\n}\n\n/**\n * Resolve enrichment for any model. Explicit map wins; heuristic fallback\n * fills the rest. Action tags (`<kind>:<verb>`) are derived from the\n * model's capability fields and merged into `tags`. Always returns a\n * value (never undefined).\n */\nexport function getEnrichment(model: ResolvedModel): ModelEnrichment {\n const curation = getCurationEnrichment(model)\n const actions = getActions(model)\n return {\n catalogPriceTier: curation.catalogPriceTier,\n tags: mergeTags(curation.tags, actions),\n lifecycle: curation.lifecycle,\n actions,\n }\n}\n\nexport function modelHasTag(model: ResolvedModel, tag: string): boolean {\n return getEnrichment(model).tags.includes(tag)\n}\n\nexport function modelHasAction(model: ResolvedModel, action: string): boolean {\n return getEnrichment(model).actions.includes(action)\n}\n\nexport function modelMatchesCatalogPriceTier(\n model: ResolvedModel,\n tier: CatalogPriceTier\n): boolean {\n return getEnrichment(model).catalogPriceTier === tier\n}\n\n/**\n * @deprecated Use `modelMatchesCatalogPriceTier`. Kept for back-compat\n * with the v1 evaluator's switch case which still uses the\n * `priceTier` discriminator string. The function itself routes to the\n * canonical name.\n */\nexport function modelMatchesPriceTier(\n model: ResolvedModel,\n tier: CatalogPriceTier\n): boolean {\n return modelMatchesCatalogPriceTier(model, tier)\n}\n\nexport function modelMatchesKind(\n model: ResolvedModel,\n kind: ModelKind\n): boolean {\n return model.kind === kind\n}\n"]}
@@ -1,7 +1,7 @@
1
- import { listRouterLlmRoutes, formatModelRef } from './chunk-XYM6UG7C.mjs';
2
- import { modelHasTag } from './chunk-CEP4H4FD.mjs';
1
+ import { listRouterLlmRoutes, formatModelRef } from './chunk-JMEDHOCQ.mjs';
2
+ import { modelHasTag } from './chunk-3WNSSJTB.mjs';
3
3
  import { getMergedOverlay } from './chunk-H6JUTF3U.mjs';
4
- import { resolvePricing, resolveAlias, isKnownLlmId, getModelProvider, LLM_PRICING_CATALOG, listUnpricedKnownLlmIds } from './chunk-Z2WIEJR7.mjs';
4
+ import { resolvePricing, resolveAlias, isKnownLlmId, getModelProvider, LLM_PRICING_CATALOG, listUnpricedKnownLlmIds } from './chunk-S27LMEYZ.mjs';
5
5
  import { IMAGE_MODEL_CATALOG } from './chunk-2LWYZOWB.mjs';
6
6
  import { VIDEO_MODEL_CATALOG } from './chunk-IJZ4XPO2.mjs';
7
7
  import { AUDIO_MODEL_CATALOG } from './chunk-WRUWNKDB.mjs';
@@ -202,5 +202,5 @@ function resolveAlias2(id) {
202
202
  }
203
203
 
204
204
  export { getModel, getModelsByProvider, getStaticModelProvider, isAgentVisible, listModels, resolveAlias2 as resolveAlias };
205
- //# sourceMappingURL=chunk-UWZLV4P2.mjs.map
206
- //# sourceMappingURL=chunk-UWZLV4P2.mjs.map
205
+ //# sourceMappingURL=chunk-H2TPFH4A.mjs.map
206
+ //# sourceMappingURL=chunk-H2TPFH4A.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/registry/index.ts"],"names":["resolveAlias"],"mappings":"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","file":"chunk-UWZLV4P2.mjs","sourcesContent":["/**\n * Cross-kind registry. Resolves a model id against every catalog (LLM,\n * image, video, audio) and returns a discriminated `ResolvedModel`.\n *\n * v1 returns the legacy per-kind data shapes verbatim — image/video keep\n * `*ModelDefinition`, LLM keeps `LLMPricing`, audio surfaces voices.\n * Callers (cost dispatcher, access evaluator) match on `.kind` and dig\n * into the per-kind payload as needed.\n */\n\nimport {\n LLM_PRICING_CATALOG,\n resolveAlias as resolveLlmAlias,\n resolvePricing,\n isKnownLlmId,\n listUnpricedKnownLlmIds,\n getModelProvider,\n type LLMPricing,\n} from \"../llm/index.js\"\nimport {\n IMAGE_MODEL_CATALOG,\n type ImageModelDefinition,\n} from \"../image/index.js\"\nimport {\n VIDEO_MODEL_CATALOG,\n type VideoModelDefinition,\n} from \"../video/index.js\"\nimport {\n AUDIO_MODEL_CATALOG,\n type AudioModelDefinition,\n} from \"../audio/index.js\"\nimport { VOICE_CATALOG, type CatalogVoice } from \"../voice/index.js\"\nimport { modelHasTag } from \"../enrichment/index.js\"\nimport { getMergedOverlay, type MergedOverlay } from \"../overlay/index.js\"\nimport { listRouterLlmRoutes, formatModelRef } from \"../route-identity/index.js\"\n\n/** Follow consumer-overlay alias hops to a concrete id (cycle-guarded).\n * Ids with no overlay alias pass through unchanged. */\nfunction followAlias(id: string, ov: MergedOverlay): string {\n let cur = id\n const seen = new Set<string>()\n for (;;) {\n const next = ov.aliases[cur]\n if (next === undefined || seen.has(cur)) break\n seen.add(cur)\n cur = next\n }\n return cur\n}\n\n/** Find an overlay voice by catalogId / providerVoiceId / alias. */\nfunction overlayVoice(ov: MergedOverlay, key: string): CatalogVoice | undefined {\n return ov.voice.find(\n v =>\n v.catalogId === key ||\n v.providerVoiceId === key ||\n (v.aliases ?? []).includes(key),\n )\n}\n\n/**\n * `audio` resolves to either an audio MODEL (priced TTS/STT) or a\n * voice (downstream metadata). Most call sites care about the model\n * (pricing, capabilities); a few (voice pickers) want the voice. They\n * share the resolver but discriminate on the inner payload.\n */\nexport type ResolvedModel =\n | {\n kind: \"llm\"\n id: string\n canonicalId: string\n /** Undefined for a real, known id with no pricing row yet — existence\n * and pricing are independent, see `LlmModelId`'s doc comment in\n * `llm/catalog.ts`. Every reader MUST handle the absent case; never\n * assume a `kind: \"llm\"` result is priced. */\n pricing: LLMPricing | undefined\n /** Best-effort provider even when `pricing` is absent (falls back to\n * `CONTEXT_WINDOWS`'s own provider field — see `getModelProvider`).\n * Prefer this over `pricing?.provider` when you only need routing. */\n provider: string | undefined\n }\n | { kind: \"image\"; id: string; def: ImageModelDefinition }\n | { kind: \"video\"; id: string; def: VideoModelDefinition }\n | { kind: \"audio\"; id: string; def: AudioModelDefinition }\n | { kind: \"voice\"; id: string; voice: CatalogVoice }\n\n/**\n * Every kind the registry can resolve. Broader than the catalog\n * `ModelKind` (llm/image/video/audio) because voices are a first-class\n * registry kind but not a priced model family. Derived from\n * `ResolvedModel` so it can never drift.\n */\nexport type CatalogKind = ResolvedModel[\"kind\"]\n\n// Voices resolve by canonical id (\"minimax-french-female-anchor\"), native\n// provider id (\"French_FemaleAnchor\"), or a consumer-overlay alias — index\n// all three so new slugs, native ids, and persisted operator rows all hit.\nconst VOICE_INDEX: Map<string, CatalogVoice> = new Map([\n ...VOICE_CATALOG.map(v => [v.providerVoiceId, v] as const),\n ...VOICE_CATALOG.map(v => [v.catalogId, v] as const),\n ...VOICE_CATALOG.flatMap((v: CatalogVoice) =>\n (v.aliases ?? []).map(a => [a, v] as const)\n ),\n])\n\n/**\n * Resolves a model id across every catalog.\n *\n * Lookup order: image → video → audio → LLM (last because LLM has the\n * partial-prefix fallback that can match other strings if probed first).\n *\n * Returns `undefined` for unknown ids — callers decide whether to throw\n * or fall back. LLM uses fallback pricing inside its own dispatcher\n * (preserves existing behavior at the orchestrator).\n */\nexport function getModel(id: string): ResolvedModel | undefined {\n // Consumer overlays first: resolve any overlay alias to a concrete id,\n // then let overlay entries override/extend the generated catalogs. The\n // returned `id` echoes what the caller asked for (alias-preserving), as\n // the legacy voice-alias path already did.\n const ov = getMergedOverlay()\n const key = followAlias(id, ov)\n\n if (ov.image[key]) return { kind: \"image\", id, def: ov.image[key]! }\n if (ov.video[key]) return { kind: \"video\", id, def: ov.video[key]! }\n if (ov.audio[key]) return { kind: \"audio\", id, def: ov.audio[key]! }\n const ovVoice = overlayVoice(ov, key)\n if (ovVoice) return { kind: \"voice\", id, voice: ovVoice }\n if (ov.llm[key]) {\n const pricing = ov.llm[key]!\n return { kind: \"llm\", id, canonicalId: key, pricing, provider: pricing.provider }\n }\n\n const imageDef = IMAGE_MODEL_CATALOG[key]\n if (imageDef) return { kind: \"image\", id, def: imageDef }\n\n const videoDef = VIDEO_MODEL_CATALOG[key]\n if (videoDef) return { kind: \"video\", id, def: videoDef }\n\n // Audio MODEL (priced TTS/STT) — checked before voice lookup so an\n // id that exists in both maps lands on the priced entry.\n const audioDef = AUDIO_MODEL_CATALOG[key]\n if (audioDef) return { kind: \"audio\", id, def: audioDef }\n\n const voice = VOICE_INDEX.get(key)\n if (voice) return { kind: \"voice\", id, voice }\n\n const llmPricing = resolvePricing(key)\n if (llmPricing) {\n const canonicalId = resolveLlmAlias(key)\n return { kind: \"llm\", id, canonicalId, pricing: llmPricing, provider: llmPricing.provider }\n }\n // Known id, no pricing row yet (see `LlmModelId`'s doc comment in\n // llm/catalog.ts) — still resolves, just unpriced. This is the case that\n // used to make a real, live, provider-published model (e.g. a brand-new\n // Anthropic release the day it ships, before the next pricing sync)\n // disappear from every downstream surface instead of showing up unpriced.\n if (isKnownLlmId(key)) {\n return { kind: \"llm\", id, canonicalId: key, pricing: undefined, provider: getModelProvider(key) }\n }\n\n return undefined\n}\n\n/**\n * Returns true iff the id is exposed to agents.\n *\n * - LLM: every entry in `LLM_PRICING_CATALOG` is considered visible\n * (legacy convention; refine in v2 with per-entry `agentVisible`).\n * - Image / Video: respects the `agentVisible` flag.\n * - Audio voices: all voices are visible (catalog itself is curated).\n */\nexport function isAgentVisible(id: string): boolean {\n const m = getModel(id)\n if (!m) return false\n switch (m.kind) {\n case \"image\":\n return m.def.agentVisible\n case \"video\":\n return m.def.agentVisible\n case \"audio\":\n return m.def.agentVisible\n case \"llm\":\n return (\n id in LLM_PRICING_CATALOG || resolveLlmAlias(id) in LLM_PRICING_CATALOG\n )\n case \"voice\":\n return true\n }\n}\n\nexport interface ListModelsFilter {\n kind?: CatalogKind\n /** Single provider (back-compat). Folded into `providers` internally. */\n provider?: string\n /** Provider OR-set — a model matches if its provider is any of these. */\n providers?: string[]\n /**\n * Capability tags a model must carry (ALL of them). Capabilities are\n * emitted as tags by enrichment — audio `tts`/`stt`/`s2s`, image\n * `edit`/`upscale`, video `i2v`/`t2v` — so this filters on the same\n * vocabulary `listModels({capabilities:[\"s2s\"]})` would expect.\n */\n capabilities?: string[]\n /** Arbitrary tags a model must carry (ALL of them). */\n tags?: string[]\n agentVisibleOnly?: boolean\n}\n\n/**\n * Cross-kind listing. Useful for catalog browsers and capability search.\n * Returns `ResolvedModel[]` (discriminated by kind).\n *\n * Provider is an OR-set (`providers` ∪ the singular `provider`); capability\n * and tag filters are AND-sets (a model must carry every listed value).\n * Composed: `listModels({ kind:\"audio\", capabilities:[\"s2s\"],\n * providers:[\"gemini-live\",\"openai-realtime\"] })` → all s2s models from\n * Gemini OR OpenAI.\n */\nexport function listModels(filter: ListModelsFilter = {}): ResolvedModel[] {\n const providerSet =\n filter.provider || filter.providers\n ? new Set([\n ...(filter.provider ? [filter.provider] : []),\n ...(filter.providers ?? []),\n ])\n : undefined\n const providerMatches = (provider: string | undefined): boolean =>\n !providerSet || (provider !== undefined && providerSet.has(provider))\n\n const ov = getMergedOverlay()\n const out: ResolvedModel[] = []\n // Overlay entries override core ones with the same id, so collect ids the\n // overlay has already supplied per kind and skip the core duplicate.\n const seen = { image: new Set<string>(), video: new Set<string>(), audio: new Set<string>(), voice: new Set<string>(), llm: new Set<string>() }\n\n if (!filter.kind || filter.kind === \"image\") {\n for (const [id, def] of Object.entries(ov.image)) {\n if (!providerMatches(def.provider)) continue\n if (filter.agentVisibleOnly && !def.agentVisible) continue\n seen.image.add(id)\n out.push({ kind: \"image\", id, def })\n }\n for (const [id, def] of Object.entries(IMAGE_MODEL_CATALOG)) {\n if (seen.image.has(id) || !providerMatches(def.provider)) continue\n if (filter.agentVisibleOnly && !def.agentVisible) continue\n out.push({ kind: \"image\", id, def })\n }\n }\n if (!filter.kind || filter.kind === \"video\") {\n for (const [id, def] of Object.entries(ov.video)) {\n if (!providerMatches(def.provider)) continue\n if (filter.agentVisibleOnly && !def.agentVisible) continue\n seen.video.add(id)\n out.push({ kind: \"video\", id, def })\n }\n for (const [id, def] of Object.entries(VIDEO_MODEL_CATALOG)) {\n if (seen.video.has(id) || !providerMatches(def.provider)) continue\n if (filter.agentVisibleOnly && !def.agentVisible) continue\n out.push({ kind: \"video\", id, def })\n }\n }\n if (!filter.kind || filter.kind === \"audio\") {\n for (const [id, def] of Object.entries(ov.audio)) {\n if (!providerMatches(def.provider)) continue\n if (filter.agentVisibleOnly && !def.agentVisible) continue\n seen.audio.add(id)\n out.push({ kind: \"audio\", id, def })\n }\n for (const [id, def] of Object.entries(AUDIO_MODEL_CATALOG)) {\n if (seen.audio.has(id) || !providerMatches(def.provider)) continue\n if (filter.agentVisibleOnly && !def.agentVisible) continue\n out.push({ kind: \"audio\", id, def })\n }\n }\n if (!filter.kind || filter.kind === \"voice\") {\n for (const v of ov.voice) {\n if (!providerMatches(v.provider)) continue\n seen.voice.add(v.catalogId)\n out.push({ kind: \"voice\", id: v.catalogId, voice: v })\n }\n for (const v of VOICE_CATALOG) {\n if (seen.voice.has(v.catalogId) || !providerMatches(v.provider)) continue\n out.push({ kind: \"voice\", id: v.catalogId, voice: v })\n }\n }\n if (!filter.kind || filter.kind === \"llm\") {\n for (const [id, pricing] of Object.entries(ov.llm)) {\n if (!providerMatches(pricing.provider)) continue\n seen.llm.add(id)\n out.push({ kind: \"llm\", id, canonicalId: id, pricing, provider: pricing.provider })\n }\n for (const [id, pricing] of Object.entries(LLM_PRICING_CATALOG)) {\n if (seen.llm.has(id) || !providerMatches(pricing.provider)) continue\n seen.llm.add(id)\n out.push({ kind: \"llm\", id, canonicalId: id, pricing, provider: pricing.provider })\n }\n // Known ids with no pricing row yet (see `LlmModelId`'s doc comment in\n // llm/catalog.ts) — surfaced unpriced rather than silently dropped.\n for (const { id, provider } of listUnpricedKnownLlmIds()) {\n if (seen.llm.has(id) || !providerMatches(provider)) continue\n out.push({ kind: \"llm\", id, canonicalId: id, pricing: undefined, provider })\n }\n }\n\n // Capability + tag filters are AND-sets, applied over the enrichment tag\n // vocabulary (capabilities are emitted as tags). Skipped entirely when\n // unset so the common path stays allocation-free.\n const required = [...(filter.capabilities ?? []), ...(filter.tags ?? [])]\n if (required.length === 0) return out\n return out.filter(model => required.every(tag => modelHasTag(model, tag)))\n}\n\n/**\n * Provider-centric view — every model a provider offers across all kinds\n * (llm / image / video / audio incl. tts/stt/s2s). This is the \"provider\n * catalog\" (openai, google, anthropic, replicate, openrouter, …): a\n * derived query over the kind-organized catalogs, NOT a parallel store.\n *\n * When `provider` names a router or a routed endpoint (openrouter, requesty,\n * huggingface, opencode, opencode-go), this also folds in that provider's\n * generated route table (`listRouterLlmRoutes`) — the provider's full\n * surface, not just what happens to be curated into `LLM_PRICING_CATALOG`.\n * The emitted id is whatever `formatModelRef` produces for the resolved ref:\n * `vendor/product@router` for the vendor-namespacing routers, and the bare\n * `opencode-go/glm-5.3` / `opencode/claude-sonnet-4-6` form for the two\n * OpenCode endpoints, whose route IS the id's leading segment (so there is no\n * `@route` to append). OpenRouter's routes are already spread into\n * `LLM_PRICING_CATALOG` (bare `vendor/product` ids, `llm/catalog.ts`), so its\n * router-table entries are deduped against the bare ids `listModels` already\n * returned; Requesty, HuggingFace and the two OpenCode endpoints have no such\n * overlap, so their route table entries are added in full. Deliberately NOT\n * achieved by spreading `REQUESTY_ROUTES`/`HUGGINGFACE_ROUTES`/\n * `OPENCODE_*_ROUTES` into `LLM_PRICING_CATALOG` itself — that catalog is the\n * legacy bare-id path, and a bare id must keep meaning direct-vendor pricing\n * (`route-identity/index.ts`).\n */\nexport function getModelsByProvider(provider: string): ResolvedModel[] {\n const models = listModels({ provider })\n const routerRoutes = listRouterLlmRoutes(provider)\n if (routerRoutes.length === 0) return models\n\n const existingIds = new Set(models.map(m => m.id))\n const routed: ResolvedModel[] = []\n for (const route of routerRoutes) {\n const bareId = `${route.vendor}/${route.product}`\n if (existingIds.has(bareId)) continue\n const id = formatModelRef(route.ref)\n routed.push({ kind: \"llm\", id, canonicalId: id, pricing: route.pricing, provider: route.pricing.provider })\n }\n return [...models, ...routed]\n}\n\n/**\n * Returns the platform a model's adapter is **statically pinned** to,\n * if known. ONLY meaningful for image / video / audio — those adapters\n * are constructed per-platform (Replicate adapter, MiniMax adapter…),\n * so the model's `def.provider` IS the runtime connector.\n *\n * For LLM, returns `undefined` — the runtime connector is determined\n * at call time by `pickLlmConnector(connectors, parseModelId(id).provider)`\n * against the guild's installed connectors, NOT by the model id alone.\n * The same `anthropic/claude-sonnet-4-5` can route through OpenRouter\n * OR direct Anthropic depending on which connectors the guild has\n * installed. Recording call sites MUST pass the actual `connectorUsed`\n * they invoked; do not infer from id.\n *\n * Use case: image/video workflow steps fetch `model.def.provider`\n * directly (no ambiguity). LLM call sites use the runtime resolver.\n */\nexport function getStaticModelProvider(\n model: ResolvedModel\n): string | undefined {\n switch (model.kind) {\n case \"image\":\n case \"video\":\n case \"audio\":\n return model.def.provider\n case \"voice\":\n return model.voice.provider\n case \"llm\":\n // Runtime routing — caller knows, we don't.\n return undefined\n }\n}\n\n/**\n * Resolves an id to its canonical catalog key across kinds. For ids that\n * have no alias, returns the id unchanged. Used by callers that want to\n * normalize before persisting (e.g., `byok_usage` rows).\n */\nexport function resolveAlias(id: string): string {\n const ov = getMergedOverlay()\n const key = followAlias(id, ov)\n if (ov.image[key] || ov.video[key] || ov.audio[key]) return key\n if (overlayVoice(ov, key)) return key\n if (ov.llm[key]) return key\n if (IMAGE_MODEL_CATALOG[key]) return key\n if (VIDEO_MODEL_CATALOG[key]) return key\n if (AUDIO_MODEL_CATALOG[key]) return key\n if (VOICE_INDEX.has(key)) return key\n return resolveLlmAlias(key)\n}\n"]}
1
+ {"version":3,"sources":["../src/registry/index.ts"],"names":["resolveAlias"],"mappings":"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","file":"chunk-H2TPFH4A.mjs","sourcesContent":["/**\n * Cross-kind registry. Resolves a model id against every catalog (LLM,\n * image, video, audio) and returns a discriminated `ResolvedModel`.\n *\n * v1 returns the legacy per-kind data shapes verbatim — image/video keep\n * `*ModelDefinition`, LLM keeps `LLMPricing`, audio surfaces voices.\n * Callers (cost dispatcher, access evaluator) match on `.kind` and dig\n * into the per-kind payload as needed.\n */\n\nimport {\n LLM_PRICING_CATALOG,\n resolveAlias as resolveLlmAlias,\n resolvePricing,\n isKnownLlmId,\n listUnpricedKnownLlmIds,\n getModelProvider,\n type LLMPricing,\n} from \"../llm/index.js\"\nimport {\n IMAGE_MODEL_CATALOG,\n type ImageModelDefinition,\n} from \"../image/index.js\"\nimport {\n VIDEO_MODEL_CATALOG,\n type VideoModelDefinition,\n} from \"../video/index.js\"\nimport {\n AUDIO_MODEL_CATALOG,\n type AudioModelDefinition,\n} from \"../audio/index.js\"\nimport { VOICE_CATALOG, type CatalogVoice } from \"../voice/index.js\"\nimport { modelHasTag } from \"../enrichment/index.js\"\nimport { getMergedOverlay, type MergedOverlay } from \"../overlay/index.js\"\nimport { listRouterLlmRoutes, formatModelRef } from \"../route-identity/index.js\"\n\n/** Follow consumer-overlay alias hops to a concrete id (cycle-guarded).\n * Ids with no overlay alias pass through unchanged. */\nfunction followAlias(id: string, ov: MergedOverlay): string {\n let cur = id\n const seen = new Set<string>()\n for (;;) {\n const next = ov.aliases[cur]\n if (next === undefined || seen.has(cur)) break\n seen.add(cur)\n cur = next\n }\n return cur\n}\n\n/** Find an overlay voice by catalogId / providerVoiceId / alias. */\nfunction overlayVoice(ov: MergedOverlay, key: string): CatalogVoice | undefined {\n return ov.voice.find(\n v =>\n v.catalogId === key ||\n v.providerVoiceId === key ||\n (v.aliases ?? []).includes(key),\n )\n}\n\n/**\n * `audio` resolves to either an audio MODEL (priced TTS/STT) or a\n * voice (downstream metadata). Most call sites care about the model\n * (pricing, capabilities); a few (voice pickers) want the voice. They\n * share the resolver but discriminate on the inner payload.\n */\nexport type ResolvedModel =\n | {\n kind: \"llm\"\n id: string\n canonicalId: string\n /** Undefined for a real, known id with no pricing row yet — existence\n * and pricing are independent, see `LlmModelId`'s doc comment in\n * `llm/catalog.ts`. Every reader MUST handle the absent case; never\n * assume a `kind: \"llm\"` result is priced. */\n pricing: LLMPricing | undefined\n /** Best-effort provider even when `pricing` is absent (falls back to\n * `CONTEXT_WINDOWS`'s own provider field — see `getModelProvider`).\n * Prefer this over `pricing?.provider` when you only need routing. */\n provider: string | undefined\n }\n | { kind: \"image\"; id: string; def: ImageModelDefinition }\n | { kind: \"video\"; id: string; def: VideoModelDefinition }\n | { kind: \"audio\"; id: string; def: AudioModelDefinition }\n | { kind: \"voice\"; id: string; voice: CatalogVoice }\n\n/**\n * Every kind the registry can resolve. Broader than the catalog\n * `ModelKind` (llm/image/video/audio) because voices are a first-class\n * registry kind but not a priced model family. Derived from\n * `ResolvedModel` so it can never drift.\n */\nexport type CatalogKind = ResolvedModel[\"kind\"]\n\n// Voices resolve by canonical id (\"minimax-french-female-anchor\"), native\n// provider id (\"French_FemaleAnchor\"), or a consumer-overlay alias — index\n// all three so new slugs, native ids, and persisted operator rows all hit.\nconst VOICE_INDEX: Map<string, CatalogVoice> = new Map([\n ...VOICE_CATALOG.map(v => [v.providerVoiceId, v] as const),\n ...VOICE_CATALOG.map(v => [v.catalogId, v] as const),\n ...VOICE_CATALOG.flatMap((v: CatalogVoice) =>\n (v.aliases ?? []).map(a => [a, v] as const)\n ),\n])\n\n/**\n * Resolves a model id across every catalog.\n *\n * Lookup order: image → video → audio → LLM (last because LLM has the\n * partial-prefix fallback that can match other strings if probed first).\n *\n * Returns `undefined` for unknown ids — callers decide whether to throw\n * or fall back. LLM uses fallback pricing inside its own dispatcher\n * (preserves existing behavior at the orchestrator).\n */\nexport function getModel(id: string): ResolvedModel | undefined {\n // Consumer overlays first: resolve any overlay alias to a concrete id,\n // then let overlay entries override/extend the generated catalogs. The\n // returned `id` echoes what the caller asked for (alias-preserving), as\n // the legacy voice-alias path already did.\n const ov = getMergedOverlay()\n const key = followAlias(id, ov)\n\n if (ov.image[key]) return { kind: \"image\", id, def: ov.image[key]! }\n if (ov.video[key]) return { kind: \"video\", id, def: ov.video[key]! }\n if (ov.audio[key]) return { kind: \"audio\", id, def: ov.audio[key]! }\n const ovVoice = overlayVoice(ov, key)\n if (ovVoice) return { kind: \"voice\", id, voice: ovVoice }\n if (ov.llm[key]) {\n const pricing = ov.llm[key]!\n return { kind: \"llm\", id, canonicalId: key, pricing, provider: pricing.provider }\n }\n\n const imageDef = IMAGE_MODEL_CATALOG[key]\n if (imageDef) return { kind: \"image\", id, def: imageDef }\n\n const videoDef = VIDEO_MODEL_CATALOG[key]\n if (videoDef) return { kind: \"video\", id, def: videoDef }\n\n // Audio MODEL (priced TTS/STT) — checked before voice lookup so an\n // id that exists in both maps lands on the priced entry.\n const audioDef = AUDIO_MODEL_CATALOG[key]\n if (audioDef) return { kind: \"audio\", id, def: audioDef }\n\n const voice = VOICE_INDEX.get(key)\n if (voice) return { kind: \"voice\", id, voice }\n\n const llmPricing = resolvePricing(key)\n if (llmPricing) {\n const canonicalId = resolveLlmAlias(key)\n return { kind: \"llm\", id, canonicalId, pricing: llmPricing, provider: llmPricing.provider }\n }\n // Known id, no pricing row yet (see `LlmModelId`'s doc comment in\n // llm/catalog.ts) — still resolves, just unpriced. This is the case that\n // used to make a real, live, provider-published model (e.g. a brand-new\n // Anthropic release the day it ships, before the next pricing sync)\n // disappear from every downstream surface instead of showing up unpriced.\n if (isKnownLlmId(key)) {\n return { kind: \"llm\", id, canonicalId: key, pricing: undefined, provider: getModelProvider(key) }\n }\n\n return undefined\n}\n\n/**\n * Returns true iff the id is exposed to agents.\n *\n * - LLM: every entry in `LLM_PRICING_CATALOG` is considered visible\n * (legacy convention; refine in v2 with per-entry `agentVisible`).\n * - Image / Video: respects the `agentVisible` flag.\n * - Audio voices: all voices are visible (catalog itself is curated).\n */\nexport function isAgentVisible(id: string): boolean {\n const m = getModel(id)\n if (!m) return false\n switch (m.kind) {\n case \"image\":\n return m.def.agentVisible\n case \"video\":\n return m.def.agentVisible\n case \"audio\":\n return m.def.agentVisible\n case \"llm\":\n return (\n id in LLM_PRICING_CATALOG || resolveLlmAlias(id) in LLM_PRICING_CATALOG\n )\n case \"voice\":\n return true\n }\n}\n\nexport interface ListModelsFilter {\n kind?: CatalogKind\n /** Single provider (back-compat). Folded into `providers` internally. */\n provider?: string\n /** Provider OR-set — a model matches if its provider is any of these. */\n providers?: string[]\n /**\n * Capability tags a model must carry (ALL of them). Capabilities are\n * emitted as tags by enrichment — audio `tts`/`stt`/`s2s`, image\n * `edit`/`upscale`, video `i2v`/`t2v` — so this filters on the same\n * vocabulary `listModels({capabilities:[\"s2s\"]})` would expect.\n */\n capabilities?: string[]\n /** Arbitrary tags a model must carry (ALL of them). */\n tags?: string[]\n agentVisibleOnly?: boolean\n}\n\n/**\n * Cross-kind listing. Useful for catalog browsers and capability search.\n * Returns `ResolvedModel[]` (discriminated by kind).\n *\n * Provider is an OR-set (`providers` ∪ the singular `provider`); capability\n * and tag filters are AND-sets (a model must carry every listed value).\n * Composed: `listModels({ kind:\"audio\", capabilities:[\"s2s\"],\n * providers:[\"gemini-live\",\"openai-realtime\"] })` → all s2s models from\n * Gemini OR OpenAI.\n */\nexport function listModels(filter: ListModelsFilter = {}): ResolvedModel[] {\n const providerSet =\n filter.provider || filter.providers\n ? new Set([\n ...(filter.provider ? [filter.provider] : []),\n ...(filter.providers ?? []),\n ])\n : undefined\n const providerMatches = (provider: string | undefined): boolean =>\n !providerSet || (provider !== undefined && providerSet.has(provider))\n\n const ov = getMergedOverlay()\n const out: ResolvedModel[] = []\n // Overlay entries override core ones with the same id, so collect ids the\n // overlay has already supplied per kind and skip the core duplicate.\n const seen = { image: new Set<string>(), video: new Set<string>(), audio: new Set<string>(), voice: new Set<string>(), llm: new Set<string>() }\n\n if (!filter.kind || filter.kind === \"image\") {\n for (const [id, def] of Object.entries(ov.image)) {\n if (!providerMatches(def.provider)) continue\n if (filter.agentVisibleOnly && !def.agentVisible) continue\n seen.image.add(id)\n out.push({ kind: \"image\", id, def })\n }\n for (const [id, def] of Object.entries(IMAGE_MODEL_CATALOG)) {\n if (seen.image.has(id) || !providerMatches(def.provider)) continue\n if (filter.agentVisibleOnly && !def.agentVisible) continue\n out.push({ kind: \"image\", id, def })\n }\n }\n if (!filter.kind || filter.kind === \"video\") {\n for (const [id, def] of Object.entries(ov.video)) {\n if (!providerMatches(def.provider)) continue\n if (filter.agentVisibleOnly && !def.agentVisible) continue\n seen.video.add(id)\n out.push({ kind: \"video\", id, def })\n }\n for (const [id, def] of Object.entries(VIDEO_MODEL_CATALOG)) {\n if (seen.video.has(id) || !providerMatches(def.provider)) continue\n if (filter.agentVisibleOnly && !def.agentVisible) continue\n out.push({ kind: \"video\", id, def })\n }\n }\n if (!filter.kind || filter.kind === \"audio\") {\n for (const [id, def] of Object.entries(ov.audio)) {\n if (!providerMatches(def.provider)) continue\n if (filter.agentVisibleOnly && !def.agentVisible) continue\n seen.audio.add(id)\n out.push({ kind: \"audio\", id, def })\n }\n for (const [id, def] of Object.entries(AUDIO_MODEL_CATALOG)) {\n if (seen.audio.has(id) || !providerMatches(def.provider)) continue\n if (filter.agentVisibleOnly && !def.agentVisible) continue\n out.push({ kind: \"audio\", id, def })\n }\n }\n if (!filter.kind || filter.kind === \"voice\") {\n for (const v of ov.voice) {\n if (!providerMatches(v.provider)) continue\n seen.voice.add(v.catalogId)\n out.push({ kind: \"voice\", id: v.catalogId, voice: v })\n }\n for (const v of VOICE_CATALOG) {\n if (seen.voice.has(v.catalogId) || !providerMatches(v.provider)) continue\n out.push({ kind: \"voice\", id: v.catalogId, voice: v })\n }\n }\n if (!filter.kind || filter.kind === \"llm\") {\n for (const [id, pricing] of Object.entries(ov.llm)) {\n if (!providerMatches(pricing.provider)) continue\n seen.llm.add(id)\n out.push({ kind: \"llm\", id, canonicalId: id, pricing, provider: pricing.provider })\n }\n for (const [id, pricing] of Object.entries(LLM_PRICING_CATALOG)) {\n if (seen.llm.has(id) || !providerMatches(pricing.provider)) continue\n seen.llm.add(id)\n out.push({ kind: \"llm\", id, canonicalId: id, pricing, provider: pricing.provider })\n }\n // Known ids with no pricing row yet (see `LlmModelId`'s doc comment in\n // llm/catalog.ts) — surfaced unpriced rather than silently dropped.\n for (const { id, provider } of listUnpricedKnownLlmIds()) {\n if (seen.llm.has(id) || !providerMatches(provider)) continue\n out.push({ kind: \"llm\", id, canonicalId: id, pricing: undefined, provider })\n }\n }\n\n // Capability + tag filters are AND-sets, applied over the enrichment tag\n // vocabulary (capabilities are emitted as tags). Skipped entirely when\n // unset so the common path stays allocation-free.\n const required = [...(filter.capabilities ?? []), ...(filter.tags ?? [])]\n if (required.length === 0) return out\n return out.filter(model => required.every(tag => modelHasTag(model, tag)))\n}\n\n/**\n * Provider-centric view — every model a provider offers across all kinds\n * (llm / image / video / audio incl. tts/stt/s2s). This is the \"provider\n * catalog\" (openai, google, anthropic, replicate, openrouter, …): a\n * derived query over the kind-organized catalogs, NOT a parallel store.\n *\n * When `provider` names a router or a routed endpoint (openrouter, requesty,\n * huggingface, opencode, opencode-go), this also folds in that provider's\n * generated route table (`listRouterLlmRoutes`) — the provider's full\n * surface, not just what happens to be curated into `LLM_PRICING_CATALOG`.\n * The emitted id is whatever `formatModelRef` produces for the resolved ref:\n * `vendor/product@router` for the vendor-namespacing routers, and the bare\n * `opencode-go/glm-5.3` / `opencode/claude-sonnet-4-6` form for the two\n * OpenCode endpoints, whose route IS the id's leading segment (so there is no\n * `@route` to append). OpenRouter's routes are already spread into\n * `LLM_PRICING_CATALOG` (bare `vendor/product` ids, `llm/catalog.ts`), so its\n * router-table entries are deduped against the bare ids `listModels` already\n * returned; Requesty, HuggingFace and the two OpenCode endpoints have no such\n * overlap, so their route table entries are added in full. Deliberately NOT\n * achieved by spreading `REQUESTY_ROUTES`/`HUGGINGFACE_ROUTES`/\n * `OPENCODE_*_ROUTES` into `LLM_PRICING_CATALOG` itself — that catalog is the\n * legacy bare-id path, and a bare id must keep meaning direct-vendor pricing\n * (`route-identity/index.ts`).\n */\nexport function getModelsByProvider(provider: string): ResolvedModel[] {\n const models = listModels({ provider })\n const routerRoutes = listRouterLlmRoutes(provider)\n if (routerRoutes.length === 0) return models\n\n const existingIds = new Set(models.map(m => m.id))\n const routed: ResolvedModel[] = []\n for (const route of routerRoutes) {\n const bareId = `${route.vendor}/${route.product}`\n if (existingIds.has(bareId)) continue\n const id = formatModelRef(route.ref)\n routed.push({ kind: \"llm\", id, canonicalId: id, pricing: route.pricing, provider: route.pricing.provider })\n }\n return [...models, ...routed]\n}\n\n/**\n * Returns the platform a model's adapter is **statically pinned** to,\n * if known. ONLY meaningful for image / video / audio — those adapters\n * are constructed per-platform (Replicate adapter, MiniMax adapter…),\n * so the model's `def.provider` IS the runtime connector.\n *\n * For LLM, returns `undefined` — the runtime connector is determined\n * at call time by `pickLlmConnector(connectors, parseModelId(id).provider)`\n * against the guild's installed connectors, NOT by the model id alone.\n * The same `anthropic/claude-sonnet-4-5` can route through OpenRouter\n * OR direct Anthropic depending on which connectors the guild has\n * installed. Recording call sites MUST pass the actual `connectorUsed`\n * they invoked; do not infer from id.\n *\n * Use case: image/video workflow steps fetch `model.def.provider`\n * directly (no ambiguity). LLM call sites use the runtime resolver.\n */\nexport function getStaticModelProvider(\n model: ResolvedModel\n): string | undefined {\n switch (model.kind) {\n case \"image\":\n case \"video\":\n case \"audio\":\n return model.def.provider\n case \"voice\":\n return model.voice.provider\n case \"llm\":\n // Runtime routing — caller knows, we don't.\n return undefined\n }\n}\n\n/**\n * Resolves an id to its canonical catalog key across kinds. For ids that\n * have no alias, returns the id unchanged. Used by callers that want to\n * normalize before persisting (e.g., `byok_usage` rows).\n */\nexport function resolveAlias(id: string): string {\n const ov = getMergedOverlay()\n const key = followAlias(id, ov)\n if (ov.image[key] || ov.video[key] || ov.audio[key]) return key\n if (overlayVoice(ov, key)) return key\n if (ov.llm[key]) return key\n if (IMAGE_MODEL_CATALOG[key]) return key\n if (VIDEO_MODEL_CATALOG[key]) return key\n if (AUDIO_MODEL_CATALOG[key]) return key\n if (VOICE_INDEX.has(key)) return key\n return resolveLlmAlias(key)\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { CatalogProviderSchema } from './chunk-WG4F6IRS.mjs';
2
- import { resolvePricing, resolveAlias, OPENCODE_GO_ROUTES, OPENCODE_ZEN_ROUTES, OPENROUTER_ROUTES, DEFAULT_PRICING } from './chunk-Z2WIEJR7.mjs';
2
+ import { resolvePricing, resolveAlias, OPENCODE_GO_ROUTES, OPENCODE_ZEN_ROUTES, OPENROUTER_ROUTES, DEFAULT_PRICING } from './chunk-S27LMEYZ.mjs';
3
3
 
4
4
  /**
5
5
  * @agentproto/model-catalog v0.1.0
@@ -2437,6 +2437,22 @@ var REQUESTY_ROUTES = {
2437
2437
  vendor: "deepinfra",
2438
2438
  provider: "requesty"
2439
2439
  },
2440
+ "deepinfra/deepseek-v4.1-flash-1017": {
2441
+ inputPer1M: 0.098,
2442
+ outputPer1M: 0.294,
2443
+ cacheReadMultiplier: 0.03,
2444
+ addedAt: "2026-10-17",
2445
+ vendor: "deepinfra",
2446
+ provider: "requesty"
2447
+ },
2448
+ "deepinfra/deepseek-v4.1-flash-1017:priority": {
2449
+ inputPer1M: 0.147,
2450
+ outputPer1M: 0.441,
2451
+ cacheReadMultiplier: 0.03,
2452
+ addedAt: "2026-10-17",
2453
+ vendor: "deepinfra",
2454
+ provider: "requesty"
2455
+ },
2440
2456
  "deepinfra/deepseek-v4.1-flash:flex": {
2441
2457
  inputPer1M: 0.16,
2442
2458
  outputPer1M: 0.48,
@@ -2818,6 +2834,14 @@ var REQUESTY_ROUTES = {
2818
2834
  vendor: "fireworks",
2819
2835
  provider: "requesty"
2820
2836
  },
2837
+ "fireworks/deepseek-v4.1-flash-1017": {
2838
+ inputPer1M: 0.3,
2839
+ outputPer1M: 1.2,
2840
+ cacheReadMultiplier: 0.02,
2841
+ addedAt: "2026-10-17",
2842
+ vendor: "fireworks",
2843
+ provider: "requesty"
2844
+ },
2821
2845
  "fireworks/glm-5.1": {
2822
2846
  inputPer1M: 1.4,
2823
2847
  outputPer1M: 4.4,
@@ -4756,6 +4780,14 @@ var REQUESTY_ROUTES = {
4756
4780
  vendor: "tensorx",
4757
4781
  provider: "requesty"
4758
4782
  },
4783
+ "tensorx/deepseek-v4.1-flash-1017": {
4784
+ inputPer1M: 0.5,
4785
+ outputPer1M: 1.5,
4786
+ cacheReadMultiplier: 0.26,
4787
+ addedAt: "2026-10-17",
4788
+ vendor: "tensorx",
4789
+ provider: "requesty"
4790
+ },
4759
4791
  "tensorx/glm-5.2": {
4760
4792
  inputPer1M: 1.5,
4761
4793
  outputPer1M: 4.5,
@@ -6173,17 +6205,6 @@ var HUGGINGFACE_ROUTES = {
6173
6205
  }
6174
6206
  ]
6175
6207
  },
6176
- "CohereLabs/c4ai-command-r7b-arabic-02-2025": {
6177
- wireId: "CohereLabs/c4ai-command-r7b-arabic-02-2025",
6178
- providers: [
6179
- {
6180
- provider: "cohere",
6181
- status: "live",
6182
- supportsTools: true,
6183
- supportsStructuredOutput: false
6184
- }
6185
- ]
6186
- },
6187
6208
  "CohereLabs/command-a-plus-05-2026-bf16": {
6188
6209
  wireId: "CohereLabs/command-a-plus-05-2026-bf16",
6189
6210
  providers: [
@@ -6624,7 +6645,7 @@ var HUGGINGFACE_ROUTES = {
6624
6645
  inputPer1M: 0.08,
6625
6646
  outputPer1M: 0.28,
6626
6647
  supportsTools: true,
6627
- supportsStructuredOutput: false
6648
+ supportsStructuredOutput: true
6628
6649
  },
6629
6650
  {
6630
6651
  provider: "featherless-ai",
@@ -6947,7 +6968,7 @@ var HUGGINGFACE_ROUTES = {
6947
6968
  inputPer1M: 0.47,
6948
6969
  outputPer1M: 3.19,
6949
6970
  supportsTools: true,
6950
- supportsStructuredOutput: true
6971
+ supportsStructuredOutput: false
6951
6972
  }
6952
6973
  ]
6953
6974
  },
@@ -6973,7 +6994,7 @@ var HUGGINGFACE_ROUTES = {
6973
6994
  inputPer1M: 0.285,
6974
6995
  outputPer1M: 1.71,
6975
6996
  supportsTools: true,
6976
- supportsStructuredOutput: false
6997
+ supportsStructuredOutput: true
6977
6998
  }
6978
6999
  ]
6979
7000
  },
@@ -7028,6 +7049,15 @@ var HUGGINGFACE_ROUTES = {
7028
7049
  supportsTools: true,
7029
7050
  supportsStructuredOutput: true
7030
7051
  },
7052
+ {
7053
+ provider: "deepinfra",
7054
+ status: "live",
7055
+ contextLength: 262144,
7056
+ inputPer1M: 0.2,
7057
+ outputPer1M: 2.5,
7058
+ supportsTools: true,
7059
+ supportsStructuredOutput: true
7060
+ },
7031
7061
  {
7032
7062
  provider: "featherless-ai",
7033
7063
  status: "live"
@@ -7048,7 +7078,7 @@ var HUGGINGFACE_ROUTES = {
7048
7078
  inputPer1M: 0.47,
7049
7079
  outputPer1M: 3.19,
7050
7080
  supportsTools: true,
7051
- supportsStructuredOutput: true
7081
+ supportsStructuredOutput: false
7052
7082
  }
7053
7083
  ]
7054
7084
  },
@@ -7161,7 +7191,7 @@ var HUGGINGFACE_ROUTES = {
7161
7191
  inputPer1M: 0.2,
7162
7192
  outputPer1M: 0.4,
7163
7193
  supportsTools: false,
7164
- supportsStructuredOutput: true
7194
+ supportsStructuredOutput: false
7165
7195
  }
7166
7196
  ]
7167
7197
  },
@@ -7178,7 +7208,7 @@ var HUGGINGFACE_ROUTES = {
7178
7208
  inputPer1M: 0.25,
7179
7209
  outputPer1M: 0.5,
7180
7210
  supportsTools: true,
7181
- supportsStructuredOutput: true
7211
+ supportsStructuredOutput: false
7182
7212
  }
7183
7213
  ]
7184
7214
  },
@@ -7233,7 +7263,7 @@ var HUGGINGFACE_ROUTES = {
7233
7263
  inputPer1M: 0.7,
7234
7264
  outputPer1M: 2.5,
7235
7265
  supportsTools: true,
7236
- supportsStructuredOutput: true
7266
+ supportsStructuredOutput: false
7237
7267
  }
7238
7268
  ]
7239
7269
  },
@@ -7644,7 +7674,7 @@ var HUGGINGFACE_ROUTES = {
7644
7674
  inputPer1M: 0.13,
7645
7675
  outputPer1M: 0.4,
7646
7676
  supportsTools: true,
7647
- supportsStructuredOutput: false
7677
+ supportsStructuredOutput: true
7648
7678
  },
7649
7679
  {
7650
7680
  provider: "scaleway",
@@ -8304,7 +8334,7 @@ var HUGGINGFACE_ROUTES = {
8304
8334
  inputPer1M: 0.171,
8305
8335
  outputPer1M: 0.684,
8306
8336
  supportsTools: true,
8307
- supportsStructuredOutput: false
8337
+ supportsStructuredOutput: true
8308
8338
  },
8309
8339
  {
8310
8340
  provider: "together",
@@ -8649,12 +8679,7 @@ var HUGGINGFACE_ROUTES = {
8649
8679
  outputPer1M: 2.2,
8650
8680
  supportsTools: true,
8651
8681
  supportsStructuredOutput: false
8652
- }
8653
- ]
8654
- },
8655
- "zai-org/GLM-4.6-FP8": {
8656
- wireId: "zai-org/GLM-4.6-FP8",
8657
- providers: [
8682
+ },
8658
8683
  {
8659
8684
  provider: "zai-org",
8660
8685
  status: "live",
@@ -8729,6 +8754,12 @@ var HUGGINGFACE_ROUTES = {
8729
8754
  outputPer1M: 2.2,
8730
8755
  supportsTools: true,
8731
8756
  supportsStructuredOutput: false
8757
+ },
8758
+ {
8759
+ provider: "zai-org",
8760
+ status: "live",
8761
+ supportsTools: true,
8762
+ supportsStructuredOutput: false
8732
8763
  }
8733
8764
  ]
8734
8765
  },
@@ -8816,17 +8847,6 @@ var HUGGINGFACE_ROUTES = {
8816
8847
  }
8817
8848
  ]
8818
8849
  },
8819
- "zai-org/GLM-5.1-FP8": {
8820
- wireId: "zai-org/GLM-5.1-FP8",
8821
- providers: [
8822
- {
8823
- provider: "zai-org",
8824
- status: "live",
8825
- supportsTools: true,
8826
- supportsStructuredOutput: false
8827
- }
8828
- ]
8829
- },
8830
8850
  "zai-org/GLM-5.2": {
8831
8851
  wireId: "zai-org/GLM-5.2",
8832
8852
  providers: [
@@ -9377,5 +9397,5 @@ function diagnoseModelRef(input) {
9377
9397
  }
9378
9398
 
9379
9399
  export { InvalidModelRefError, OPENROUTER_VARIANTS, clearCustomRoutes, diagnoseModelRef, formatModelRef, isModelRefString, listRouterLlmRoutes, parseModelRef, registerCustomRoute, resolveCustomRoute, resolveLlmModelRoute, stripAnthropicNativeVendor, stripFixedNativeVendor, stripRouteSuffix, tryParseModelRef };
9380
- //# sourceMappingURL=chunk-XYM6UG7C.mjs.map
9381
- //# sourceMappingURL=chunk-XYM6UG7C.mjs.map
9400
+ //# sourceMappingURL=chunk-JMEDHOCQ.mjs.map
9401
+ //# sourceMappingURL=chunk-JMEDHOCQ.mjs.map