language-models 2.1.3 → 2.3.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 (54) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +26 -0
  3. package/README.md +2 -0
  4. package/dist/index.d.ts +3 -1
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +13 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/models.d.ts +1 -1
  9. package/dist/models.d.ts.map +1 -1
  10. package/dist/models.js +8 -10
  11. package/dist/models.js.map +1 -1
  12. package/dist/policy.d.ts +127 -0
  13. package/dist/policy.d.ts.map +1 -0
  14. package/dist/policy.js +246 -0
  15. package/dist/policy.js.map +1 -0
  16. package/dist/pricing/index.d.ts +19 -0
  17. package/dist/pricing/index.d.ts.map +1 -0
  18. package/dist/pricing/index.js +18 -0
  19. package/dist/pricing/index.js.map +1 -0
  20. package/dist/pricing/lookup.d.ts +46 -0
  21. package/dist/pricing/lookup.d.ts.map +1 -0
  22. package/dist/pricing/lookup.js +94 -0
  23. package/dist/pricing/lookup.js.map +1 -0
  24. package/dist/pricing/table.d.ts +46 -0
  25. package/dist/pricing/table.d.ts.map +1 -0
  26. package/dist/pricing/table.js +214 -0
  27. package/dist/pricing/table.js.map +1 -0
  28. package/dist/pricing/types.d.ts +84 -0
  29. package/dist/pricing/types.d.ts.map +1 -0
  30. package/dist/pricing/types.js +32 -0
  31. package/dist/pricing/types.js.map +1 -0
  32. package/package.json +16 -12
  33. package/src/index.ts +42 -1
  34. package/src/models.ts +8 -12
  35. package/src/policy.ts +343 -0
  36. package/src/pricing/index.ts +29 -0
  37. package/src/pricing/lookup.ts +124 -0
  38. package/src/pricing/table.ts +235 -0
  39. package/src/pricing/types.ts +90 -0
  40. package/{src → test}/aliases.test.ts +20 -22
  41. package/{src → test}/index.test.ts +9 -9
  42. package/{src → test}/models.test.ts +8 -6
  43. package/test/policy.test.ts +203 -0
  44. package/test/pricing.test.ts +279 -0
  45. package/vitest.config.ts +21 -1
  46. package/.turbo/turbo-test.log +0 -18
  47. package/LICENSE +0 -21
  48. package/src/aliases.js +0 -40
  49. package/src/aliases.test.js +0 -264
  50. package/src/index.js +0 -9
  51. package/src/index.test.js +0 -320
  52. package/src/models.js +0 -108
  53. package/src/models.test.js +0 -335
  54. package/vitest.config.js +0 -10
@@ -1,4 +1,4 @@
1
1
 
2
- > language-models@2.1.3 build /Users/nathanclevenger/projects/primitives.org.ai/packages/language-models
2
+ > language-models@2.3.0 build /Users/nathanclevenger/projects/primitives.org.ai/packages/language-models
3
3
  > tsc -p tsconfig.json && cp -r data dist/
4
4
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # language-models
2
2
 
3
+ ## 2.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 2787830: Fold llm-pricing primitive into language-models (consolidate accidentally-scoped @primitives/llm-pricing).
8
+
9
+ The canonical LLM model pricing table (rates, tiers, context-tier breakpoints, `priceFor()` cost computation) now lives inside `language-models` under `src/pricing/`. Two ways to import:
10
+
11
+ - Subpath: `import { priceFor, PRICING_TABLE } from 'language-models/pricing'`
12
+ - Root: `import { priceFor, PRICING_TABLE } from 'language-models'` (re-exported for convenience)
13
+
14
+ The standalone `@primitives/llm-pricing` package is removed — it was accidentally scoped under `@primitives/`, an npm scope we do not own, and was always intended to live alongside the model catalog.
15
+
16
+ ## 2.2.0
17
+
18
+ ### Minor Changes
19
+
20
+ - Add `ModelPolicy` MDXLD type and per-model policy derivation layer
21
+ (aip-70mk). `policyFor(alias)` returns derived retry, circuit-breaker,
22
+ fallback-chain, and batch-tier data for any catalog model. Heuristics
23
+ encode "frontier providers retry more aggressively", "same-family
24
+ siblings fall back first, sorted by recency then price", and
25
+ "OpenAI/Bedrock are flex-eligible". `ai-functions` reads policy via
26
+ `RetryPolicy.forModel`, `CircuitBreaker.forModel`,
27
+ `FallbackChain.forModel`.
28
+
3
29
  ## 2.1.3
4
30
 
5
31
  ### Patch Changes
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # language-models
2
2
 
3
+ ![Stability: Experimental](https://img.shields.io/badge/stability-experimental-red)
4
+
3
5
  **Stop memorizing model IDs. Start shipping.**
4
6
 
5
7
  You're building AI-powered applications, but every provider has different naming conventions. Is it `claude-opus-4-5-20251101` or `anthropic/claude-opus-4.5`? Was it `gpt-4o` or `openai/gpt-4o`? You shouldn't have to care.
package/dist/index.d.ts CHANGED
@@ -5,6 +5,8 @@
5
5
  *
6
6
  * @packageDocumentation
7
7
  */
8
- export { resolve, resolveWithProvider, list, get, search, DIRECT_PROVIDERS, type ModelInfo, type ProviderEndpoint, type ResolvedModel, type DirectProvider } from './models.js';
8
+ export { resolve, resolveWithProvider, list, get, search, DIRECT_PROVIDERS, type ModelInfo, type ProviderEndpoint, type ResolvedModel, type DirectProvider, } from './models.js';
9
9
  export { ALIASES } from './aliases.js';
10
+ export { policyFor, derivePolicy, defaultPolicy, resetPolicyCache, listAliases, DEFAULT_RETRY, DEFAULT_CIRCUIT_BREAKER, type ModelPolicy, type RetryPolicyData, type CircuitBreakerPolicyData, type BatchTier, type ErrorCategoryName, type ErrorMapping, } from './policy.js';
11
+ export { PRICING_TABLE, priceFor, listSlugs, hasPricing, rowsForSlug, type ModelPricing, type PricingTier, type Provider, type RateBlock, type PriceForArgs, type PriceForResult, type HasPricingArgs, } from './pricing/index.js';
10
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,OAAO,EACP,mBAAmB,EACnB,IAAI,EACJ,GAAG,EACH,MAAM,EACN,gBAAgB,EAChB,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,OAAO,EACP,mBAAmB,EACnB,IAAI,EACJ,GAAG,EACH,MAAM,EACN,gBAAgB,EAChB,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,cAAc,GACpB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAOtC,OAAO,EACL,SAAS,EACT,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,uBAAuB,EACvB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,wBAAwB,EAC7B,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,YAAY,GAClB,MAAM,aAAa,CAAA;AAOpB,OAAO,EACL,aAAa,EACb,QAAQ,EACR,SAAS,EACT,UAAU,EACV,WAAW,EACX,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,oBAAoB,CAAA"}
package/dist/index.js CHANGED
@@ -5,6 +5,18 @@
5
5
  *
6
6
  * @packageDocumentation
7
7
  */
8
- export { resolve, resolveWithProvider, list, get, search, DIRECT_PROVIDERS } from './models.js';
8
+ export { resolve, resolveWithProvider, list, get, search, DIRECT_PROVIDERS, } from './models.js';
9
9
  export { ALIASES } from './aliases.js';
10
+ // Per-model resilience and tier policy data.
11
+ // The runtime *machinery* (RetryPolicy, CircuitBreaker, FallbackChain) lives
12
+ // in `ai-functions`; the *data* (which categories are retryable, which models
13
+ // to fall back to, which batch tiers are eligible) lives here alongside the
14
+ // catalog because it's a per-model concern.
15
+ export { policyFor, derivePolicy, defaultPolicy, resetPolicyCache, listAliases, DEFAULT_RETRY, DEFAULT_CIRCUIT_BREAKER, } from './policy.js';
16
+ // =============================================================================
17
+ // Pricing (consolidated from former @primitives/llm-pricing — see
18
+ // `./pricing/` for the source. Also re-exported under the subpath
19
+ // `language-models/pricing` for surgical imports.)
20
+ // =============================================================================
21
+ export { PRICING_TABLE, priceFor, listSlugs, hasPricing, rowsForSlug, } from './pricing/index.js';
10
22
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,OAAO,EACP,mBAAmB,EACnB,IAAI,EACJ,GAAG,EACH,MAAM,EACN,gBAAgB,EAKjB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,OAAO,EACP,mBAAmB,EACnB,IAAI,EACJ,GAAG,EACH,MAAM,EACN,gBAAgB,GAKjB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,6CAA6C;AAC7C,6EAA6E;AAC7E,8EAA8E;AAC9E,4EAA4E;AAC5E,4CAA4C;AAC5C,OAAO,EACL,SAAS,EACT,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,uBAAuB,GAOxB,MAAM,aAAa,CAAA;AAEpB,gFAAgF;AAChF,kEAAkE;AAClE,kEAAkE;AAClE,mDAAmD;AACnD,gFAAgF;AAChF,OAAO,EACL,aAAa,EACb,QAAQ,EACR,SAAS,EACT,UAAU,EACV,WAAW,GAQZ,MAAM,oBAAoB,CAAA"}
package/dist/models.d.ts CHANGED
@@ -64,7 +64,7 @@ export declare function resolve(input: string): string;
64
64
  * These providers have special capabilities like MCP, extended thinking, etc.
65
65
  */
66
66
  export declare const DIRECT_PROVIDERS: readonly ["openai", "anthropic", "google"];
67
- export type DirectProvider = typeof DIRECT_PROVIDERS[number];
67
+ export type DirectProvider = (typeof DIRECT_PROVIDERS)[number];
68
68
  /**
69
69
  * Result of resolving a model with provider routing info
70
70
  */
@@ -1 +1 @@
1
- {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAA;IACf,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAA;QACd,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;IACD,YAAY,CAAC,EAAE;QACb,QAAQ,EAAE,MAAM,CAAA;QAChB,gBAAgB,EAAE,MAAM,EAAE,CAAA;QAC1B,iBAAiB,EAAE,MAAM,EAAE,CAAA;KAC5B,CAAA;IACD,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,sDAAsD;IACtD,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,EAAE,gBAAgB,CAAA;CAC5B;AAeD;;GAEG;AACH,wBAAgB,IAAI,IAAI,SAAS,EAAE,CAElC;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAErD;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,CAMjD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAwB7C;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,4CAA6C,CAAA;AAC1E,MAAM,MAAM,cAAc,GAAG,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAA;AAE5D;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,EAAE,EAAE,MAAM,CAAA;IACV,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAA;IAChB,oEAAoE;IACpE,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,wDAAwD;IACxD,qBAAqB,EAAE,OAAO,CAAA;IAC9B,mCAAmC;IACnC,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAiBhE"}
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAA;IACf,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAA;QACd,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;IACD,YAAY,CAAC,EAAE;QACb,QAAQ,EAAE,MAAM,CAAA;QAChB,gBAAgB,EAAE,MAAM,EAAE,CAAA;QAC1B,iBAAiB,EAAE,MAAM,EAAE,CAAA;KAC5B,CAAA;IACD,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,sDAAsD;IACtD,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,EAAE,gBAAgB,CAAA;CAC5B;AAeD;;GAEG;AACH,wBAAgB,IAAI,IAAI,SAAS,EAAE,CAElC;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAErD;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,CAKjD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAwB7C;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,4CAA6C,CAAA;AAC1E,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAA;AAE9D;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,EAAE,EAAE,MAAM,CAAA;IACV,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAA;IAChB,oEAAoE;IACpE,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,wDAAwD;IACxD,qBAAqB,EAAE,OAAO,CAAA;IAC9B,mCAAmC;IACnC,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAchE"}
package/dist/models.js CHANGED
@@ -27,7 +27,7 @@ export function list() {
27
27
  * Get a model by exact ID
28
28
  */
29
29
  export function get(id) {
30
- return loadModels().find(m => m.id === id);
30
+ return loadModels().find((m) => m.id === id);
31
31
  }
32
32
  /**
33
33
  * Search models by query string
@@ -35,8 +35,7 @@ export function get(id) {
35
35
  */
36
36
  export function search(query) {
37
37
  const q = query.toLowerCase();
38
- return loadModels().filter(m => m.id.toLowerCase().includes(q) ||
39
- m.name.toLowerCase().includes(q));
38
+ return loadModels().filter((m) => m.id.toLowerCase().includes(q) || m.name.toLowerCase().includes(q));
40
39
  }
41
40
  /**
42
41
  * Resolve a model alias or partial name to a full model ID
@@ -98,12 +97,11 @@ export function resolveWithProvider(input) {
98
97
  const slashIndex = id.indexOf('/');
99
98
  const provider = slashIndex > 0 ? id.substring(0, slashIndex) : 'unknown';
100
99
  const supportsDirectRouting = DIRECT_PROVIDERS.includes(provider);
101
- return {
102
- id,
103
- provider,
104
- providerModelId: model?.provider_model_id,
105
- supportsDirectRouting,
106
- model
107
- };
100
+ const result = { id, provider, supportsDirectRouting };
101
+ if (model)
102
+ result.model = model;
103
+ if (model?.provider_model_id)
104
+ result.providerModelId = model.provider_model_id;
105
+ return result;
108
106
  }
109
107
  //# sourceMappingURL=models.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * ModelPolicy - per-model resilience and tier policy data
3
+ *
4
+ * `language-models` owns model identity (alias resolution, capability lookup).
5
+ * Resilience policy (retry, circuit breaker, fallback chain, batch tier) is
6
+ * a per-model concern that belongs alongside the catalog data — but the
7
+ * runtime *machinery* that applies the policy lives in `ai-functions`.
8
+ *
9
+ * This module provides:
10
+ * - `ModelPolicy` MDXLD type (`$type: 'ModelPolicy'`)
11
+ * - `policyFor(alias)` - resolve an alias and return its derived policy
12
+ * - `derivePolicy(model, alias?)` - inference layer that turns OpenRouter raw
13
+ * data into a policy by applying heuristics (newest frontier model is best,
14
+ * price within a family is inversely correlated with capability, etc.)
15
+ *
16
+ * Source of truth: OpenRouter raw catalog (data/models.json) + heuristics.
17
+ * Strategy: runtime derivation, cached. A static snapshot generator could be
18
+ * added later (see `derivePolicy` — it's pure, so you can pre-compute it).
19
+ *
20
+ * @packageDocumentation
21
+ */
22
+ import { type ModelInfo } from './models.js';
23
+ /**
24
+ * Error category taxonomy. Mirrors `ai-functions`'s `ErrorCategory` enum by
25
+ * string value — we don't import it (circular), but the strings line up.
26
+ */
27
+ export type ErrorCategoryName = 'network' | 'rate_limit' | 'invalid_input' | 'authentication' | 'server' | 'context_length' | 'unknown';
28
+ /**
29
+ * Retry classification: which error categories are retryable for this model,
30
+ * plus backoff parameters.
31
+ */
32
+ export interface RetryPolicyData {
33
+ maxRetries: number;
34
+ baseDelay: number;
35
+ maxDelay: number;
36
+ multiplier: number;
37
+ jitter: number;
38
+ /** Categories that should trigger a retry */
39
+ retryableCategories: ErrorCategoryName[];
40
+ }
41
+ /**
42
+ * Circuit-breaker policy data (per-model state keys come from the alias).
43
+ */
44
+ export interface CircuitBreakerPolicyData {
45
+ failureThreshold: number;
46
+ resetTimeout: number;
47
+ successThreshold: number;
48
+ }
49
+ /**
50
+ * Tiers a model is eligible for.
51
+ *
52
+ * - `immediate`: synchronous online inference (always available)
53
+ * - `flex`: faster-than-batch processing (~minutes, ~50% discount)
54
+ * — only OpenAI/Bedrock currently
55
+ * - `batch`: batch API processing (~hours, ~50% discount)
56
+ * — OpenAI/Anthropic/Google/Bedrock/Cloudflare
57
+ */
58
+ export type BatchTier = 'immediate' | 'flex' | 'batch';
59
+ /**
60
+ * Provider-specific HTTP status code → ErrorCategory mapping.
61
+ * Empty here by default — `ai-functions/retry.ts#classifyError` handles the
62
+ * common cases. Override per-model if a provider has unusual error codes.
63
+ */
64
+ export type ErrorMapping = Record<number, ErrorCategoryName>;
65
+ /**
66
+ * MDXLD-shaped per-model resilience and tier policy.
67
+ *
68
+ * `$type: 'ModelPolicy'`, `$id` is the resolved model id (e.g.
69
+ * `'anthropic/claude-opus-4.5'`).
70
+ */
71
+ export interface ModelPolicy {
72
+ $type: 'ModelPolicy';
73
+ $id: string;
74
+ /** Provider slug (e.g. 'anthropic') */
75
+ provider: string;
76
+ retry: RetryPolicyData;
77
+ circuitBreaker: CircuitBreakerPolicyData;
78
+ /** Ordered list of model ids to try after this one fails */
79
+ fallbackChain: string[];
80
+ /** Tiers this model is eligible for */
81
+ batchTier: BatchTier[];
82
+ /** Provider-specific HTTP code → category overrides */
83
+ errorMapping: ErrorMapping;
84
+ }
85
+ /** Default retry policy — matches `ai-functions` `RetryPolicy` defaults. */
86
+ export declare const DEFAULT_RETRY: RetryPolicyData;
87
+ /** Default circuit breaker — matches `ai-functions` defaults. */
88
+ export declare const DEFAULT_CIRCUIT_BREAKER: CircuitBreakerPolicyData;
89
+ /**
90
+ * Default policy for an unknown model. Used when no catalog entry is found.
91
+ */
92
+ export declare function defaultPolicy(modelId: string): ModelPolicy;
93
+ /**
94
+ * Derivation layer — turn a `ModelInfo` (from OpenRouter raw data) into a
95
+ * `ModelPolicy` by applying heuristics.
96
+ *
97
+ * Pure function; safe to call at build time to pre-compute a static snapshot.
98
+ *
99
+ * @param model - The catalog entry for the model.
100
+ * @param allModels - The full catalog, used for sibling lookup. Optional;
101
+ * defaults to `list()`.
102
+ */
103
+ export declare function derivePolicy(model: ModelInfo, allModels?: ModelInfo[]): ModelPolicy;
104
+ /**
105
+ * Resolve an alias (or full model id) and return its policy.
106
+ *
107
+ * Falls back to `defaultPolicy(id)` if the model is not in the catalog —
108
+ * callers always get a usable policy.
109
+ *
110
+ * @example
111
+ * ```ts
112
+ * const p = policyFor('sonnet')
113
+ * // p.fallbackChain → ['anthropic/claude-opus-4.5', 'openai/gpt-4o', ...]
114
+ * // p.batchTier → ['immediate', 'batch']
115
+ * ```
116
+ */
117
+ export declare function policyFor(input: string): ModelPolicy;
118
+ /**
119
+ * Reset the policy cache. Useful for tests, or after the catalog is reloaded.
120
+ */
121
+ export declare function resetPolicyCache(): void;
122
+ /**
123
+ * List all known aliases. Convenience for tooling that wants to enumerate
124
+ * derived policies (e.g. a static snapshot generator).
125
+ */
126
+ export declare function listAliases(): string[];
127
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAA;AAOhE;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GACzB,SAAS,GACT,YAAY,GACZ,eAAe,GACf,gBAAgB,GAChB,QAAQ,GACR,gBAAgB,GAChB,SAAS,CAAA;AAEb;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,6CAA6C;IAC7C,mBAAmB,EAAE,iBAAiB,EAAE,CAAA;CACzC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,gBAAgB,EAAE,MAAM,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,CAAA;AAEtD;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;AAE5D;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,aAAa,CAAA;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,eAAe,CAAA;IACtB,cAAc,EAAE,wBAAwB,CAAA;IACxC,4DAA4D;IAC5D,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,uCAAuC;IACvC,SAAS,EAAE,SAAS,EAAE,CAAA;IACtB,uDAAuD;IACvD,YAAY,EAAE,YAAY,CAAA;CAC3B;AAuBD,4EAA4E;AAC5E,eAAO,MAAM,aAAa,EAAE,eAO3B,CAAA;AAED,iEAAiE;AACjE,eAAO,MAAM,uBAAuB,EAAE,wBAIrC,CAAA;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAY1D;AAkHD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,WAAW,CAenF;AASD;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CASpD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,MAAM,EAAE,CAEtC"}
package/dist/policy.js ADDED
@@ -0,0 +1,246 @@
1
+ /**
2
+ * ModelPolicy - per-model resilience and tier policy data
3
+ *
4
+ * `language-models` owns model identity (alias resolution, capability lookup).
5
+ * Resilience policy (retry, circuit breaker, fallback chain, batch tier) is
6
+ * a per-model concern that belongs alongside the catalog data — but the
7
+ * runtime *machinery* that applies the policy lives in `ai-functions`.
8
+ *
9
+ * This module provides:
10
+ * - `ModelPolicy` MDXLD type (`$type: 'ModelPolicy'`)
11
+ * - `policyFor(alias)` - resolve an alias and return its derived policy
12
+ * - `derivePolicy(model, alias?)` - inference layer that turns OpenRouter raw
13
+ * data into a policy by applying heuristics (newest frontier model is best,
14
+ * price within a family is inversely correlated with capability, etc.)
15
+ *
16
+ * Source of truth: OpenRouter raw catalog (data/models.json) + heuristics.
17
+ * Strategy: runtime derivation, cached. A static snapshot generator could be
18
+ * added later (see `derivePolicy` — it's pure, so you can pre-compute it).
19
+ *
20
+ * @packageDocumentation
21
+ */
22
+ import { resolve, get, list } from './models.js';
23
+ import { ALIASES } from './aliases.js';
24
+ // ============================================================================
25
+ // Defaults & heuristics
26
+ // ============================================================================
27
+ /** Frontier labs — newer releases tend to be more capable. */
28
+ const FRONTIER_PROVIDERS = new Set(['anthropic', 'openai', 'google']);
29
+ /** Providers with batch APIs supported by ai-functions. */
30
+ const BATCH_PROVIDERS = new Set(['anthropic', 'openai', 'google', 'amazon-bedrock', 'cloudflare']);
31
+ /** Providers with flex (faster-than-batch) APIs. */
32
+ const FLEX_PROVIDERS = new Set(['openai', 'amazon-bedrock']);
33
+ /** Curated fallback seeds — picked one per frontier family. */
34
+ const FRONTIER_FALLBACK = [
35
+ 'anthropic/claude-sonnet-4.5',
36
+ 'anthropic/claude-opus-4.5',
37
+ 'openai/gpt-4o',
38
+ 'google/gemini-2.5-pro',
39
+ ];
40
+ /** Default retry policy — matches `ai-functions` `RetryPolicy` defaults. */
41
+ export const DEFAULT_RETRY = {
42
+ maxRetries: 3,
43
+ baseDelay: 1000,
44
+ maxDelay: 30000,
45
+ multiplier: 2,
46
+ jitter: 0,
47
+ retryableCategories: ['network', 'rate_limit', 'server', 'unknown'],
48
+ };
49
+ /** Default circuit breaker — matches `ai-functions` defaults. */
50
+ export const DEFAULT_CIRCUIT_BREAKER = {
51
+ failureThreshold: 5,
52
+ resetTimeout: 30000,
53
+ successThreshold: 1,
54
+ };
55
+ /**
56
+ * Default policy for an unknown model. Used when no catalog entry is found.
57
+ */
58
+ export function defaultPolicy(modelId) {
59
+ const provider = modelId.includes('/') ? modelId.split('/')[0] : 'unknown';
60
+ return {
61
+ $type: 'ModelPolicy',
62
+ $id: modelId,
63
+ provider,
64
+ retry: { ...DEFAULT_RETRY },
65
+ circuitBreaker: { ...DEFAULT_CIRCUIT_BREAKER },
66
+ fallbackChain: [],
67
+ batchTier: ['immediate'],
68
+ errorMapping: {},
69
+ };
70
+ }
71
+ // ============================================================================
72
+ // Derivation layer
73
+ // ============================================================================
74
+ /**
75
+ * Parse a price-per-token string to a number. Returns 0 on parse failure.
76
+ * Pricing comes through OpenRouter as a string (e.g. "0.000003").
77
+ */
78
+ function parsePrice(p) {
79
+ if (!p)
80
+ return 0;
81
+ const n = Number(p);
82
+ return Number.isFinite(n) ? n : 0;
83
+ }
84
+ /**
85
+ * Extract a "family" key from a model id for fallback grouping.
86
+ * 'anthropic/claude-opus-4.5' → 'anthropic/claude'
87
+ * 'openai/gpt-4o-mini' → 'openai/gpt'
88
+ */
89
+ function familyKey(id) {
90
+ const slash = id.indexOf('/');
91
+ if (slash < 0)
92
+ return id;
93
+ const provider = id.substring(0, slash);
94
+ const rest = id.substring(slash + 1).toLowerCase();
95
+ // Strip trailing version tags / size qualifiers
96
+ const family = rest
97
+ .replace(/[-_]?\d.*$/, '') // drop -4.5, -2.0, etc
98
+ .replace(/(opus|sonnet|haiku|mini|pro|flash|lite|maverick|instruct).*$/, '$1')
99
+ .replace(/-?(opus|sonnet|haiku|mini|pro|flash|lite|maverick|instruct)$/, '');
100
+ return `${provider}/${family || rest.split('-')[0]}`;
101
+ }
102
+ /**
103
+ * Derive the fallback chain for a model.
104
+ *
105
+ * Heuristics:
106
+ * 1. Prefer same-family siblings (e.g. sonnet → opus → haiku within Claude)
107
+ * ordered by `created` (newer first), then by price descending (more
108
+ * expensive within a family is usually more capable).
109
+ * 2. Then fall back to frontier-lab seeds, skipping the model itself and
110
+ * anything from the same family already included.
111
+ * 3. Cap at 4 entries to keep latency bounded.
112
+ */
113
+ function deriveFallbackChain(model, allModels) {
114
+ const chain = [];
115
+ const seen = new Set([model.id]);
116
+ const fam = familyKey(model.id);
117
+ // Step 1: same-family siblings, sorted newest-first then by price desc.
118
+ const siblings = allModels
119
+ .filter((m) => m.id !== model.id && familyKey(m.id) === fam)
120
+ .map((m) => ({
121
+ m,
122
+ created: m.created ?? 0,
123
+ price: parsePrice(m.pricing?.completion),
124
+ }))
125
+ .sort((a, b) => {
126
+ if (b.created !== a.created)
127
+ return b.created - a.created;
128
+ return b.price - a.price;
129
+ });
130
+ for (const { m } of siblings.slice(0, 2)) {
131
+ if (!seen.has(m.id)) {
132
+ chain.push(m.id);
133
+ seen.add(m.id);
134
+ }
135
+ }
136
+ // Step 2: frontier seeds.
137
+ for (const seed of FRONTIER_FALLBACK) {
138
+ if (chain.length >= 4)
139
+ break;
140
+ if (seen.has(seed))
141
+ continue;
142
+ if (familyKey(seed) === fam)
143
+ continue;
144
+ chain.push(seed);
145
+ seen.add(seed);
146
+ }
147
+ return chain;
148
+ }
149
+ /**
150
+ * Derive batch-tier eligibility from provider capability.
151
+ */
152
+ function deriveBatchTiers(provider) {
153
+ const tiers = ['immediate'];
154
+ if (FLEX_PROVIDERS.has(provider))
155
+ tiers.push('flex');
156
+ if (BATCH_PROVIDERS.has(provider))
157
+ tiers.push('batch');
158
+ return tiers;
159
+ }
160
+ /**
161
+ * Derive the retry policy. Frontier providers get one extra attempt because
162
+ * their rate limits are typically more transient than long-tail providers.
163
+ */
164
+ function deriveRetry(provider) {
165
+ if (FRONTIER_PROVIDERS.has(provider)) {
166
+ return { ...DEFAULT_RETRY, maxRetries: 4, jitter: 0.2 };
167
+ }
168
+ return { ...DEFAULT_RETRY };
169
+ }
170
+ /**
171
+ * Derive the circuit-breaker policy. Frontier providers get a higher
172
+ * failure threshold (more capacity) and a shorter reset timeout.
173
+ */
174
+ function deriveCircuitBreaker(provider) {
175
+ if (FRONTIER_PROVIDERS.has(provider)) {
176
+ return { failureThreshold: 8, resetTimeout: 20000, successThreshold: 1 };
177
+ }
178
+ return { ...DEFAULT_CIRCUIT_BREAKER };
179
+ }
180
+ /**
181
+ * Derivation layer — turn a `ModelInfo` (from OpenRouter raw data) into a
182
+ * `ModelPolicy` by applying heuristics.
183
+ *
184
+ * Pure function; safe to call at build time to pre-compute a static snapshot.
185
+ *
186
+ * @param model - The catalog entry for the model.
187
+ * @param allModels - The full catalog, used for sibling lookup. Optional;
188
+ * defaults to `list()`.
189
+ */
190
+ export function derivePolicy(model, allModels) {
191
+ const all = allModels ?? list();
192
+ const slash = model.id.indexOf('/');
193
+ const provider = slash > 0 ? model.id.substring(0, slash) : model.provider ?? 'unknown';
194
+ return {
195
+ $type: 'ModelPolicy',
196
+ $id: model.id,
197
+ provider,
198
+ retry: deriveRetry(provider),
199
+ circuitBreaker: deriveCircuitBreaker(provider),
200
+ fallbackChain: deriveFallbackChain(model, all),
201
+ batchTier: deriveBatchTiers(provider),
202
+ errorMapping: {},
203
+ };
204
+ }
205
+ // ============================================================================
206
+ // Public API
207
+ // ============================================================================
208
+ /** Per-process cache of derived policies, keyed by resolved model id. */
209
+ const policyCache = new Map();
210
+ /**
211
+ * Resolve an alias (or full model id) and return its policy.
212
+ *
213
+ * Falls back to `defaultPolicy(id)` if the model is not in the catalog —
214
+ * callers always get a usable policy.
215
+ *
216
+ * @example
217
+ * ```ts
218
+ * const p = policyFor('sonnet')
219
+ * // p.fallbackChain → ['anthropic/claude-opus-4.5', 'openai/gpt-4o', ...]
220
+ * // p.batchTier → ['immediate', 'batch']
221
+ * ```
222
+ */
223
+ export function policyFor(input) {
224
+ const id = resolve(input);
225
+ const cached = policyCache.get(id);
226
+ if (cached)
227
+ return cached;
228
+ const model = get(id);
229
+ const policy = model ? derivePolicy(model) : defaultPolicy(id);
230
+ policyCache.set(id, policy);
231
+ return policy;
232
+ }
233
+ /**
234
+ * Reset the policy cache. Useful for tests, or after the catalog is reloaded.
235
+ */
236
+ export function resetPolicyCache() {
237
+ policyCache.clear();
238
+ }
239
+ /**
240
+ * List all known aliases. Convenience for tooling that wants to enumerate
241
+ * derived policies (e.g. a static snapshot generator).
242
+ */
243
+ export function listAliases() {
244
+ return Object.keys(ALIASES);
245
+ }
246
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * language-models / pricing — canonical LLM model pricing table.
3
+ *
4
+ * Consume via the subpath export:
5
+ *
6
+ * import { PRICING_TABLE, priceFor, type ModelPricing } from 'language-models/pricing'
7
+ *
8
+ * (Equivalent symbols are also re-exported from the package root —
9
+ * `import { priceFor } from 'language-models'` works too.)
10
+ *
11
+ * Rates are sourced from public Vertex / Bedrock / AI Studio list prices.
12
+ * `priceFor()` throws on unknown slug/tier rather than returning a silent
13
+ * zero (per BYOK_GATEWAY_LIES discipline: loud failure beats silent
14
+ * downgrade).
15
+ */
16
+ export type { HasPricingArgs, ModelPricing, PriceForArgs, PriceForResult, PricingTier, Provider, RateBlock, } from './types.js';
17
+ export { PRICING_TABLE } from './table.js';
18
+ export { priceFor, listSlugs, hasPricing, rowsForSlug } from './lookup.js';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pricing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,YAAY,EACV,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,WAAW,EACX,QAAQ,EACR,SAAS,GACV,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE1C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * language-models / pricing — canonical LLM model pricing table.
3
+ *
4
+ * Consume via the subpath export:
5
+ *
6
+ * import { PRICING_TABLE, priceFor, type ModelPricing } from 'language-models/pricing'
7
+ *
8
+ * (Equivalent symbols are also re-exported from the package root —
9
+ * `import { priceFor } from 'language-models'` works too.)
10
+ *
11
+ * Rates are sourced from public Vertex / Bedrock / AI Studio list prices.
12
+ * `priceFor()` throws on unknown slug/tier rather than returning a silent
13
+ * zero (per BYOK_GATEWAY_LIES discipline: loud failure beats silent
14
+ * downgrade).
15
+ */
16
+ export { PRICING_TABLE } from './table.js';
17
+ export { priceFor, listSlugs, hasPricing, rowsForSlug } from './lookup.js';
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pricing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAYH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE1C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * language-models / pricing — lookup helpers.
3
+ *
4
+ * The single source of truth for cost computation across the Phase-2
5
+ * three-repo cascade. Throws on unknown slug/tier (per BYOK_GATEWAY_LIES
6
+ * memory: silent zero is the lying-gateway pattern; loud failure beats
7
+ * silent downgrade).
8
+ */
9
+ import type { HasPricingArgs, ModelPricing, PriceForArgs, PriceForResult } from './types.js';
10
+ /**
11
+ * Compute USD cost for a known generation. Throws on:
12
+ * - unknown slug (no rows for the slug at all)
13
+ * - unknown/unmodeled tier for the slug (no row for the (slug, tier) pair)
14
+ * - negative token counts (programming error — fail loud)
15
+ *
16
+ * Honors `contextTierBreakpoint` when present: if `inputTokens >=
17
+ * breakpoint`, the entire request is billed at `contextTierAbove` rates
18
+ * (matches Google's published billing model — the rate switches once the
19
+ * input crosses 200K, applied to the full request).
20
+ *
21
+ * `cachedInputTokens` is billed at `cachedInputPer1M` when defined,
22
+ * falling back to the regular input rate otherwise. Cached tokens are
23
+ * SUBTRACTED from `inputTokens` to compute the non-cached portion — i.e.
24
+ * `inputTokens` is the TOTAL input including any cached tokens.
25
+ */
26
+ export declare function priceFor(args: PriceForArgs): PriceForResult;
27
+ /**
28
+ * Returns the unique set of slugs in the table. Useful for adapters that
29
+ * want to validate caller-supplied model ids before dispatching.
30
+ */
31
+ export declare function listSlugs(): readonly string[];
32
+ /**
33
+ * Returns true if pricing exists for the given (slug, tier). Use this
34
+ * when you need a non-throwing existence check before calling
35
+ * `priceFor()` (e.g. a metering middleware that wants to fall back to
36
+ * "unknown cost" telemetry rather than throwing on a not-yet-registered
37
+ * model).
38
+ */
39
+ export declare function hasPricing(args: HasPricingArgs): boolean;
40
+ /**
41
+ * Returns all pricing rows for a slug, across all tiers. Useful for
42
+ * tooling that wants to display "this model has standard + batch tiers"
43
+ * in a UI.
44
+ */
45
+ export declare function rowsForSlug(slug: string): readonly ModelPricing[];
46
+ //# sourceMappingURL=lookup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lookup.d.ts","sourceRoot":"","sources":["../../src/pricing/lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,cAAc,EAEf,MAAM,YAAY,CAAA;AAEnB;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc,CAoC3D;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,SAAS,MAAM,EAAE,CAI7C;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAExD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,YAAY,EAAE,CAEjE"}