@plurnk/plurnk-providers 1.3.7 → 1.3.8

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/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;
@@ -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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"}
@@ -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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plurnk/plurnk-providers",
3
- "version": "1.3.7",
3
+ "version": "1.3.8",
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.8",
70
+ "@plurnk/plurnk-aliases": "1.3.8",
71
+ "@plurnk/plurnk-meta": "1.3.8",
72
+ "@plurnk/plurnk-models": "1.3.8",
73
73
  "ai": "^7.0.37",
74
74
  "zod": "^3.25.76"
75
75
  }
@@ -171,6 +171,33 @@ 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
+
174
201
  test("#622: two Fireworks aliases independently select default and priority service tiers", async () => {
175
202
  const bodies: Record<string, unknown>[] = [];
176
203
  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);
@@ -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
+ });