@plurnk/plurnk-providers 1.3.7 → 1.3.9

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/.env.defaults CHANGED
@@ -88,6 +88,14 @@ PLURNK_PROVIDERS_PROBE_DELAY=250
88
88
  # per-alias (_<alias>) for a box whose model the catalog doesn't know.
89
89
  # PLURNK_PROVIDERS_CONTEXT_WINDOW=200000
90
90
 
91
+ # --- Model pricing override (USD per million tokens; SPEC §4) ---
92
+ # Models.dev owns catalog rates. Set these together for a model absent from the
93
+ # snapshot or to deliberately override its rates. Cached input defaults to the
94
+ # input rate when omitted. All three knobs are per-alias scopable.
95
+ # PLURNK_PROVIDERS_INPUT_USD_PER_MILLION=1
96
+ # PLURNK_PROVIDERS_CACHE_READ_USD_PER_MILLION=0.1
97
+ # PLURNK_PROVIDERS_OUTPUT_USD_PER_MILLION=5
98
+
91
99
  # --- llama-server detection pin (#34) ---
92
100
  # Unset = auto-detect from the /v1/models fingerprint. 1 = pin llama-server capabilities
93
101
  # (grammar transport, slot pinning, /tokenize) WITHOUT trusting the probe; 0 = force plain
@@ -96,9 +104,10 @@ PLURNK_PROVIDERS_PROBE_DELAY=250
96
104
 
97
105
  # --- Data capture (#36, SPEC §14) - OFF by default; the flag IS the isolation ---
98
106
  # Enable ONLY on a dataset-scraping alias (append _<alias>); serving turns then request and
99
- # carry nothing. TOP_LOGPROBS: non-negative int = the OpenAI top_logprobs count (surfaced on
100
- # assistant.logprobs; raw model logprob, the sampling-invariant confidence). RAWBODY: truthy -> verbatim wire
101
- # body on response.rawBody (keeps sampling_logprob/token_id/bytes the digest drops).
107
+ # carry nothing. TOP_LOGPROBS: "off" or a non-negative OpenAI top_logprobs count
108
+ # (0 captures only the chosen token; surfaced on assistant.logprobs). "off" lets
109
+ # an alias override process-wide capture. RAWBODY: truthy -> verbatim wire body
110
+ # on response.rawBody (keeps sampling_logprob/token_id/bytes the digest drops).
102
111
  # PLURNK_PROVIDERS_TOP_LOGPROBS_myscraper=3
103
112
  # PLURNK_PROVIDERS_RAWBODY_myscraper=1
104
113
 
package/SPEC.md CHANGED
@@ -116,6 +116,12 @@ Every operational value is an environment knob documented in `.env.defaults`.
116
116
  There are no hidden tuning constants. Every `PLURNK_PROVIDERS_*` knob may be
117
117
  scoped to an alias by appending `_<alias>`; the scoped value wins.
118
118
 
119
+ The public Node provider registry applies this package's committed
120
+ `.env.defaults` as a set-if-unset operational floor. Consumers pass their
121
+ operator environment, not a manually composed copy of the provider floor.
122
+ Explicit operator values always win and invalid explicit values fail at the
123
+ knob's owning contract.
124
+
119
125
  The universal groups are:
120
126
 
121
127
  - reasoning activation and optional explicit budget;
@@ -123,6 +129,8 @@ The universal groups are:
123
129
  - request, stream-idle, retry, and probe budgets;
124
130
  - local GBNF and llama-server capability pins;
125
131
  - context-window and generation-envelope overrides;
132
+ - explicit input, cached-input, and output USD-per-million rates for models
133
+ absent from the snapshot or deliberate operator overrides;
126
134
  - opt-in logprob and raw-body capture.
127
135
 
128
136
  Operator secrets and machine-specific values never belong in committed
@@ -144,7 +152,10 @@ defaults.
144
152
  5. A precise unknown-provider error.
145
153
 
146
154
  Earlier sources are authoritative. Installed plugins cannot shadow a cataloged
147
- or explicitly declared name.
155
+ or explicitly declared name. This remains true when a named model is absent
156
+ from the Models.dev snapshot: construction requires an explicit
157
+ `PLURNK_PROVIDERS_CONTEXT_WINDOW` and never falls through to a same-name
158
+ plugin.
148
159
 
149
160
  Model IDs resolve exactly first. A unique catalog suffix is accepted to avoid
150
161
  forcing a vendor-owned resource prefix into PLURNK aliases. Ambiguous suffixes
@@ -1 +1 @@
1
- {"version":3,"file":"ProviderRegistry.d.ts","sourceRoot":"","sources":["../src/ProviderRegistry.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAuB,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEhE,OAAO,EAAY,KAAK,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAU/E,KAAK,YAAY,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE5D,KAAK,UAAU,GAAG,CAAC,OAAO,CAAC,EAAE,eAAe,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;AAcpE,eAAO,MAAM,mBAAmB,SACtB,MAAM,OACP,MAAM,CAAC,UAAU,SACf,MAAM,eACD,YAAY,eACZ,UAAU,YACZ,MAAM,EAAE,+EAA+E;QACzF,MAAM,KACf,OAAO,CAAC,QAAQ,CAyClB,CAAC;AAGF,eAAO,MAAM,mBAAmB,QAAO,IAAmC,CAAC;AAG3E,eAAO,MAAM,kBAAkB,SACtB,MAAM,CAAC,UAAU,eACV,YAAY,eACZ,UAAU,KACvB,OAAO,CAAC,QAAQ,CAMlB,CAAC"}
1
+ {"version":3,"file":"ProviderRegistry.d.ts","sourceRoot":"","sources":["../src/ProviderRegistry.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAuB,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEhE,OAAO,EAAY,KAAK,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAW/E,KAAK,YAAY,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE5D,KAAK,UAAU,GAAG,CAAC,OAAO,CAAC,EAAE,eAAe,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;AAcpE,eAAO,MAAM,mBAAmB,SACtB,MAAM,OACP,MAAM,CAAC,UAAU,SACf,MAAM,eACD,YAAY,eACZ,UAAU,YACZ,MAAM,EAAE,+EAA+E;QACzF,MAAM,KACf,OAAO,CAAC,QAAQ,CA0ClB,CAAC;AAGF,eAAO,MAAM,mBAAmB,QAAO,IAAmC,CAAC;AAG3E,eAAO,MAAM,kBAAkB,SACtB,MAAM,CAAC,UAAU,eACV,YAAY,eACZ,UAAU,KACvB,OAAO,CAAC,QAAQ,CAMlB,CAAC"}
@@ -22,6 +22,7 @@ import { scopeEnvToAlias } from "./env.js";
22
22
  import { ollamaProviderFromEnv } from "./ollama.js";
23
23
  import { compatibleProviderFromEnv } from "./compatibleProvider.js";
24
24
  import { contextWindowFromEnv } from "./env.js";
25
+ import { withProviderDefaults } from "./defaults.js";
25
26
  const importModule = (specifier) => import(__rewriteRelativeImportExtension(specifier));
26
27
  // The node_modules scan is filesystem work that never changes within a process,
27
28
  // so it runs once and the result is memoized. A long-lived daemon pays one scan
@@ -36,6 +37,7 @@ const providerPackages = async (discoverFn, env) => {
36
37
  // extensibility seam for an AI SDK provider that neither source describes.
37
38
  export const instantiateProvider = async (name, env, model, importImpl = importModule, discoverFn = discover, baseUrl, // per-alias endpoint override (PLURNK_BASEURL_<alias>); threaded to both tiers
38
39
  alias) => {
40
+ env = withProviderDefaults(env);
39
41
  // Per-alias knob scoping overlays _<alias>-suffixed knobs onto their bare
40
42
  // names before any resolver reads them.
41
43
  if (alias !== undefined)
@@ -1 +1 @@
1
- {"version":3,"file":"ProviderRegistry.js","sourceRoot":"","sources":["../src/ProviderRegistry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ProviderRegistry.js","sourceRoot":"","sources":["../src/ProviderRegistry.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"catalogProvider.d.ts","sourceRoot":"","sources":["../src/catalogProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAerF,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,YAAY,CAAC;AAG1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAmBxC,eAAO,MAAM,oBAAoB,4EAS9B;IACC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,SAAS,CAAC;CACpB,KAAG,QAwDH,CAAC;AAEF,eAAO,MAAM,sBAAsB,SACzB,MAAM,OACP,MAAM,CAAC,UAAU,SACf,MAAM,oBACK,MAAM,KACzB,QAAQ,GAAG,IAgCb,CAAC"}
1
+ {"version":3,"file":"catalogProvider.d.ts","sourceRoot":"","sources":["../src/catalogProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAgBrF,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,YAAY,CAAC;AAG1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAmBxC,eAAO,MAAM,oBAAoB,4EAS9B;IACC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,SAAS,CAAC;CACpB,KAAG,QA0DH,CAAC;AAEF,eAAO,MAAM,sBAAsB,SACzB,MAAM,OACP,MAAM,CAAC,UAAU,SACf,MAAM,oBACK,MAAM,KACzB,QAAQ,GAAG,IAoCb,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { lookupProvider, resolveModel } from "@plurnk/plurnk-models";
2
- import { contextWindowFromEnv, dataCaptureFromEnv, envelopeFromEnv, parseRequiredFloat, parseRequiredInt, promptCacheKeyFromEnv, reasoningFromEnv, resolveReserve, } from "./env.js";
2
+ import { contextWindowFromEnv, dataCaptureFromEnv, envelopeFromEnv, parseRequiredFloat, parseRequiredInt, promptCacheKeyFromEnv, reasoningFromEnv, resolveReserve, tokenRatesFromEnv, } from "./env.js";
3
3
  import AiSdkProvider from "./AiSdkProvider.js";
4
4
  import { configuredProviderInfo, createSdkModel } from "./sdkModels.js";
5
5
  import { providerSource } from "./telemetry.js";
@@ -36,14 +36,16 @@ export const providerFromSdkModel = ({ name, env, model, languageModel, url, hea
36
36
  : completionTokens === null
37
37
  ? configuredReasoning
38
38
  : { tokens: Math.round(completionTokens / 2) };
39
- const cost = info?.cost;
40
- const calculateCost = cost === undefined
39
+ const configuredRates = tokenRatesFromEnv(env, name);
40
+ const catalogCost = info?.cost;
41
+ const rates = configuredRates ?? (catalogCost === undefined ? null : {
42
+ input: catalogCost.inputPer1M,
43
+ output: catalogCost.outputPer1M,
44
+ cached: catalogCost.cacheReadPer1M ?? catalogCost.inputPer1M,
45
+ });
46
+ const calculateCost = rates === null
41
47
  ? undefined
42
- : (usage) => calculateCostUsd(usage, {
43
- input: cost.inputPer1M,
44
- output: cost.outputPer1M,
45
- cached: cost.cacheReadPer1M ?? cost.inputPer1M,
46
- });
48
+ : (usage) => calculateCostUsd(usage, rates);
47
49
  return new AiSdkProvider({
48
50
  model,
49
51
  ...(languageModel === undefined ? {} : { languageModel }),
@@ -75,10 +77,11 @@ export const catalogProviderFromEnv = (name, env, model, baseUrlOverride) => {
75
77
  const contextOverride = contextWindowFromEnv(env, name);
76
78
  if (lookupProvider(name) === null && configuredProviderInfo(name, env) === null)
77
79
  return null;
78
- if (name === "openai" && resolved === null)
79
- return null;
80
- if (resolved === null && contextOverride === null)
80
+ if ((name === "openai" || name === "ollama") && resolved === null)
81
81
  return null;
82
+ if (resolved === null && contextOverride === null) {
83
+ throw new Error(`${name} provider: context window unresolved for "${model}" — set PLURNK_PROVIDERS_CONTEXT_WINDOW or update the Models.dev snapshot`);
84
+ }
82
85
  const wireModel = resolved?.id ?? model;
83
86
  const sdk = createSdkModel(name, wireModel, env, baseUrlOverride);
84
87
  if (sdk === null)
@@ -1 +1 @@
1
- {"version":3,"file":"catalogProvider.js","sourceRoot":"","sources":["../src/catalogProvider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"catalogProvider.js","sourceRoot":"","sources":["../src/catalogProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const withProviderDefaults: (env: NodeJS.ProcessEnv) => NodeJS.ProcessEnv;
2
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,oBAAoB,QAAS,MAAM,CAAC,UAAU,KAAG,MAAM,CAAC,UAGnE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { parseEnv } from "node:util";
3
+ const providerDefaults = parseEnv(readFileSync(new URL("../.env.defaults", import.meta.url), "utf8"));
4
+ export const withProviderDefaults = (env) => ({
5
+ ...providerDefaults,
6
+ ...env,
7
+ });
8
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,MAAM,gBAAgB,GAAG,QAAQ,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,kBAAkB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAEtG,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAsB,EAAqB,EAAE,CAAC,CAAC;IAChF,GAAG,gBAAgB;IACnB,GAAG,GAAG;CACT,CAAC,CAAC"}
package/dist/env.d.ts CHANGED
@@ -9,6 +9,12 @@ export declare const dataCaptureFromEnv: (env: NodeJS.ProcessEnv, label: string)
9
9
  rawBody: boolean;
10
10
  };
11
11
  export declare const contextWindowFromEnv: (env: NodeJS.ProcessEnv, label: string) => number | null;
12
+ export type ProviderTokenRates = {
13
+ input: number;
14
+ cached: number;
15
+ output: number;
16
+ };
17
+ export declare const tokenRatesFromEnv: (env: NodeJS.ProcessEnv, label: string) => ProviderTokenRates | null;
12
18
  export type ReserveSpec = {
13
19
  percent: number;
14
20
  } | {
package/dist/env.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,gBAAgB,QAAS,MAAM,GAAG,SAAS,QAAQ,MAAM,SAAS,MAAM,KAAG,MAKvF,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAS,MAAM,GAAG,SAAS,QAAQ,MAAM,SAAS,MAAM,KAAG,MAAM,GAAG,IAKhG,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAS,MAAM,GAAG,SAAS,QAAQ,MAAM,SAAS,MAAM,OAAO,MAAM,KAAG,MAKtG,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAS,MAAM,GAAG,SAAS,QAAQ,MAAM,SAAS,MAAM,OAAO,MAAM,KAAG,MAAM,GAAG,IAK/G,CAAC;AAEF,eAAO,MAAM,UAAU,QAAS,MAAM,GAAG,SAAS,QAAQ,MAAM,SAAS,MAAM,KAAG,MAGjF,CAAC;AAEF,eAAO,MAAM,qBAAqB,QAAS,MAAM,CAAC,UAAU,SAAS,MAAM,KAAG,OAO7E,CAAC;AAkBF,eAAO,MAAM,kBAAkB,QAAS,MAAM,CAAC,UAAU,SAAS,MAAM,KAAG;IAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAMxH,CAAC;AAMF,eAAO,MAAM,oBAAoB,QAAS,MAAM,CAAC,UAAU,SAAS,MAAM,KAAG,MAAM,GAAG,IAGrF,CAAC;AAcF,MAAM,MAAM,WAAW,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAenE,eAAO,MAAM,eAAe,QAAS,MAAM,CAAC,UAAU,SAAS,MAAM,KAAG;IAAE,gBAAgB,EAAE,WAAW,CAAC;IAAC,iBAAiB,EAAE,WAAW,CAAA;CAGrI,CAAC;AAIH,eAAO,MAAM,cAAc,SAAU,WAAW,UAAU,MAAM,GAAG,IAAI,KAAG,MAAM,GAAG,IACY,CAAC;AAQhG,eAAO,MAAM,sBAAsB,QAAS,MAAM,CAAC,UAAU,UAAU,MAAM,GAAG,IAAI,KAAG;IAAE,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;CAOzJ,CAAC;AAWF,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,UAAU,GAAG,IAAI,CAAC;AACtD,MAAM,MAAM,SAAS,GAAG;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAEvE,eAAO,MAAM,gBAAgB,QAAS,MAAM,CAAC,UAAU,SAAS,MAAM,KAAG,SAcxE,CAAC;AASF,eAAO,MAAM,eAAe,mBAwB1B,CAAC;AAaH,eAAO,MAAM,eAAe,QAAS,MAAM,CAAC,UAAU,SAAS,MAAM,UAAS,SAAS,MAAM,EAAE,KAAqB,MAAM,CAAC,UAkB1H,CAAC"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,gBAAgB,QAAS,MAAM,GAAG,SAAS,QAAQ,MAAM,SAAS,MAAM,KAAG,MAKvF,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAS,MAAM,GAAG,SAAS,QAAQ,MAAM,SAAS,MAAM,KAAG,MAAM,GAAG,IAKhG,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAS,MAAM,GAAG,SAAS,QAAQ,MAAM,SAAS,MAAM,OAAO,MAAM,KAAG,MAKtG,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAS,MAAM,GAAG,SAAS,QAAQ,MAAM,SAAS,MAAM,OAAO,MAAM,KAAG,MAAM,GAAG,IAK/G,CAAC;AAEF,eAAO,MAAM,UAAU,QAAS,MAAM,GAAG,SAAS,QAAQ,MAAM,SAAS,MAAM,KAAG,MAGjF,CAAC;AAEF,eAAO,MAAM,qBAAqB,QAAS,MAAM,CAAC,UAAU,SAAS,MAAM,KAAG,OAO7E,CAAC;AAmBF,eAAO,MAAM,kBAAkB,QAAS,MAAM,CAAC,UAAU,SAAS,MAAM,KAAG;IAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CASxH,CAAC;AAMF,eAAO,MAAM,oBAAoB,QAAS,MAAM,CAAC,UAAU,SAAS,MAAM,KAAG,MAAM,GAAG,IAGrF,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnF,eAAO,MAAM,iBAAiB,QAAS,MAAM,CAAC,UAAU,SAAS,MAAM,KAAG,kBAAkB,GAAG,IAe9F,CAAC;AAcF,MAAM,MAAM,WAAW,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAenE,eAAO,MAAM,eAAe,QAAS,MAAM,CAAC,UAAU,SAAS,MAAM,KAAG;IAAE,gBAAgB,EAAE,WAAW,CAAC;IAAC,iBAAiB,EAAE,WAAW,CAAA;CAGrI,CAAC;AAIH,eAAO,MAAM,cAAc,SAAU,WAAW,UAAU,MAAM,GAAG,IAAI,KAAG,MAAM,GAAG,IACY,CAAC;AAQhG,eAAO,MAAM,sBAAsB,QAAS,MAAM,CAAC,UAAU,UAAU,MAAM,GAAG,IAAI,KAAG;IAAE,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;CAOzJ,CAAC;AAWF,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,UAAU,GAAG,IAAI,CAAC;AACtD,MAAM,MAAM,SAAS,GAAG;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAEvE,eAAO,MAAM,gBAAgB,QAAS,MAAM,CAAC,UAAU,SAAS,MAAM,KAAG,SAcxE,CAAC;AASF,eAAO,MAAM,eAAe,mBA2B1B,CAAC;AAaH,eAAO,MAAM,eAAe,QAAS,MAAM,CAAC,UAAU,SAAS,MAAM,UAAS,SAAS,MAAM,EAAE,KAAqB,MAAM,CAAC,UAkB1H,CAAC"}
package/dist/env.js CHANGED
@@ -57,14 +57,18 @@ const shedRenamed = (env, oldName, newName, label, ref) => {
57
57
  // Data-capture knobs (#36), read identically by every provider (standard AND
58
58
  // plugin) so the opt-in surface is one source of truth. Both OFF by default —
59
59
  // the flag is the isolation, so serving turns request and carry nothing.
60
- // PLURNK_PROVIDERS_TOP_LOGPROBS non-negative int = the OpenAI `top_logprobs`
61
- // count (set -> request per-token logprobs; unset -> off). Per-alias-scopable.
60
+ // PLURNK_PROVIDERS_TOP_LOGPROBS "off" or a non-negative int = the OpenAI
61
+ // `top_logprobs` count (0 captures the chosen token only). Unset -> off.
62
+ // Per-alias-scopable, so "off" can override process-wide capture.
62
63
  // PLURNK_PROVIDERS_RAWBODY truthy (not ""/"0") → attach the verbatim wire
63
64
  // body to response.rawBody. Per-alias-scopable.
64
65
  export const dataCaptureFromEnv = (env, label) => {
65
66
  shedRenamed(env, "PLURNK_PROVIDERS_LOGPROB", "PLURNK_PROVIDERS_TOP_LOGPROBS", label, "the OpenAI wire term"); // lexicon-allow
67
+ const topLogprobs = env.PLURNK_PROVIDERS_TOP_LOGPROBS === "off"
68
+ ? null
69
+ : parseOptionalInt(env.PLURNK_PROVIDERS_TOP_LOGPROBS, "PLURNK_PROVIDERS_TOP_LOGPROBS", label);
66
70
  return {
67
- topLogprobs: parseOptionalInt(env.PLURNK_PROVIDERS_TOP_LOGPROBS, "PLURNK_PROVIDERS_TOP_LOGPROBS", label),
71
+ topLogprobs,
68
72
  rawBody: env.PLURNK_PROVIDERS_RAWBODY !== undefined && env.PLURNK_PROVIDERS_RAWBODY !== "" && env.PLURNK_PROVIDERS_RAWBODY !== "0",
69
73
  };
70
74
  };
@@ -76,6 +80,23 @@ export const contextWindowFromEnv = (env, label) => {
76
80
  shedRenamed(env, "PLURNK_PROVIDERS_CONTEXT_SIZE", "PLURNK_PROVIDERS_CONTEXT_WINDOW", label, "the industry term, #472"); // lexicon-allow
77
81
  return parseOptionalInt(env.PLURNK_PROVIDERS_CONTEXT_WINDOW, "PLURNK_PROVIDERS_CONTEXT_WINDOW", label);
78
82
  };
83
+ export const tokenRatesFromEnv = (env, label) => {
84
+ const inputName = "PLURNK_PROVIDERS_INPUT_USD_PER_MILLION";
85
+ const cachedName = "PLURNK_PROVIDERS_CACHE_READ_USD_PER_MILLION";
86
+ const outputName = "PLURNK_PROVIDERS_OUTPUT_USD_PER_MILLION";
87
+ const configured = [inputName, cachedName, outputName]
88
+ .some((name) => env[name] !== undefined && env[name] !== "");
89
+ if (!configured)
90
+ return null;
91
+ const input = parseRequiredFloat(env[inputName], inputName, label, 0);
92
+ return {
93
+ input,
94
+ cached: env[cachedName] === undefined || env[cachedName] === ""
95
+ ? input
96
+ : parseRequiredFloat(env[cachedName], cachedName, label, 0),
97
+ output: parseRequiredFloat(env[outputName], outputName, label, 0),
98
+ };
99
+ };
79
100
  const parseReserve = (raw, name, label) => {
80
101
  if (raw === undefined || raw.length === 0)
81
102
  throw new Error(`${label} provider: ${name} must be set (a percentage of the window like "10%", or an absolute token count)`);
@@ -144,6 +165,9 @@ export const PROVIDERS_KNOBS = Object.freeze([
144
165
  "PLURNK_PROVIDERS_REASONING_BUDGET",
145
166
  "PLURNK_PROVIDERS_REASONING",
146
167
  "PLURNK_PROVIDERS_CONTEXT_WINDOW",
168
+ "PLURNK_PROVIDERS_INPUT_USD_PER_MILLION",
169
+ "PLURNK_PROVIDERS_CACHE_READ_USD_PER_MILLION",
170
+ "PLURNK_PROVIDERS_OUTPUT_USD_PER_MILLION",
147
171
  "PLURNK_PROVIDERS_RETRY_ATTEMPTS",
148
172
  "PLURNK_PROVIDERS_FETCH_TIMEOUT",
149
173
  "PLURNK_PROVIDERS_STREAM_IDLE_TIMEOUT",
package/dist/env.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plurnk/plurnk-providers",
3
- "version": "1.3.7",
3
+ "version": "1.3.9",
4
4
  "description": "PLURNK's stable model-provider contract and AI SDK adapter.",
5
5
  "keywords": [
6
6
  "plurnk",
@@ -66,10 +66,10 @@
66
66
  "@ai-sdk/togetherai": "^3.0.0",
67
67
  "@ai-sdk/xai": "^4.0.0",
68
68
  "@openrouter/ai-sdk-provider": "^3.0.0",
69
- "@plurnk/gbnf": "1.3.7",
70
- "@plurnk/plurnk-aliases": "1.3.7",
71
- "@plurnk/plurnk-meta": "1.3.7",
72
- "@plurnk/plurnk-models": "1.3.7",
69
+ "@plurnk/gbnf": "1.3.9",
70
+ "@plurnk/plurnk-aliases": "1.3.9",
71
+ "@plurnk/plurnk-meta": "1.3.9",
72
+ "@plurnk/plurnk-models": "1.3.9",
73
73
  "ai": "^7.0.37",
74
74
  "zod": "^3.25.76"
75
75
  }
@@ -171,6 +171,83 @@ test("instantiateProvider: per-alias knobs scope through to the provider (per-al
171
171
  mock.restoreAll();
172
172
  });
173
173
 
174
+ test("#633: public construction applies the package floor to a sparse consumer environment", async () => {
175
+ const provider = await instantiateProvider(
176
+ "fireworks",
177
+ { FIREWORKS_API_KEY: "fw" },
178
+ "deepseek-v4-pro",
179
+ async () => ({}),
180
+ mapOf({}),
181
+ );
182
+ assert.equal(provider.model, "accounts/fireworks/models/deepseek-v4-pro");
183
+ });
184
+
185
+ test("#633: an explicit malformed operator override still fails at its owning contract", async () => {
186
+ await assert.rejects(
187
+ () => instantiateProvider(
188
+ "fireworks",
189
+ {
190
+ FIREWORKS_API_KEY: "fw",
191
+ PLURNK_PROVIDERS_PROMPT_CACHE_KEY: "malformed",
192
+ },
193
+ "deepseek-v4-pro",
194
+ async () => ({}),
195
+ mapOf({}),
196
+ ),
197
+ /fireworks provider: PLURNK_PROVIDERS_PROMPT_CACHE_KEY must be "0" or "1"/,
198
+ );
199
+ });
200
+
201
+ test("#634: a catalog provider with unknown model metadata never falls through to plugin discovery", async () => {
202
+ let scanned = false;
203
+ await assert.rejects(
204
+ () => instantiateProvider(
205
+ "cloudflare",
206
+ {
207
+ CLOUDFLARE_ACCOUNT_ID: "account",
208
+ CLOUDFLARE_API_TOKEN: "token",
209
+ },
210
+ "vendor/model-outside-snapshot",
211
+ async () => { throw new Error("plugin import must not run"); },
212
+ async () => {
213
+ scanned = true;
214
+ return {
215
+ registry: new Map([["cloudflare", "@plurnk/plurnk-providers-cloudflare"]]),
216
+ skipped: new Map(),
217
+ attributions: new Map(),
218
+ };
219
+ },
220
+ ),
221
+ /cloudflare provider: context window unresolved for "vendor\/model-outside-snapshot" — set PLURNK_PROVIDERS_CONTEXT_WINDOW or update the Models.dev snapshot/,
222
+ );
223
+ assert.equal(scanned, false);
224
+ });
225
+
226
+ test("#634: explicit metadata constructs an out-of-snapshot Cloudflare model in the consolidated transport", async () => {
227
+ let scanned = false;
228
+ const provider = await instantiateProvider(
229
+ "cloudflare",
230
+ {
231
+ CLOUDFLARE_ACCOUNT_ID: "account",
232
+ CLOUDFLARE_API_TOKEN: "token",
233
+ PLURNK_PROVIDERS_CONTEXT_WINDOW: "128000",
234
+ },
235
+ "vendor/model-outside-snapshot",
236
+ async () => { throw new Error("plugin import must not run"); },
237
+ async () => {
238
+ scanned = true;
239
+ return {
240
+ registry: new Map([["cloudflare", "@plurnk/plurnk-providers-cloudflare"]]),
241
+ skipped: new Map(),
242
+ attributions: new Map(),
243
+ };
244
+ },
245
+ );
246
+ assert.equal(provider.model, "vendor/model-outside-snapshot");
247
+ assert.equal(provider.contextWindow, 128000);
248
+ assert.equal(scanned, false);
249
+ });
250
+
174
251
  test("#622: two Fireworks aliases independently select default and priority service tiers", async () => {
175
252
  const bodies: Record<string, unknown>[] = [];
176
253
  mock.method(globalThis, "fetch", async (_url: string, init?: RequestInit) => {
@@ -16,6 +16,7 @@ import { scopeEnvToAlias } from "./env.ts";
16
16
  import { ollamaProviderFromEnv } from "./ollama.ts";
17
17
  import { compatibleProviderFromEnv } from "./compatibleProvider.ts";
18
18
  import { contextWindowFromEnv } from "./env.ts";
19
+ import { withProviderDefaults } from "./defaults.ts";
19
20
 
20
21
  // Two injectable seams, both defaulting to production behavior and never passed
21
22
  // by real callers: the module importer (tests exercise the bespoke path without
@@ -45,6 +46,7 @@ export const instantiateProvider = async (
45
46
  baseUrl?: string, // per-alias endpoint override (PLURNK_BASEURL_<alias>); threaded to both tiers
46
47
  alias?: string, // the alias this instantiation serves — scopes PLURNK_PROVIDERS_<KNOB>_<alias> overrides
47
48
  ): Promise<Provider> => {
49
+ env = withProviderDefaults(env);
48
50
  // Per-alias knob scoping overlays _<alias>-suffixed knobs onto their bare
49
51
  // names before any resolver reads them.
50
52
  if (alias !== undefined) env = scopeEnvToAlias(env, alias);
@@ -90,7 +90,10 @@ test("official AI SDK provider owns the native request while PLURNK owns call se
90
90
  });
91
91
 
92
92
  test("cataloged unknown model fails unless its context is explicit", () => {
93
- assert.equal(catalogProviderFromEnv("xai", env, "not-in-the-catalog"), null);
93
+ assert.throws(
94
+ () => catalogProviderFromEnv("xai", env, "not-in-the-catalog"),
95
+ /context window unresolved/,
96
+ );
94
97
  const provider = catalogProviderFromEnv("xai", {
95
98
  ...env,
96
99
  XAI_API_KEY: "test-key",
@@ -98,3 +101,23 @@ test("cataloged unknown model fails unless its context is explicit", () => {
98
101
  }, "not-in-the-catalog");
99
102
  assert.equal(provider?.contextWindow, 8192);
100
103
  });
104
+
105
+ test("explicit operator rates price out-of-snapshot models and override catalog rates", () => {
106
+ const priced = {
107
+ ...env,
108
+ XAI_API_KEY: "test-key",
109
+ PLURNK_PROVIDERS_CONTEXT_WINDOW: "8192",
110
+ PLURNK_PROVIDERS_INPUT_USD_PER_MILLION: "2",
111
+ PLURNK_PROVIDERS_CACHE_READ_USD_PER_MILLION: "0.5",
112
+ PLURNK_PROVIDERS_OUTPUT_USD_PER_MILLION: "8",
113
+ };
114
+ const usage = {
115
+ prompt: 1_000_000,
116
+ cached: 250_000,
117
+ completion: 500_000,
118
+ reasoning: 500_000,
119
+ total: 2_000_000,
120
+ };
121
+ assert.equal(catalogProviderFromEnv("xai", priced, "not-in-the-catalog")?.calculateCost(usage), 9.625);
122
+ assert.equal(catalogProviderFromEnv("openai", priced, "gpt-4.1-mini")?.calculateCost(usage), 9.625);
123
+ });
@@ -8,6 +8,7 @@ import {
8
8
  promptCacheKeyFromEnv,
9
9
  reasoningFromEnv,
10
10
  resolveReserve,
11
+ tokenRatesFromEnv,
11
12
  type ReserveSpec,
12
13
  } from "./env.ts";
13
14
  import AiSdkProvider, { type ReasoningStyle } from "./AiSdkProvider.ts";
@@ -75,14 +76,16 @@ export const providerFromSdkModel = ({
75
76
  ? configuredReasoning
76
77
  : { tokens: Math.round(completionTokens / 2) };
77
78
 
78
- const cost = info?.cost;
79
- const calculateCost = cost === undefined
79
+ const configuredRates = tokenRatesFromEnv(env, name);
80
+ const catalogCost = info?.cost;
81
+ const rates = configuredRates ?? (catalogCost === undefined ? null : {
82
+ input: catalogCost.inputPer1M,
83
+ output: catalogCost.outputPer1M,
84
+ cached: catalogCost.cacheReadPer1M ?? catalogCost.inputPer1M,
85
+ });
86
+ const calculateCost = rates === null
80
87
  ? undefined
81
- : (usage: ProviderUsage): number => calculateCostUsd(usage, {
82
- input: cost.inputPer1M,
83
- output: cost.outputPer1M,
84
- cached: cost.cacheReadPer1M ?? cost.inputPer1M,
85
- });
88
+ : (usage: ProviderUsage): number => calculateCostUsd(usage, rates);
86
89
 
87
90
  return new AiSdkProvider({
88
91
  model,
@@ -120,8 +123,12 @@ export const catalogProviderFromEnv = (
120
123
  const resolved = resolveModel(name, model);
121
124
  const contextOverride = contextWindowFromEnv(env, name);
122
125
  if (lookupProvider(name) === null && configuredProviderInfo(name, env) === null) return null;
123
- if (name === "openai" && resolved === null) return null;
124
- if (resolved === null && contextOverride === null) return null;
126
+ if ((name === "openai" || name === "ollama") && resolved === null) return null;
127
+ if (resolved === null && contextOverride === null) {
128
+ throw new Error(
129
+ `${name} provider: context window unresolved for "${model}" — set PLURNK_PROVIDERS_CONTEXT_WINDOW or update the Models.dev snapshot`,
130
+ );
131
+ }
125
132
  const wireModel = resolved?.id ?? model;
126
133
  const sdk = createSdkModel(name, wireModel, env, baseUrlOverride);
127
134
  if (sdk === null) return null;
@@ -0,0 +1,19 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { withProviderDefaults } from "./defaults.ts";
4
+
5
+ test("withProviderDefaults supplies the package-owned operational floor", () => {
6
+ const env = withProviderDefaults({});
7
+ assert.equal(env.PLURNK_PROVIDERS_PROMPT_CACHE_KEY, "1");
8
+ assert.equal(env.PLURNK_PROVIDERS_FETCH_TIMEOUT, "600000");
9
+ assert.equal(env.PLURNK_PROVIDERS_RETRY_ATTEMPTS, "3");
10
+ });
11
+
12
+ test("withProviderDefaults preserves every explicit operator value", () => {
13
+ const env = withProviderDefaults({
14
+ PLURNK_PROVIDERS_PROMPT_CACHE_KEY: "malformed",
15
+ PLURNK_PROVIDERS_FETCH_TIMEOUT: "42",
16
+ });
17
+ assert.equal(env.PLURNK_PROVIDERS_PROMPT_CACHE_KEY, "malformed");
18
+ assert.equal(env.PLURNK_PROVIDERS_FETCH_TIMEOUT, "42");
19
+ });
@@ -0,0 +1,9 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { parseEnv } from "node:util";
3
+
4
+ const providerDefaults = parseEnv(readFileSync(new URL("../.env.defaults", import.meta.url), "utf8"));
5
+
6
+ export const withProviderDefaults = (env: NodeJS.ProcessEnv): NodeJS.ProcessEnv => ({
7
+ ...providerDefaults,
8
+ ...env,
9
+ });
package/src/env.test.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import test from "node:test";
2
2
  import { strict as assert } from "node:assert";
3
- import { parseRequiredInt, parseOptionalInt, requireEnv, reasoningFromEnv } from "./env.ts";
3
+ import { parseRequiredInt, parseOptionalInt, requireEnv, reasoningFromEnv, tokenRatesFromEnv } from "./env.ts";
4
4
 
5
5
  test("parseRequiredInt: parses a non-negative integer", () => {
6
6
  assert.equal(parseRequiredInt("600000", "PLURNK_PROVIDERS_FETCH_TIMEOUT", "openai"), 600000);
@@ -46,6 +46,31 @@ test("requireEnv: returns the value or throws a named error", () => {
46
46
  assert.throws(() => requireEnv("", "GROQ_API_KEY", "groq"), /must be set/);
47
47
  });
48
48
 
49
+ test("tokenRatesFromEnv is all-or-nothing, with cached input defaulting to input", () => {
50
+ assert.equal(tokenRatesFromEnv({}, "cloudflare"), null);
51
+ assert.deepEqual(tokenRatesFromEnv({
52
+ PLURNK_PROVIDERS_INPUT_USD_PER_MILLION: "0.435",
53
+ PLURNK_PROVIDERS_OUTPUT_USD_PER_MILLION: "0.87",
54
+ }, "cloudflare"), {
55
+ input: 0.435,
56
+ cached: 0.435,
57
+ output: 0.87,
58
+ });
59
+ assert.deepEqual(tokenRatesFromEnv({
60
+ PLURNK_PROVIDERS_INPUT_USD_PER_MILLION: "3",
61
+ PLURNK_PROVIDERS_CACHE_READ_USD_PER_MILLION: "0.3",
62
+ PLURNK_PROVIDERS_OUTPUT_USD_PER_MILLION: "15",
63
+ }, "cloudflare"), {
64
+ input: 3,
65
+ cached: 0.3,
66
+ output: 15,
67
+ });
68
+ assert.throws(
69
+ () => tokenRatesFromEnv({ PLURNK_PROVIDERS_INPUT_USD_PER_MILLION: "1" }, "cloudflare"),
70
+ /PLURNK_PROVIDERS_OUTPUT_USD_PER_MILLION must be set/,
71
+ );
72
+ });
73
+
49
74
  // — per-alias knob scoping (per-alias scoping doctrine, user 2026-07-03) —
50
75
 
51
76
  test("scopeEnvToAlias: suffixed knob wins, bare is the fallback, other aliases ignored", async () => {
@@ -84,6 +109,7 @@ test("#36 dataCaptureFromEnv: both knobs OFF by default, ON when set (TOP_LOGPRO
84
109
  assert.deepEqual(dataCaptureFromEnv({ PLURNK_PROVIDERS_RAWBODY: "0" } as NodeJS.ProcessEnv, "x"), { topLogprobs: null, rawBody: false });
85
110
  assert.deepEqual(dataCaptureFromEnv({ PLURNK_PROVIDERS_TOP_LOGPROBS: "3", PLURNK_PROVIDERS_RAWBODY: "1" } as NodeJS.ProcessEnv, "x"), { topLogprobs: 3, rawBody: true });
86
111
  assert.deepEqual(dataCaptureFromEnv({ PLURNK_PROVIDERS_TOP_LOGPROBS: "0" } as NodeJS.ProcessEnv, "x"), { topLogprobs: 0, rawBody: false }); // set-to-0 = on, chosen-token only
112
+ assert.deepEqual(dataCaptureFromEnv({ PLURNK_PROVIDERS_TOP_LOGPROBS: "off" } as NodeJS.ProcessEnv, "x"), { topLogprobs: null, rawBody: false });
87
113
  });
88
114
 
89
115
  test("OpenAI-lexicon shed: a still-set PLURNK_PROVIDERS_LOGPROB fails hard with the rename pointer", async () => {
package/src/env.ts CHANGED
@@ -55,14 +55,18 @@ const shedRenamed = (env: NodeJS.ProcessEnv, oldName: string, newName: string, l
55
55
  // Data-capture knobs (#36), read identically by every provider (standard AND
56
56
  // plugin) so the opt-in surface is one source of truth. Both OFF by default —
57
57
  // the flag is the isolation, so serving turns request and carry nothing.
58
- // PLURNK_PROVIDERS_TOP_LOGPROBS non-negative int = the OpenAI `top_logprobs`
59
- // count (set -> request per-token logprobs; unset -> off). Per-alias-scopable.
58
+ // PLURNK_PROVIDERS_TOP_LOGPROBS "off" or a non-negative int = the OpenAI
59
+ // `top_logprobs` count (0 captures the chosen token only). Unset -> off.
60
+ // Per-alias-scopable, so "off" can override process-wide capture.
60
61
  // PLURNK_PROVIDERS_RAWBODY truthy (not ""/"0") → attach the verbatim wire
61
62
  // body to response.rawBody. Per-alias-scopable.
62
63
  export const dataCaptureFromEnv = (env: NodeJS.ProcessEnv, label: string): { topLogprobs: number | null; rawBody: boolean } => {
63
64
  shedRenamed(env, "PLURNK_PROVIDERS_LOGPROB", "PLURNK_PROVIDERS_TOP_LOGPROBS", label, "the OpenAI wire term"); // lexicon-allow
65
+ const topLogprobs = env.PLURNK_PROVIDERS_TOP_LOGPROBS === "off"
66
+ ? null
67
+ : parseOptionalInt(env.PLURNK_PROVIDERS_TOP_LOGPROBS, "PLURNK_PROVIDERS_TOP_LOGPROBS", label);
64
68
  return {
65
- topLogprobs: parseOptionalInt(env.PLURNK_PROVIDERS_TOP_LOGPROBS, "PLURNK_PROVIDERS_TOP_LOGPROBS", label),
69
+ topLogprobs,
66
70
  rawBody: env.PLURNK_PROVIDERS_RAWBODY !== undefined && env.PLURNK_PROVIDERS_RAWBODY !== "" && env.PLURNK_PROVIDERS_RAWBODY !== "0",
67
71
  };
68
72
  };
@@ -76,6 +80,25 @@ export const contextWindowFromEnv = (env: NodeJS.ProcessEnv, label: string): num
76
80
  return parseOptionalInt(env.PLURNK_PROVIDERS_CONTEXT_WINDOW, "PLURNK_PROVIDERS_CONTEXT_WINDOW", label);
77
81
  };
78
82
 
83
+ export type ProviderTokenRates = { input: number; cached: number; output: number };
84
+
85
+ export const tokenRatesFromEnv = (env: NodeJS.ProcessEnv, label: string): ProviderTokenRates | null => {
86
+ const inputName = "PLURNK_PROVIDERS_INPUT_USD_PER_MILLION";
87
+ const cachedName = "PLURNK_PROVIDERS_CACHE_READ_USD_PER_MILLION";
88
+ const outputName = "PLURNK_PROVIDERS_OUTPUT_USD_PER_MILLION";
89
+ const configured = [inputName, cachedName, outputName]
90
+ .some((name) => env[name] !== undefined && env[name] !== "");
91
+ if (!configured) return null;
92
+ const input = parseRequiredFloat(env[inputName], inputName, label, 0);
93
+ return {
94
+ input,
95
+ cached: env[cachedName] === undefined || env[cachedName] === ""
96
+ ? input
97
+ : parseRequiredFloat(env[cachedName], cachedName, label, 0),
98
+ output: parseRequiredFloat(env[outputName], outputName, label, 0),
99
+ };
100
+ };
101
+
79
102
  // The generation-envelope reserves (#507, owner-ruled migration): how much of a
80
103
  // DETECTED context window is reserved for reasoning and for completion — the
81
104
  // remainder (minus the consumer's own packing-safety margin) is the prompt
@@ -169,6 +192,9 @@ export const PROVIDERS_KNOBS = Object.freeze([
169
192
  "PLURNK_PROVIDERS_REASONING_BUDGET",
170
193
  "PLURNK_PROVIDERS_REASONING",
171
194
  "PLURNK_PROVIDERS_CONTEXT_WINDOW",
195
+ "PLURNK_PROVIDERS_INPUT_USD_PER_MILLION",
196
+ "PLURNK_PROVIDERS_CACHE_READ_USD_PER_MILLION",
197
+ "PLURNK_PROVIDERS_OUTPUT_USD_PER_MILLION",
172
198
  "PLURNK_PROVIDERS_RETRY_ATTEMPTS",
173
199
  "PLURNK_PROVIDERS_FETCH_TIMEOUT",
174
200
  "PLURNK_PROVIDERS_STREAM_IDLE_TIMEOUT",