@agentproto/model-catalog 0.13.0 → 0.13.1
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/dist/access/index.mjs +4 -4
- package/dist/{chunk-XP2KTH6U.mjs → chunk-5EX3V7QZ.mjs} +4 -4
- package/dist/{chunk-XP2KTH6U.mjs.map → chunk-5EX3V7QZ.mjs.map} +1 -1
- package/dist/{chunk-LMY5TLSF.mjs → chunk-6TZ6WIM3.mjs} +4 -4
- package/dist/{chunk-LMY5TLSF.mjs.map → chunk-6TZ6WIM3.mjs.map} +1 -1
- package/dist/{chunk-JMEDHOCQ.mjs → chunk-ALUIW3QO.mjs} +65 -90
- package/dist/chunk-ALUIW3QO.mjs.map +1 -0
- package/dist/{chunk-3WNSSJTB.mjs → chunk-NNV3NYUE.mjs} +3 -3
- package/dist/{chunk-3WNSSJTB.mjs.map → chunk-NNV3NYUE.mjs.map} +1 -1
- package/dist/{chunk-S27LMEYZ.mjs → chunk-TVXNRUJM.mjs} +38 -58
- package/dist/chunk-TVXNRUJM.mjs.map +1 -0
- package/dist/{chunk-PITHETND.mjs → chunk-TZ5LNR5F.mjs} +3 -3
- package/dist/{chunk-PITHETND.mjs.map → chunk-TZ5LNR5F.mjs.map} +1 -1
- package/dist/{chunk-TWTG323Z.mjs → chunk-UOOTUH6N.mjs} +3 -3
- package/dist/{chunk-TWTG323Z.mjs.map → chunk-UOOTUH6N.mjs.map} +1 -1
- package/dist/{chunk-H2TPFH4A.mjs → chunk-XJUZ5X3W.mjs} +5 -5
- package/dist/{chunk-H2TPFH4A.mjs.map → chunk-XJUZ5X3W.mjs.map} +1 -1
- package/dist/cost/index.mjs +6 -6
- package/dist/curation/index.mjs +6 -6
- package/dist/index.mjs +10 -10
- package/dist/llm/index.mjs +2 -2
- package/dist/route-identity/index.mjs +2 -2
- package/package.json +3 -3
- package/dist/chunk-JMEDHOCQ.mjs.map +0 -1
- package/dist/chunk-S27LMEYZ.mjs.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DEFAULT_PRICING } from './chunk-
|
|
1
|
+
import { DEFAULT_PRICING } from './chunk-TVXNRUJM.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-
|
|
368
|
-
//# sourceMappingURL=chunk-
|
|
367
|
+
//# sourceMappingURL=chunk-NNV3NYUE.mjs.map
|
|
368
|
+
//# sourceMappingURL=chunk-NNV3NYUE.mjs.map
|
|
@@ -1 +1 @@
|
|
|
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
|
+
{"version":3,"sources":["../src/registry/actions.ts","../src/enrichment/index.ts"],"names":[],"mappings":"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","file":"chunk-NNV3NYUE.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"]}
|
|
@@ -501,13 +501,6 @@ var OPENROUTER_ROUTES = {
|
|
|
501
501
|
vendor: "deepseek",
|
|
502
502
|
provider: "openrouter"
|
|
503
503
|
},
|
|
504
|
-
"deepseek/deepseek-r1": {
|
|
505
|
-
inputPer1M: 0.7,
|
|
506
|
-
outputPer1M: 2.5,
|
|
507
|
-
addedAt: "2025-01-20",
|
|
508
|
-
vendor: "deepseek",
|
|
509
|
-
provider: "openrouter"
|
|
510
|
-
},
|
|
511
504
|
"deepseek/deepseek-r1-0528": {
|
|
512
505
|
inputPer1M: 0.5,
|
|
513
506
|
outputPer1M: 2.15,
|
|
@@ -547,9 +540,9 @@ var OPENROUTER_ROUTES = {
|
|
|
547
540
|
provider: "openrouter"
|
|
548
541
|
},
|
|
549
542
|
"deepseek/deepseek-v4-flash-0731": {
|
|
550
|
-
inputPer1M:
|
|
551
|
-
outputPer1M: 0.
|
|
552
|
-
cacheReadMultiplier:
|
|
543
|
+
inputPer1M: 0.15,
|
|
544
|
+
outputPer1M: 0.15,
|
|
545
|
+
cacheReadMultiplier: 0.28,
|
|
553
546
|
addedAt: "2026-07-31",
|
|
554
547
|
vendor: "deepseek",
|
|
555
548
|
provider: "openrouter"
|
|
@@ -563,8 +556,8 @@ var OPENROUTER_ROUTES = {
|
|
|
563
556
|
provider: "openrouter"
|
|
564
557
|
},
|
|
565
558
|
"deepseek/deepseek-v4-pro": {
|
|
566
|
-
inputPer1M: 0.
|
|
567
|
-
outputPer1M:
|
|
559
|
+
inputPer1M: 0.95526,
|
|
560
|
+
outputPer1M: 1.91052,
|
|
568
561
|
cacheReadMultiplier: 0.083333,
|
|
569
562
|
addedAt: "2026-04-24",
|
|
570
563
|
vendor: "deepseek",
|
|
@@ -580,7 +573,7 @@ var OPENROUTER_ROUTES = {
|
|
|
580
573
|
},
|
|
581
574
|
"deepseek/deepseek-v4.1-flash": {
|
|
582
575
|
inputPer1M: 0.04,
|
|
583
|
-
outputPer1M: 0.
|
|
576
|
+
outputPer1M: 0.08,
|
|
584
577
|
cacheReadMultiplier: 0.04,
|
|
585
578
|
addedAt: "2026-09-10",
|
|
586
579
|
vendor: "deepseek",
|
|
@@ -942,8 +935,8 @@ var OPENROUTER_ROUTES = {
|
|
|
942
935
|
provider: "openrouter"
|
|
943
936
|
},
|
|
944
937
|
"google/gemma-4-26b-a4b-it": {
|
|
945
|
-
inputPer1M: 0.
|
|
946
|
-
outputPer1M: 0.
|
|
938
|
+
inputPer1M: 0.09,
|
|
939
|
+
outputPer1M: 0.3,
|
|
947
940
|
cacheReadMultiplier: 0.555556,
|
|
948
941
|
addedAt: "2026-04-03",
|
|
949
942
|
vendor: "google",
|
|
@@ -1080,8 +1073,8 @@ var OPENROUTER_ROUTES = {
|
|
|
1080
1073
|
provider: "openrouter"
|
|
1081
1074
|
},
|
|
1082
1075
|
"meta-llama/llama-3.2-3b-instruct": {
|
|
1083
|
-
inputPer1M: 0.
|
|
1084
|
-
outputPer1M: 0.
|
|
1076
|
+
inputPer1M: 0.0509,
|
|
1077
|
+
outputPer1M: 0.335,
|
|
1085
1078
|
addedAt: "2024-09-25",
|
|
1086
1079
|
vendor: "meta-llama",
|
|
1087
1080
|
provider: "openrouter"
|
|
@@ -1186,13 +1179,6 @@ var OPENROUTER_ROUTES = {
|
|
|
1186
1179
|
vendor: "microsoft",
|
|
1187
1180
|
provider: "openrouter"
|
|
1188
1181
|
},
|
|
1189
|
-
"microsoft/wizardlm-2-8x22b": {
|
|
1190
|
-
inputPer1M: 0.62,
|
|
1191
|
-
outputPer1M: 0.62,
|
|
1192
|
-
addedAt: "2024-04-16",
|
|
1193
|
-
vendor: "microsoft",
|
|
1194
|
-
provider: "openrouter"
|
|
1195
|
-
},
|
|
1196
1182
|
"minimax/minimax-01": {
|
|
1197
1183
|
inputPer1M: 0.2,
|
|
1198
1184
|
outputPer1M: 1.1,
|
|
@@ -1517,9 +1503,9 @@ var OPENROUTER_ROUTES = {
|
|
|
1517
1503
|
provider: "openrouter"
|
|
1518
1504
|
},
|
|
1519
1505
|
"moonshotai/kimi-k3": {
|
|
1520
|
-
inputPer1M: 0.
|
|
1506
|
+
inputPer1M: 0.239,
|
|
1521
1507
|
outputPer1M: 11.936,
|
|
1522
|
-
cacheReadMultiplier: 0.
|
|
1508
|
+
cacheReadMultiplier: 0.878661,
|
|
1523
1509
|
addedAt: "2026-07-16",
|
|
1524
1510
|
vendor: "moonshotai",
|
|
1525
1511
|
provider: "openrouter"
|
|
@@ -2778,8 +2764,9 @@ var OPENROUTER_ROUTES = {
|
|
|
2778
2764
|
provider: "openrouter"
|
|
2779
2765
|
},
|
|
2780
2766
|
"qwen/qwen3.5-27b": {
|
|
2781
|
-
inputPer1M: 0.
|
|
2782
|
-
outputPer1M: 2.
|
|
2767
|
+
inputPer1M: 0.27,
|
|
2768
|
+
outputPer1M: 2.16,
|
|
2769
|
+
cacheReadMultiplier: 1,
|
|
2783
2770
|
addedAt: "2026-02-25",
|
|
2784
2771
|
vendor: "qwen",
|
|
2785
2772
|
provider: "openrouter"
|
|
@@ -3033,13 +3020,6 @@ var OPENROUTER_ROUTES = {
|
|
|
3033
3020
|
vendor: "sao10k",
|
|
3034
3021
|
provider: "openrouter"
|
|
3035
3022
|
},
|
|
3036
|
-
"sao10k/l3.3-euryale-70b": {
|
|
3037
|
-
inputPer1M: 0.65,
|
|
3038
|
-
outputPer1M: 0.75,
|
|
3039
|
-
addedAt: "2024-12-18",
|
|
3040
|
-
vendor: "sao10k",
|
|
3041
|
-
provider: "openrouter"
|
|
3042
|
-
},
|
|
3043
3023
|
"scaledown/extract": {
|
|
3044
3024
|
inputPer1M: 0.04,
|
|
3045
3025
|
outputPer1M: 0,
|
|
@@ -3106,8 +3086,8 @@ var OPENROUTER_ROUTES = {
|
|
|
3106
3086
|
provider: "openrouter"
|
|
3107
3087
|
},
|
|
3108
3088
|
"tencent/hy3": {
|
|
3109
|
-
inputPer1M: 0.
|
|
3110
|
-
outputPer1M: 0.
|
|
3089
|
+
inputPer1M: 0.132,
|
|
3090
|
+
outputPer1M: 0.528,
|
|
3111
3091
|
cacheReadMultiplier: 0.25,
|
|
3112
3092
|
addedAt: "2026-07-06",
|
|
3113
3093
|
vendor: "tencent",
|
|
@@ -3122,8 +3102,8 @@ var OPENROUTER_ROUTES = {
|
|
|
3122
3102
|
provider: "openrouter"
|
|
3123
3103
|
},
|
|
3124
3104
|
"tencent/hy4-preview": {
|
|
3125
|
-
inputPer1M: 0.
|
|
3126
|
-
outputPer1M: 2.
|
|
3105
|
+
inputPer1M: 0.834,
|
|
3106
|
+
outputPer1M: 2.501,
|
|
3127
3107
|
cacheReadMultiplier: 0.05036,
|
|
3128
3108
|
addedAt: "2026-08-28",
|
|
3129
3109
|
vendor: "tencent",
|
|
@@ -3366,8 +3346,8 @@ var OPENROUTER_ROUTES = {
|
|
|
3366
3346
|
provider: "openrouter"
|
|
3367
3347
|
},
|
|
3368
3348
|
"z-ai/glm-4.6": {
|
|
3369
|
-
inputPer1M: 0.
|
|
3370
|
-
outputPer1M: 2,
|
|
3349
|
+
inputPer1M: 0.55,
|
|
3350
|
+
outputPer1M: 2.2,
|
|
3371
3351
|
cacheReadMultiplier: 0.2,
|
|
3372
3352
|
addedAt: "2025-09-30",
|
|
3373
3353
|
vendor: "z-ai",
|
|
@@ -3438,7 +3418,7 @@ var OPENROUTER_ROUTES = {
|
|
|
3438
3418
|
},
|
|
3439
3419
|
"z-ai/glm-5.3-flash": {
|
|
3440
3420
|
inputPer1M: 0.048,
|
|
3441
|
-
outputPer1M: 0.
|
|
3421
|
+
outputPer1M: 0.16,
|
|
3442
3422
|
cacheReadMultiplier: 0.125,
|
|
3443
3423
|
addedAt: "2026-08-26",
|
|
3444
3424
|
vendor: "z-ai",
|
|
@@ -3523,24 +3503,24 @@ var OPENROUTER_ROUTES = {
|
|
|
3523
3503
|
},
|
|
3524
3504
|
"~deepseek/deepseek-flash-latest": {
|
|
3525
3505
|
inputPer1M: 0.05,
|
|
3526
|
-
outputPer1M: 0.
|
|
3527
|
-
cacheReadMultiplier: 0.
|
|
3506
|
+
outputPer1M: 0.15,
|
|
3507
|
+
cacheReadMultiplier: 0.24,
|
|
3528
3508
|
addedAt: "2026-09-14",
|
|
3529
3509
|
vendor: "~deepseek",
|
|
3530
3510
|
provider: "openrouter"
|
|
3531
3511
|
},
|
|
3532
3512
|
"~deepseek/deepseek-pro-latest": {
|
|
3533
|
-
inputPer1M: 0.
|
|
3513
|
+
inputPer1M: 0.225,
|
|
3534
3514
|
outputPer1M: 8,
|
|
3535
|
-
cacheReadMultiplier: 1,
|
|
3515
|
+
cacheReadMultiplier: 1.022222,
|
|
3536
3516
|
addedAt: "2026-09-14",
|
|
3537
3517
|
vendor: "~deepseek",
|
|
3538
3518
|
provider: "openrouter"
|
|
3539
3519
|
},
|
|
3540
3520
|
"~deepseek/deepseek-v4-flash-latest": {
|
|
3541
|
-
inputPer1M:
|
|
3542
|
-
outputPer1M: 0.
|
|
3543
|
-
cacheReadMultiplier:
|
|
3521
|
+
inputPer1M: 65e-4,
|
|
3522
|
+
outputPer1M: 0.45,
|
|
3523
|
+
cacheReadMultiplier: 1,
|
|
3544
3524
|
addedAt: "2026-08-01",
|
|
3545
3525
|
vendor: "~deepseek",
|
|
3546
3526
|
provider: "openrouter"
|
|
@@ -3564,9 +3544,9 @@ var OPENROUTER_ROUTES = {
|
|
|
3564
3544
|
provider: "openrouter"
|
|
3565
3545
|
},
|
|
3566
3546
|
"~moonshotai/kimi-latest": {
|
|
3567
|
-
inputPer1M: 0.
|
|
3568
|
-
outputPer1M:
|
|
3569
|
-
cacheReadMultiplier: 0.
|
|
3547
|
+
inputPer1M: 0.238,
|
|
3548
|
+
outputPer1M: 13,
|
|
3549
|
+
cacheReadMultiplier: 0.957983,
|
|
3570
3550
|
addedAt: "2026-04-27",
|
|
3571
3551
|
vendor: "~moonshotai",
|
|
3572
3552
|
provider: "openrouter"
|
|
@@ -3638,16 +3618,16 @@ var OPENROUTER_ROUTES = {
|
|
|
3638
3618
|
},
|
|
3639
3619
|
"~z-ai/glm-flash-latest": {
|
|
3640
3620
|
inputPer1M: 0.048,
|
|
3641
|
-
outputPer1M: 0.
|
|
3621
|
+
outputPer1M: 0.16,
|
|
3642
3622
|
cacheReadMultiplier: 0.125,
|
|
3643
3623
|
addedAt: "2026-08-27",
|
|
3644
3624
|
vendor: "~z-ai",
|
|
3645
3625
|
provider: "openrouter"
|
|
3646
3626
|
},
|
|
3647
3627
|
"~z-ai/glm-latest": {
|
|
3648
|
-
inputPer1M: 0.
|
|
3649
|
-
outputPer1M:
|
|
3650
|
-
cacheReadMultiplier: 0.
|
|
3628
|
+
inputPer1M: 0.047,
|
|
3629
|
+
outputPer1M: 6,
|
|
3630
|
+
cacheReadMultiplier: 0.617021,
|
|
3651
3631
|
addedAt: "2026-08-19",
|
|
3652
3632
|
vendor: "~z-ai",
|
|
3653
3633
|
provider: "openrouter"
|
|
@@ -5389,5 +5369,5 @@ var OPENCODE_ZEN_ANTHROPIC_MODELS = [
|
|
|
5389
5369
|
];
|
|
5390
5370
|
|
|
5391
5371
|
export { DEFAULT_PRICING, LLM_PRICING_CATALOG, MODEL_ALIASES, OPENCODE_GO_ANTHROPIC_MODELS, OPENCODE_GO_ROUTES, OPENCODE_ZEN_ANTHROPIC_MODELS, OPENCODE_ZEN_ROUTES, OPENROUTER_ROUTES, calculateLLMCreditCost, getCacheStats, getModelProvider, isKnownLlmId, listNativeModelIds, listUnpricedKnownLlmIds, resolveAlias, resolveContextWindow, resolveModelRoute, resolvePricing, resolvePricingExact, selectPricingTier, splitContextWindowHint };
|
|
5392
|
-
//# sourceMappingURL=chunk-
|
|
5393
|
-
//# sourceMappingURL=chunk-
|
|
5372
|
+
//# sourceMappingURL=chunk-TVXNRUJM.mjs.map
|
|
5373
|
+
//# sourceMappingURL=chunk-TVXNRUJM.mjs.map
|