@plurnk/plurnk-aliases 1.23.0 → 1.25.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.
- package/README.md +1 -1
- package/SPEC.md +15 -6
- package/dist/aliases.d.ts +1 -0
- package/dist/aliases.d.ts.map +1 -1
- package/dist/aliases.js +18 -11
- package/dist/aliases.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @plurnk/plurnk-aliases
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Provider-free parser for Plurnk model selectors and the optional alias cascade.
|
|
4
4
|
Vendor-agnostic, MIT.
|
|
5
5
|
|
|
6
6
|
Resolves `PLURNK_MODEL_<alias>=<provider>/<model>` env vars (plus per-alias
|
package/SPEC.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# @plurnk/plurnk-aliases — contract
|
|
2
2
|
|
|
3
|
-
The canonical
|
|
4
|
-
model-alias cascade.
|
|
5
|
-
|
|
3
|
+
The canonical provider-free parser for Plurnk model selectors and the optional
|
|
4
|
+
model-alias cascade. Its only runtime import is the shared configuration error.
|
|
5
|
+
`@plurnk/plurnk-providers` depends on this package and re-exports
|
|
6
6
|
its surface unchanged. Clients transmit selector strings and never resolve the
|
|
7
7
|
daemon's environment themselves; this package is the daemon/provider runtime's
|
|
8
8
|
single parsing authority.
|
|
@@ -52,14 +52,23 @@ alias-scoped tuning applies only when that real alias is present.
|
|
|
52
52
|
- **`resolveActiveRoute(env = process.env): ProviderSpec | null`** — resolves
|
|
53
53
|
`PLURNK_MODEL`, or returns `null` only when it is unset. An explicit unknown or
|
|
54
54
|
malformed selector fails instead of silently disabling the provider.
|
|
55
|
+
- **`resolveChildRoute(env = process.env): ProviderSpec | null`** — resolves
|
|
56
|
+
`PLURNK_MODEL_CHILD`, returning `null` only when absent (inherit).
|
|
57
|
+
An explicit empty value is invalid. Exact routes resolve independently of
|
|
58
|
+
alias declarations for both selectors.
|
|
55
59
|
|
|
56
60
|
## Fail-hard rules
|
|
57
61
|
|
|
58
|
-
- **Case-folding collision** — two `PLURNK_MODEL_*`
|
|
59
|
-
|
|
62
|
+
- §alias-case-collisions **Case-folding collision** — two nonempty `PLURNK_MODEL_*`
|
|
63
|
+
declarations or two nonempty `PLURNK_BASEURL_*` overrides that downcase to the
|
|
64
|
+
same alias throw (`Duplicate provider alias "<alias>"` or
|
|
65
|
+
`Duplicate base-URL override "<alias>"`). Identical values do not excuse
|
|
66
|
+
duplicate spelling; declaration order never selects a winner.
|
|
60
67
|
- **Dangling override** — a `PLURNK_BASEURL_*` whose alias has no matching
|
|
61
68
|
`PLURNK_MODEL_*` throws (a typo, not a silent no-op).
|
|
62
69
|
- **Unresolved active selector** — a non-empty `PLURNK_MODEL` that is neither a
|
|
63
70
|
declared alias nor a complete exact route throws.
|
|
64
71
|
|
|
65
|
-
|
|
72
|
+
These throw the shared `ConfigurationError`, naming the offending key.
|
|
73
|
+
Consumers preserve the diagnostic at their composition boundary; they never
|
|
74
|
+
substitute a selector or disguise an unresolved alias catalog as empty.
|
package/dist/aliases.d.ts
CHANGED
|
@@ -2,4 +2,5 @@ import type { ProviderAlias, ProviderSpec } from "./types.ts";
|
|
|
2
2
|
export declare const parseAliasesFromEnv: (env?: NodeJS.ProcessEnv) => ProviderAlias[];
|
|
3
3
|
export declare const resolveModelSelector: (selector: string, aliases: readonly ProviderAlias[]) => ProviderSpec | null;
|
|
4
4
|
export declare const resolveActiveRoute: (env?: NodeJS.ProcessEnv) => ProviderSpec | null;
|
|
5
|
+
export declare const resolveChildRoute: (env?: NodeJS.ProcessEnv) => ProviderSpec | null;
|
|
5
6
|
//# sourceMappingURL=aliases.d.ts.map
|
package/dist/aliases.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aliases.d.ts","sourceRoot":"","sources":["../src/aliases.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"aliases.d.ts","sourceRoot":"","sources":["../src/aliases.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAwB9D,eAAO,MAAM,mBAAmB,SAAS,MAAM,CAAC,UAAU,KAAiB,aAAa,EAwBvF,CAAC;AAEF,eAAO,MAAM,oBAAoB,aACnB,MAAM,WACP,SAAS,aAAa,EAAE,KAClC,YAAY,GAAG,IAOjB,CAAC;AAcF,eAAO,MAAM,kBAAkB,SAAS,MAAM,CAAC,UAAU,KAAiB,YAAY,GAAG,IAA4C,CAAC;AAEtI,eAAO,MAAM,iBAAiB,SAAS,MAAM,CAAC,UAAU,KAAiB,YAAY,GAAG,IAAkD,CAAC"}
|
package/dist/aliases.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// The
|
|
1
|
+
// The model-alias cascade imports no provider, tokenizer, or discovery machinery.
|
|
2
2
|
//
|
|
3
3
|
// PLURNK_MODEL_<alias>=<provider>/<model> declares an alias; PLURNK_MODEL selects
|
|
4
4
|
// either one declared alias or one exact provider/model route at boot. The provider segment is the first "/"-delimited
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
//
|
|
10
10
|
// Extracted from @plurnk/plurnk-providers so a thin consumer can resolve aliases
|
|
11
11
|
// from its own (always-fresh) env without pulling the provider/tokenizer machinery.
|
|
12
|
+
import ConfigurationError from "@plurnk/plurnk-meta/configuration-error";
|
|
12
13
|
// PLURNK_BASEURL_<alias>: per-alias endpoint override, case-folded on the alias
|
|
13
14
|
// to match PLURNK_MODEL_<alias>. Lets two aliases on the same provider name target
|
|
14
15
|
// different self-hosted boxes (openai/ollama), the one thing a per-name base-URL
|
|
@@ -23,7 +24,12 @@ const parseBaseUrls = (env) => {
|
|
|
23
24
|
const aliasRaw = key.slice("PLURNK_BASEURL_".length);
|
|
24
25
|
if (aliasRaw.length === 0)
|
|
25
26
|
continue;
|
|
26
|
-
|
|
27
|
+
const alias = aliasRaw.toLowerCase();
|
|
28
|
+
const existing = out.get(alias);
|
|
29
|
+
if (existing !== undefined) {
|
|
30
|
+
throw new ConfigurationError(key, `Duplicate base-URL override "${alias}": ${existing.key} and ${key} case-fold to the same alias.`);
|
|
31
|
+
}
|
|
32
|
+
out.set(alias, { key, value });
|
|
27
33
|
}
|
|
28
34
|
return out;
|
|
29
35
|
};
|
|
@@ -48,15 +54,15 @@ export const parseAliasesFromEnv = (env = process.env) => {
|
|
|
48
54
|
// Aliases are case-folded, so PLURNK_MODEL_opus and PLURNK_MODEL_OPUS
|
|
49
55
|
// collide. Surface the ambiguity rather than silently picking one.
|
|
50
56
|
if (seen.has(alias))
|
|
51
|
-
throw new
|
|
57
|
+
throw new ConfigurationError(key, `Duplicate provider alias "${alias}": multiple PLURNK_MODEL_* keys case-fold to the same alias. Rename one.`);
|
|
52
58
|
seen.add(alias);
|
|
53
|
-
const baseUrl = baseUrls.get(alias);
|
|
59
|
+
const baseUrl = baseUrls.get(alias)?.value;
|
|
54
60
|
out.push({ alias, provider: value.slice(0, slash), model: value.slice(slash + 1), ...(baseUrl !== undefined ? { baseUrl } : {}) });
|
|
55
61
|
}
|
|
56
62
|
// A base-URL override with no matching alias is a typo, not a silent no-op.
|
|
57
63
|
const unmatched = [...baseUrls.keys()].filter((a) => !seen.has(a));
|
|
58
64
|
if (unmatched.length > 0)
|
|
59
|
-
throw new
|
|
65
|
+
throw new ConfigurationError(baseUrls.get(unmatched[0]).key, `PLURNK_BASEURL_* override(s) with no matching PLURNK_MODEL_* alias: ${unmatched.join(", ")}. Declare the alias or remove the override.`);
|
|
60
66
|
return out;
|
|
61
67
|
};
|
|
62
68
|
export const resolveModelSelector = (selector, aliases) => {
|
|
@@ -68,15 +74,16 @@ export const resolveModelSelector = (selector, aliases) => {
|
|
|
68
74
|
return null;
|
|
69
75
|
return aliases.find((alias) => alias.alias === selector.toLowerCase()) ?? null;
|
|
70
76
|
};
|
|
71
|
-
|
|
72
|
-
const selected = env
|
|
73
|
-
if (selected === undefined || selected.length === 0)
|
|
77
|
+
const configuredRoute = (env, key) => {
|
|
78
|
+
const selected = env[key];
|
|
79
|
+
if (selected === undefined || (key === "PLURNK_MODEL" && selected.length === 0))
|
|
74
80
|
return null;
|
|
75
|
-
const
|
|
76
|
-
const route = resolveModelSelector(selected, aliases);
|
|
81
|
+
const route = resolveModelSelector(selected, selected.includes("/") ? [] : parseAliasesFromEnv(env));
|
|
77
82
|
if (route === null) {
|
|
78
|
-
throw new
|
|
83
|
+
throw new ConfigurationError(key, `${key} '${selected}' is neither a declared alias nor a provider/model route.`);
|
|
79
84
|
}
|
|
80
85
|
return route;
|
|
81
86
|
};
|
|
87
|
+
export const resolveActiveRoute = (env = process.env) => configuredRoute(env, "PLURNK_MODEL");
|
|
88
|
+
export const resolveChildRoute = (env = process.env) => configuredRoute(env, "PLURNK_MODEL_CHILD");
|
|
82
89
|
//# sourceMappingURL=aliases.js.map
|
package/dist/aliases.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aliases.js","sourceRoot":"","sources":["../src/aliases.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"aliases.js","sourceRoot":"","sources":["../src/aliases.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export type { ModelRoute, ProviderAlias, ProviderSpec } from "./types.ts";
|
|
2
|
-
export { parseAliasesFromEnv, resolveActiveRoute, resolveModelSelector } from "./aliases.ts";
|
|
2
|
+
export { parseAliasesFromEnv, resolveActiveRoute, resolveChildRoute, resolveModelSelector } from "./aliases.ts";
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { parseAliasesFromEnv, resolveActiveRoute, resolveModelSelector } from "./aliases.js";
|
|
1
|
+
export { parseAliasesFromEnv, resolveActiveRoute, resolveChildRoute, resolveModelSelector } from "./aliases.js";
|
|
2
2
|
//# 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":"AACA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plurnk/plurnk-aliases",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.25.0",
|
|
4
4
|
"description": "Runtime-free parser for PLURNK model selectors and the model-alias cascade.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"plurnk",
|
|
@@ -49,6 +49,7 @@
|
|
|
49
49
|
"prepack": "npm run build"
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
|
-
"@plurnk/plurnk-contracts": "1.
|
|
52
|
+
"@plurnk/plurnk-contracts": "1.25.0",
|
|
53
|
+
"@plurnk/plurnk-meta": "1.25.0"
|
|
53
54
|
}
|
|
54
55
|
}
|