@agentproto/model-catalog 0.11.4 → 0.12.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/README.md +7 -0
- package/dist/access/index.d.ts +3 -3
- package/dist/access/index.mjs +4 -4
- package/dist/{catalog-BAKSkM-q.d.ts → catalog-bHxCjKZP.d.ts} +404 -231
- package/dist/{chunk-TTIJME5T.mjs → chunk-7U7XGVHP.mjs} +12 -2
- package/dist/chunk-7U7XGVHP.mjs.map +1 -0
- package/dist/{chunk-PD7TZ6PJ.mjs → chunk-ARZ2NGZS.mjs} +4 -4
- package/dist/{chunk-PD7TZ6PJ.mjs.map → chunk-ARZ2NGZS.mjs.map} +1 -1
- package/dist/{chunk-WDIFBFY5.mjs → chunk-BOCXDO4T.mjs} +240 -155
- package/dist/chunk-BOCXDO4T.mjs.map +1 -0
- package/dist/{chunk-3YADNIR3.mjs → chunk-DDP4LWNM.mjs} +4 -4
- package/dist/{chunk-3YADNIR3.mjs.map → chunk-DDP4LWNM.mjs.map} +1 -1
- package/dist/{chunk-3MQVOHXC.mjs → chunk-HKPGUJ6C.mjs} +3 -3
- package/dist/{chunk-3MQVOHXC.mjs.map → chunk-HKPGUJ6C.mjs.map} +1 -1
- package/dist/{chunk-BTPINTV6.mjs → chunk-HOTSTCXF.mjs} +3 -3
- package/dist/{chunk-BTPINTV6.mjs.map → chunk-HOTSTCXF.mjs.map} +1 -1
- package/dist/{chunk-N23C5AL6.mjs → chunk-K5FVQ66Z.mjs} +34 -61
- package/dist/chunk-K5FVQ66Z.mjs.map +1 -0
- package/dist/{chunk-JTWZ2BXT.mjs → chunk-YGKXLIZQ.mjs} +5 -5
- package/dist/{chunk-JTWZ2BXT.mjs.map → chunk-YGKXLIZQ.mjs.map} +1 -1
- package/dist/{chunk-DR2AOQDW.mjs → chunk-ZFELFXSM.mjs} +3 -3
- package/dist/{chunk-DR2AOQDW.mjs.map → chunk-ZFELFXSM.mjs.map} +1 -1
- package/dist/cost/index.mjs +6 -6
- package/dist/curation/index.d.ts +2 -2
- package/dist/curation/index.mjs +6 -6
- package/dist/{evaluate-BCFSdYJh.d.ts → evaluate-ChQi1sh7.d.ts} +1 -1
- package/dist/{index-BG_DyoXP.d.ts → index-D75ALRM7.d.ts} +1 -1
- package/dist/{index-BLuu7OZP.d.ts → index-DigHyBLg.d.ts} +2 -2
- package/dist/index.d.ts +5 -5
- package/dist/index.mjs +11 -11
- package/dist/index.mjs.map +1 -1
- package/dist/llm/index.d.ts +1 -1
- package/dist/llm/index.mjs +2 -2
- package/dist/overlay/index.d.ts +1 -1
- package/dist/picker/index.d.ts +4 -4
- package/dist/route-identity/index.d.ts +1 -1
- package/dist/route-identity/index.mjs +2 -2
- package/dist/schema/index.d.ts +21 -0
- package/dist/schema/index.mjs +1 -1
- package/package.json +1 -1
- package/dist/chunk-N23C5AL6.mjs.map +0 -1
- package/dist/chunk-TTIJME5T.mjs.map +0 -1
- package/dist/chunk-WDIFBFY5.mjs.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { getModel } from './chunk-
|
|
2
|
-
import { calculateLLMCreditCost } from './chunk-
|
|
1
|
+
import { getModel } from './chunk-YGKXLIZQ.mjs';
|
|
2
|
+
import { calculateLLMCreditCost } from './chunk-BOCXDO4T.mjs';
|
|
3
3
|
import { computeCenticredits, pricingRegistry } from './chunk-QHELXPSL.mjs';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -223,5 +223,5 @@ function calculateAudioCost(modelId, usage, opts) {
|
|
|
223
223
|
}
|
|
224
224
|
|
|
225
225
|
export { CostUsageKindMismatchError, UnknownModelError, calculateAudioCost, calculateCost, calculateImageCost, calculateLLMCost, calculateVideoCost };
|
|
226
|
-
//# sourceMappingURL=chunk-
|
|
227
|
-
//# sourceMappingURL=chunk-
|
|
226
|
+
//# sourceMappingURL=chunk-DDP4LWNM.mjs.map
|
|
227
|
+
//# sourceMappingURL=chunk-DDP4LWNM.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cost/index.ts"],"names":["resolved","baseCostUsd","credits","calculatedCredits","markup"],"mappings":"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","file":"chunk-3YADNIR3.mjs","sourcesContent":["/**\n * Cost dispatcher — computes credit cost + production USD cost for any\n * model id, regardless of kind. Single entry point used by orchestrator,\n * billing audits, and (eventually) the metered MCP gen layer.\n *\n * Per-kind formulas:\n * - LLM → reuses `calculateLLMCreditCost` (token math + cache + markup)\n * - Image → `creditCost × numOutputs`\n * - Video → `creditCost × multipliers[resolution|duration|mode]`\n * - Audio → `creditCost × (characters or seconds)` per `billingUnit`\n */\n\nimport {\n calculateLLMCreditCost,\n type LLMCreditCostResult,\n} from \"../llm/index.js\"\nimport { getModel } from \"../registry/index.js\"\nimport { computeCenticredits, pricingRegistry } from \"../pricing/index.js\"\n\n/**\n * Voice metadata → default audio model the dispatcher bills through.\n *\n * Voices are render-targets, not priced units. A MiniMax voice can be\n * played through `minimax/speech-02-hd` OR `…-turbo`; an ElevenLabs\n * voice through any of their model tiers. We default to the cheapest\n * model per provider so a drive-by voice-id call doesn't over-bill.\n * Callers wanting HD / premium-tier pricing should pass the audio\n * model id directly with the voice as metadata — see\n * `text-to-speech.tool.ts` for the canonical pattern.\n *\n * Add a new provider here when a new voice catalog lands (e.g.\n * `ELEVENLABS_VOICES` if/when we surface their voice IDs).\n */\nconst VOICE_PROVIDER_DEFAULT_MODEL: Record<string, string> = {\n minimax: \"minimax/speech-02-turbo\",\n elevenlabs: \"elevenlabs/flash-v2.5\",\n}\n\nexport type CostUsage =\n | {\n kind: \"llm\"\n inputTokens: number\n outputTokens: number\n cacheReadInputTokens?: number\n cacheCreationInputTokens?: number\n }\n | { kind: \"image\"; numOutputs?: number }\n | {\n kind: \"video\"\n resolution?: string\n duration?: number\n mode?: string\n }\n | { kind: \"audio\"; characters?: number; seconds?: number }\n\nexport interface CostResult {\n kind: \"llm\" | \"image\" | \"video\" | \"audio\"\n modelId: string\n /** Canonical model id after alias resolution (LLM only; same as modelId for media) */\n canonicalId: string\n /**\n * Total **centicredits** to charge (1 displayed credit = 100 cc).\n * Honors per-model overrides. Feed straight into the ledger — the\n * `credit_transactions.credits` column stores cc, so no `× 100`\n * conversion at the call site. Format for display with\n * `displayCredits(cc) → cr`.\n */\n credits: number\n /**\n * Centicredits the pure formula (provider cost × category markup)\n * would have charged, independent of any per-model override. Equal\n * to `credits` when no override is in play. Surfaced so\n * reconciliation can diff \"what we did\" vs \"what the formula said\"\n * without recomputing — persisted to `usage_events.calculated_credits`.\n */\n calculatedCredits: number\n /** Production cost in USD (provider-side, before markup) */\n baseCostUsd: number\n /** Per-kind breakdown — inputCredits/outputCredits for LLM, etc. All in cc. */\n breakdown: Record<string, number>\n /** True iff fallback pricing was used (currently LLM-only) */\n isFallback: boolean\n /** Markup applied (1.0 = catalog rate as-is) */\n markup: number\n}\n\nexport class UnknownModelError extends Error {\n constructor(public readonly modelId: string) {\n super(`Unknown model id: \"${modelId}\"`)\n this.name = \"UnknownModelError\"\n }\n}\n\nexport class CostUsageKindMismatchError extends Error {\n constructor(\n public readonly modelId: string,\n public readonly expected: string,\n public readonly got: string\n ) {\n super(\n `Model \"${modelId}\" is kind \"${expected}\", but received usage of kind \"${got}\"`\n )\n this.name = \"CostUsageKindMismatchError\"\n }\n}\n\nexport interface CalculateCostOptions {\n /**\n * App that's invoking the model. Routes per-app markup overrides\n * registered via `pricingRegistry.registerApp(appId, ...)`. When\n * omitted, core defaults apply.\n */\n appId?: string\n}\n\n/**\n * Computes credit + USD cost for a model run.\n *\n * Throws `UnknownModelError` for ids not in any catalog (LLM has its own\n * fallback path inside `calculateLLMCreditCost` — this surface preserves\n * that for back-compat).\n *\n * Throws `CostUsageKindMismatchError` if `usage.kind` doesn't match the\n * resolved model's kind (data integrity guard).\n *\n * Image / video / audio credits are derived at call time via the\n * pricing registry (`provider_cost × category-markup`). LLM keeps its\n * own per-model markup table inside `calculateLLMCreditCost` —\n * collapsing that follows in W6b.\n */\nexport function calculateCost(\n modelId: string,\n usage: CostUsage,\n opts: CalculateCostOptions = {}\n): CostResult {\n // LLM has a fallback path that returns valid pricing even for unknown\n // ids (preserves the orchestrator's existing tolerance). Other kinds\n // throw for unknowns.\n if (usage.kind === \"llm\") {\n const llmResult: LLMCreditCostResult = calculateLLMCreditCost(modelId, {\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n cacheReadInputTokens: usage.cacheReadInputTokens,\n cacheCreationInputTokens: usage.cacheCreationInputTokens,\n })\n const resolved = getModel(modelId)\n const canonicalId =\n resolved && resolved.kind === \"llm\" ? resolved.canonicalId : modelId\n return {\n kind: \"llm\",\n modelId,\n canonicalId,\n credits: llmResult.credits,\n calculatedCredits: llmResult.calculatedCredits,\n baseCostUsd: llmResult.productionCost,\n breakdown: {\n inputCredits: llmResult.inputCredits,\n outputCredits: llmResult.outputCredits,\n cacheReadCredits: llmResult.cacheReadCredits,\n cacheWriteCredits: llmResult.cacheWriteCredits,\n },\n isFallback: llmResult.isFallback,\n markup: llmResult.markup,\n }\n }\n\n const resolved = getModel(modelId)\n if (!resolved) throw new UnknownModelError(modelId)\n // `voice` is structurally audio for billing purposes (MiniMax voice\n // metadata billed via per-character output). Accept `audio` usage on\n // voice models so the per-kind branches below can pattern-match.\n const expectedUsageKind: CostUsage[\"kind\"] =\n resolved.kind === \"voice\" ? \"audio\" : resolved.kind\n if (expectedUsageKind !== usage.kind) {\n // Pass `expectedUsageKind` (not `resolved.kind`) so the error message\n // accurately says \"audio\" rather than \"voice\" when a voice model is\n // billed — the caller must supply audio usage, not voice usage.\n throw new CostUsageKindMismatchError(modelId, expectedUsageKind, usage.kind)\n }\n\n if (resolved.kind === \"image\") {\n // `usage.kind` is \"image\" here (guarded above) but TS won't cross-narrow\n // it from `resolved.kind`, so check explicitly before reading numOutputs.\n const numOutputs = Math.max(\n 1,\n usage.kind === \"image\" ? (usage.numOutputs ?? 1) : 1\n )\n const baseCostUsd = resolved.def.pricing.baseCost * numOutputs\n const perOutputCredits = computeCenticredits({\n baseCostUsd: resolved.def.pricing.baseCost,\n category: \"image\",\n overrideCreditCost: resolved.def.pricing.overrideCreditCost,\n appId: opts.appId,\n })\n const credits = perOutputCredits * numOutputs\n // Formula-only (ignores override) — for `usage_events.calculated_credits`.\n const formulaPerOutput = computeCenticredits({\n baseCostUsd: resolved.def.pricing.baseCost,\n category: \"image\",\n appId: opts.appId,\n })\n const calculatedCredits = formulaPerOutput * numOutputs\n const markup = pricingRegistry.getMarkup(\"image\", opts.appId)\n return {\n kind: \"image\",\n modelId,\n canonicalId: modelId,\n credits,\n calculatedCredits,\n baseCostUsd,\n breakdown: {\n perOutputCredits,\n numOutputs,\n },\n isFallback: false,\n markup,\n }\n }\n\n if (resolved.kind === \"video\") {\n if (usage.kind !== \"video\") {\n throw new CostUsageKindMismatchError(modelId, \"video\", usage.kind)\n }\n const pricing = resolved.def.pricing\n // Provider-side multipliers — re-applied to BOTH the provider cost\n // (what we pay) AND the derived credit cost (so margin holds).\n const mult = pricing.multipliers\n const resMult =\n usage.resolution && mult?.resolution\n ? (mult.resolution[usage.resolution] ?? 1.0)\n : 1.0\n const durMult =\n usage.duration && mult?.duration\n ? (mult.duration[usage.duration] ?? 1.0)\n : 1.0\n const modMult =\n usage.mode && mult?.mode ? (mult.mode[usage.mode] ?? 1.0) : 1.0\n const variantMultiplier = resMult * durMult * modMult\n const baseCostUsd = pricing.baseCost * variantMultiplier\n const perClipCredits = computeCenticredits({\n baseCostUsd: pricing.baseCost,\n category: \"video\",\n overrideCreditCost: pricing.overrideCreditCost,\n appId: opts.appId,\n })\n const credits = Math.ceil(perClipCredits * variantMultiplier)\n const formulaPerClip = computeCenticredits({\n baseCostUsd: pricing.baseCost,\n category: \"video\",\n appId: opts.appId,\n })\n const calculatedCredits = Math.ceil(formulaPerClip * variantMultiplier)\n const markup = pricingRegistry.getMarkup(\"video\", opts.appId)\n return {\n kind: \"video\",\n modelId,\n canonicalId: modelId,\n credits,\n calculatedCredits,\n baseCostUsd,\n breakdown: {\n perClipCredits,\n resolutionMultiplier: resMult,\n durationMultiplier: durMult,\n modeMultiplier: modMult,\n variantMultiplier,\n },\n isFallback: false,\n markup,\n }\n }\n\n // Audio (and voice, delegated as audio — see expectedUsageKind above).\n if (usage.kind !== \"audio\") {\n throw new CostUsageKindMismatchError(modelId, \"audio\", usage.kind)\n }\n\n if (resolved.kind === \"voice\") {\n // Voice rows are metadata; delegate to the provider's default audio model.\n const provider = resolved.voice.provider\n const delegateModelId = VOICE_PROVIDER_DEFAULT_MODEL[provider]\n if (!delegateModelId) throw new UnknownModelError(modelId)\n const delegateResult = calculateCost(delegateModelId, usage, opts)\n return {\n ...delegateResult,\n modelId,\n canonicalId: delegateModelId,\n }\n }\n\n // Only `audio` remains (llm returned at top; image/video/voice handled\n // above). Narrow explicitly so `.def` is type-safe.\n if (resolved.kind !== \"audio\") throw new UnknownModelError(modelId)\n const audioPricing = resolved.def.pricing\n // Map the provider's billing unit to a quantity of billable units.\n // The catalog DATA uses `per_1k_chars` (chars ÷ 1000) and `per_minute`\n // (whole minutes, rounded UP to match provider invoicing). `per_character`\n // / `per_second` are handled too so a future data migration to those units\n // keeps working. NOTE: do not switch on the zod enum value alone — the\n // audio schema enum is stale (`per_character|per_second`) while the data\n // still ships `per_1k_chars|per_minute`; trusting the enum bills 0.\n const billingUnit = audioPricing.billingUnit as string\n let quantity: number\n switch (billingUnit) {\n case \"per_1k_chars\":\n quantity = Math.max(0, usage.characters ?? 0) / 1000\n break\n case \"per_character\":\n quantity = Math.max(0, usage.characters ?? 0)\n break\n case \"per_minute\":\n quantity = Math.ceil(Math.max(0, usage.seconds ?? 0) / 60)\n break\n case \"per_second\":\n default:\n quantity = Math.max(0, usage.seconds ?? 0)\n break\n }\n const baseCostUsd = audioPricing.baseCost * quantity\n const perUnitCredits = computeCenticredits({\n baseCostUsd: audioPricing.baseCost,\n category: \"audio\",\n overrideCreditCost: audioPricing.overrideCreditCost,\n appId: opts.appId,\n })\n // Per-call floor (1 cc) so a non-empty call never rounds to 0; a genuinely\n // empty call (quantity 0, e.g. empty-string TTS) bills nothing.\n const credits =\n quantity > 0 ? Math.max(1, Math.ceil(perUnitCredits * quantity)) : 0\n const formulaPerUnit = computeCenticredits({\n baseCostUsd: audioPricing.baseCost,\n category: \"audio\",\n appId: opts.appId,\n })\n const calculatedCredits =\n quantity > 0 ? Math.max(1, Math.ceil(formulaPerUnit * quantity)) : 0\n const markup = pricingRegistry.getMarkup(\"audio\", opts.appId)\n return {\n kind: \"audio\",\n modelId,\n canonicalId: modelId,\n credits,\n calculatedCredits,\n baseCostUsd,\n breakdown: {\n perUnitCredits,\n quantity,\n },\n isFallback: false,\n markup,\n }\n}\n\n// Thin ergonomic wrappers around `calculateCost`. Two reasons they exist:\n// 1. Callers with a known kind don't want to construct the full union.\n// 2. The kind/usage union is a `calculateCost` implementation detail —\n// wrapper types are narrower and easier to read at call sites.\n\nexport function calculateLLMCost(\n modelId: string,\n usage: {\n inputTokens: number\n outputTokens: number\n cacheReadInputTokens?: number\n cacheCreationInputTokens?: number\n },\n opts?: CalculateCostOptions\n): CostResult {\n return calculateCost(modelId, { kind: \"llm\", ...usage }, opts)\n}\n\nexport function calculateImageCost(\n modelId: string,\n usage: { numOutputs?: number },\n opts?: CalculateCostOptions\n): CostResult {\n return calculateCost(modelId, { kind: \"image\", ...usage }, opts)\n}\n\nexport function calculateVideoCost(\n modelId: string,\n usage: { resolution?: string; duration?: number; mode?: string },\n opts?: CalculateCostOptions\n): CostResult {\n return calculateCost(modelId, { kind: \"video\", ...usage }, opts)\n}\n\nexport function calculateAudioCost(\n modelId: string,\n usage: { characters?: number; seconds?: number },\n opts?: CalculateCostOptions\n): CostResult {\n return calculateCost(modelId, { kind: \"audio\", ...usage }, opts)\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/cost/index.ts"],"names":["resolved","baseCostUsd","credits","calculatedCredits","markup"],"mappings":"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","file":"chunk-DDP4LWNM.mjs","sourcesContent":["/**\n * Cost dispatcher — computes credit cost + production USD cost for any\n * model id, regardless of kind. Single entry point used by orchestrator,\n * billing audits, and (eventually) the metered MCP gen layer.\n *\n * Per-kind formulas:\n * - LLM → reuses `calculateLLMCreditCost` (token math + cache + markup)\n * - Image → `creditCost × numOutputs`\n * - Video → `creditCost × multipliers[resolution|duration|mode]`\n * - Audio → `creditCost × (characters or seconds)` per `billingUnit`\n */\n\nimport {\n calculateLLMCreditCost,\n type LLMCreditCostResult,\n} from \"../llm/index.js\"\nimport { getModel } from \"../registry/index.js\"\nimport { computeCenticredits, pricingRegistry } from \"../pricing/index.js\"\n\n/**\n * Voice metadata → default audio model the dispatcher bills through.\n *\n * Voices are render-targets, not priced units. A MiniMax voice can be\n * played through `minimax/speech-02-hd` OR `…-turbo`; an ElevenLabs\n * voice through any of their model tiers. We default to the cheapest\n * model per provider so a drive-by voice-id call doesn't over-bill.\n * Callers wanting HD / premium-tier pricing should pass the audio\n * model id directly with the voice as metadata — see\n * `text-to-speech.tool.ts` for the canonical pattern.\n *\n * Add a new provider here when a new voice catalog lands (e.g.\n * `ELEVENLABS_VOICES` if/when we surface their voice IDs).\n */\nconst VOICE_PROVIDER_DEFAULT_MODEL: Record<string, string> = {\n minimax: \"minimax/speech-02-turbo\",\n elevenlabs: \"elevenlabs/flash-v2.5\",\n}\n\nexport type CostUsage =\n | {\n kind: \"llm\"\n inputTokens: number\n outputTokens: number\n cacheReadInputTokens?: number\n cacheCreationInputTokens?: number\n }\n | { kind: \"image\"; numOutputs?: number }\n | {\n kind: \"video\"\n resolution?: string\n duration?: number\n mode?: string\n }\n | { kind: \"audio\"; characters?: number; seconds?: number }\n\nexport interface CostResult {\n kind: \"llm\" | \"image\" | \"video\" | \"audio\"\n modelId: string\n /** Canonical model id after alias resolution (LLM only; same as modelId for media) */\n canonicalId: string\n /**\n * Total **centicredits** to charge (1 displayed credit = 100 cc).\n * Honors per-model overrides. Feed straight into the ledger — the\n * `credit_transactions.credits` column stores cc, so no `× 100`\n * conversion at the call site. Format for display with\n * `displayCredits(cc) → cr`.\n */\n credits: number\n /**\n * Centicredits the pure formula (provider cost × category markup)\n * would have charged, independent of any per-model override. Equal\n * to `credits` when no override is in play. Surfaced so\n * reconciliation can diff \"what we did\" vs \"what the formula said\"\n * without recomputing — persisted to `usage_events.calculated_credits`.\n */\n calculatedCredits: number\n /** Production cost in USD (provider-side, before markup) */\n baseCostUsd: number\n /** Per-kind breakdown — inputCredits/outputCredits for LLM, etc. All in cc. */\n breakdown: Record<string, number>\n /** True iff fallback pricing was used (currently LLM-only) */\n isFallback: boolean\n /** Markup applied (1.0 = catalog rate as-is) */\n markup: number\n}\n\nexport class UnknownModelError extends Error {\n constructor(public readonly modelId: string) {\n super(`Unknown model id: \"${modelId}\"`)\n this.name = \"UnknownModelError\"\n }\n}\n\nexport class CostUsageKindMismatchError extends Error {\n constructor(\n public readonly modelId: string,\n public readonly expected: string,\n public readonly got: string\n ) {\n super(\n `Model \"${modelId}\" is kind \"${expected}\", but received usage of kind \"${got}\"`\n )\n this.name = \"CostUsageKindMismatchError\"\n }\n}\n\nexport interface CalculateCostOptions {\n /**\n * App that's invoking the model. Routes per-app markup overrides\n * registered via `pricingRegistry.registerApp(appId, ...)`. When\n * omitted, core defaults apply.\n */\n appId?: string\n}\n\n/**\n * Computes credit + USD cost for a model run.\n *\n * Throws `UnknownModelError` for ids not in any catalog (LLM has its own\n * fallback path inside `calculateLLMCreditCost` — this surface preserves\n * that for back-compat).\n *\n * Throws `CostUsageKindMismatchError` if `usage.kind` doesn't match the\n * resolved model's kind (data integrity guard).\n *\n * Image / video / audio credits are derived at call time via the\n * pricing registry (`provider_cost × category-markup`). LLM keeps its\n * own per-model markup table inside `calculateLLMCreditCost` —\n * collapsing that follows in W6b.\n */\nexport function calculateCost(\n modelId: string,\n usage: CostUsage,\n opts: CalculateCostOptions = {}\n): CostResult {\n // LLM has a fallback path that returns valid pricing even for unknown\n // ids (preserves the orchestrator's existing tolerance). Other kinds\n // throw for unknowns.\n if (usage.kind === \"llm\") {\n const llmResult: LLMCreditCostResult = calculateLLMCreditCost(modelId, {\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n cacheReadInputTokens: usage.cacheReadInputTokens,\n cacheCreationInputTokens: usage.cacheCreationInputTokens,\n })\n const resolved = getModel(modelId)\n const canonicalId =\n resolved && resolved.kind === \"llm\" ? resolved.canonicalId : modelId\n return {\n kind: \"llm\",\n modelId,\n canonicalId,\n credits: llmResult.credits,\n calculatedCredits: llmResult.calculatedCredits,\n baseCostUsd: llmResult.productionCost,\n breakdown: {\n inputCredits: llmResult.inputCredits,\n outputCredits: llmResult.outputCredits,\n cacheReadCredits: llmResult.cacheReadCredits,\n cacheWriteCredits: llmResult.cacheWriteCredits,\n },\n isFallback: llmResult.isFallback,\n markup: llmResult.markup,\n }\n }\n\n const resolved = getModel(modelId)\n if (!resolved) throw new UnknownModelError(modelId)\n // `voice` is structurally audio for billing purposes (MiniMax voice\n // metadata billed via per-character output). Accept `audio` usage on\n // voice models so the per-kind branches below can pattern-match.\n const expectedUsageKind: CostUsage[\"kind\"] =\n resolved.kind === \"voice\" ? \"audio\" : resolved.kind\n if (expectedUsageKind !== usage.kind) {\n // Pass `expectedUsageKind` (not `resolved.kind`) so the error message\n // accurately says \"audio\" rather than \"voice\" when a voice model is\n // billed — the caller must supply audio usage, not voice usage.\n throw new CostUsageKindMismatchError(modelId, expectedUsageKind, usage.kind)\n }\n\n if (resolved.kind === \"image\") {\n // `usage.kind` is \"image\" here (guarded above) but TS won't cross-narrow\n // it from `resolved.kind`, so check explicitly before reading numOutputs.\n const numOutputs = Math.max(\n 1,\n usage.kind === \"image\" ? (usage.numOutputs ?? 1) : 1\n )\n const baseCostUsd = resolved.def.pricing.baseCost * numOutputs\n const perOutputCredits = computeCenticredits({\n baseCostUsd: resolved.def.pricing.baseCost,\n category: \"image\",\n overrideCreditCost: resolved.def.pricing.overrideCreditCost,\n appId: opts.appId,\n })\n const credits = perOutputCredits * numOutputs\n // Formula-only (ignores override) — for `usage_events.calculated_credits`.\n const formulaPerOutput = computeCenticredits({\n baseCostUsd: resolved.def.pricing.baseCost,\n category: \"image\",\n appId: opts.appId,\n })\n const calculatedCredits = formulaPerOutput * numOutputs\n const markup = pricingRegistry.getMarkup(\"image\", opts.appId)\n return {\n kind: \"image\",\n modelId,\n canonicalId: modelId,\n credits,\n calculatedCredits,\n baseCostUsd,\n breakdown: {\n perOutputCredits,\n numOutputs,\n },\n isFallback: false,\n markup,\n }\n }\n\n if (resolved.kind === \"video\") {\n if (usage.kind !== \"video\") {\n throw new CostUsageKindMismatchError(modelId, \"video\", usage.kind)\n }\n const pricing = resolved.def.pricing\n // Provider-side multipliers — re-applied to BOTH the provider cost\n // (what we pay) AND the derived credit cost (so margin holds).\n const mult = pricing.multipliers\n const resMult =\n usage.resolution && mult?.resolution\n ? (mult.resolution[usage.resolution] ?? 1.0)\n : 1.0\n const durMult =\n usage.duration && mult?.duration\n ? (mult.duration[usage.duration] ?? 1.0)\n : 1.0\n const modMult =\n usage.mode && mult?.mode ? (mult.mode[usage.mode] ?? 1.0) : 1.0\n const variantMultiplier = resMult * durMult * modMult\n const baseCostUsd = pricing.baseCost * variantMultiplier\n const perClipCredits = computeCenticredits({\n baseCostUsd: pricing.baseCost,\n category: \"video\",\n overrideCreditCost: pricing.overrideCreditCost,\n appId: opts.appId,\n })\n const credits = Math.ceil(perClipCredits * variantMultiplier)\n const formulaPerClip = computeCenticredits({\n baseCostUsd: pricing.baseCost,\n category: \"video\",\n appId: opts.appId,\n })\n const calculatedCredits = Math.ceil(formulaPerClip * variantMultiplier)\n const markup = pricingRegistry.getMarkup(\"video\", opts.appId)\n return {\n kind: \"video\",\n modelId,\n canonicalId: modelId,\n credits,\n calculatedCredits,\n baseCostUsd,\n breakdown: {\n perClipCredits,\n resolutionMultiplier: resMult,\n durationMultiplier: durMult,\n modeMultiplier: modMult,\n variantMultiplier,\n },\n isFallback: false,\n markup,\n }\n }\n\n // Audio (and voice, delegated as audio — see expectedUsageKind above).\n if (usage.kind !== \"audio\") {\n throw new CostUsageKindMismatchError(modelId, \"audio\", usage.kind)\n }\n\n if (resolved.kind === \"voice\") {\n // Voice rows are metadata; delegate to the provider's default audio model.\n const provider = resolved.voice.provider\n const delegateModelId = VOICE_PROVIDER_DEFAULT_MODEL[provider]\n if (!delegateModelId) throw new UnknownModelError(modelId)\n const delegateResult = calculateCost(delegateModelId, usage, opts)\n return {\n ...delegateResult,\n modelId,\n canonicalId: delegateModelId,\n }\n }\n\n // Only `audio` remains (llm returned at top; image/video/voice handled\n // above). Narrow explicitly so `.def` is type-safe.\n if (resolved.kind !== \"audio\") throw new UnknownModelError(modelId)\n const audioPricing = resolved.def.pricing\n // Map the provider's billing unit to a quantity of billable units.\n // The catalog DATA uses `per_1k_chars` (chars ÷ 1000) and `per_minute`\n // (whole minutes, rounded UP to match provider invoicing). `per_character`\n // / `per_second` are handled too so a future data migration to those units\n // keeps working. NOTE: do not switch on the zod enum value alone — the\n // audio schema enum is stale (`per_character|per_second`) while the data\n // still ships `per_1k_chars|per_minute`; trusting the enum bills 0.\n const billingUnit = audioPricing.billingUnit as string\n let quantity: number\n switch (billingUnit) {\n case \"per_1k_chars\":\n quantity = Math.max(0, usage.characters ?? 0) / 1000\n break\n case \"per_character\":\n quantity = Math.max(0, usage.characters ?? 0)\n break\n case \"per_minute\":\n quantity = Math.ceil(Math.max(0, usage.seconds ?? 0) / 60)\n break\n case \"per_second\":\n default:\n quantity = Math.max(0, usage.seconds ?? 0)\n break\n }\n const baseCostUsd = audioPricing.baseCost * quantity\n const perUnitCredits = computeCenticredits({\n baseCostUsd: audioPricing.baseCost,\n category: \"audio\",\n overrideCreditCost: audioPricing.overrideCreditCost,\n appId: opts.appId,\n })\n // Per-call floor (1 cc) so a non-empty call never rounds to 0; a genuinely\n // empty call (quantity 0, e.g. empty-string TTS) bills nothing.\n const credits =\n quantity > 0 ? Math.max(1, Math.ceil(perUnitCredits * quantity)) : 0\n const formulaPerUnit = computeCenticredits({\n baseCostUsd: audioPricing.baseCost,\n category: \"audio\",\n appId: opts.appId,\n })\n const calculatedCredits =\n quantity > 0 ? Math.max(1, Math.ceil(formulaPerUnit * quantity)) : 0\n const markup = pricingRegistry.getMarkup(\"audio\", opts.appId)\n return {\n kind: \"audio\",\n modelId,\n canonicalId: modelId,\n credits,\n calculatedCredits,\n baseCostUsd,\n breakdown: {\n perUnitCredits,\n quantity,\n },\n isFallback: false,\n markup,\n }\n}\n\n// Thin ergonomic wrappers around `calculateCost`. Two reasons they exist:\n// 1. Callers with a known kind don't want to construct the full union.\n// 2. The kind/usage union is a `calculateCost` implementation detail —\n// wrapper types are narrower and easier to read at call sites.\n\nexport function calculateLLMCost(\n modelId: string,\n usage: {\n inputTokens: number\n outputTokens: number\n cacheReadInputTokens?: number\n cacheCreationInputTokens?: number\n },\n opts?: CalculateCostOptions\n): CostResult {\n return calculateCost(modelId, { kind: \"llm\", ...usage }, opts)\n}\n\nexport function calculateImageCost(\n modelId: string,\n usage: { numOutputs?: number },\n opts?: CalculateCostOptions\n): CostResult {\n return calculateCost(modelId, { kind: \"image\", ...usage }, opts)\n}\n\nexport function calculateVideoCost(\n modelId: string,\n usage: { resolution?: string; duration?: number; mode?: string },\n opts?: CalculateCostOptions\n): CostResult {\n return calculateCost(modelId, { kind: \"video\", ...usage }, opts)\n}\n\nexport function calculateAudioCost(\n modelId: string,\n usage: { characters?: number; seconds?: number },\n opts?: CalculateCostOptions\n): CostResult {\n return calculateCost(modelId, { kind: \"audio\", ...usage }, opts)\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DEFAULT_PRICING } from './chunk-
|
|
1
|
+
import { DEFAULT_PRICING } from './chunk-BOCXDO4T.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-HKPGUJ6C.mjs.map
|
|
368
|
+
//# sourceMappingURL=chunk-HKPGUJ6C.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/registry/actions.ts","../src/enrichment/index.ts"],"names":[],"mappings":"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","file":"chunk-3MQVOHXC.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-HKPGUJ6C.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,4 +1,4 @@
|
|
|
1
|
-
import { OPENCODE_GO_ROUTES, OPENCODE_ZEN_ROUTES, OPENCODE_GO_ANTHROPIC_MODELS, OPENCODE_ZEN_ANTHROPIC_MODELS } from './chunk-
|
|
1
|
+
import { OPENCODE_GO_ROUTES, OPENCODE_ZEN_ROUTES, OPENCODE_GO_ANTHROPIC_MODELS, OPENCODE_ZEN_ANTHROPIC_MODELS } from './chunk-BOCXDO4T.mjs';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @agentproto/model-catalog v0.1.0
|
|
@@ -76,5 +76,5 @@ var LLM_TIERS = {
|
|
|
76
76
|
};
|
|
77
77
|
|
|
78
78
|
export { LLM_TIERS, OPERATOR_AGENT_MODELS, OPERATOR_DEFAULT_GEMINI, OPERATOR_DEFAULT_PREMIUM, OPERATOR_DEFAULT_STANDARD, WORKFLOW_FAST_MODEL, WORKFLOW_PREMIUM_MODEL, WORKFLOW_TINY_MODEL, formatTokens, listOpencodeAnthropicModelRefs, listOpencodeModelRefs };
|
|
79
|
-
//# sourceMappingURL=chunk-
|
|
80
|
-
//# sourceMappingURL=chunk-
|
|
79
|
+
//# sourceMappingURL=chunk-HOTSTCXF.mjs.map
|
|
80
|
+
//# sourceMappingURL=chunk-HOTSTCXF.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/llm/opencode.ts","../src/llm/tokens.ts","../src/llm/defaults.ts"],"names":[],"mappings":";;;;;;;;;AAiCO,SAAS,sBAAsB,QAAA,EAAsC;AAC1E,EAAA,MAAM,MAAA,GAAS,QAAA,KAAa,aAAA,GAAgB,kBAAA,GAAqB,mBAAA;AACjE,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,IAAA,EAAK;AAClC;AAkBO,SAAS,+BAA+B,QAAA,EAAsC;AACnF,EAAA,MAAM,OAAA,GACJ,QAAA,KAAa,aAAA,GAAgB,4BAAA,GAA+B,6BAAA;AAC9D,EAAA,OAAO,OAAA,CAAQ,IAAI,CAAA,EAAA,KAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,CAAA,CAAE,IAAA,EAAK;AACrD;;;ACjDO,SAAS,aAAa,CAAA,EAAsC;AACjE,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,IAAK,GAAG,OAAO,IAAA;AAC5C,EAAA,IAAI,KAAK,GAAA,EAAW;AAClB,IAAA,MAAM,IAAI,CAAA,GAAI,GAAA;AACd,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,GAAI,OAAO,CAAC,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAC1D,IAAA,OAAO,GAAG,IAAI,CAAA,CAAA,CAAA;AAAA,EAChB;AACA,EAAA,IAAI,KAAK,GAAA,EAAO;AACd,IAAA,MAAM,IAAI,CAAA,GAAI,GAAA;AACd,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,GAAI,OAAO,CAAC,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAC1D,IAAA,OAAO,GAAG,IAAI,CAAA,CAAA,CAAA;AAAA,EAChB;AACA,EAAA,OAAO,OAAO,CAAC,CAAA;AACjB;;;ACRO,IAAM,mBAAA,GAAsB;AAG5B,IAAM,sBAAA,GAAyB;AAG/B,IAAM,mBAAA,GAAsB;AAO5B,IAAM,qBAAA,GAAwB;AAAA,EACnC,iBAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF;AAKO,IAAM,wBAAA,GAA+C;AACrD,IAAM,yBAAA,GAAgD;AACtD,IAAM,uBAAA,GACX;AAcK,IAAM,SAAA,GAAY;AAAA;AAAA,EAEvB,IAAA,EAAM,CAAC,+BAA+B,CAAA;AAAA;AAAA,EAEtC,IAAA,EAAM;AAAA,IACJ,cAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA,EAEA,IAAA,EAAM;AAAA,IACJ,kBAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA,EAEA,IAAA,EAAM;AAAA,IACJ,mBAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA,EAEA,GAAA,EAAK;AAAA,IACH,iBAAA;AAAA,IACA,+BAAA;AAAA,IACA;AAAA;AAEJ","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/llm/opencode.ts","../src/llm/tokens.ts","../src/llm/defaults.ts"],"names":[],"mappings":";;;;;;;;;AAiCO,SAAS,sBAAsB,QAAA,EAAsC;AAC1E,EAAA,MAAM,MAAA,GAAS,QAAA,KAAa,aAAA,GAAgB,kBAAA,GAAqB,mBAAA;AACjE,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,IAAA,EAAK;AAClC;AAkBO,SAAS,+BAA+B,QAAA,EAAsC;AACnF,EAAA,MAAM,OAAA,GACJ,QAAA,KAAa,aAAA,GAAgB,4BAAA,GAA+B,6BAAA;AAC9D,EAAA,OAAO,OAAA,CAAQ,IAAI,CAAA,EAAA,KAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,CAAA,CAAE,IAAA,EAAK;AACrD;;;ACjDO,SAAS,aAAa,CAAA,EAAsC;AACjE,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,IAAK,GAAG,OAAO,IAAA;AAC5C,EAAA,IAAI,KAAK,GAAA,EAAW;AAClB,IAAA,MAAM,IAAI,CAAA,GAAI,GAAA;AACd,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,GAAI,OAAO,CAAC,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAC1D,IAAA,OAAO,GAAG,IAAI,CAAA,CAAA,CAAA;AAAA,EAChB;AACA,EAAA,IAAI,KAAK,GAAA,EAAO;AACd,IAAA,MAAM,IAAI,CAAA,GAAI,GAAA;AACd,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,GAAI,OAAO,CAAC,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAC1D,IAAA,OAAO,GAAG,IAAI,CAAA,CAAA,CAAA;AAAA,EAChB;AACA,EAAA,OAAO,OAAO,CAAC,CAAA;AACjB;;;ACRO,IAAM,mBAAA,GAAsB;AAG5B,IAAM,sBAAA,GAAyB;AAG/B,IAAM,mBAAA,GAAsB;AAO5B,IAAM,qBAAA,GAAwB;AAAA,EACnC,iBAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF;AAKO,IAAM,wBAAA,GAA+C;AACrD,IAAM,yBAAA,GAAgD;AACtD,IAAM,uBAAA,GACX;AAcK,IAAM,SAAA,GAAY;AAAA;AAAA,EAEvB,IAAA,EAAM,CAAC,+BAA+B,CAAA;AAAA;AAAA,EAEtC,IAAA,EAAM;AAAA,IACJ,cAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA,EAEA,IAAA,EAAM;AAAA,IACJ,kBAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA,EAEA,IAAA,EAAM;AAAA,IACJ,mBAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA,EAEA,GAAA,EAAK;AAAA,IACH,iBAAA;AAAA,IACA,+BAAA;AAAA,IACA;AAAA;AAEJ","file":"chunk-HOTSTCXF.mjs","sourcesContent":["/**\n * OpenCode's two hosted endpoints — the small hand-written surface over their\n * generated route tables.\n *\n * Deliberately its OWN module rather than an addition to `catalog.ts`: that\n * file owns `LLM_PRICING_CATALOG`, and the one invariant these tables have is\n * that they are NEVER spread into it (a bare `claude-sonnet-5` must keep\n * meaning direct Anthropic, not a Zen-priced route — see the OpenCode branch\n * in `route-identity/index.ts`). Keeping the import out of `catalog.ts`\n * keeps that temptation out of reach.\n */\n\nimport {\n OPENCODE_GO_ANTHROPIC_MODELS,\n OPENCODE_GO_ROUTES,\n} from \"./opencode-go-routes.generated.js\"\nimport {\n OPENCODE_ZEN_ANTHROPIC_MODELS,\n OPENCODE_ZEN_ROUTES,\n} from \"./opencode-zen-routes.generated.js\"\n\n/**\n * The two OpenCode hosted endpoints, by catalog provider id.\n * - `\"opencode\"` — OpenCode Zen, pay-as-you-go (`.../zen/v1`).\n * - `\"opencode-go\"` — OpenCode Go, the flat subscription (`.../zen/go/v1`).\n */\nexport type OpencodeEndpoint = \"opencode\" | \"opencode-go\"\n\n/**\n * Every model ref an OpenCode endpoint serves, in the `<provider>/<bare-id>`\n * form the route tables are keyed by — which is also opencode's own config\n * spelling and what a caller passes to `agent_start`.\n */\nexport function listOpencodeModelRefs(endpoint: OpencodeEndpoint): string[] {\n const routes = endpoint === \"opencode-go\" ? OPENCODE_GO_ROUTES : OPENCODE_ZEN_ROUTES\n return Object.keys(routes).sort()\n}\n\n/**\n * The subset of {@link listOpencodeModelRefs} whose wire surface is the\n * Anthropic Messages API — exactly what the matching `opencode` /\n * `opencode-go` gateway preset can serve, and therefore exactly what an\n * Anthropic-native adapter (claude-code / claude-sdk) may offer on that\n * route. Both endpoints also serve OpenAI chat/completions, OpenAI Responses\n * and (Zen only) Gemini models behind the same base URL; those are\n * unreachable from an Anthropic client and are excluded here.\n *\n * Derived from the generated `*_ANTHROPIC_MODELS` lists, which come from the\n * source's own per-model `provider.npm` discriminator — so an adapter menu\n * built on this can never drift into offering an id the endpoint won't answer\n * on `/v1/messages`, and a newly-added Anthropic-surface model becomes\n * offerable on the next catalog-sync run with no code change (the same\n * rationale as `listNativeModelIds`).\n */\nexport function listOpencodeAnthropicModelRefs(endpoint: OpencodeEndpoint): string[] {\n const bareIds =\n endpoint === \"opencode-go\" ? OPENCODE_GO_ANTHROPIC_MODELS : OPENCODE_ZEN_ANTHROPIC_MODELS\n return bareIds.map(id => `${endpoint}/${id}`).sort()\n}\n","/**\n * Shared human-readable token formatting, so the `agentproto models` CLI and\n * the `catalog_models` MCP tool render the same `1M`/`200k` shapes instead of\n * raw integers. Lives next to `resolveContextWindow` (its data source) — one\n * formatter per concept, both output surfaces consume it.\n */\n\n/** Format a token count compactly — `1M`, `500k`, `2k`, `448`. Undefined ⇒\n * null so JSON output omits rather than fabricates a value. */\nexport function formatTokens(n: number | undefined): string | null {\n if (typeof n !== \"number\" || n <= 0) return null\n if (n >= 1_000_000) {\n const m = n / 1_000_000\n const text = Number.isInteger(m) ? String(m) : m.toFixed(1)\n return `${text}M`\n }\n if (n >= 1_000) {\n const k = n / 1_000\n const text = Number.isInteger(k) ? String(k) : k.toFixed(1)\n return `${text}k`\n }\n return String(n)\n}\n","/**\n * Curated, SDK-ready LLM model ids.\n *\n * Centralizes the version-specific provider ids used at runtime so call\n * sites stop carrying string literals. Pricing for each is resolved\n * automatically through `MODEL_ALIASES` in `catalog.ts` (e.g.\n * `claude-sonnet-4-6` → `claude-sonnet-4-5`).\n *\n * Update one constant here when bumping the platform-wide default —\n * every workflow step and operator config picks up the new id with a\n * single rebuild.\n */\n\n/** Fast workhorse for content workflows (outline, post, sections). */\nexport const WORKFLOW_FAST_MODEL = \"claude-sonnet-4-6\" as const\n\n/** Premium tier for high-stakes generation (rarely used in workflows). */\nexport const WORKFLOW_PREMIUM_MODEL = \"claude-opus-4-6\" as const\n\n/** Cheap-and-quick for short outputs like titles. */\nexport const WORKFLOW_TINY_MODEL = \"claude-haiku-4-5-20251001\" as const\n\n/**\n * Models eligible for operator agents (an app). Keep in sync with the\n * agent-framework's model-provider config. The literal tuple drives the\n * `OperatorAgentModel` union type below.\n */\nexport const OPERATOR_AGENT_MODELS = [\n \"claude-opus-4-5\",\n \"claude-sonnet-4-5\",\n \"gemini-3.1-pro-preview\",\n] as const\n\nexport type OperatorAgentModel = (typeof OPERATOR_AGENT_MODELS)[number]\n\n/** Default operator model when no explicit choice is made. */\nexport const OPERATOR_DEFAULT_PREMIUM: OperatorAgentModel = \"claude-opus-4-5\"\nexport const OPERATOR_DEFAULT_STANDARD: OperatorAgentModel = \"claude-sonnet-4-5\"\nexport const OPERATOR_DEFAULT_GEMINI: OperatorAgentModel =\n \"gemini-3.1-pro-preview\"\n\n// ── Plan-tier → model lists ─────────────────────────────────────────────\n//\n// Catalog-canonical equivalent of agent-framework's `MODEL_TIERS`. Used\n// by per-app `AppPlanRegistry` files as the source list when a plan\n// surfaces \"all of the X tier\". Keeping this in the catalog keeps the\n// app registries declarative — they pick from `LLM_TIERS.plus` rather\n// than re-specifying ids.\n//\n// All ids resolve through `resolvePricing` (direct match → alias →\n// partial-prefix). Names are app-vocabulary-neutral; per-app registries\n// re-key as needed (`PaygoTier.nano` → `LLM_TIERS.nano`, etc.).\n\nexport const LLM_TIERS = {\n /** Cheap-and-quick. Single-model fallback. */\n nano: [\"mistral-small-creative-latest\"] as const,\n /** Low-cost, agentic-capable. Direct alt-providers. */\n mini: [\n \"MiniMax-M2.5\",\n \"MiniMax-M2.1\",\n \"MiniMax-M2\",\n \"mistral-large-latest\",\n ] as const,\n /** Medium cost, fast inference + good general perf. OpenRouter-routed. */\n lite: [\n \"x-ai/grok-4-fast\",\n \"xiaomi/mimo-v2-flash\",\n \"google/gemini-3-flash-preview\",\n ] as const,\n /** High quality, premium features. Mix of direct + OpenRouter. */\n plus: [\n \"claude-sonnet-4-5\",\n \"gpt-4o\",\n \"kimi-k2.5\",\n \"deepseek/deepseek-v3.2\",\n ] as const,\n /** Top-tier, best performance. */\n pro: [\n \"claude-opus-4-5\",\n \"google/gemini-3.1-pro-preview\",\n \"kimi-k2-thinking\",\n ] as const,\n} as const\n\nexport type LlmTierName = keyof typeof LLM_TIERS\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-
|
|
2
|
+
import { resolvePricing, resolveAlias, OPENCODE_GO_ROUTES, OPENCODE_ZEN_ROUTES, OPENROUTER_ROUTES, DEFAULT_PRICING } from './chunk-BOCXDO4T.mjs';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* @agentproto/model-catalog v0.1.0
|
|
@@ -5849,7 +5849,7 @@ var HUGGINGFACE_ROUTES = {
|
|
|
5849
5849
|
inputPer1M: 0.08,
|
|
5850
5850
|
outputPer1M: 0.25,
|
|
5851
5851
|
supportsTools: true,
|
|
5852
|
-
supportsStructuredOutput:
|
|
5852
|
+
supportsStructuredOutput: false
|
|
5853
5853
|
}
|
|
5854
5854
|
]
|
|
5855
5855
|
},
|
|
@@ -6156,7 +6156,7 @@ var HUGGINGFACE_ROUTES = {
|
|
|
6156
6156
|
inputPer1M: 0.71,
|
|
6157
6157
|
outputPer1M: 4.25,
|
|
6158
6158
|
supportsTools: true,
|
|
6159
|
-
supportsStructuredOutput:
|
|
6159
|
+
supportsStructuredOutput: true
|
|
6160
6160
|
},
|
|
6161
6161
|
{
|
|
6162
6162
|
provider: "scaleway",
|
|
@@ -6306,7 +6306,7 @@ var HUGGINGFACE_ROUTES = {
|
|
|
6306
6306
|
inputPer1M: 0.99,
|
|
6307
6307
|
outputPer1M: 1.49,
|
|
6308
6308
|
supportsTools: true,
|
|
6309
|
-
supportsStructuredOutput:
|
|
6309
|
+
supportsStructuredOutput: false
|
|
6310
6310
|
},
|
|
6311
6311
|
{
|
|
6312
6312
|
provider: "deepinfra",
|
|
@@ -6328,7 +6328,7 @@ var HUGGINGFACE_ROUTES = {
|
|
|
6328
6328
|
inputPer1M: 0.42,
|
|
6329
6329
|
outputPer1M: 3,
|
|
6330
6330
|
supportsTools: true,
|
|
6331
|
-
supportsStructuredOutput:
|
|
6331
|
+
supportsStructuredOutput: true
|
|
6332
6332
|
},
|
|
6333
6333
|
{
|
|
6334
6334
|
provider: "ovhcloud",
|
|
@@ -6414,7 +6414,7 @@ var HUGGINGFACE_ROUTES = {
|
|
|
6414
6414
|
inputPer1M: 1,
|
|
6415
6415
|
outputPer1M: 3,
|
|
6416
6416
|
supportsTools: true,
|
|
6417
|
-
supportsStructuredOutput:
|
|
6417
|
+
supportsStructuredOutput: true
|
|
6418
6418
|
},
|
|
6419
6419
|
{
|
|
6420
6420
|
provider: "novita",
|
|
@@ -6441,6 +6441,20 @@ var HUGGINGFACE_ROUTES = {
|
|
|
6441
6441
|
}
|
|
6442
6442
|
]
|
|
6443
6443
|
},
|
|
6444
|
+
"XiaomiMiMo/MiMo-V2.6-Pro-RL": {
|
|
6445
|
+
wireId: "XiaomiMiMo/MiMo-V2.6-Pro-RL",
|
|
6446
|
+
providers: [
|
|
6447
|
+
{
|
|
6448
|
+
provider: "novita",
|
|
6449
|
+
status: "live",
|
|
6450
|
+
contextLength: 1048576,
|
|
6451
|
+
inputPer1M: 0.435,
|
|
6452
|
+
outputPer1M: 0.87,
|
|
6453
|
+
supportsTools: true,
|
|
6454
|
+
supportsStructuredOutput: false
|
|
6455
|
+
}
|
|
6456
|
+
]
|
|
6457
|
+
},
|
|
6444
6458
|
"aisingapore/Gemma-SEA-LION-v4-27B-IT": {
|
|
6445
6459
|
wireId: "aisingapore/Gemma-SEA-LION-v4-27B-IT",
|
|
6446
6460
|
providers: [
|
|
@@ -6526,7 +6540,7 @@ var HUGGINGFACE_ROUTES = {
|
|
|
6526
6540
|
contextLength: 163840,
|
|
6527
6541
|
inputPer1M: 0.5,
|
|
6528
6542
|
outputPer1M: 2.15,
|
|
6529
|
-
supportsTools:
|
|
6543
|
+
supportsTools: true,
|
|
6530
6544
|
supportsStructuredOutput: false
|
|
6531
6545
|
},
|
|
6532
6546
|
{
|
|
@@ -6539,7 +6553,7 @@ var HUGGINGFACE_ROUTES = {
|
|
|
6539
6553
|
contextLength: 163840,
|
|
6540
6554
|
inputPer1M: 0.7,
|
|
6541
6555
|
outputPer1M: 2.5,
|
|
6542
|
-
supportsTools:
|
|
6556
|
+
supportsTools: true,
|
|
6543
6557
|
supportsStructuredOutput: true
|
|
6544
6558
|
}
|
|
6545
6559
|
]
|
|
@@ -6558,7 +6572,7 @@ var HUGGINGFACE_ROUTES = {
|
|
|
6558
6572
|
inputPer1M: 0.05,
|
|
6559
6573
|
outputPer1M: 0.05,
|
|
6560
6574
|
supportsTools: false,
|
|
6561
|
-
supportsStructuredOutput:
|
|
6575
|
+
supportsStructuredOutput: true
|
|
6562
6576
|
}
|
|
6563
6577
|
]
|
|
6564
6578
|
},
|
|
@@ -6576,7 +6590,7 @@ var HUGGINGFACE_ROUTES = {
|
|
|
6576
6590
|
inputPer1M: 0.2,
|
|
6577
6591
|
outputPer1M: 0.2,
|
|
6578
6592
|
supportsTools: false,
|
|
6579
|
-
supportsStructuredOutput:
|
|
6593
|
+
supportsStructuredOutput: true
|
|
6580
6594
|
}
|
|
6581
6595
|
]
|
|
6582
6596
|
},
|
|
@@ -6594,7 +6608,7 @@ var HUGGINGFACE_ROUTES = {
|
|
|
6594
6608
|
inputPer1M: 0.15,
|
|
6595
6609
|
outputPer1M: 0.15,
|
|
6596
6610
|
supportsTools: false,
|
|
6597
|
-
supportsStructuredOutput:
|
|
6611
|
+
supportsStructuredOutput: true
|
|
6598
6612
|
}
|
|
6599
6613
|
]
|
|
6600
6614
|
},
|
|
@@ -6788,15 +6802,6 @@ var HUGGINGFACE_ROUTES = {
|
|
|
6788
6802
|
"deepseek-ai/DeepSeek-V4-Pro": {
|
|
6789
6803
|
wireId: "deepseek-ai/DeepSeek-V4-Pro",
|
|
6790
6804
|
providers: [
|
|
6791
|
-
{
|
|
6792
|
-
provider: "deepinfra",
|
|
6793
|
-
status: "live",
|
|
6794
|
-
contextLength: 1048576,
|
|
6795
|
-
inputPer1M: 1.3,
|
|
6796
|
-
outputPer1M: 2.6,
|
|
6797
|
-
supportsTools: true,
|
|
6798
|
-
supportsStructuredOutput: true
|
|
6799
|
-
},
|
|
6800
6805
|
{
|
|
6801
6806
|
provider: "featherless-ai",
|
|
6802
6807
|
status: "live"
|
|
@@ -6856,15 +6861,6 @@ var HUGGINGFACE_ROUTES = {
|
|
|
6856
6861
|
"deepseek-ai/DeepSeek-V4.1-Flash": {
|
|
6857
6862
|
wireId: "deepseek-ai/DeepSeek-V4.1-Flash",
|
|
6858
6863
|
providers: [
|
|
6859
|
-
{
|
|
6860
|
-
provider: "baseten",
|
|
6861
|
-
status: "live",
|
|
6862
|
-
contextLength: 1048576,
|
|
6863
|
-
inputPer1M: 0.3,
|
|
6864
|
-
outputPer1M: 1.2,
|
|
6865
|
-
supportsTools: true,
|
|
6866
|
-
supportsStructuredOutput: true
|
|
6867
|
-
},
|
|
6868
6864
|
{
|
|
6869
6865
|
provider: "deepinfra",
|
|
6870
6866
|
status: "live",
|
|
@@ -6973,7 +6969,7 @@ var HUGGINGFACE_ROUTES = {
|
|
|
6973
6969
|
inputPer1M: 0.13,
|
|
6974
6970
|
outputPer1M: 0.4,
|
|
6975
6971
|
supportsTools: true,
|
|
6976
|
-
supportsStructuredOutput:
|
|
6972
|
+
supportsStructuredOutput: true
|
|
6977
6973
|
},
|
|
6978
6974
|
{
|
|
6979
6975
|
provider: "scaleway",
|
|
@@ -6981,7 +6977,7 @@ var HUGGINGFACE_ROUTES = {
|
|
|
6981
6977
|
inputPer1M: 0.285,
|
|
6982
6978
|
outputPer1M: 0.57,
|
|
6983
6979
|
supportsTools: true,
|
|
6984
|
-
supportsStructuredOutput:
|
|
6980
|
+
supportsStructuredOutput: false
|
|
6985
6981
|
}
|
|
6986
6982
|
]
|
|
6987
6983
|
},
|
|
@@ -7087,7 +7083,7 @@ var HUGGINGFACE_ROUTES = {
|
|
|
7087
7083
|
inputPer1M: 0.06,
|
|
7088
7084
|
outputPer1M: 0.18,
|
|
7089
7085
|
supportsTools: true,
|
|
7090
|
-
supportsStructuredOutput:
|
|
7086
|
+
supportsStructuredOutput: false
|
|
7091
7087
|
},
|
|
7092
7088
|
{
|
|
7093
7089
|
provider: "novita",
|
|
@@ -7565,7 +7561,7 @@ var HUGGINGFACE_ROUTES = {
|
|
|
7565
7561
|
inputPer1M: 0.05,
|
|
7566
7562
|
outputPer1M: 0.25,
|
|
7567
7563
|
supportsTools: true,
|
|
7568
|
-
supportsStructuredOutput:
|
|
7564
|
+
supportsStructuredOutput: true
|
|
7569
7565
|
},
|
|
7570
7566
|
{
|
|
7571
7567
|
provider: "nscale",
|
|
@@ -7788,7 +7784,7 @@ var HUGGINGFACE_ROUTES = {
|
|
|
7788
7784
|
inputPer1M: 0.834,
|
|
7789
7785
|
outputPer1M: 2.501,
|
|
7790
7786
|
supportsTools: true,
|
|
7791
|
-
supportsStructuredOutput:
|
|
7787
|
+
supportsStructuredOutput: true
|
|
7792
7788
|
},
|
|
7793
7789
|
{
|
|
7794
7790
|
provider: "novita",
|
|
@@ -7818,7 +7814,7 @@ var HUGGINGFACE_ROUTES = {
|
|
|
7818
7814
|
status: "live",
|
|
7819
7815
|
contextLength: 1048576,
|
|
7820
7816
|
supportsTools: true,
|
|
7821
|
-
supportsStructuredOutput:
|
|
7817
|
+
supportsStructuredOutput: false
|
|
7822
7818
|
},
|
|
7823
7819
|
{
|
|
7824
7820
|
provider: "together",
|
|
@@ -7877,17 +7873,6 @@ var HUGGINGFACE_ROUTES = {
|
|
|
7877
7873
|
}
|
|
7878
7874
|
]
|
|
7879
7875
|
},
|
|
7880
|
-
"zai-org/GLM-4.5": {
|
|
7881
|
-
wireId: "zai-org/GLM-4.5",
|
|
7882
|
-
providers: [
|
|
7883
|
-
{
|
|
7884
|
-
provider: "zai-org",
|
|
7885
|
-
status: "live",
|
|
7886
|
-
supportsTools: true,
|
|
7887
|
-
supportsStructuredOutput: false
|
|
7888
|
-
}
|
|
7889
|
-
]
|
|
7890
|
-
},
|
|
7891
7876
|
"zai-org/GLM-4.5-Air": {
|
|
7892
7877
|
wireId: "zai-org/GLM-4.5-Air",
|
|
7893
7878
|
providers: [
|
|
@@ -7963,12 +7948,6 @@ var HUGGINGFACE_ROUTES = {
|
|
|
7963
7948
|
outputPer1M: 2.2,
|
|
7964
7949
|
supportsTools: true,
|
|
7965
7950
|
supportsStructuredOutput: false
|
|
7966
|
-
},
|
|
7967
|
-
{
|
|
7968
|
-
provider: "zai-org",
|
|
7969
|
-
status: "live",
|
|
7970
|
-
supportsTools: true,
|
|
7971
|
-
supportsStructuredOutput: false
|
|
7972
7951
|
}
|
|
7973
7952
|
]
|
|
7974
7953
|
},
|
|
@@ -8133,12 +8112,6 @@ var HUGGINGFACE_ROUTES = {
|
|
|
8133
8112
|
{
|
|
8134
8113
|
provider: "featherless-ai",
|
|
8135
8114
|
status: "live"
|
|
8136
|
-
},
|
|
8137
|
-
{
|
|
8138
|
-
provider: "zai-org",
|
|
8139
|
-
status: "live",
|
|
8140
|
-
supportsTools: true,
|
|
8141
|
-
supportsStructuredOutput: false
|
|
8142
8115
|
}
|
|
8143
8116
|
]
|
|
8144
8117
|
},
|
|
@@ -8174,7 +8147,7 @@ var HUGGINGFACE_ROUTES = {
|
|
|
8174
8147
|
inputPer1M: 1.4,
|
|
8175
8148
|
outputPer1M: 4.4,
|
|
8176
8149
|
supportsTools: true,
|
|
8177
|
-
supportsStructuredOutput:
|
|
8150
|
+
supportsStructuredOutput: false
|
|
8178
8151
|
},
|
|
8179
8152
|
{
|
|
8180
8153
|
provider: "scaleway",
|
|
@@ -8692,5 +8665,5 @@ function diagnoseModelRef(input) {
|
|
|
8692
8665
|
}
|
|
8693
8666
|
|
|
8694
8667
|
export { InvalidModelRefError, OPENROUTER_VARIANTS, clearCustomRoutes, diagnoseModelRef, formatModelRef, isModelRefString, listRouterLlmRoutes, parseModelRef, registerCustomRoute, resolveCustomRoute, resolveLlmModelRoute, stripAnthropicNativeVendor, stripFixedNativeVendor, stripRouteSuffix, tryParseModelRef };
|
|
8695
|
-
//# sourceMappingURL=chunk-
|
|
8696
|
-
//# sourceMappingURL=chunk-
|
|
8668
|
+
//# sourceMappingURL=chunk-K5FVQ66Z.mjs.map
|
|
8669
|
+
//# sourceMappingURL=chunk-K5FVQ66Z.mjs.map
|