@agentproto/model-catalog 0.9.2 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/access/index.d.ts +5 -5
  2. package/dist/access/index.mjs +4 -4
  3. package/dist/audio/index.d.ts +1 -1
  4. package/dist/{audio-DR0g_ZH_.d.ts → audio-Do2j3wDC.d.ts} +2 -0
  5. package/dist/{base-B8IIoaqg.d.ts → base-BaiI72Da.d.ts} +4 -0
  6. package/dist/{catalog-Cg0AJJZ7.d.ts → catalog-BAb74hY-.d.ts} +1 -1
  7. package/dist/{chunk-ZTTWZ7PL.mjs → chunk-5ZNG5RQB.mjs} +15 -3
  8. package/dist/chunk-5ZNG5RQB.mjs.map +1 -0
  9. package/dist/{chunk-AJLMLBEZ.mjs → chunk-67NNWX36.mjs} +3 -3
  10. package/dist/{chunk-AJLMLBEZ.mjs.map → chunk-67NNWX36.mjs.map} +1 -1
  11. package/dist/{chunk-XC355MAQ.mjs → chunk-C6HNSPGW.mjs} +4 -4
  12. package/dist/{chunk-XC355MAQ.mjs.map → chunk-C6HNSPGW.mjs.map} +1 -1
  13. package/dist/{chunk-W4VANZM3.mjs → chunk-L6TCCCP6.mjs} +4 -4
  14. package/dist/{chunk-W4VANZM3.mjs.map → chunk-L6TCCCP6.mjs.map} +1 -1
  15. package/dist/{chunk-QDQWHWDU.mjs → chunk-M3I2OMBX.mjs} +3 -3
  16. package/dist/{chunk-QDQWHWDU.mjs.map → chunk-M3I2OMBX.mjs.map} +1 -1
  17. package/dist/{chunk-AVCHKXUD.mjs → chunk-MATRJ7K6.mjs} +218 -127
  18. package/dist/chunk-MATRJ7K6.mjs.map +1 -0
  19. package/dist/{chunk-OH37WKVA.mjs → chunk-MOSKXFIN.mjs} +1399 -156
  20. package/dist/chunk-MOSKXFIN.mjs.map +1 -0
  21. package/dist/{chunk-4ROXWVQD.mjs → chunk-MRFY23PA.mjs} +5 -5
  22. package/dist/{chunk-4ROXWVQD.mjs.map → chunk-MRFY23PA.mjs.map} +1 -1
  23. package/dist/{chunk-3Y5TQDGE.mjs → chunk-TTIJME5T.mjs} +3 -3
  24. package/dist/{chunk-3Y5TQDGE.mjs.map → chunk-TTIJME5T.mjs.map} +1 -1
  25. package/dist/{chunk-QNJRWRWC.mjs → chunk-WG4F6IRS.mjs} +22 -2
  26. package/dist/chunk-WG4F6IRS.mjs.map +1 -0
  27. package/dist/cost/index.mjs +7 -7
  28. package/dist/curation/index.d.ts +4 -4
  29. package/dist/curation/index.mjs +7 -7
  30. package/dist/{evaluate-D3gXrAg-.d.ts → evaluate-B83jX17h.d.ts} +2 -2
  31. package/dist/{index-DC8jecem.d.ts → index-BWvtVzEG.d.ts} +3 -3
  32. package/dist/{index-BZfxAdXA.d.ts → index-vC37SFpk.d.ts} +18 -13
  33. package/dist/index.d.ts +7 -7
  34. package/dist/index.mjs +12 -12
  35. package/dist/llm/index.d.ts +44 -3
  36. package/dist/llm/index.mjs +2 -2
  37. package/dist/overlay/index.d.ts +3 -3
  38. package/dist/picker/index.d.ts +6 -6
  39. package/dist/route-identity/index.d.ts +5 -2
  40. package/dist/route-identity/index.mjs +3 -3
  41. package/dist/schema/index.d.ts +16 -2
  42. package/dist/schema/index.mjs +2 -2
  43. package/package.json +5 -5
  44. package/dist/chunk-AVCHKXUD.mjs.map +0 -1
  45. package/dist/chunk-OH37WKVA.mjs.map +0 -1
  46. package/dist/chunk-QNJRWRWC.mjs.map +0 -1
  47. package/dist/chunk-ZTTWZ7PL.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/schema/base.ts"],"names":[],"mappings":";;;;;;;;AAYO,IAAM,eAAA,GAAkB,EAAE,IAAA,CAAK,CAAC,OAAO,OAAA,EAAS,OAAA,EAAS,OAAO,CAAC;AAGjE,IAAM,kBAAkB,CAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,SAAA,EAAW,YAAY,CAAC;AASlE,IAAM,sBAAA,GAAyB,EAAE,IAAA,CAAK,CAAC,OAAO,KAAA,EAAO,MAAA,EAAQ,SAAS,CAAC;AAGvE,IAAM,mBAAmB,CAAA,CAAE,IAAA,CAAK,CAAC,UAAA,EAAY,YAAA,EAAc,QAAQ,CAAC;AAUpE,IAAM,qBAAA,GAAwB,EAAE,IAAA,CAAK;AAAA,EAC1C,WAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,iBAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAC;AAoBM,IAAM,gBAAA,GAAoD;AAAA,EAC/D,SAAA,EAAW,mBAAA;AAAA,EACX,UAAA,EAAY,oBAAA;AAAA,EACZ,QAAA,EAAU,kBAAA;AAAA,EACV,UAAA,EAAY,oBAAA;AAAA,EACZ,aAAA,EAAe,8BAAA;AAAA,EACf,MAAA,EAAQ,8BAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBR,WAAA,EAAa,UAAA;AAAA,EACb,OAAA,EAAS,iBAAA;AAAA,EACT,OAAA,EAAS,iBAAA;AAAA,EACT,QAAA,EAAU,kBAAA;AAAA,EACV,MAAA,EAAQ,gBAAA;AAAA,EACR,iBAAA,EAAmB,gBAAA;AAAA,EACnB,UAAA,EAAY,oBAAA;AAAA,EACZ,SAAA,EAAW,qBAAA;AAAA,EACX,QAAA,EAAU,kBAAA;AAAA,EACV,GAAA,EAAK;AACP;AAwCO,IAAM,wBAAA,GAA2B;AAAA,EACtC,MAAA,EAAQ,CAAC,gBAAgB,CAAA;AAAA,EACzB,QAAA,EAAU,CAAC,qBAAqB;AAClC;AAEO,IAAM,cAAA,GAAiB;AAAA,EAC5B,EAAA,EAAI,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACpB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACtB,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,EAAE,CAAA;AAAA,EAClC,QAAA,EAAU,qBAAA;AAAA,EACV,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC5B,YAAA,EAAc,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA;AAAA,EACvC,SAAA,EAAW,eAAA,CAAgB,OAAA,CAAQ,QAAQ,CAAA;AAAA,EAC3C,IAAA,EAAM,EAAE,KAAA,CAAM,CAAA,CAAE,QAAQ,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,EACpC,gBAAA,EAAkB,sBAAA,CAAuB,OAAA,CAAQ,KAAK,CAAA;AAAA,EACtD,UAAA,EAAY,gBAAA,CAAiB,OAAA,CAAQ,UAAU,CAAA;AAAA,EAC/C,SAAS,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACtC,SAAS,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA;AAC/B","file":"chunk-QNJRWRWC.mjs","sourcesContent":["import { z } from \"zod\"\n\n/**\n * Shared schema fragments for every model catalog entry.\n *\n * `baseEntryShape` is spread into per-kind schemas so each kind stays a\n * plain `z.object` — required by `z.discriminatedUnion`.\n *\n * Mirrors the pattern in\n * `packages/agencies/registry-client/src/types.ts` (`basePayloadShape`).\n */\n\nexport const ModelKindSchema = z.enum([\"llm\", \"image\", \"video\", \"audio\"])\nexport type ModelKind = z.infer<typeof ModelKindSchema>\n\nexport const LifecycleSchema = z.enum([\"stable\", \"preview\", \"deprecated\"])\nexport type Lifecycle = z.infer<typeof LifecycleSchema>\n\n/**\n * `catalogPriceTier` — the model's intrinsic cost bucket. Distinct from\n * `subscriptionPlanTier` (the user's billing level) and `modelPreset`\n * (an app's per-conversation UX picker). Always qualify when discussing\n * tiers — bare `priceTier` / `tier` is ambiguous in this codebase.\n */\nexport const CatalogPriceTierSchema = z.enum([\"low\", \"mid\", \"high\", \"premium\"])\nexport type CatalogPriceTier = z.infer<typeof CatalogPriceTierSchema>\n\nexport const NsfwPolicySchema = z.enum([\"filtered\", \"permissive\", \"strict\"])\nexport type NsfwPolicy = z.infer<typeof NsfwPolicySchema>\n\n/**\n * Canonical model-provider registry — the single source of truth for the\n * `provider` field on every catalog entry. Adding a model on a new\n * provider means adding it here first, so a typo or an un-onboarded\n * provider is a validation/build error rather than a silently-broken\n * entry. `CatalogVoiceProviderSchema` is the voice-callable subset.\n */\nexport const CatalogProviderSchema = z.enum([\n \"anthropic\",\n \"assemblyai\",\n \"deepgram\",\n \"elevenlabs\",\n \"gemini-live\",\n \"google\",\n \"huggingface\",\n \"minimax\",\n \"mistral\",\n \"moonshot\",\n \"openai\",\n \"openai-realtime\",\n \"openrouter\",\n \"replicate\",\n \"requesty\",\n \"xai\",\n])\nexport type CatalogProvider = z.infer<typeof CatalogProviderSchema>\n\n/**\n * Canonical provider → api-key ENVIRONMENT VARIABLE name — the single source\n * of truth for \"which env var carries this provider's LLM billing key\". Lives\n * here, next to {@link CatalogProviderSchema}, because provider identity and\n * its key env are the same fact (adding a provider to the enum forces adding\n * its key env, or this `Record<CatalogProvider, string>` fails to type-check —\n * the compile-time equivalent of catalog-sync keeping it current).\n *\n * `@agentproto/runtime`'s `providers-store` DERIVES `PROVIDER_ENV_VARS` from\n * this map (re-exporting it plus a few non-catalog gateway keys like `groq` /\n * `vercel-ai-gateway`), and the billing-auth resolver calls\n * `providerEnvVar(provider)` rather than ever re-listing these names per\n * adapter manifest. Names follow each SDK's own convention (matching the\n * adapter manifests' `models.env` maps). This is the api-key axis ONLY — the\n * `subscription` (Anthropic OAuth) env var is consumer-specific and declared\n * per Claude adapter, not here.\n */\nexport const PROVIDER_KEY_ENV: Record<CatalogProvider, string> = {\n anthropic: \"ANTHROPIC_API_KEY\",\n assemblyai: \"ASSEMBLYAI_API_KEY\",\n deepgram: \"DEEPGRAM_API_KEY\",\n elevenlabs: \"ELEVENLABS_API_KEY\",\n \"gemini-live\": \"GOOGLE_GENERATIVE_AI_API_KEY\",\n google: \"GOOGLE_GENERATIVE_AI_API_KEY\",\n // Ecosystem convention, not our own invention: every HF tool (transformers,\n // huggingface_hub, the `hf` CLI) and — load-bearing here — opencode's own\n // bundled huggingface provider (`@ai-sdk/openai-compatible`, reads\n // `env:[\"HF_TOKEN\"]` off its models.dev-style catalog entry, confirmed by\n // inspecting the shipped `opencode acp` binary) read `HF_TOKEN`, never\n // `HUGGINGFACE_API_KEY`. `ANTHROPIC_GATEWAY_PRESETS.huggingface.keyEnv`\n // (`provider-presets/src/anthropic-gateways.ts`) already got this right for\n // the explicit `route.gateway` path; this was the other half — the\n // model-derived-api-key path (`resolveAuthSpec`'s non-gateway branch calls\n // `providerEnvVar(provider)`, i.e. THIS map, directly) still injected the\n // wrong var, so any `<model>@huggingface` spawn through a model-derived\n // router (opencode) got a credential opencode's huggingface provider never\n // reads — it sees no HF_TOKEN, treats the provider as unconfigured, and\n // 404s with \"model not found: huggingface/<model>\" even though the model\n // itself is present in opencode's own catalog.\n huggingface: \"HF_TOKEN\",\n minimax: \"MINIMAX_API_KEY\",\n mistral: \"MISTRAL_API_KEY\",\n moonshot: \"MOONSHOT_API_KEY\",\n openai: \"OPENAI_API_KEY\",\n \"openai-realtime\": \"OPENAI_API_KEY\",\n openrouter: \"OPENROUTER_API_KEY\",\n replicate: \"REPLICATE_API_TOKEN\",\n requesty: \"REQUESTY_API_KEY\",\n xai: \"XAI_API_KEY\",\n}\n\n/**\n * ADDITIONAL env-var names that carry the *same* provider key, beyond the one\n * canonical name in {@link PROVIDER_KEY_ENV}. Some consumers read a different\n * alias for a provider than the name we canonically inject, so a key set once\n * (`agentproto auth provider set <provider> <key>`) must be able to satisfy\n * every alias, not just the canonical name. `providers-store` derives its\n * `PROVIDER_ENV_ALIASES` from this and injects the canonical name PLUS every\n * alias at `serve` boot (explicit env still wins, per env name).\n *\n * Aliases are VERIFIED against a real consumer, never guessed — an alias we\n * cannot prove a consumer reads does not belong here:\n *\n * - `google: [\"GOOGLE_API_KEY\"]` — mastracode / `@mastra/core`. Its\n * `PROVIDER_REGISTRY.google.apiKeyEnvVar` is the alias array\n * `[\"GOOGLE_API_KEY\", \"GOOGLE_GENERATIVE_AI_API_KEY\"]`, but\n * `@mastra/code-sdk`'s `getApiKeyEnvVar()` collapses it to `envVars[0]`\n * (`GOOGLE_API_KEY`) before testing `Boolean(process.env[…])`. So mastracode\n * consults ONLY `GOOGLE_API_KEY`; our canonical `GOOGLE_GENERATIVE_AI_API_KEY`\n * is invisible to it. (Confirmed in the installed mastracode 0.26.x tree.)\n * - `moonshot: [\"MOONSHOT_AI_API_KEY\"]` — mastracode again, but via a HARDCODED\n * branch that bypasses the registry entirely:\n * `@mastra/code-sdk/dist/agents/mastracode-gateway.js:331-333` does\n * `if (args.providerId === \"moonshotai\") { if (!process.env.MOONSHOT_AI_API_KEY) throw … }`.\n * It reads `MOONSHOT_AI_API_KEY` (note the `_AI_`); we inject `MOONSHOT_API_KEY`\n * via {@link PROVIDER_KEY_ENV}. Because the name is hardcoded, not\n * registry-declared, the next reader cannot discover it from the registry —\n * hence this comment. (The provider slug drifts too: `moonshotai` upstream vs\n * our `moonshot`; the alias handles the env NAME, which is what matters here.)\n *\n * `gemini-live` is deliberately absent: no consumer of that provider is known\n * to read `GOOGLE_API_KEY`, so per the verify-not-guess rule it stays out. The\n * drift set is capped: across the providers we share with mastracode, only\n * `google` and `moonshot` diverge — anthropic / openai / openrouter / xai /\n * mistral / minimax (and the non-catalog groq) all match, so none are added.\n *\n * `Partial` because most providers have no known alias — a provider absent\n * here just gets its single canonical name injected.\n */\nexport const PROVIDER_KEY_ENV_ALIASES = {\n google: [\"GOOGLE_API_KEY\"],\n moonshot: [\"MOONSHOT_AI_API_KEY\"],\n} satisfies Partial<Record<CatalogProvider, readonly string[]>>\n\nexport const baseEntryShape = {\n id: z.string().min(1),\n name: z.string().min(1),\n description: z.string().default(\"\"),\n provider: CatalogProviderSchema,\n providerId: z.string().min(1),\n agentVisible: z.boolean().default(false),\n lifecycle: LifecycleSchema.default(\"stable\"),\n tags: z.array(z.string()).default([]),\n catalogPriceTier: CatalogPriceTierSchema.default(\"mid\"),\n nsfwPolicy: NsfwPolicySchema.default(\"filtered\"),\n regions: z.array(z.string()).optional(),\n aliases: z.array(z.string()).optional(),\n} as const\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/llm/tokens.ts","../src/llm/defaults.ts"],"names":[],"mappings":";;;;;;;AASO,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-ZTTWZ7PL.mjs","sourcesContent":["/**\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"]}