@plurnk/plurnk-providers 1.3.6 → 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 +6 -0
- package/dist/ProviderRegistry.d.ts.map +1 -1
- package/dist/ProviderRegistry.js +2 -0
- package/dist/ProviderRegistry.js.map +1 -1
- package/dist/defaults.d.ts +2 -0
- package/dist/defaults.d.ts.map +1 -0
- package/dist/defaults.js +8 -0
- package/dist/defaults.js.map +1 -0
- package/package.json +5 -5
- package/src/ProviderRegistry.test.ts +27 -0
- package/src/ProviderRegistry.ts +2 -0
- package/src/defaults.test.ts +19 -0
- package/src/defaults.ts +9 -0
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;
|
|
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"}
|
package/dist/ProviderRegistry.js
CHANGED
|
@@ -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":"AAAA,uEAAuE;AACvE,2EAA2E;AAC3E,+EAA+E;AAC/E,2EAA2E;AAC3E,EAAE;AACF,+EAA+E;AAC/E,6EAA6E;AAC7E,+EAA+E;AAC/E,gEAAgE;;;;;;;;;AAGhE,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAwC,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"ProviderRegistry.js","sourceRoot":"","sources":["../src/ProviderRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|
package/dist/defaults.js
ADDED
|
@@ -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.
|
|
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.
|
|
70
|
-
"@plurnk/plurnk-aliases": "1.3.
|
|
71
|
-
"@plurnk/plurnk-meta": "1.3.
|
|
72
|
-
"@plurnk/plurnk-models": "1.3.
|
|
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) => {
|
package/src/ProviderRegistry.ts
CHANGED
|
@@ -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
|
+
});
|
package/src/defaults.ts
ADDED
|
@@ -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
|
+
});
|