@plurnk/plurnk-providers 0.40.0 → 1.0.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/dist/discover.d.ts.map +1 -1
- package/dist/discover.js +4 -39
- package/dist/discover.js.map +1 -1
- package/package.json +54 -55
- package/dist/tokenizers.d.ts +0 -6
- package/dist/tokenizers.d.ts.map +0 -1
- package/dist/tokenizers.js +0 -40
- package/dist/tokenizers.js.map +0 -1
package/dist/discover.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"AA0BA,MAAM,MAAM,eAAe,GAAG;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAC3B,CAAC;AAGF,MAAM,MAAM,SAAS,GAAG;IACpB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAM7B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;CAChD,CAAC;AAGF,eAAO,MAAM,QAAQ,aAAmB,eAAe,KAAQ,OAAO,CAAC,SAAS,CAyB/E,CAAC"}
|
package/dist/discover.js
CHANGED
|
@@ -1,16 +1,6 @@
|
|
|
1
1
|
import fs from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
|
|
4
|
-
// ON (any value) → `@plurnk/*` always trusted, plus a comma-separated allowlist
|
|
5
|
-
// of additionally-trusted package names ("1" = on with zero third-party).
|
|
6
|
-
const isTrusted = (packageName, env) => {
|
|
7
|
-
const gate = env.PLURNK_PLUGINS_TRUSTED_ONLY;
|
|
8
|
-
if (gate === undefined || gate === "" || gate === "0")
|
|
9
|
-
return true;
|
|
10
|
-
if (packageName.startsWith("@plurnk/"))
|
|
11
|
-
return true;
|
|
12
|
-
return gate.split(",").map((s) => s.trim()).includes(packageName);
|
|
13
|
-
};
|
|
3
|
+
import Meta from "@plurnk/plurnk-meta";
|
|
14
4
|
export const discover = async (options = {}) => {
|
|
15
5
|
const dirs = options.packageDirs ?? await defaultPackageDirs(options.cwd ?? process.cwd());
|
|
16
6
|
const env = options.env ?? process.env;
|
|
@@ -21,7 +11,7 @@ export const discover = async (options = {}) => {
|
|
|
21
11
|
const info = await readProviderInfo(dir);
|
|
22
12
|
if (info === null)
|
|
23
13
|
continue;
|
|
24
|
-
if (!isTrusted(info.packageName, env)) {
|
|
14
|
+
if (!Meta.isTrusted(info.packageName, env)) {
|
|
25
15
|
skipped.set(info.name, info.packageName); // declined — not a collision candidate
|
|
26
16
|
continue;
|
|
27
17
|
}
|
|
@@ -39,33 +29,8 @@ export const discover = async (options = {}) => {
|
|
|
39
29
|
// Enumerate every installed package directory — scoped and unscoped — under
|
|
40
30
|
// `<cwd>/node_modules`. Unreadable node_modules (e.g. nothing installed) → [].
|
|
41
31
|
const defaultPackageDirs = async (cwd) => {
|
|
42
|
-
const nm = path.join(cwd, "node_modules");
|
|
43
|
-
|
|
44
|
-
try {
|
|
45
|
-
entries = await fs.readdir(nm, { withFileTypes: true });
|
|
46
|
-
}
|
|
47
|
-
catch {
|
|
48
|
-
return [];
|
|
49
|
-
}
|
|
50
|
-
const dirs = [];
|
|
51
|
-
for (const entry of entries) {
|
|
52
|
-
if (!entry.isDirectory() || entry.name === ".bin" || entry.name === ".cache")
|
|
53
|
-
continue;
|
|
54
|
-
if (entry.name.startsWith("@")) {
|
|
55
|
-
const scopeDir = path.join(nm, entry.name);
|
|
56
|
-
try {
|
|
57
|
-
const scoped = await fs.readdir(scopeDir, { withFileTypes: true });
|
|
58
|
-
for (const s of scoped)
|
|
59
|
-
if (s.isDirectory())
|
|
60
|
-
dirs.push(path.join(scopeDir, s.name));
|
|
61
|
-
}
|
|
62
|
-
catch { /* unreadable scope dir — skip */ }
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
dirs.push(path.join(nm, entry.name));
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
return dirs;
|
|
32
|
+
const nm = Meta.nearestNodeModules(cwd) ?? path.join(path.resolve(cwd), "node_modules");
|
|
33
|
+
return (await Meta.packageDirs(nm)).map((c) => c.dir).toSorted();
|
|
69
34
|
};
|
|
70
35
|
const readProviderInfo = async (dir) => {
|
|
71
36
|
let raw;
|
package/dist/discover.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,58 +1,57 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
},
|
|
15
|
-
"repository": {
|
|
16
|
-
"type": "git",
|
|
17
|
-
"url": "git+https://github.com/plurnk/plurnk-providers.git"
|
|
18
|
-
},
|
|
19
|
-
"engines": {
|
|
20
|
-
"node": ">=26"
|
|
21
|
-
},
|
|
22
|
-
"license": "MIT",
|
|
23
|
-
"author": "@wikitopian",
|
|
24
|
-
"type": "module",
|
|
25
|
-
"publishConfig": {
|
|
26
|
-
"access": "public"
|
|
27
|
-
},
|
|
28
|
-
"exports": {
|
|
29
|
-
".": {
|
|
30
|
-
"types": "./dist/index.d.ts",
|
|
31
|
-
"default": "./dist/index.js"
|
|
2
|
+
"name": "@plurnk/plurnk-providers",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Framework + contract for plurnk LLM transports: built-in standard OpenAI-compatible providers plus scope-agnostic discovery of first-party and third-party provider packages.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"plurnk",
|
|
7
|
+
"llm",
|
|
8
|
+
"provider",
|
|
9
|
+
"tokenizer"
|
|
10
|
+
],
|
|
11
|
+
"homepage": "https://github.com/plurnk/plurnk-providers#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/plurnk/plurnk-providers/issues"
|
|
32
14
|
},
|
|
33
|
-
"
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
"
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
"
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "git+https://github.com/plurnk/plurnk-providers.git"
|
|
18
|
+
},
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=26"
|
|
21
|
+
},
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"author": "@wikitopian",
|
|
24
|
+
"type": "module",
|
|
25
|
+
"publishConfig": {
|
|
26
|
+
"access": "public"
|
|
27
|
+
},
|
|
28
|
+
"exports": {
|
|
29
|
+
".": {
|
|
30
|
+
"types": "./dist/index.d.ts",
|
|
31
|
+
"plurnk-dev": "./src/index.ts",
|
|
32
|
+
"default": "./dist/index.js"
|
|
33
|
+
},
|
|
34
|
+
"./package.json": "./package.json"
|
|
35
|
+
},
|
|
36
|
+
"files": [
|
|
37
|
+
"dist/**/*",
|
|
38
|
+
"README.md",
|
|
39
|
+
"SPEC.md",
|
|
40
|
+
".env.defaults"
|
|
41
|
+
],
|
|
42
|
+
"scripts": {
|
|
43
|
+
"test:lint": "tsc --noEmit",
|
|
44
|
+
"test:unit": "node --conditions=plurnk-dev --test src/**/*.test.ts",
|
|
45
|
+
"test": "npm run test:lint && npm run test:unit",
|
|
46
|
+
"build:dist": "tsc -p tsconfig.build.json",
|
|
47
|
+
"build": "npm run build:dist",
|
|
48
|
+
"prepack": "npm run build"
|
|
49
|
+
},
|
|
50
|
+
"dependencies": {
|
|
51
|
+
"@plurnk/gbnf": "1.0.0",
|
|
52
|
+
"@plurnk/plurnk-aliases": "1.0.0",
|
|
53
|
+
"@plurnk/plurnk-models": "1.0.0",
|
|
54
|
+
"@plurnk/plurnk-providers-ollama": "1.0.0",
|
|
55
|
+
"@plurnk/plurnk-meta": "1.0.0"
|
|
56
|
+
}
|
|
58
57
|
}
|
package/dist/tokenizers.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export type TokenizerFamily = "heuristic" | "cl100k" | "llama";
|
|
2
|
-
export type CountTokens = (text: string) => number;
|
|
3
|
-
export declare const tokenizerFor: (family: TokenizerFamily) => CountTokens;
|
|
4
|
-
export declare const parseTokenizerFamily: (raw: string | undefined, fallback: TokenizerFamily, envName: string, label: string) => TokenizerFamily;
|
|
5
|
-
export declare const tokenizerByPublisher: (model: string, table: ReadonlyMap<string, TokenizerFamily>, index?: number) => TokenizerFamily;
|
|
6
|
-
//# sourceMappingURL=tokenizers.d.ts.map
|
package/dist/tokenizers.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tokenizers.d.ts","sourceRoot":"","sources":["../src/tokenizers.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE/D,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;AAYnD,eAAO,MAAM,YAAY,GAAI,QAAQ,eAAe,KAAG,WAAiC,CAAC;AAKzF,eAAO,MAAM,oBAAoB,GAAI,KAAK,MAAM,GAAG,SAAS,EAAE,UAAU,eAAe,EAAE,SAAS,MAAM,EAAE,OAAO,MAAM,KAAG,eAKzH,CAAC;AAMF,eAAO,MAAM,oBAAoB,GAC7B,OAAO,MAAM,EACb,OAAO,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,EAC3C,cAAS,KACV,eAGF,CAAC"}
|
package/dist/tokenizers.js
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
// Tokenizer strategies shared by every provider's countTokens(). Centralizes
|
|
2
|
-
// the gpt-tokenizer / llama-tokenizer-js deps (each sibling pulled them in
|
|
3
|
-
// separately) and the per-publisher dispatch maps that openrouter and
|
|
4
|
-
// cloudflare had independently re-invented.
|
|
5
|
-
//
|
|
6
|
-
// countTokens is synchronous by contract (SPEC §2), so only client-side
|
|
7
|
-
// tokenizers qualify. "heuristic" (chars/4) is the safe default for any
|
|
8
|
-
// upstream whose tokenizer we can't run locally.
|
|
9
|
-
import { encode as encodeCl100k } from "gpt-tokenizer/encoding/cl100k_base";
|
|
10
|
-
import llamaTokenizer from "llama-tokenizer-js";
|
|
11
|
-
// chars/2 is a deliberate UPPER BOUND, not an estimate: real agentic text runs
|
|
12
|
-
// ~2.9 chars/token (gemma SP-256k) to ~3.2 (deepseek BPE-128k), so /4 silently
|
|
13
|
-
// UNDERcounted 20-27% — the dangerous direction for window math. A fallback may
|
|
14
|
-
// overcount (refuse a too-big prompt safely) but must never undercount.
|
|
15
|
-
const heuristic = (text) => (text.length === 0 ? 0 : Math.ceil(text.length / 2));
|
|
16
|
-
const cl100k = (text) => (text.length === 0 ? 0 : encodeCl100k(text).length);
|
|
17
|
-
const llama = (text) => (text.length === 0 ? 0 : llamaTokenizer.encode(text).length);
|
|
18
|
-
const STRATEGIES = Object.freeze({ heuristic, cl100k, llama });
|
|
19
|
-
export const tokenizerFor = (family) => STRATEGIES[family];
|
|
20
|
-
// Parse an operator-declared tokenizer override (e.g. OPENAI_TOKENIZER).
|
|
21
|
-
// Accepts a legacy "cl100k_base" spelling for back-compat with the openai
|
|
22
|
-
// sibling's existing env contract.
|
|
23
|
-
export const parseTokenizerFamily = (raw, fallback, envName, label) => {
|
|
24
|
-
if (raw === undefined || raw.length === 0)
|
|
25
|
-
return fallback;
|
|
26
|
-
if (raw === "cl100k_base")
|
|
27
|
-
return "cl100k";
|
|
28
|
-
if (raw === "heuristic" || raw === "cl100k" || raw === "llama")
|
|
29
|
-
return raw;
|
|
30
|
-
throw new Error(`${label} provider: ${envName} must be one of "heuristic", "cl100k", "llama" (got "${raw}")`);
|
|
31
|
-
};
|
|
32
|
-
// Dispatch a tokenizer family from a model id's publisher segment. Relay
|
|
33
|
-
// providers (openrouter, cloudflare) route across many upstream families, so
|
|
34
|
-
// the family is read from the id prefix. `index` selects which "/"-segment
|
|
35
|
-
// holds the publisher (0 for "anthropic/claude…", 1 for "@cf/meta/llama…").
|
|
36
|
-
export const tokenizerByPublisher = (model, table, index = 0) => {
|
|
37
|
-
const publisher = model.split("/")[index];
|
|
38
|
-
return publisher !== undefined ? table.get(publisher) ?? "heuristic" : "heuristic";
|
|
39
|
-
};
|
|
40
|
-
//# sourceMappingURL=tokenizers.js.map
|
package/dist/tokenizers.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tokenizers.js","sourceRoot":"","sources":["../src/tokenizers.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,2EAA2E;AAC3E,sEAAsE;AACtE,4CAA4C;AAC5C,EAAE;AACF,wEAAwE;AACxE,wEAAwE;AACxE,iDAAiD;AAEjD,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,cAAc,MAAM,oBAAoB,CAAC;AAMhD,+EAA+E;AAC/E,+EAA+E;AAC/E,gFAAgF;AAChF,wEAAwE;AACxE,MAAM,SAAS,GAAgB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AAC9F,MAAM,MAAM,GAAgB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;AAC1F,MAAM,KAAK,GAAgB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;AAElG,MAAM,UAAU,GAAmD,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AAE/G,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAuB,EAAe,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAEzF,yEAAyE;AACzE,0EAA0E;AAC1E,mCAAmC;AACnC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAuB,EAAE,QAAyB,EAAE,OAAe,EAAE,KAAa,EAAmB,EAAE;IACxI,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC3D,IAAI,GAAG,KAAK,aAAa;QAAE,OAAO,QAAQ,CAAC;IAC3C,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,OAAO;QAAE,OAAO,GAAG,CAAC;IAC3E,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,cAAc,OAAO,wDAAwD,GAAG,IAAI,CAAC,CAAC;AAClH,CAAC,CAAC;AAEF,yEAAyE;AACzE,6EAA6E;AAC7E,2EAA2E;AAC3E,4EAA4E;AAC5E,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAChC,KAAa,EACb,KAA2C,EAC3C,KAAK,GAAG,CAAC,EACM,EAAE;IACjB,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC1C,OAAO,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;AACvF,CAAC,CAAC"}
|