@plurnk/plurnk-providers 1.3.8 → 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
@@ -129,6 +129,8 @@ The universal groups are:
129
129
  - request, stream-idle, retry, and probe budgets;
130
130
  - local GBNF and llama-server capability pins;
131
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;
132
134
  - opt-in logprob and raw-body capture.
133
135
 
134
136
  Operator secrets and machine-specific values never belong in committed
@@ -150,7 +152,10 @@ defaults.
150
152
  5. A precise unknown-provider error.
151
153
 
152
154
  Earlier sources are authoritative. Installed plugins cannot shadow a cataloged
153
- 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.
154
159
 
155
160
  Model IDs resolve exactly first. A unique catalog suffix is accepted to avoid
156
161
  forcing a vendor-owned resource prefix into PLURNK aliases. Ambiguous suffixes
@@ -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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"}
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.8",
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.8",
70
- "@plurnk/plurnk-aliases": "1.3.8",
71
- "@plurnk/plurnk-meta": "1.3.8",
72
- "@plurnk/plurnk-models": "1.3.8",
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
  }
@@ -198,6 +198,56 @@ test("#633: an explicit malformed operator override still fails at its owning co
198
198
  );
199
199
  });
200
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
+
201
251
  test("#622: two Fireworks aliases independently select default and priority service tiers", async () => {
202
252
  const bodies: Record<string, unknown>[] = [];
203
253
  mock.method(globalThis, "fetch", async (_url: string, init?: RequestInit) => {
@@ -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;
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",